From f14f2bad3ba7440d6f36657f32d00c89cae54623 Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Mon, 24 Jun 2019 10:35:31 -0400 Subject: don't update invisible tabs update tabs when origin changes change setting name because 2.2.0 can't handle the text list --- src/modinfodialog.cpp | 57 ++++++++++++++++++++++++++++------------- src/modinfodialog.h | 7 ++--- src/modinfodialogcategories.cpp | 5 ++++ src/modinfodialogcategories.h | 1 + src/modinfodialognexus.cpp | 5 ++++ src/modinfodialognexus.h | 1 + src/modinfodialogtab.cpp | 10 ++++++++ src/modinfodialogtab.h | 3 +++ 8 files changed, 68 insertions(+), 21 deletions(-) (limited to 'src') diff --git a/src/modinfodialog.cpp b/src/modinfodialog.cpp index c03739ca..4c169cc4 100644 --- a/src/modinfodialog.cpp +++ b/src/modinfodialog.cpp @@ -100,6 +100,12 @@ ModInfoDialog::TabInfo::TabInfo(std::unique_ptr tab) { } +bool ModInfoDialog::TabInfo::isVisible() const +{ + return (realPos != -1); +} + + ModInfoDialog::ModInfoDialog( MainWindow* mw, OrganizerCore* core, PluginContainer* plugin) : TutorableDialog("ModInfoDialog", mw), @@ -126,7 +132,9 @@ ModInfoDialog::ModInfoDialog( connect( tabInfo.tab.get(), &ModInfoDialogTab::originModified, - [&](int originID){ emit originModified(originID); }); + [this, i](int originID) { + onOriginModified(static_cast(i), originID); + }); connect( tabInfo.tab.get(), &ModInfoDialogTab::modOpen, @@ -207,9 +215,8 @@ void ModInfoDialog::update(bool firstTime) { setWindowTitle(m_mod->name()); setTabsVisibility(firstTime); + updateTabs(); - feedFiles(); - setTabsColors(); if (m_initialTab >= 0) { switchToTab(m_initialTab); @@ -261,18 +268,29 @@ void ModInfoDialog::setTabsVisibility(bool firstTime) reAddTabs(visibility, sel); } -void ModInfoDialog::updateTabs() +void ModInfoDialog::updateTabs(bool becauseOriginChanged) { auto* origin = getOrigin(); for (auto& tabInfo : m_tabs) { + if (!tabInfo.isVisible()) { + continue; + } + + if (becauseOriginChanged && !tabInfo.tab->usesOriginFiles()) { + continue; + } + tabInfo.tab->setMod(m_mod, origin); tabInfo.tab->clear(); tabInfo.tab->update(); } + + feedFiles(becauseOriginChanged); + setTabsColors(); } -void ModInfoDialog::feedFiles() +void ModInfoDialog::feedFiles(bool becauseOriginChanged) { const auto rootPath = m_mod->absolutePath(); @@ -282,6 +300,14 @@ void ModInfoDialog::feedFiles() QString fileName = dirIterator.next(); for (auto& tabInfo : m_tabs) { + if (!tabInfo.isVisible()) { + continue; + } + + if (becauseOriginChanged && !tabInfo.tab->usesOriginFiles()) { + continue; + } + if (tabInfo.tab->feedFile(rootPath, fileName)) { break; } @@ -332,7 +358,7 @@ void ModInfoDialog::saveState(Settings& s) const { const auto tabState = saveTabState(); if (!tabState.isEmpty()) { - s.directInterface().setValue("mod_info_tabs", tabState); + s.directInterface().setValue("mod_info_tab_order", tabState); } for (const auto& tabInfo : m_tabs) { @@ -366,14 +392,13 @@ QString ModInfoDialog::saveTabState() const std::vector ModInfoDialog::getOrderedTabNames() const { - const auto value = Settings::instance() - .directInterface().value("mod_info_tabs"); + const auto& settings = Settings::instance().directInterface(); std::vector v; - if (value.type() == QVariant::ByteArray) { + if (settings.contains("mod_info_tabs")) { // old byte array - QDataStream stream(value.toByteArray()); + QDataStream stream(settings.value("mod_info_tabs").toByteArray()); int count = 0; stream >> count; @@ -385,7 +410,7 @@ std::vector ModInfoDialog::getOrderedTabNames() const } } else { // string list - QString string = value.toString(); + QString string = settings.value("mod_info_tab_order").toString(); QTextStream stream(&string); while (!stream.atEnd()) { @@ -458,14 +483,10 @@ void ModInfoDialog::reAddTabs(const std::vector& visibility, ETabs sel) } } -int ModInfoDialog::tabIndex(const QString& tabId) +void ModInfoDialog::onOriginModified(std::size_t tabIndex, int originID) { - for (int i = 0; i < ui->tabWidget->count(); ++i) { - if (ui->tabWidget->widget(i)->objectName() == tabId) { - return i; - } - } - return -1; + emit originModified(originID); + updateTabs(true); } void ModInfoDialog::onDeleteShortcut() diff --git a/src/modinfodialog.h b/src/modinfodialog.h index 54e056b8..31ea5536 100644 --- a/src/modinfodialog.h +++ b/src/modinfodialog.h @@ -116,6 +116,7 @@ private: QIcon icon; TabInfo(std::unique_ptr tab); + bool isVisible() const; }; std::unique_ptr ui; @@ -131,15 +132,15 @@ private: QString saveTabState() const; void update(bool firstTime=false); void onDeleteShortcut(); - int tabIndex(const QString &tabId); MOShared::FilesOrigin* getOrigin(); void setTabsVisibility(bool firstTime); - void updateTabs(); - void feedFiles(); + void updateTabs(bool becauseOriginChanged=false); + void feedFiles(bool becauseOriginChanged); void setTabsColors(); void switchToTab(ETabs id); void reAddTabs(const std::vector& visibility, ETabs sel); std::vector getOrderedTabNames() const; + void onOriginModified(std::size_t tabIndex, int originID); template std::unique_ptr createTab(int index) diff --git a/src/modinfodialogcategories.cpp b/src/modinfodialogcategories.cpp index 4bd10028..0d739d1f 100644 --- a/src/modinfodialogcategories.cpp +++ b/src/modinfodialogcategories.cpp @@ -42,6 +42,11 @@ bool CategoriesTab::canHandleSeparators() const return true; } +bool CategoriesTab::usesOriginFiles() const +{ + return false; +} + void CategoriesTab::add( const CategoryFactory &factory, const std::set& enabledCategories, QTreeWidgetItem* root, int rootLevel) diff --git a/src/modinfodialogcategories.h b/src/modinfodialogcategories.h index 738b4e4d..392023e7 100644 --- a/src/modinfodialogcategories.h +++ b/src/modinfodialogcategories.h @@ -12,6 +12,7 @@ public: void clear() override; void update() override; bool canHandleSeparators() const override; + bool usesOriginFiles() const override; private: void add( diff --git a/src/modinfodialognexus.cpp b/src/modinfodialognexus.cpp index 172968ab..d296e000 100644 --- a/src/modinfodialognexus.cpp +++ b/src/modinfodialognexus.cpp @@ -102,6 +102,11 @@ void NexusTab::setMod(ModInfo::Ptr mod, MOShared::FilesOrigin* origin) mod.data(), &ModInfo::modDetailsUpdated, [&]{ onModChanged(); }); } +bool NexusTab::usesOriginFiles() const +{ + return false; +} + void NexusTab::updateVersionColor() { if (mod()->getVersion() != mod()->getNewestVersion()) { diff --git a/src/modinfodialognexus.h b/src/modinfodialognexus.h index ce1ef426..a09f4316 100644 --- a/src/modinfodialognexus.h +++ b/src/modinfodialognexus.h @@ -42,6 +42,7 @@ public: void clear() override; void update() override; void setMod(ModInfo::Ptr mod, MOShared::FilesOrigin* origin) override; + bool usesOriginFiles() const override; private: QMetaObject::Connection m_modConnection; diff --git a/src/modinfodialogtab.cpp b/src/modinfodialogtab.cpp index 2f5fbdb8..009fb804 100644 --- a/src/modinfodialogtab.cpp +++ b/src/modinfodialogtab.cpp @@ -53,6 +53,11 @@ bool ModInfoDialogTab::canHandleUnmanaged() const return false; } +bool ModInfoDialogTab::usesOriginFiles() const +{ + return true; +} + void ModInfoDialogTab::setMod(ModInfo::Ptr mod, MOShared::FilesOrigin* origin) { m_mod = mod; @@ -158,3 +163,8 @@ void NotesTab::onNotes() mod()->setNotes(ui->notesEdit->toHtml()); } } + +bool NotesTab::usesOriginFiles() const +{ + return false; +} diff --git a/src/modinfodialogtab.h b/src/modinfodialogtab.h index fae5bc41..c85d2ded 100644 --- a/src/modinfodialogtab.h +++ b/src/modinfodialogtab.h @@ -27,10 +27,12 @@ public: virtual bool canClose(); virtual void saveState(Settings& s); virtual void restoreState(const Settings& s); + virtual bool deleteRequested(); virtual bool canHandleSeparators() const; virtual bool canHandleUnmanaged() const; + virtual bool usesOriginFiles() const; virtual void setMod(ModInfo::Ptr mod, MOShared::FilesOrigin* origin); @@ -81,6 +83,7 @@ public: void clear() override; void update() override; bool canHandleSeparators() const override; + bool usesOriginFiles() const override; private: void onComments(); -- cgit v1.3.1