2022-12-08 Fred Gleason <fredg@paravelsystems.com>

* Implemented column sorting for log lists in rdadmin(1),rdairplay(1),
	rdcastmanager(1) and rdlogedit(1).

Signed-off-by: Fred Gleason <fredg@paravelsystems.com>
This commit is contained in:
Fred Gleason 2022-12-08 13:03:55 -05:00
parent 1bb35439fa
commit dc04bd0150
9 changed files with 89 additions and 43 deletions

View File

@ -23775,3 +23775,6 @@
section of rd.conf(5). section of rd.conf(5).
2022-12-07 Fred Gleason <fredg@paravelsystems.com> 2022-12-07 Fred Gleason <fredg@paravelsystems.com>
* Incremented the package version to 4.0.0rc0int6. * Incremented the package version to 4.0.0rc0int6.
2022-12-08 Fred Gleason <fredg@paravelsystems.com>
* Implemented column sorting for log lists in rdadmin(1),rdairplay(1),
rdcastmanager(1) and rdlogedit(1).

View File

@ -2,7 +2,7 @@
// //
// Select a Rivendell Log // Select a Rivendell Log
// //
// (C) Copyright 2002-2021 Fred Gleason <fredg@paravelsystems.com> // (C) Copyright 2002-2022 Fred Gleason <fredg@paravelsystems.com>
// //
// This program is free software; you can redistribute it and/or modify // This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2 as // it under the terms of the GNU General Public License version 2 as
@ -50,8 +50,9 @@ RDListLogs::RDListLogs(QString *logname,RDLogFilter::FilterMode mode,
list_log_model->setPalette(palette()); list_log_model->setPalette(palette());
list_log_view->setModel(list_log_model); list_log_view->setModel(list_log_model);
list_log_view->resizeColumnsToContents(); list_log_view->resizeColumnsToContents();
connect(list_filter_widget,SIGNAL(filterChanged(const QString &)), connect(list_filter_widget,SIGNAL(filterChanged(const QString &,
list_log_model,SLOT(setFilterSql(const QString &))); const QString &)),
list_log_model,SLOT(setFilterSql(const QString &,const QString &)));
connect(list_log_view,SIGNAL(doubleClicked(const QModelIndex &)), connect(list_log_view,SIGNAL(doubleClicked(const QModelIndex &)),
this,SLOT(doubleClickedData(const QModelIndex &))); this,SLOT(doubleClickedData(const QModelIndex &)));
connect(list_log_model,SIGNAL(modelReset()),this,SLOT(modelResetData())); connect(list_log_model,SIGNAL(modelReset()),this,SLOT(modelResetData()));
@ -73,7 +74,8 @@ RDListLogs::RDListLogs(QString *logname,RDLogFilter::FilterMode mode,
list_cancel_button->setDefault(true); list_cancel_button->setDefault(true);
connect(list_cancel_button,SIGNAL(clicked()),this,SLOT(cancelButtonData())); connect(list_cancel_button,SIGNAL(clicked()),this,SLOT(cancelButtonData()));
list_log_model->setFilterSql(list_filter_widget->whereSql()); list_log_model->setFilterSql(list_filter_widget->whereSql(),
list_filter_widget->limitSql());
} }

View File

