mirror of
				https://github.com/ElvishArtisan/rivendell.git
				synced 2025-10-31 06:03:51 +01:00 
			
		
		
		
	2018-03-21 Fred Gleason <fredg@paravelsystems.com>
* Added support for notifications to rdlibrary(1).
This commit is contained in:
		| @@ -16723,3 +16723,5 @@ | ||||
| 	ripcd(8). | ||||
| 	* Added an 'RDRipc::sendNotification()' method. | ||||
| 	* Added an 'RDRipc::notificationReceived()' signal. | ||||
| 2018-03-21 Fred Gleason <fredg@paravelsystems.com> | ||||
| 	* Added support for notifications to rdlibrary(1). | ||||
|   | ||||
| @@ -20,6 +20,15 @@ | ||||
|  | ||||
| #include "rdnotification.h" | ||||
|  | ||||
| RDNotification::RDNotification(RDNotification::Type type, | ||||
| 			       RDNotification::Action action,unsigned cartnum) | ||||
| { | ||||
|   notify_type=type; | ||||
|   notify_action=action; | ||||
|   notify_id=QVariant(cartnum); | ||||
| } | ||||
|  | ||||
|  | ||||
| RDNotification::RDNotification() | ||||
| { | ||||
|   notify_type=RDNotification::NullType; | ||||
| @@ -84,7 +93,7 @@ bool RDNotification::read(const QString &str) | ||||
|       RDNotification::Type type=(RDNotification::Type)i; | ||||
|       if(args[1]==RDNotification::typeString(type)) { | ||||
| 	notify_type=type; | ||||
| 	notify_id=QVariant(args[2].toUInt()); | ||||
| 	notify_id=QVariant(args[3].toUInt()); | ||||
|       } | ||||
|     } | ||||
|     if(notify_type==RDNotification::NullType) { | ||||
|   | ||||
| @@ -30,6 +30,7 @@ class RDNotification | ||||
|   enum Type {NullType=0,CartType=1,LastType=2}; | ||||
|   enum Action {NoAction=0,AddAction=1,DeleteAction=2,ModifyAction=3, | ||||
| 	       LastAction=4}; | ||||
|   RDNotification(Type type,Action action,unsigned cartnum); | ||||
|   RDNotification(); | ||||
|   Type type() const; | ||||
|   void setType(Type type); | ||||
|   | ||||
| @@ -178,8 +178,9 @@ MainWidget::MainWidget(QWidget *parent) | ||||
|   lib_filter_mode=rda->station()->filterMode(); | ||||
|   rdaudioport_conf=new RDAudioPort(rda->config()->stationName(), | ||||
| 				   rda->libraryConf()->inputCard()); | ||||
|   connect(rda->ripc(),SIGNAL(connected(bool)),this,SLOT(connectedData(bool))); | ||||
|   connect(rda,SIGNAL(userChanged()),this,SLOT(userData())); | ||||
|   connect(rda->ripc(),SIGNAL(notificationReceived(RDNotification *)), | ||||
| 	  this,SLOT(notificationReceivedData(RDNotification *))); | ||||
|   rda->ripc()-> | ||||
|     connectHost("localhost",RIPCD_TCP_PORT,rda->config()->password()); | ||||
|   cut_clipboard=NULL; | ||||
| @@ -482,11 +483,6 @@ QSizePolicy MainWidget::sizePolicy() const | ||||
| } | ||||
|  | ||||
|  | ||||
| void MainWidget::connectedData(bool state) | ||||
| { | ||||
| } | ||||
|  | ||||
|  | ||||
| void MainWidget::userData() | ||||
| { | ||||
|   QString sql; | ||||
| @@ -610,6 +606,7 @@ void MainWidget::addData() | ||||
|     RDListViewItem *item=new RDListViewItem(lib_cart_list); | ||||
|     item->setText(1,QString().sprintf("%06u",cart_num)); | ||||
|     RefreshLine(item); | ||||
|     SendNotification(RDNotification::AddAction,cart_num); | ||||
|     QListViewItemIterator it(lib_cart_list); | ||||
|     while(it.current()) { | ||||
|       lib_cart_list->setSelected(it.current(),false); | ||||
| @@ -657,6 +654,7 @@ void MainWidget::editData() | ||||
|     edit_cart->exec(); | ||||
|     RefreshLine(item); | ||||
|     cartOnItemData(item); | ||||
|     SendNotification(RDNotification::ModifyAction,item->text(1).toUInt()); | ||||
|     delete edit_cart; | ||||
|     delete it; | ||||
|   } | ||||
| @@ -673,6 +671,8 @@ void MainWidget::editData() | ||||
|       while(it->current()) { | ||||
|         if (it->current()->isSelected()) { | ||||
|           RefreshLine((RDListViewItem *)it->current()); | ||||
| 	  SendNotification(RDNotification::ModifyAction, | ||||
| 			   it->current()->text(1).toUInt()); | ||||
|         } | ||||
|         ++(*it); | ||||
|       } | ||||
| @@ -757,6 +757,7 @@ Do you still want to delete it?"),item->text(1).toUInt()); | ||||
|       QMessageBox::warning(this,tr("RDLibrary"),tr("Unable to delete audio!")); | ||||
|       return; | ||||
|     } | ||||
|     SendNotification(RDNotification::DeleteAction,rdcart->number()); | ||||
|     delete rdcart; | ||||
|     delete item; | ||||
|   }  | ||||
| @@ -894,6 +895,54 @@ void MainWidget::dragsChangedData(int state) | ||||
| } | ||||
|  | ||||
|  | ||||
| void MainWidget::notificationReceivedData(RDNotification *notify) | ||||
| { | ||||
|   RDListViewItem *item=NULL; | ||||
|   QString sql; | ||||
|   RDSqlQuery *q; | ||||
|  | ||||
|   if(notify->type()==RDNotification::CartType) { | ||||
|     switch(notify->action()) { | ||||
|     case RDNotification::AddAction: | ||||
|       sql=QString("select CART.NUMBER from CART ")+ | ||||
| 	"left join CUTS on CART.NUMBER=CUTS.CART_NUMBER "+ | ||||
| 	WhereClause()+ | ||||
| 	QString().sprintf(" && CART.NUMBER=%u ",notify->id().toUInt()); | ||||
|       q=new RDSqlQuery(sql); | ||||
|       if(q->first()) { | ||||
| 	item=new RDListViewItem(lib_cart_list); | ||||
| 	item->setText(1,QString().sprintf("%06u",notify->id().toUInt())); | ||||
| 	RefreshLine(item); | ||||
|       } | ||||
|       delete q; | ||||
|       break; | ||||
|  | ||||
|     case RDNotification::ModifyAction: | ||||
|       if((item=(RDListViewItem *)lib_cart_list-> | ||||
| 	  findItem(QString().sprintf("%06u",notify->id().toUInt()),1))!=NULL) { | ||||
| 	RefreshLine(item); | ||||
|       } | ||||
|       break; | ||||
|  | ||||
|     case RDNotification::DeleteAction: | ||||
|       if(lib_edit_pending) { | ||||
| 	lib_deleted_carts.push_back(notify->id().toUInt()); | ||||
|       } | ||||
|       else { | ||||
| 	if((item=(RDListViewItem *)lib_cart_list->findItem(QString().sprintf("%06u",notify->id().toUInt()),1))!=NULL) { | ||||
| 	  delete item; | ||||
| 	} | ||||
|       } | ||||
|       break; | ||||
|  | ||||
|     case RDNotification::NoAction: | ||||
|     case RDNotification::LastAction: | ||||
|       break; | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
| void MainWidget::quitMainWidget() | ||||
| { | ||||
|   SaveGeometry(); | ||||
| @@ -1011,21 +1060,7 @@ void MainWidget::RefreshList() | ||||
|     "CUTS.SUN "+                // 36 | ||||
|     "from CART left join GROUPS on CART.GROUP_NAME=GROUPS.NAME "+ | ||||
|     "left join CUTS on CART.NUMBER=CUTS.CART_NUMBER"; | ||||
|   QString schedcode=""; | ||||
|   if(lib_codes_box->currentText()!=tr("ALL")) { | ||||
|     schedcode=lib_codes_box->currentText(); | ||||
|   } | ||||
|   if(lib_group_box->currentText()==QString(tr("ALL"))) { | ||||
|     sql+=QString(" where ")+ | ||||
|       RDAllCartSearchText(lib_filter_edit->text(),schedcode, | ||||
| 			  rda->user()->name(),true)+" && "+type_filter; | ||||
|  | ||||
|   } | ||||
|   else { | ||||
|     sql+=QString(" where ")+ | ||||
|       RDCartSearchText(lib_filter_edit->text(),lib_group_box->currentText(), | ||||
| 		       schedcode,true)+" && "+type_filter;       | ||||
|   } | ||||
|   sql+=WhereClause(); | ||||
|   sql+=" order by CART.NUMBER"; | ||||
|   if(lib_showmatches_box->isChecked()) { | ||||
|     sql+=QString().sprintf(" limit %d",RD_LIMITED_CART_SEARCH_QUANTITY); | ||||
| @@ -1141,6 +1176,31 @@ void MainWidget::RefreshList() | ||||
| } | ||||
|  | ||||
|  | ||||
| QString MainWidget::WhereClause() const | ||||
| { | ||||
|   QString sql=""; | ||||
|   QString type_filter=GetTypeFilter(); | ||||
|  | ||||
|   QString schedcode=""; | ||||
|   if(lib_codes_box->currentText()!=tr("ALL")) { | ||||
|     schedcode=lib_codes_box->currentText(); | ||||
|   } | ||||
|   if(lib_group_box->currentText()==QString(tr("ALL"))) { | ||||
|     sql+=QString(" where ")+ | ||||
|       RDAllCartSearchText(lib_filter_edit->text(),schedcode, | ||||
| 			  rda->user()->name(),true)+" && "+type_filter; | ||||
|  | ||||
|   } | ||||
|   else { | ||||
|     sql+=QString(" where ")+ | ||||
|       RDCartSearchText(lib_filter_edit->text(),lib_group_box->currentText(), | ||||
| 		       schedcode,true)+" && "+type_filter;       | ||||
|   } | ||||
|  | ||||
|   return sql; | ||||
| } | ||||
|  | ||||
|  | ||||
| void SigHandler(int signo) | ||||
| { | ||||
|   pid_t pLocalPid; | ||||
| @@ -1321,7 +1381,7 @@ void MainWidget::SetCaption(QString user) | ||||
| } | ||||
|  | ||||
|  | ||||
| QString MainWidget::GetTypeFilter() | ||||
| QString MainWidget::GetTypeFilter() const | ||||
| { | ||||
|   QString type_filter; | ||||
|  | ||||
| @@ -1410,16 +1470,42 @@ void MainWidget::LockUser() | ||||
|  | ||||
| bool MainWidget::UnlockUser() | ||||
| { | ||||
|  | ||||
|   RDListViewItem *item=NULL; | ||||
|  | ||||
|   // | ||||
|   // Process Deleted Carts | ||||
|   // | ||||
|   for(unsigned i=0;i<lib_deleted_carts.size();i++) { | ||||
|     if((item=(RDListViewItem *)lib_cart_list->findItem(QString().sprintf("%06u",lib_deleted_carts.at(i)),1))!=NULL) { | ||||
|       delete item; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   // | ||||
|   // Process User Change | ||||
|   // | ||||
|   bool ret=lib_user_changed; | ||||
|   lib_edit_pending=false; | ||||
|   if(lib_user_changed) { | ||||
|     lib_user_timer->start(0,true); | ||||
|     lib_user_changed=false; | ||||
|   } | ||||
|  | ||||
|   return ret; | ||||
| } | ||||
|  | ||||
|  | ||||
| void MainWidget::SendNotification(RDNotification::Action action, | ||||
| 				  unsigned cartnum) | ||||
| { | ||||
|   RDNotification *notify= | ||||
|     new RDNotification(RDNotification::CartType,action,cartnum); | ||||
|   rda->ripc()->sendNotification(*notify); | ||||
|   delete notify; | ||||
| } | ||||
|  | ||||
|  | ||||
| int main(int argc,char *argv[]) | ||||
| { | ||||
|   QApplication a(argc,argv); | ||||
|   | ||||
| @@ -70,7 +70,6 @@ class MainWidget : public QWidget | ||||
|   QSizePolicy sizePolicy() const; | ||||
|  | ||||
|  private slots: | ||||
|   void connectedData(bool state); | ||||
|   void userData(); | ||||
|   void filterChangedData(const QString &str); | ||||
|   void searchClickedData(); | ||||
| @@ -88,6 +87,7 @@ class MainWidget : public QWidget | ||||
|   void macroChangedData(int state); | ||||
|   void searchLimitChangedData(int state); | ||||
|   void dragsChangedData(int state); | ||||
|   void notificationReceivedData(RDNotification *notify); | ||||
|   void quitMainWidget(); | ||||
|  | ||||
|  protected: | ||||
| @@ -96,17 +96,19 @@ class MainWidget : public QWidget | ||||
|    | ||||
|  private: | ||||
|   void RefreshList(); | ||||
|   QString WhereClause() const; | ||||
|   void RefreshLine(RDListViewItem *item); | ||||
|   void UpdateItemColor(RDListViewItem *item,RDCart::Validity validity, | ||||
| 		       const QDateTime &end_datetime, | ||||
| 		       const QDateTime ¤t_datetime);  | ||||
|   void SetCaption(QString user); | ||||
|   QString GetTypeFilter(); | ||||
|   QString GetTypeFilter() const; | ||||
|   QString GeometryFile(); | ||||
|   void LoadGeometry(); | ||||
|   void SaveGeometry(); | ||||
|   void LockUser(); | ||||
|   bool UnlockUser(); | ||||
|   void SendNotification(RDNotification::Action action,unsigned cartnum); | ||||
|   LibListView *lib_cart_list; | ||||
|   CartTip *lib_cart_tip; | ||||
|   QString lib_filter_text; | ||||
| @@ -148,6 +150,7 @@ class MainWidget : public QWidget | ||||
|   bool lib_user_changed; | ||||
|   QTimer *lib_user_timer; | ||||
|   bool lib_resize; | ||||
|   std::vector<unsigned> lib_deleted_carts; | ||||
| }; | ||||
|  | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user