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).
2022-12-07 Fred Gleason <fredg@paravelsystems.com>
* 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
//
// (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
// 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_view->setModel(list_log_model);
list_log_view->resizeColumnsToContents();
connect(list_filter_widget,SIGNAL(filterChanged(const QString &)),
list_log_model,SLOT(setFilterSql(const QString &)));
connect(list_filter_widget,SIGNAL(filterChanged(const QString &,
const QString &)),
list_log_model,SLOT(setFilterSql(const QString &,const QString &)));
connect(list_log_view,SIGNAL(doubleClicked(const QModelIndex &)),
this,SLOT(doubleClickedData(const QModelIndex &)));
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);
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)+"%%'))";
}
}
return sql;
}
QString RDLogFilter::limitSql() const
{
QString sql=" ";
if(filter_recent_check->isChecked()) {
sql+=QString::asprintf("order by `LOGS`.`ORIGIN_DATETIME` desc limit %d",
RD_LOGFILTER_LIMIT_QUAN);
sql+=", `LOGS`.`ORIGIN_DATETIME` desc ";
sql+=QString::asprintf("limit %d ",RD_LOGFILTER_LIMIT_QUAN);
}
return sql;
}
@ -194,14 +203,14 @@ void RDLogFilter::changeUser()
void RDLogFilter::filterChangedData(const QString &str)
{
LogSearchString(filter_filter_edit->text());
emit filterChanged(whereSql());
emit filterChanged(whereSql(),limitSql());
}
void RDLogFilter::filterChangedData()
{
LogSearchString(filter_filter_edit->text());
emit filterChanged(whereSql());
emit filterChanged(whereSql(),limitSql());
}
@ -215,7 +224,7 @@ void RDLogFilter::filterClearedData()
void RDLogFilter::serviceChangedData(int n)
{
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 filterText() const;
QString whereSql() const;
QString limitSql() const;
public slots:
void changeUser();
signals:
void filterChanged(const QString &where_sql);
void filterChanged(const QString &where_sql,const QString &limit_sql);
private slots:
void filterChangedData(const QString &str);

View File

@ -2,7 +2,7 @@
//
// 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
// it under the terms of the GNU General Public License version 2 as
@ -25,6 +25,8 @@
RDLogListModel::RDLogListModel(QObject *parent)
: QAbstractTableModel(parent)
{
d_sort_column=0;
d_sort_order=Qt::AscendingOrder;
d_service_names.push_back(tr("ALL"));
//
@ -36,39 +38,51 @@ RDLogListModel::RDLogListModel(QObject *parent)
d_headers.push_back(tr("Log Name"));
d_alignments.push_back(left);
d_column_fields.push_back("`NAME`");
d_headers.push_back(tr("Description"));
d_alignments.push_back(left);
d_column_fields.push_back("`DESCRIPTION`");
d_headers.push_back(tr("Service"));
d_alignments.push_back(left);
d_column_fields.push_back("`SERVICE`");
d_headers.push_back(tr("Music"));
d_alignments.push_back(center);
d_column_fields.push_back("`MUSIC_LINKED`");
d_headers.push_back(tr("Traffic"));
d_alignments.push_back(center);
d_column_fields.push_back("`TRAFFIC_LINKED`");
d_headers.push_back(tr("Tracks"));
d_alignments.push_back(center);
d_column_fields.push_back("`SCHEDULED_TRACKS`");
d_headers.push_back(tr("Valid From"));
d_alignments.push_back(left);
d_column_fields.push_back("`START_DATE`");
d_headers.push_back(tr("Valid To"));
d_alignments.push_back(left);
d_column_fields.push_back("`END_DATE`");
d_headers.push_back(tr("Auto Refresh"));
d_alignments.push_back(center);
d_column_fields.push_back("`AUTO_REFRESH`");
d_headers.push_back(tr("Origin"));
d_alignments.push_back(left);
d_column_fields.push_back("`ORIGIN_USER`");
d_headers.push_back(tr("Last Linked"));
d_alignments.push_back(left);
d_column_fields.push_back("`LINK_DATETIME`");
d_headers.push_back(tr("Last Modified"));
d_alignments.push_back(left);
d_column_fields.push_back("`MODIFIED_DATETIME`");
connect(rda->ripc(),SIGNAL(notificationReceived(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
{
return d_texts.at(row.row()).at(0).toString();
@ -184,7 +208,7 @@ QModelIndex RDLogListModel::addLog(const QString &name)
"`NAME` "+ // 00
"from `LOGS` where "+
"`NAME`='"+RDEscapeString(name)+"' "+
d_filter_sql;
d_filter_where_sql;
RDSqlQuery *q=new RDSqlQuery(sql);
if(q->first()) {
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) {
updateModel(sql);
d_filter_sql=sql;
if((d_filter_where_sql!=where_sql)||(d_filter_limit_sql!=limit_sql)) {
updateModel(where_sql,limit_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;
QString sql=sqlFields()+
"where "+
" where "+
"(`TYPE`=0)&&"+
"(`LOG_EXISTS`='Y') "+
filter_sql;
// "order by `NAME` ";
where_sql+" ";
sql+="order by "+d_column_fields.at(d_sort_column)+" ";
if(d_sort_order==Qt::DescendingOrder) {
sql+="desc ";
}
sql+=limit_sql;
beginResetModel();
d_texts.clear();
d_icons.clear();

View File

@ -44,6 +44,7 @@ class RDLogListModel : public QAbstractTableModel
QVariant headerData(int section,Qt::Orientation orient,
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;
QModelIndex addLog(const QString &name);
void removeLog(const QModelIndex &row);
@ -52,13 +53,13 @@ class RDLogListModel : public QAbstractTableModel
void refresh(const QString &logname);
public slots:
void setFilterSql(const QString &sql);
void setFilterSql(const QString &where_sql,const QString &limit_sql);
private slots:
void processNotification(RDNotification *notify);
protected:
void updateModel(const QString &filter_sql);
void updateModel(const QString &where_sql,const QString &limit_sql);
void updateRowLine(int line);
void updateRow(int row,RDSqlQuery *q);
QString sqlFields() const;
@ -71,7 +72,11 @@ class RDLogListModel : public QAbstractTableModel
QList<QList<QVariant> > d_texts;
QList<QList<QVariant> > d_icons;
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_view->setModel(list_log_model);
list_log_view->resizeColumnsToContents();
connect(list_filter_widget,SIGNAL(filterChanged(const QString &)),
list_log_model,SLOT(setFilterSql(const QString &)));
connect(list_filter_widget,
SIGNAL(filterChanged(const QString &,const QString &)),
list_log_model,SLOT(setFilterSql(const QString &,const QString &)));
connect(list_log_view,SIGNAL(doubleClicked(const QModelIndex &)),
this,SLOT(doubleClickedData(const QModelIndex &)));
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());
}
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();
}

View File

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

View File

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