From fa73bdbdd04c059d26f4447af8a35a724b2bfcf9 Mon Sep 17 00:00:00 2001 From: Fred Gleason Date: Thu, 8 Dec 2022 15:43:08 -0500 Subject: [PATCH] 2022-12-08 Fred Gleason * Implemented column sorting for item lists in rdcastmanager(1). Signed-off-by: Fred Gleason --- ChangeLog | 2 ++ lib/rdpodcastlistmodel.cpp | 29 +++++++++++++++++++++++++++-- lib/rdpodcastlistmodel.h | 6 +++++- rdcastmanager/list_casts.cpp | 2 ++ 4 files changed, 36 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8faf29a2..25e96985 100644 --- a/ChangeLog +++ b/ChangeLog @@ -23781,3 +23781,5 @@ 2022-12-08 Fred Gleason * Fixed a bug in rdcastmanager(1) that could cause a segfault when uploading a new item. +2022-12-08 Fred Gleason + * Implemented column sorting for item lists in rdcastmanager(1). diff --git a/lib/rdpodcastlistmodel.cpp b/lib/rdpodcastlistmodel.cpp index a0550252..0b26e72b 100644 --- a/lib/rdpodcastlistmodel.cpp +++ b/lib/rdpodcastlistmodel.cpp @@ -2,7 +2,7 @@ // // Data model for Rivendell podcast episodes // -// (C) Copyright 2021 Fred Gleason +// (C) Copyright 2021-2022 Fred Gleason // // 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 @@ -30,6 +30,8 @@ RDPodcastListModel::RDPodcastListModel(unsigned feed_id,QObject *parent) d_feed_id=feed_id; d_font_metrics=NULL; d_bold_font_metrics=NULL; + d_sort_column=0; + d_sort_order=Qt::AscendingOrder; // // Column Attributes @@ -40,30 +42,39 @@ RDPodcastListModel::RDPodcastListModel(unsigned feed_id,QObject *parent) d_headers.push_back(tr("Title")); // 00 d_alignments.push_back(left); + d_column_fields.push_back("`PODCASTS`.`ITEM_TITLE`"); d_headers.push_back(tr("Status")); // 01 d_alignments.push_back(center); + d_column_fields.push_back("`PODCASTS`.`STATUS`"); d_headers.push_back(tr("Start")); // 02 d_alignments.push_back(left); + d_column_fields.push_back("`PODCASTS`.`EFFECTIVE_DATETIME`"); d_headers.push_back(tr("Expiration")); // 03 d_alignments.push_back(left); + d_column_fields.push_back("`PODCASTS`.`EXPIRATION_DATETIME`"); d_headers.push_back(tr("Length")); // 04 d_alignments.push_back(right); + d_column_fields.push_back("`PODCASTS`.`AUDIO_LENGTH`"); d_headers.push_back(tr("Feed")); // 05 d_alignments.push_back(center); + d_column_fields.push_back("`FEEDS`.`KEY_NAME`"); d_headers.push_back(tr("Category")); // 06 d_alignments.push_back(left); + d_column_fields.push_back("`FEEDS`.`CHANNEL_CATEGORY`"); d_headers.push_back(tr("Posted By")); // 07 d_alignments.push_back(left); + d_column_fields.push_back("`PODCASTS`.`ORIGIN_LOGIN_NAME`"); d_headers.push_back(tr("SHA1")); // 08 d_alignments.push_back(left); + d_column_fields.push_back("`PODCASTS`.`SHA1_HASH`"); updateModel(); } @@ -177,6 +188,16 @@ QVariant RDPodcastListModel::data(const QModelIndex &index,int role) const } +void RDPodcastListModel::sort(int col,Qt::SortOrder order) +{ + if((col!=d_sort_column)||(order!=d_sort_order)) { + d_sort_column=col; + d_sort_order=order; + updateModel(); + } +} + + unsigned RDPodcastListModel::castId(const QModelIndex &row) const { return d_cast_ids.at(row.row()); @@ -304,7 +325,11 @@ void RDPodcastListModel::updateModel() "where "+ QString::asprintf("`PODCASTS`.`FEED_ID`=%u ",d_feed_id)+ d_filter_sql+ - " order by `PODCASTS`.`ORIGIN_DATETIME` desc"; + " order by "+d_column_fields.at(d_sort_column)+" "; + if(d_sort_order==Qt::DescendingOrder) { + sql+="desc "; + } + beginResetModel(); d_cast_ids.clear(); d_texts.clear(); diff --git a/lib/rdpodcastlistmodel.h b/lib/rdpodcastlistmodel.h index bc4a16f7..3ac7c13f 100644 --- a/lib/rdpodcastlistmodel.h +++ b/lib/rdpodcastlistmodel.h @@ -2,7 +2,7 @@ // // Data model for Rivendell podcast episodes // -// (C) Copyright 2021 Fred Gleason +// (C) Copyright 2021-2022 Fred Gleason // // 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 @@ -44,6 +44,7 @@ class RDPodcastListModel : 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 castId(const QModelIndex &row) const; QModelIndex addCast(unsigned cast_id); void removeCast(const QModelIndex &row); @@ -75,6 +76,9 @@ class RDPodcastListModel : public QAbstractTableModel QList > d_icons; unsigned d_feed_id; QString d_filter_sql; + QStringList d_column_fields; + int d_sort_column; + Qt::SortOrder d_sort_order; }; diff --git a/rdcastmanager/list_casts.cpp b/rdcastmanager/list_casts.cpp index 6e6abfa7..0d34812f 100644 --- a/rdcastmanager/list_casts.cpp +++ b/rdcastmanager/list_casts.cpp @@ -81,6 +81,8 @@ ListCasts::ListCasts(unsigned feed_id,QWidget *parent) list_casts_label->setFont(bigLabelFont()); list_casts_label->setAlignment(Qt::AlignLeft|Qt::AlignVCenter); list_casts_view=new RDTableView(this); + list_casts_view->setSortingEnabled(true); + list_casts_view->sortByColumn(2,Qt::DescendingOrder); list_casts_model=new RDPodcastListModel(feed_id,this); list_casts_model->setFont(font()); list_casts_model->setPalette(palette());