diff options
| -rw-r--r-- | src/modinfodialog.cpp | 57 | ||||
| -rw-r--r-- | src/modinfodialog.h | 7 | ||||
| -rw-r--r-- | src/modinfodialogcategories.cpp | 5 | ||||
| -rw-r--r-- | src/modinfodialogcategories.h | 1 | ||||
| -rw-r--r-- | src/modinfodialognexus.cpp | 5 | ||||
| -rw-r--r-- | src/modinfodialognexus.h | 1 | ||||
| -rw-r--r-- | src/modinfodialogtab.cpp | 10 | ||||
| -rw-r--r-- | src/modinfodialogtab.h | 3 |
8 files changed, 68 insertions, 21 deletions
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<ModInfoDialogTab> 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<std::size_t>(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<QString> ModInfoDialog::getOrderedTabNames() const { - const auto value = Settings::instance() - .directInterface().value("mod_info_tabs"); + const auto& settings = Settings::instance().directInterface(); std::vector<QString> 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<QString> 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<bool>& 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<ModInfoDialogTab> tab);
+ bool isVisible() const;
};
std::unique_ptr<Ui::ModInfoDialog> 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<bool>& visibility, ETabs sel);
std::vector<QString> getOrderedTabNames() const;
+ void onOriginModified(std::size_t tabIndex, int originID);
template <class T>
std::unique_ptr<ModInfoDialogTab> 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<int>& 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(); |
