diff options
Diffstat (limited to 'archiveview.cpp')
-rw-r--r-- | archiveview.cpp | 74 |
1 files changed, 70 insertions, 4 deletions
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; +} |