From 459f58c57bfa1021783134b11853e8e4140055f3 Mon Sep 17 00:00:00 2001 From: Arno Date: Sun, 2 Jun 2013 00:43:09 +0200 Subject: Remember expanded Items For the current SortOrder the expanded items are written to the config file and read on startup. --- archivemodel.cpp | 25 +++++++++++++++++++++++++ archivemodel.h | 2 ++ archiveview.cpp | 29 +++++++++++++++++++++++++++++ archiveview.h | 7 +++++++ shemov.cpp | 4 +++- 5 files changed, 66 insertions(+), 1 deletion(-) diff --git a/archivemodel.cpp b/archivemodel.cpp index c317c32..de95328 100644 --- a/archivemodel.cpp +++ b/archivemodel.cpp @@ -57,6 +57,31 @@ QVariant ArchiveModel::data(const QModelIndex &index, int role) const{ return SmTreeModel::data(index, role); } +QStringList ArchiveModel::indexToPath(const QModelIndex &idx) const { + QStringList retval; + SmTreeItem *item = itemAt(idx); + while (item) { + retval << item->data(Name).toString(); + item = item->parent(); + } + std::reverse(retval.begin(), retval.end()); + return retval; +} + +QModelIndexList ArchiveModel::pathToIndex(const QStringList &path) const { + QModelIndexList retval; + QModelIndex parentIdx = QModelIndex(); + for(int i = 0; i < path.count(); ++i){ + QString curItem = path.at(i); + QModelIndex found = find(curItem, Name, parentIdx); + if(found.isValid()){ + retval << found; + parentIdx = found; + } + } + return retval; +} + void ArchiveModel::setOrder(int order) { mOrder = order; SmTreeItem *rootItem = new SmTreeItem(NumFields); diff --git a/archivemodel.h b/archivemodel.h index c07fc7b..0f2eea7 100644 --- a/archivemodel.h +++ b/archivemodel.h @@ -29,6 +29,8 @@ class ArchiveModel : public SmTreeModel { const QHash availableOrdersHash() const { return mAvailableOrders; } ArchiveCollector *collector() { return mCollector; } virtual QVariant data(const QModelIndex &index, int role) const; + QStringList indexToPath(const QModelIndex &idx) const; + QModelIndexList pathToIndex(const QStringList &path) const; public slots: void setOrder(int order); diff --git a/archiveview.cpp b/archiveview.cpp index dbc3c39..9edfd0b 100644 --- a/archiveview.cpp +++ b/archiveview.cpp @@ -39,6 +39,8 @@ ArchiveView::ArchiveView(QWidget *parent) : QWidget(parent), mConstructing(true) mTree->setColumnHidden(ArchiveModel::Subtitle, true); mTree->setColumnHidden(ArchiveModel::Count, true); mTree->resizeColumnToContents(ArchiveModel::Name); + connect(mTree, SIGNAL(expanded(QModelIndex)), this, SLOT(expandItem(QModelIndex))); + connect(mTree, SIGNAL(collapsed(QModelIndex)), this, SLOT(collapseItem(QModelIndex))); QString sortOrderName = s.value("archivemodel/sortorder", "Series Name").toString(); mSortOrder = new QComboBox; @@ -89,12 +91,30 @@ void ArchiveView::writeSettings() { QSettings s; s.setValue("archivemodel/sortorder", mSortOrder->currentText()); s.setValue("archivemodel/filter", mFilter->text()); + QVariantList expandedItems; + foreach(QPersistentModelIndex idx, mExpandedItems){ + QStringList path = mArchiveModel->indexToPath(mProxy->mapToSource(idx)); + expandedItems << path; + } + s.setValue("archivemodel/expandeditems", expandedItems); } QWidget *ArchiveView::progressDialog(){ return qobject_cast(mProgress); } +void ArchiveView::setExpanded(){ + QSettings s; + QVariantList expanded = s.value("archivemodel/expandeditems").toList(); + foreach(QVariant pathList, expanded){ + QStringList path = pathList.toStringList(); + QModelIndexList expand = mArchiveModel->pathToIndex(path); + foreach(QModelIndex idx, expand){ + mTree->expand(mProxy->mapFromSource(idx)); + } + } +} + void ArchiveView::setFilter(){ QString filter = mFilter->text(); mProxy->setFilter(filter, currentSortOrder()); @@ -116,6 +136,15 @@ void ArchiveView::collectorStarted(){ void ArchiveView::collectorFinished(){ mProgress->hide(); + setExpanded(); +} + +void ArchiveView::expandItem(const QModelIndex &idx){ + mExpandedItems << QPersistentModelIndex(idx); +} + +void ArchiveView::collapseItem(const QModelIndex &idx){ + mExpandedItems.removeAll(QPersistentModelIndex(idx)); } ArchiveTree::ArchiveTree(QWidget *parent) : SmTreeView(parent) { diff --git a/archiveview.h b/archiveview.h index a62fd66..33969d9 100644 --- a/archiveview.h +++ b/archiveview.h @@ -35,13 +35,19 @@ class ArchiveView : public QWidget { // this is needed for displaying the progress dialog in the // center of the main window... void setConstructingDone() { mConstructing = false; } + ArchiveModel *archiveModel() { return mArchiveModel; } QWidget *progressDialog(); + public slots: + void setExpanded(); + private slots: void setFilter(); void clearFilter(); void collectorStarted(); void collectorFinished(); + void expandItem(const QModelIndex &idx); + void collapseItem(const QModelIndex &idx); private: QComboBox *mSortOrder; @@ -51,6 +57,7 @@ class ArchiveView : public QWidget { ArchiveModel *mArchiveModel; ArchiveProxy *mProxy; ArchiveProgressDialog *mProgress; + QList mExpandedItems; bool mConstructing; }; diff --git a/shemov.cpp b/shemov.cpp index 1baa7d5..0144a7d 100644 --- a/shemov.cpp +++ b/shemov.cpp @@ -142,7 +142,9 @@ SheMov::SheMov(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, fla mPicWidget->readSettings(); mArchive->setConstructingDone(); Helper::centerWidget(mArchive->progressDialog()); - mArchive->progressDialog()->show(); + if(mArchive->archiveModel()->collector()->isRunning()){ + mArchive->progressDialog()->show(); + } Helper::centerWidget(picViewer); } -- cgit v1.2.3-70-g09d2