From e3fb53d0cf2e333cc52ca602f440930d8ddb80d6 Mon Sep 17 00:00:00 2001 From: Fred Gleason Date: Wed, 21 Mar 2018 14:16:52 -0400 Subject: [PATCH] 2018-03-21 Fred Gleason * Added support for notifications to rdlibrary(1). --- ChangeLog | 2 + lib/rdnotification.cpp | 11 +++- lib/rdnotification.h | 1 + rdlibrary/rdlibrary.cpp | 130 +++++++++++++++++++++++++++++++++------- rdlibrary/rdlibrary.h | 7 ++- 5 files changed, 126 insertions(+), 25 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5f2eaecb..f3e863ea 100644 --- a/ChangeLog +++ b/ChangeLog @@ -16723,3 +16723,5 @@ ripcd(8). * Added an 'RDRipc::sendNotification()' method. * Added an 'RDRipc::notificationReceived()' signal. +2018-03-21 Fred Gleason + * Added support for notifications to rdlibrary(1). diff --git a/lib/rdnotification.cpp b/lib/rdnotification.cpp index a1540b6c..03d4725e 100644 --- a/lib/rdnotification.cpp +++ b/lib/rdnotification.cpp @@ -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) { diff --git a/lib/rdnotification.h b/lib/rdnotification.h index 3fbc5c93..93317a48 100644 --- a/lib/rdnotification.h +++ b/lib/rdnotification.h @@ -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); diff --git a/rdlibrary/rdlibrary.cpp b/rdlibrary/rdlibrary.cpp index e911df65..a9c217a1 100644 --- a/rdlibrary/rdlibrary.cpp +++ b/rdlibrary/rdlibrary.cpp @@ -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;ifindItem(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); diff --git a/rdlibrary/rdlibrary.h b/rdlibrary/rdlibrary.h index 1f952305..51820397 100644 --- a/rdlibrary/rdlibrary.h +++ b/rdlibrary/rdlibrary.h @@ -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 lib_deleted_carts; };