@ -163,11 +163,20 @@ QString RDLogFilter::whereSql() const
sql+="(`LOGS`.`DESCRIPTION` like '%%"+RDEscapeString(filter)+"%%'))"; sql+="(`LOGS`.`DESCRIPTION` like '%%"+RDEscapeString(filter)+"%%'))";
} }
} }
return sql;
}
QString RDLogFilter::limitSql() const
{
QString sql=" ";
if(filter_recent_check->isChecked()) { if(filter_recent_check->isChecked()) {
sql+=QString::asprintf("order by `LOGS`.`ORIGIN_DATETIME` desc limit %d", sql+=", `LOGS`.`ORIGIN_DATETIME` desc ";
RD_LOGFILTER_LIMIT_QUAN); sql+=QString::asprintf("limit %d ",RD_LOGFILTER_LIMIT_QUAN);
} }
return sql; return sql;
} }
@ -194,14 +203,14 @@ void RDLogFilter::changeUser()
void RDLogFilter::filterChangedData(const QString &str) void RDLogFilter::filterChangedData(const QString &str)
{ {
LogSearchString(filter_filter_edit->text()); LogSearchString(filter_filter_edit->text());
emit filterChanged(whereSql()); emit filterChanged(whereSql(),limitSql());
} }
void RDLogFilter::filterChangedData() void RDLogFilter::filterChangedData()
{ {
LogSearchString(filter_filter_edit->text()); LogSearchString(filter_filter_edit->text());
emit filterChanged(whereSql()); emit filterChanged(whereSql(),limitSql());
} }
@ -215,7 +224,7 @@ void RDLogFilter::filterClearedData()
void RDLogFilter::serviceChangedData(int n) void RDLogFilter::serviceChangedData(int n)
{ {
LogSearchString(filter_filter_edit->text()); LogSearchString(filter_filter_edit->text());
emit filterChanged(whereSql()); emit filterChanged(whereSql(),limitSql());
} }

View File

@ -42,12 +42,13 @@ class RDLogFilter : public QWidget
QString filterServiceName() const; QString filterServiceName() const;
QString filterText() const; QString filterText() const;
QString whereSql() const; QString whereSql() const;
QString limitSql() const;
public slots: public slots:
void changeUser(); void changeUser();
signals: signals:
void filterChanged(const QString &where_sql); void filterChanged(const QString &where_sql,const QString &limit_sql);
private slots: private slots:
void filterChangedData(const QString &str); void filterChangedData(const QString &str);

View File

