From 1f22430ed48747017cf338e44aa949cbf836c70d Mon Sep 17 00:00:00 2001 From: Fred Gleason Date: Thu, 4 Aug 2022 19:31:48 -0400 Subject: [PATCH] 2022-08-04 Fred Gleason * Added support for sorting the event list in rdcatch(1). Signed-off-by: Fred Gleason --- ChangeLog | 2 ++ rdcatch/rdcatch.cpp | 2 ++ rdcatch/recordlistmodel.cpp | 68 ++++++++++++++++++++++++++++++++++--- rdcatch/recordlistmodel.h | 7 +++- 4 files changed, 73 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3dc78794..175316ba 100644 --- a/ChangeLog +++ b/ChangeLog @@ -23227,3 +23227,5 @@ * Added a 'Router' column to the event list in rdcatch(1). 2022-08-04 Fred Gleason * Added the ability to filter rdcatch(1) events by switcher matrix. +2022-08-04 Fred Gleason + * Added support for sorting the event list in rdcatch(1). diff --git a/rdcatch/rdcatch.cpp b/rdcatch/rdcatch.cpp index 2f452b2b..7476410d 100644 --- a/rdcatch/rdcatch.cpp +++ b/rdcatch/rdcatch.cpp @@ -379,6 +379,8 @@ MainWidget::MainWidget(RDConfig *c,QWidget *parent) catch_recordings_model ,SLOT(notificationReceivedData(RDNotification *))); catch_recordings_view->setModel(catch_recordings_model); + catch_recordings_view->setSortingEnabled(true); + catch_recordings_view->sortByColumn(2,Qt::AscendingOrder); catch_recordings_view->resizeColumnsToContents(); connect(catch_recordings_view,SIGNAL(doubleClicked(const QModelIndex &)), this,SLOT(doubleClickedData(const QModelIndex &))); diff --git a/rdcatch/recordlistmodel.cpp b/rdcatch/recordlistmodel.cpp index ec33dc72..d23e4c91 100644 --- a/rdcatch/recordlistmodel.cpp +++ b/rdcatch/recordlistmodel.cpp @@ -29,6 +29,11 @@ RecordListModel::RecordListModel(QObject *parent) : QAbstractTableModel(parent) { + d_sort_column=0; + d_sort_order=Qt::AscendingOrder; + d_sort_clauses[Qt::AscendingOrder]="asc"; + d_sort_clauses[Qt::DescendingOrder]="desc"; + // // Column Attributes // @@ -38,104 +43,138 @@ RecordListModel::RecordListModel(QObject *parent) d_headers.push_back(tr("Description")); // 00 d_alignments.push_back(left); + d_order_columns.push_back("`RECORDINGS`.`DESCRIPTION`"); d_headers.push_back(tr("Location")); // 01 d_alignments.push_back(left); + d_order_columns.push_back("`RECORDINGS`.`STATION_NAME`"); d_headers.push_back(tr("Start")); // 02 d_alignments.push_back(left); + d_order_columns.push_back("`RECORDINGS`.`START_TIME`"); d_headers.push_back(tr("End")); // 03 d_alignments.push_back(left); + d_order_columns.push_back("`RECORDINGS`.`END_TIME`"); d_headers.push_back(tr("Router")); // 04 d_alignments.push_back(left); + d_order_columns.push_back("`RECORDINGS`.`CHANNEL`"); d_headers.push_back(tr("Source")); // 05 d_alignments.push_back(left); + d_order_columns.push_back("`RECORDINGS`.`SWITCH_INPUT`"); d_headers.push_back(tr("Destination")); // 06 d_alignments.push_back(left); + d_order_columns.push_back("`RECORDINGS`.`SWITCH_OUTPUT`"); d_headers.push_back(tr("Su")); // 07 d_alignments.push_back(left); + d_order_columns.push_back("`RECORDINGS`.`SUN`"); d_headers.push_back(tr("Mo")); // 08 d_alignments.push_back(left); + d_order_columns.push_back(""); d_headers.push_back(tr("Tu")); // 09 d_alignments.push_back(left); + d_order_columns.push_back(""); d_headers.push_back(tr("We")); // 10 d_alignments.push_back(left); + d_order_columns.push_back(""); d_headers.push_back(tr("Th")); // 11 d_alignments.push_back(center); + d_order_columns.push_back(""); d_headers.push_back(tr("Fr")); // 12 d_alignments.push_back(center); + d_order_columns.push_back(""); d_headers.push_back(tr("Sa")); // 13 d_alignments.push_back(left); + d_order_columns.push_back(""); d_headers.push_back(tr("RSS Feed")); // 14 d_alignments.push_back(left); + d_order_columns.push_back("`FEEDS`.`KEY_NAME`"); d_headers.push_back(tr("Origin")); // 15 d_alignments.push_back(left); + d_order_columns.push_back("`CUTS`.`ORIGIN_NAME`"); d_headers.push_back(tr("One Shot")); // 16 d_alignments.push_back(left); + d_order_columns.push_back("`RECORDINGS`.`ONE_SHOT`"); d_headers.push_back(tr("Trim Threshold")); // 17 d_alignments.push_back(left); + d_order_columns.push_back("`RECORDINGS`.`TRIM_THRESHOLD`"); d_headers.push_back(tr("StartDate Offset")); // 18 d_alignments.push_back(left); + d_order_columns.push_back("`RECORDINGS`.`STARTDATE_OFFSET`"); d_headers.push_back(tr("EndDate Offset")); // 19 d_alignments.push_back(left); + d_order_columns.push_back("`RECORDINGS`.`ENDDATE_OFFSET`"); d_headers.push_back(tr("Format")); // 20 d_alignments.push_back(left); + d_order_columns.push_back("`RECORDINGS`.`FORMAT`"); d_headers.push_back(tr("Channels")); // 21 d_alignments.push_back(left); + d_order_columns.push_back("`RECORDINGS`.`CHANNELS`"); d_headers.push_back(tr("Sample Rate")); // 22 d_alignments.push_back(left); + d_order_columns.push_back("`RECORDINGS`.`SAMPRATE`"); d_headers.push_back(tr("Bit Rate")); // 23 d_alignments.push_back(left); + d_order_columns.push_back("`RECORDINGS`.`BITRATE`"); d_headers.push_back(tr("Host")); // 24 d_alignments.push_back(left); + d_order_columns.push_back(""); d_headers.push_back(tr("Deck")); // 25 d_alignments.push_back(left); + d_order_columns.push_back(""); d_headers.push_back(tr("Cut")); // 26 d_alignments.push_back(left); + d_order_columns.push_back(""); d_headers.push_back(tr("Cart")); // 27 d_alignments.push_back(left); + d_order_columns.push_back(""); d_headers.push_back(tr("ID")); // 28 d_alignments.push_back(left); + d_order_columns.push_back("`RECORDINGS`.`ID`"); d_headers.push_back(tr("Type")); // 29 d_alignments.push_back(left); + d_order_columns.push_back("`RECORDINGS`.`TYPE`"); d_headers.push_back(tr("Status")); // 30 d_alignments.push_back(left); + d_order_columns.push_back(""); d_headers.push_back(tr("Exit Code")); // 31 d_alignments.push_back(left); + d_order_columns.push_back("`RECORDINGS`.`EXIT_CODE`"); d_headers.push_back(tr("State")); // 32 d_alignments.push_back(left); + d_order_columns.push_back(""); - updateModel(); + setFilterSql(""); + // updateModel(); } @@ -227,6 +266,14 @@ QVariant RecordListModel::data(const QModelIndex &index,int role) const } +void RecordListModel::sort(int col,Qt::SortOrder order) +{ + d_sort_column=col; + d_sort_order=order; + setFilterSql(d_filter_sql); +} + + unsigned RecordListModel::recordId(const QModelIndex &row) const { return d_ids.at(row.row()); @@ -453,10 +500,18 @@ bool RecordListModel::refresh(unsigned id) void RecordListModel::setFilterSql(const QString &sql) { - if(sql!=d_filter_sql) { - d_filter_sql=sql; - updateModel(); + QString fsql=sql; + + d_filter_sql=sql; + if((d_sort_column<0)||(d_order_columns.at(d_sort_column).isEmpty())) { + // Use "natural" sort order + fsql+=" order by `RECORDINGS`.`START_TIME` asc "; } + else { + fsql+=" order by "+d_order_columns.at(d_sort_column)+" "+ + d_sort_clauses.value(d_sort_order); + } + updateModel(fsql); } @@ -492,7 +547,7 @@ void RecordListModel::notificationReceivedData(RDNotification *notify) } -void RecordListModel::updateModel() +void RecordListModel::updateModel(const QString &filter_sql) { QList texts; QList icons; @@ -518,9 +573,12 @@ void RecordListModel::updateModel() // // Load Model Rows // + /* sql=sqlFields()+ d_filter_sql+ "order by `RECORDINGS`.`START_TIME` "; + */ + sql=sqlFields()+filter_sql; beginResetModel(); d_ids.clear(); d_types.clear(); diff --git a/rdcatch/recordlistmodel.h b/rdcatch/recordlistmodel.h index 455e4406..32c816f6 100644 --- a/rdcatch/recordlistmodel.h +++ b/rdcatch/recordlistmodel.h @@ -45,6 +45,7 @@ class RecordListModel : 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); unsigned recordId(const QModelIndex &row) const; RDRecording::Type recordType(const QModelIndex &row) const; RDRecording::ExitCode recordExitCode(const QModelIndex &row) const; @@ -72,7 +73,7 @@ class RecordListModel : public QAbstractTableModel void notificationReceivedData(RDNotification *notify); protected: - void updateModel(); + void updateModel(const QString &filter_sql); void updateRowLine(int line); void updateRow(int row,RDSqlQuery *q); QString sqlFields() const; @@ -81,6 +82,10 @@ class RecordListModel : public QAbstractTableModel QString GetSourceName(QString station,int matrix,int input); QString GetDestinationName(QString station,int matrix,int output); void UpdateStatus(int line); + int d_sort_column; + Qt::SortOrder d_sort_order; + QMap d_sort_clauses; + QStringList d_order_columns; QPalette d_palette; QFont d_font; QFont d_bold_font;