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

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