@ -2,7 +2,7 @@
// //
// Data model for Rivendell log metadata // Data model for Rivendell log metadata
// //
// (C) Copyright 2020-2021 Fred Gleason <fredg@paravelsystems.com> // (C) Copyright 2020-2022 Fred Gleason <fredg@paravelsystems.com>
// //
// This program is free software; you can redistribute it and/or modify // This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2 as // it under the terms of the GNU General Public License version 2 as
@ -25,6 +25,8 @@
RDLogListModel::RDLogListModel(QObject *parent) RDLogListModel::RDLogListModel(QObject *parent)
: QAbstractTableModel(parent) : QAbstractTableModel(parent)
{ {
d_sort_column=0;
d_sort_order=Qt::AscendingOrder;
d_service_names.push_back(tr("ALL")); d_service_names.push_back(tr("ALL"));
// //
@ -36,39 +38,51 @@ RDLogListModel::RDLogListModel(QObject *parent)
d_headers.push_back(tr("Log Name")); d_headers.push_back(tr("Log Name"));
d_alignments.push_back(left); d_alignments.push_back(left);
d_column_fields.push_back("`NAME`");
d_headers.push_back(tr("Description")); d_headers.push_back(tr("Description"));
d_alignments.push_back(left); d_alignments.push_back(left);
d_column_fields.push_back("`DESCRIPTION`");
d_headers.push_back(tr("Service")); d_headers.push_back(tr("Service"));
d_alignments.push_back(left); d_alignments.push_back(left);
d_column_fields.push_back("`SERVICE`");
d_headers.push_back(tr("Music")); d_headers.push_back(tr("Music"));
d_alignments.push_back(center); d_alignments.push_back(center);
d_column_fields.push_back("`MUSIC_LINKED`");
d_headers.push_back(tr("Traffic")); d_headers.push_back(tr("Traffic"));
d_alignments.push_back(center); d_alignments.push_back(center);
d_column_fields.push_back("`TRAFFIC_LINKED`");
d_headers.push_back(tr("Tracks")); d_headers.push_back(tr("Tracks"));
d_alignments.push_back(center); d_alignments.push_back(center);
d_column_fields.push_back("`SCHEDULED_TRACKS`");
d_headers.push_back(tr("Valid From")); d_headers.push_back(tr("Valid From"));
d_alignments.push_back(left); d_alignments.push_back(left);
d_column_fields.push_back("`START_DATE`");
d_headers.push_back(tr("Valid To")); d_headers.push_back(tr("Valid To"));
d_alignments.push_back(left); d_alignments.push_back(left);
d_column_fields.push_back("`END_DATE`");
d_headers.push_back(tr("Auto Refresh")); d_headers.push_back(tr("Auto Refresh"));
d_alignments.push_back(center); d_alignments.push_back(center);
d_column_fields.push_back("`AUTO_REFRESH`");
d_headers.push_back(tr("Origin")); d_headers.push_back(tr("Origin"));
d_alignments.push_back(left); d_alignments.push_back(left);
d_column_fields.push_back("`ORIGIN_USER`");
d_headers.push_back(tr("Last Linked")); d_headers.push_back(tr("Last Linked"));
d_alignments.push_back(left); d_alignments.push_back(left);
d_column_fields.push_back("`LINK_DATETIME`");
d_headers.push_back(tr("Last Modified")); d_headers.push_back(tr("Last Modified"));
d_alignments.push_back(left); d_alignments.push_back(left);
d_column_fields.push_back("`MODIFIED_DATETIME`");
connect(rda->ripc(),SIGNAL(notificationReceived(RDNotification *)), connect(rda->ripc(),SIGNAL(notificationReceived(RDNotification *)),
this,SLOT(processNotification(RDNotification *))); this,SLOT(processNotification(RDNotification *)));
@ -158,6 +172,16 @@ QVariant RDLogListModel::data(const QModelIndex &index,int role) const
} }
void RDLogListModel::sort(int col,Qt::SortOrder order)
{
if((col!=d_sort_column)||(order!=d_sort_order)) {
d_sort_column=col;
d_sort_order=order;
updateModel(d_filter_where_sql,d_filter_limit_sql);
}
}
QString RDLogListModel::logName(const QModelIndex &row) const QString RDLogListModel::logName(const QModelIndex &row) const
{ {
return d_texts.at(row.row()).at(0).toString(); return d_texts.at(row.row()).at(0).toString();
@ -184,7 +208,7 @@ QModelIndex RDLogListModel::addLog(const QString &name)
"`NAME` "+ // 00 "`NAME` "+ // 00
"from `LOGS` where "+ "from `LOGS` where "+
"`NAME`='"+RDEscapeString(name)+"' "+ "`NAME`='"+RDEscapeString(name)+"' "+
d_filter_sql; d_filter_where_sql;
RDSqlQuery *q=new RDSqlQuery(sql); RDSqlQuery *q=new RDSqlQuery(sql);
if(q->first()) { if(q->first()) {
QList<QVariant> list; QList<QVariant> list;
@ -255,11 +279,13 @@ void RDLogListModel::refresh(const QString &logname)
} }
void RDLogListModel::setFilterSql(const QString &sql) void RDLogListModel::setFilterSql(const QString &where_sql,
const QString &limit_sql)
{ {
if(d_filter_sql!=sql) { if((d_filter_where_sql!=where_sql)||(d_filter_limit_sql!=limit_sql)) {
updateModel(sql); updateModel(where_sql,limit_sql);
d_filter_sql=sql; d_filter_where_sql=where_sql;
d_filter_limit_sql=limit_sql;
} }
} }
@ -288,15 +314,21 @@ void RDLogListModel::processNotification(RDNotification *notify)
} }
void RDLogListModel::updateModel(const QString &filter_sql) void RDLogListModel::updateModel(const QString &where_sql,
const QString &limit_sql)
{ {
RDSqlQuery *q=NULL; RDSqlQuery *q=NULL;
QString sql=sqlFields()+ QString sql=sqlFields()+
"where "+ " where "+
"(`TYPE`=0)&&"+ "(`TYPE`=0)&&"+
"(`LOG_EXISTS`='Y') "+ "(`LOG_EXISTS`='Y') "+
filter_sql; where_sql+" ";
// "order by `NAME` "; sql+="order by "+d_column_fields.at(d_sort_column)+" ";
if(d_sort_order==Qt::DescendingOrder) {
sql+="desc ";
}
sql+=limit_sql;
beginResetModel(); beginResetModel();
d_texts.clear(); d_texts.clear();
d_icons.clear(); d_icons.clear();

View File

@ -44,6 +44,7 @@ class RDLogListModel : public QAbstractTableModel
QVariant headerData(int section,Qt::Orientation orient, QVariant headerData(int section,Qt::Orientation orient,
int role=Qt::DisplayRole) const; int role=Qt::DisplayRole) const;
QVariant data(const QModelIndex &index,int role=Qt::DisplayRole) const; QVariant data(const QModelIndex &index,int role=Qt::DisplayRole) const;
void sort(int col,Qt::SortOrder order=Qt::AscendingOrder);
QString logName(const QModelIndex &row) const; QString logName(const QModelIndex &row) const;
QModelIndex addLog(const QString &name); QModelIndex addLog(const QString &name);
void removeLog(const QModelIndex &row); void removeLog(const QModelIndex &row);
@ -52,13 +53,13 @@ class RDLogListModel : public QAbstractTableModel
void refresh(const QString &logname); void refresh(const QString &logname);
public slots: public slots:
void setFilterSql(const QString &sql); void setFilterSql(const QString &where_sql,const QString &limit_sql);
private slots: private slots:
void processNotification(RDNotification *notify); void processNotification(RDNotification *notify);
protected: protected:
void updateModel(const QString &filter_sql); void updateModel(const QString &where_sql,const QString &limit_sql);
void updateRowLine(int line); void updateRowLine(int line);
void updateRow(int row,RDSqlQuery *q); void updateRow(int row,RDSqlQuery *q);
QString sqlFields() const; QString sqlFields() const;
@ -71,7 +72,11 @@ class RDLogListModel : public QAbstractTableModel
QList<QList<QVariant> > d_texts; QList<QList<QVariant> > d_texts;
QList<QList<QVariant> > d_icons; QList<QList<QVariant> > d_icons;
QList<QVariant> d_alignments; QList<QVariant> d_alignments;
QString d_filter_sql; QString d_filter_where_sql;
QString d_filter_limit_sql;
int d_sort_column;
Qt::SortOrder d_sort_order;
QStringList d_column_fields;
}; };

