1
0
mirror of https://github.com/ElvishArtisan/rivendell.git synced 2025-04-11 07:12:56 +02:00

2018-03-21 Fred Gleason <fredg@paravelsystems.com>

* Added support for notifications to rdlibrary(1).
This commit is contained in:
Fred Gleason 2018-03-21 14:16:52 -04:00
parent 7ce4b2ff10
commit e3fb53d0cf
5 changed files with 126 additions and 25 deletions

@ -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 &current_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;
};