diff --git a/src/settings/documentsettings.kcfg b/src/settings/documentsettings.kcfg --- a/src/settings/documentsettings.kcfg +++ b/src/settings/documentsettings.kcfg @@ -16,5 +16,10 @@ Visible columns in the main editor window. - + + + Collapsed tree view items of statistics view window. + + + diff --git a/src/statistics/lessonstatisticsview.h b/src/statistics/lessonstatisticsview.h --- a/src/statistics/lessonstatisticsview.h +++ b/src/statistics/lessonstatisticsview.h @@ -28,7 +28,10 @@ public: LessonStatisticsView(QWidget *parent); + ~LessonStatisticsView(); void setModel(ContainerModel *model) Q_DECL_OVERRIDE; + void saveExpandedStatus() const; + void restoreExpandedStatus(); public Q_SLOTS: void adjustColumnWidths(); @@ -45,6 +48,10 @@ void setModel(QAbstractItemModel *model) Q_DECL_OVERRIDE { Q_UNUSED(model) } + void getCollapsedItems(QStringList &collapsedItems, const QModelIndex &item, + QString name) const; + void setCollapsedItems(const QStringList &collapsedItems, const QModelIndex &item, + QString name); }; #endif diff --git a/src/statistics/lessonstatisticsview.cpp b/src/statistics/lessonstatisticsview.cpp --- a/src/statistics/lessonstatisticsview.cpp +++ b/src/statistics/lessonstatisticsview.cpp @@ -34,6 +34,7 @@ #include "statisticsmodel.h" #include "keduvoclesson.h" #include "utils.h" +#include "documentsettings.h" // GradeDelegate shows the graphic colored bar in the statistics, @@ -115,6 +116,11 @@ this, &LessonStatisticsView::sectionResized); } +LessonStatisticsView::~LessonStatisticsView() +{ + saveExpandedStatus(); +} + void LessonStatisticsView::setModel(ContainerModel *model) { ContainerView::setModel(model); @@ -173,3 +179,76 @@ KEduVocLesson *lesson = static_cast(selectedIndex.internalPointer()); lesson->resetGrades(-1, KEduVocContainer::Recursive); } + +void LessonStatisticsView::saveExpandedStatus() const +{ + auto statisticsModel = qobject_cast(model()); + Q_ASSERT(statisticsModel != nullptr); + + QStringList collapsedItems; + getCollapsedItems(collapsedItems, statisticsModel->index(0, 0, QModelIndex()), QString()); + + const KEduVocDocument *doc = statisticsModel->document(); + if (doc != nullptr) { + DocumentSettings documentSettings(doc->url().url()); + documentSettings.setCollapsedStatisticsViewItems(collapsedItems); + documentSettings.save(); + } +} + +void LessonStatisticsView::getCollapsedItems(QStringList &collapsedItems, const QModelIndex &item, + QString name) const +{ + if (!item.isValid()) { + return; + } + + int rowCount = model()->rowCount(item); + if (rowCount > 0) { + // Item has children and therefore expandable + name += item.data().toString(); + if (!isExpanded(item)) { + collapsedItems << name; + } + for (int row = 0; row < rowCount; ++row) { + getCollapsedItems(collapsedItems, model()->index(row, 0, item), name + '/'); + } + } +} + +void LessonStatisticsView::restoreExpandedStatus() +{ + auto statisticsModel = qobject_cast(model()); + Q_ASSERT(statisticsModel != nullptr); + + const KEduVocDocument *doc = statisticsModel->document(); + if (doc != nullptr) { + DocumentSettings documentSettings(doc->url().url()); + documentSettings.load(); + QStringList collapsedItems = documentSettings.collapsedStatisticsViewItems(); + setCollapsedItems(collapsedItems, statisticsModel->index(0, 0, QModelIndex()), QString()); + } +} + +void LessonStatisticsView::setCollapsedItems(const QStringList &collapsedItems, + const QModelIndex &item, QString name) +{ + if (!item.isValid()) { + return; + } + + int rowCount = model()->rowCount(item); + if (rowCount > 0) { + // Item has children and therefore expandable + name += item.data().toString(); + if (collapsedItems.contains(name)) { + collapse(item); + } else { + expand(item); + } + for (int row = 0; row < rowCount; ++row) { + setCollapsedItems(collapsedItems, model()->index(row, 0, item), name + '/'); + } + } +} + diff --git a/src/statistics/statisticsmainwindow.cpp b/src/statistics/statisticsmainwindow.cpp --- a/src/statistics/statisticsmainwindow.cpp +++ b/src/statistics/statisticsmainwindow.cpp @@ -88,7 +88,7 @@ m_doc = doc; m_statisticsModel->setDocument(doc); m_ui->lessonStatistics->setModel(m_statisticsModel); - m_ui->lessonStatistics->expandAll(); + m_ui->lessonStatistics->restoreExpandedStatus(); m_ui->lessonStatistics->resizeColumnToContents(0); } @@ -330,7 +330,8 @@ void StatisticsMainWindow::updateModelSettings() { + m_ui->lessonStatistics->saveExpandedStatus(); m_statisticsModel->updateDocumentSettings(); - m_ui->lessonStatistics->expandAll(); + m_ui->lessonStatistics->restoreExpandedStatus(); } diff --git a/src/statistics/statisticsmodel.h b/src/statistics/statisticsmodel.h --- a/src/statistics/statisticsmodel.h +++ b/src/statistics/statisticsmodel.h @@ -55,6 +55,7 @@ Qt::DropActions supportedDragActions() const Q_DECL_OVERRIDE; void updateDocumentSettings(); + const KEduVocDocument *document() const; public slots: virtual void setDocument(KEduVocDocument *doc) Q_DECL_OVERRIDE; diff --git a/src/statistics/statisticsmodel.cpp b/src/statistics/statisticsmodel.cpp --- a/src/statistics/statisticsmodel.cpp +++ b/src/statistics/statisticsmodel.cpp @@ -199,3 +199,9 @@ endResetModel(); } + +const KEduVocDocument *StatisticsModel::document() const +{ + return m_doc; +} +