diff options
-rw-r--r-- | archivemodel.cpp | 2 | ||||
-rw-r--r-- | archivemodel.h | 3 | ||||
-rw-r--r-- | archiveview.cpp | 74 | ||||
-rw-r--r-- | archiveview.h | 26 | ||||
-rw-r--r-- | shemov.cpp | 1 |
5 files changed, 100 insertions, 6 deletions
diff --git a/archivemodel.cpp b/archivemodel.cpp index 5c3cb49..90c6cd9 100644 --- a/archivemodel.cpp +++ b/archivemodel.cpp @@ -10,7 +10,7 @@ #include "smtreeitem.h" #include "archivemodel.h" -ArchiveModel::ArchiveModel(const QStringList &headers, QObject *parent) : SmTreeModel(headers, parent), mOrder(SeriesName){ +ArchiveModel::ArchiveModel(const QStringList &headers, QObject *parent) : SmTreeModel(headers, parent), mOrder(NoOrder){ mDb = QSqlDatabase::database("treedb"); mAvailableOrders.insert("Series Name", SeriesName); mAvailableOrders.insert("Actor", Actor); diff --git a/archivemodel.h b/archivemodel.h index b4fdcd5..1f39717 100644 --- a/archivemodel.h +++ b/archivemodel.h @@ -18,11 +18,12 @@ class ArchiveModel : public SmTreeModel { public: enum CustomRoles { NameRole = Qt::UserRole + 1, SeriesIdRole = Qt::UserRole + 2, SeriesPartIdRole = Qt::UserRole + 3, SeriesPartRole = Qt::UserRole + 4, TypeRole = Qt::UserRole + 5, FavoriteRole = Qt::UserRole + 6, SubtitleRole = Qt::UserRole + 7, CountRole = Qt::UserRole + 8 }; enum Fields { Name = 0, GenericId = 1, SeriesPartId = 2, SeriesPart = 3, Type = 4, Favorite = 5, Subtitle = 6, Count = 7 }; - enum Order { SeriesName, Actor, Genre }; + enum Order { SeriesName, Actor, Genre, NoOrder }; enum { NumFields = 8 }; enum NodeType { SeriesNode, SeriesPartNode, GenreNode, ActorNode }; explicit ArchiveModel(const QStringList &headers, QObject *parent = 0); const QStringList availableOrders() const; + const QHash<QString, int> availableOrdersHash() const { return mAvailableOrders; } virtual QVariant data(const QModelIndex &index, int role) const; signals: diff --git a/archiveview.cpp b/archiveview.cpp index dc4b135..def3609 100644 --- a/archiveview.cpp +++ b/archiveview.cpp @@ -10,7 +10,7 @@ #include <QLabel> #include <QLineEdit> #include <QPushButton> -#include <QSortFilterProxyModel> +#include <QSettings> #include <QSplitter> #include <QVBoxLayout> @@ -18,11 +18,12 @@ #include "smglobals.h" ArchiveView::ArchiveView(QWidget *parent) : QWidget(parent) { + QSettings s; mArchiveModel = static_cast<ArchiveModel*>(SmGlobals::instance()->model("ArchiveModel")); - QSortFilterProxyModel *proxy = new QSortFilterProxyModel; - proxy->setSourceModel(mArchiveModel); + mProxy = new ArchiveProxy; + mProxy->setSourceModel(mArchiveModel); mTree = new ArchiveTree; - mTree->setModel(proxy); + mTree->setModel(mProxy); mTree->setColumnHidden(ArchiveModel::GenericId, true); mTree->setColumnHidden(ArchiveModel::SeriesPartId, true); mTree->setColumnHidden(ArchiveModel::SeriesPart, true); @@ -31,13 +32,22 @@ ArchiveView::ArchiveView(QWidget *parent) : QWidget(parent) { mTree->setColumnHidden(ArchiveModel::Subtitle, true); mTree->setColumnHidden(ArchiveModel::Count, true); mTree->resizeColumnToContents(ArchiveModel::Name); + QString sortOrderName = s.value("archivemodel/sortorder", "Series Name").toString(); mSortOrder = new QComboBox; mSortOrder->addItems(mArchiveModel->availableOrders()); connect(mSortOrder, SIGNAL(currentIndexChanged(QString)), mArchiveModel, SLOT(setOrder(QString))); + connect(mSortOrder, SIGNAL(currentTextChanged(QString)), mArchiveModel, SLOT(setOrder(QString))); + mSortOrder->setCurrentText(sortOrderName); QLabel *l1 = new QLabel(tr("Filter")); mFilter = new QLineEdit; + QString savedFilter = s.value("archivemodel/filter", QString()).toString(); + connect(mFilter, SIGNAL(returnPressed()), this, SLOT(setFilter())); QPushButton *filter = new QPushButton(tr("Filter")); + connect(filter, SIGNAL(clicked()), this, SLOT(setFilter())); QPushButton *clear = new QPushButton(tr("Clear")); + mFilter->setText(savedFilter); + connect(clear, SIGNAL(clicked()), this, SLOT(clearFilter())); + mProxy->setFilter(savedFilter, currentSortOrder()); QHBoxLayout *filterLayout = new QHBoxLayout; filterLayout->addWidget(l1); filterLayout->addWidget(mFilter); @@ -60,8 +70,64 @@ ArchiveView::ArchiveView(QWidget *parent) : QWidget(parent) { setLayout(mainLayout); } +int ArchiveView::currentSortOrder() const { + return mArchiveModel->availableOrdersHash().value(mSortOrder->currentText()); +} + +void ArchiveView::writeSettings() { + QSettings s; + s.setValue("archivemodel/sortorder", mSortOrder->currentText()); + s.setValue("archivemodel/filter", mFilter->text()); +} + +void ArchiveView::setFilter(){ + QString filter = mFilter->text(); + mProxy->setFilter(filter, currentSortOrder()); + mTree->expandAll(); +} + +void ArchiveView::clearFilter(){ + mFilter->clear(); + mProxy->setFilter(QString(), currentSortOrder()); + mTree->collapseAll(); +} + ArchiveTree::ArchiveTree(QWidget *parent) : SmTreeView(parent) { } ArchiveFiles::ArchiveFiles(QWidget *parent) : SmTreeView(parent){ } + +ArchiveProxy::ArchiveProxy(QObject *parent) : QSortFilterProxyModel(parent) {} + +void ArchiveProxy::setFilter(const QString &filter, int sortOrder){ + mFilter = QRegExp(filter); + mSortOrder = sortOrder; + invalidateFilter(); +} + +bool ArchiveProxy::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const { + if(mFilter.isEmpty()){ + return true; + } + QModelIndex nodeIdx = sourceModel()->index(sourceRow, ArchiveModel::Type, sourceParent); + if(mSortOrder == ArchiveModel::SeriesName){ + if(nodeIdx.data().toInt() == ArchiveModel::SeriesNode){ + QModelIndex nameIdx = sourceModel()->index(sourceRow, ArchiveModel::Name, sourceParent); + QString name = nameIdx.data().toString(); + return name.contains(mFilter); + }else{ + return true; + } + }else if(mSortOrder == ArchiveModel::Genre || mSortOrder == ArchiveModel::Actor){ + int nodeType = nodeIdx.data().toInt(); + if(nodeType == ArchiveModel::ActorNode || nodeType == ArchiveModel::GenreNode){ + QModelIndex nameIdx = sourceModel()->index(sourceRow, ArchiveModel::Name, sourceParent); + QString name = nameIdx.data().toString(); + return name.contains(mFilter); + }else{ + return true; + } + } + return false; +} diff --git a/archiveview.h b/archiveview.h index d97ca7f..b76e487 100644 --- a/archiveview.h +++ b/archiveview.h @@ -9,6 +9,8 @@ #define ARCHIVEVIEW_H #include <QWidget> +#include <QSortFilterProxyModel> +#include <QRegExp> #include "archivemodel.h" #include "smtreeview.h" @@ -19,11 +21,18 @@ class QLineEdit; class ArchiveTree; class ArchiveFiles; +class ArchiveProxy; class ArchiveView : public QWidget { Q_OBJECT public: explicit ArchiveView(QWidget *parent = 0); + int currentSortOrder() const; + void writeSettings(); + + private slots: + void setFilter(); + void clearFilter(); private: QComboBox *mSortOrder; @@ -31,6 +40,7 @@ class ArchiveView : public QWidget { ArchiveTree *mTree; ArchiveFiles *mFiles; ArchiveModel *mArchiveModel; + ArchiveProxy *mProxy; }; class ArchiveTree : public SmTreeView { @@ -47,4 +57,20 @@ class ArchiveFiles : public SmTreeView { explicit ArchiveFiles(QWidget *parent = 0); }; +class ArchiveProxy : public QSortFilterProxyModel { + Q_OBJECT + public: + ArchiveProxy(QObject *parent = 0); + + public slots: + void setFilter(const QString &filter, int sortOrder); + + protected: + bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const; + + private: + QRegExp mFilter; + int mSortOrder; +}; + #endif // ARCHIVEVIEW_H @@ -150,6 +150,7 @@ void SheMov::closeEvent(QCloseEvent *event){ mATree->filesWidget()->filesTree()->writeSettings(); mPicWidget->picViewer2()->writeSettings(); mPicWidget->writeSettings(); + mArchive->writeSettings(); writeSettings(); SmGlobals *globals = SmGlobals::instance(); delete globals; |