From d815f4615662b3b9525a05363a06bf25907c4315 Mon Sep 17 00:00:00 2001 From: Moritz Bunkus Date: Sat, 13 Nov 2021 20:30:55 +0100 Subject: [PATCH] GUI: headers: calculate top level pages on the fly, no caching Part of the implementation of #3227. --- .../header_editor/page_model.cpp | 34 +++++++++++-------- src/mkvtoolnix-gui/header_editor/page_model.h | 3 +- src/mkvtoolnix-gui/header_editor/tab.cpp | 6 ++-- 3 files changed, 23 insertions(+), 20 deletions(-) diff --git a/src/mkvtoolnix-gui/header_editor/page_model.cpp b/src/mkvtoolnix-gui/header_editor/page_model.cpp index 4c01063a0..312bbe6bf 100644 --- a/src/mkvtoolnix-gui/header_editor/page_model.cpp +++ b/src/mkvtoolnix-gui/header_editor/page_model.cpp @@ -53,8 +53,6 @@ PageModel::appendPage(PageBase *page, page->setItems(newItems); m_pages[pageId] = page; - if (!parentIdx.isValid()) - m_topLevelPages << page; } bool @@ -66,10 +64,6 @@ PageModel::deletePage(PageBase *page) { m_pages.remove(pageId); delete page; - auto idx = m_topLevelPages.indexOf(page); - if (-1 != idx) - m_topLevelPages.removeAt(idx); - return true; } @@ -83,23 +77,36 @@ PageModel::pages() return pages; } -QList const & +QList PageModel::topLevelPages() const { - return m_topLevelPages; + auto rootItem = invisibleRootItem(); + + QList pages; + pages.reserve(rootItem->rowCount()); + + for (int row = 0, numRows = rootItem->rowCount(); row < numRows; ++row) { + auto topLevelItem = rootItem->child(row); + auto pageId = topLevelItem->data(Util::HeaderEditorPageIdRole).value(); + + pages << m_pages[pageId]; + } + + return pages; } QList PageModel::allExpandablePages() const { - auto pages = m_topLevelPages; + auto allTopLevelPages = topLevelPages(); + auto expandablePages = allTopLevelPages; - for (auto const &page : m_topLevelPages) + for (auto const &page : allTopLevelPages) for (auto const &subPage : page->m_children) if (dynamic_cast(subPage)) - pages << static_cast(subPage); + expandablePages << static_cast(subPage); - return pages; + return expandablePages; } void @@ -110,7 +117,6 @@ PageModel::reset() { delete page; m_pages.clear(); - m_topLevelPages.clear(); removeRows(0, rowCount()); @@ -120,7 +126,7 @@ PageModel::reset() { QModelIndex PageModel::validate() const { - for (auto page : m_topLevelPages) { + for (auto page : topLevelPages()) { auto result = page->validate(); if (result.isValid()) return result; diff --git a/src/mkvtoolnix-gui/header_editor/page_model.h b/src/mkvtoolnix-gui/header_editor/page_model.h index d2f552a81..2fcf0a49f 100644 --- a/src/mkvtoolnix-gui/header_editor/page_model.h +++ b/src/mkvtoolnix-gui/header_editor/page_model.h @@ -16,7 +16,6 @@ class PageModel: public QStandardItemModel { Q_OBJECT protected: QHash m_pages; - QList m_topLevelPages; int m_pageId{}; QModelIndex m_lastSelectedIdx; @@ -30,7 +29,7 @@ public: bool deletePage(PageBase *page); QList pages() const; - QList const &topLevelPages() const; + QList topLevelPages() const; QList allExpandablePages() const; void reset(); diff --git a/src/mkvtoolnix-gui/header_editor/tab.cpp b/src/mkvtoolnix-gui/header_editor/tab.cpp index a52afd516..90df34332 100644 --- a/src/mkvtoolnix-gui/header_editor/tab.cpp +++ b/src/mkvtoolnix-gui/header_editor/tab.cpp @@ -407,8 +407,7 @@ Tab::title() PageBase * Tab::hasBeenModified() { - auto &pages = m_model->topLevelPages(); - for (auto const &page : pages) { + for (auto const &page : m_model->topLevelPages()) { auto modifiedPage = page->hasBeenModified(); if (modifiedPage) return modifiedPage; @@ -476,8 +475,7 @@ Tab::determineTrackUIDChanges() { void Tab::doModifications() { - auto &pages = m_model->topLevelPages(); - for (auto const &page : pages) + for (auto const &page : m_model->topLevelPages()) page->doModifications(); pruneEmptyMastersForAllTracks();