View File

@ -52,8 +52,9 @@ ListLogs::ListLogs(RDLogPlay *log,QWidget *parent)
list_log_model->setPalette(palette()); list_log_model->setPalette(palette());
list_log_view->setModel(list_log_model); list_log_view->setModel(list_log_model);
list_log_view->resizeColumnsToContents(); list_log_view->resizeColumnsToContents();
connect(list_filter_widget,SIGNAL(filterChanged(const QString &)), connect(list_filter_widget,
list_log_model,SLOT(setFilterSql(const QString &))); SIGNAL(filterChanged(const QString &,const QString &)),
list_log_model,SLOT(setFilterSql(const QString &,const QString &)));
connect(list_log_view,SIGNAL(doubleClicked(const QModelIndex &)), connect(list_log_view,SIGNAL(doubleClicked(const QModelIndex &)),
this,SLOT(doubleClickedData(const QModelIndex &))); this,SLOT(doubleClickedData(const QModelIndex &)));
connect(list_log_model,SIGNAL(modelReset()),this,SLOT(modelResetData())); connect(list_log_model,SIGNAL(modelReset()),this,SLOT(modelResetData()));
@ -123,7 +124,8 @@ int ListLogs::exec(QString *logname,QString *svcname,RDLogLock **log_lock)
services_list.push_back(q->value(0).toString()); services_list.push_back(q->value(0).toString());
} }
delete q; delete q;
list_log_model->setFilterSql(list_filter_widget->whereSql()); list_log_model->setFilterSql(list_filter_widget->whereSql(),
list_filter_widget->limitSql());
return QDialog::exec(); return QDialog::exec();
} }

