summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--archivemodel.cpp2
-rw-r--r--archivemodel.h3
-rw-r--r--archiveview.cpp74
-rw-r--r--archiveview.h26
-rw-r--r--shemov.cpp1
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
diff --git a/shemov.cpp b/shemov.cpp
index 9859d2f..6c53879 100644
--- a/shemov.cpp
+++ b/shemov.cpp
@@ -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;