/* This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include "archiveview.h" #include "smglobals.h" ArchiveView::ArchiveView(QWidget *parent) : QWidget(parent) { QSettings s; mArchiveModel = static_cast(SmGlobals::instance()->model("ArchiveModel")); mProxy = new ArchiveProxy; mProxy->setSourceModel(mArchiveModel); mTree = new ArchiveTree; mTree->setModel(mProxy); mTree->setColumnHidden(ArchiveModel::GenericId, true); mTree->setColumnHidden(ArchiveModel::SeriesPartId, true); mTree->setColumnHidden(ArchiveModel::SeriesPart, true); mTree->setColumnHidden(ArchiveModel::Type, true); mTree->setColumnHidden(ArchiveModel::Favorite, true); 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); filterLayout->addWidget(filter); filterLayout->addWidget(clear); QVBoxLayout *treeLayout = new QVBoxLayout; treeLayout->addWidget(mSortOrder); treeLayout->addLayout(filterLayout); treeLayout->addWidget(mTree); QWidget *treeWidget = new QWidget; treeWidget->setLayout(treeLayout); mFiles = new ArchiveFiles; QSplitter *treeSplitter = new QSplitter(Qt::Horizontal); treeSplitter->addWidget(treeWidget); treeSplitter->addWidget(mFiles); treeSplitter->setStretchFactor(0, 1); treeSplitter->setStretchFactor(1, 4); QHBoxLayout *mainLayout = new QHBoxLayout; mainLayout->addWidget(treeSplitter); 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; }