View File

@ -105,31 +105,30 @@ MainWidget::MainWidget(RDConfig *c,QWidget *parent)
// //
// Log Filter // Log Filter
// //
log_filter_widget= log_filter_widget=new RDLogFilter(RDLogFilter::UserFilter,this);
new RDLogFilter(RDLogFilter::UserFilter,this);
connect(log_filter_widget,SIGNAL(filterChanged(const QString &)),
this,SLOT(filterChangedData(const QString &)));
// //
// Dialogs // Dialogs
// //
log_edit_dialog= log_edit_dialog=
new EditLog(&log_filter,&log_group,&log_schedcode,&log_clipboard,this); new EditLog(&log_filter,&log_group,&log_schedcode,&log_clipboard,this);
log_tracker_dialog=new VoiceTracker(&log_import_path,this); log_tracker_dialog=new VoiceTracker(&log_import_path,this);
// //
// Log List // Log List
// //
log_log_view=new RDTableView(this); log_log_view=new RDTableView(this);
log_log_view->setSortingEnabled(true);
log_log_view->sortByColumn(0,Qt::AscendingOrder);
log_log_view->setSelectionMode(QAbstractItemView::ExtendedSelection); log_log_view->setSelectionMode(QAbstractItemView::ExtendedSelection);
log_log_model=new RDLogListModel(this); log_log_model=new RDLogListModel(this);
log_log_model->setFont(defaultFont()); log_log_model->setFont(defaultFont());
log_log_model->setPalette(palette()); log_log_model->setPalette(palette());
log_log_view->setModel(log_log_model); log_log_view->setModel(log_log_model);
log_log_view->resizeColumnsToContents(); log_log_view->resizeColumnsToContents();
connect(log_filter_widget,SIGNAL(filterChanged(const QString &)), connect(log_filter_widget,
log_log_model,SLOT(setFilterSql(const QString &))); SIGNAL(filterChanged(const QString &,const QString &)),
log_log_model,SLOT(setFilterSql(const QString &,const QString &)));
connect(log_log_view,SIGNAL(doubleClicked(const QModelIndex &)), connect(log_log_view,SIGNAL(doubleClicked(const QModelIndex &)),
this,SLOT(doubleClickedData(const QModelIndex &))); this,SLOT(doubleClickedData(const QModelIndex &)));
connect(log_log_view->selectionModel(), connect(log_log_view->selectionModel(),
@ -240,9 +239,9 @@ void MainWidget::userData()
rda->ripc()->user()); rda->ripc()->user());
log_filter_widget->changeUser(); log_filter_widget->changeUser();
log_log_model->setFilterSql(log_filter_widget->whereSql()); log_log_model->setFilterSql(log_filter_widget->whereSql(),
log_filter_widget->limitSql());
log_log_view->resizeColumnsToContents(); log_log_view->resizeColumnsToContents();
// RefreshList();
// //
// Set Control Perms // Set Control Perms
@ -576,12 +575,6 @@ void MainWidget::reportData()
} }
void MainWidget::filterChangedData(const QString &str)
{
// RefreshList();
}
void MainWidget::selectionChangedData(const QItemSelection &selected, void MainWidget::selectionChangedData(const QItemSelection &selected,
const QItemSelection &deselected) const QItemSelection &deselected)
{ {

View File

@ -60,7 +60,6 @@ class MainWidget : public RDMainWindow
void deleteData(); void deleteData();
void trackData(); void trackData();
void reportData(); void reportData();
void filterChangedData(const QString &str);
void selectionChangedData(const QItemSelection &selected, void selectionChangedData(const QItemSelection &selected,
const QItemSelection &deselected); const QItemSelection &deselected);
void doubleClickedData(const QModelIndex &index); void doubleClickedData(const QModelIndex &index);