From f919e0917344d7396f03423ef4fcd4d41fe37b07 Mon Sep 17 00:00:00 2001 From: Mikaƫl Capelle Date: Thu, 7 Jan 2021 20:11:26 +0100 Subject: Show conflicts and highligth plugins from collapsed separators. --- src/modinfo.cpp | 1 + src/modinfo.h | 63 ++++++++++++++----------------- src/modinfowithconflictinfo.h | 21 ++++------- src/modlistview.cpp | 87 ++++++++++++++++++++----------------------- src/modlistview.h | 15 +++++--- src/settingsdialog.ui | 6 +-- 6 files changed, 89 insertions(+), 104 deletions(-) (limited to 'src') diff --git a/src/modinfo.cpp b/src/modinfo.cpp index c76cb4ad..b46a68ab 100644 --- a/src/modinfo.cpp +++ b/src/modinfo.cpp @@ -49,6 +49,7 @@ using namespace MOBase; using namespace MOShared; +const std::set ModInfo::s_EmptySet; std::vector ModInfo::s_Collection; ModInfo::Ptr ModInfo::s_Overwrite; std::map ModInfo::s_ModsByName; diff --git a/src/modinfo.h b/src/modinfo.h index 08ed94f8..634ea900 100644 --- a/src/modinfo.h +++ b/src/modinfo.h @@ -868,46 +868,35 @@ public: // Nexus stuff public: // Conflicts - /** - * @return retrieve list of mods (as mod index) that are overwritten by this one. - * Updates may be delayed. - */ - virtual std::set getModOverwrite() const { - return std::set(); } + // retrieve the list of mods (as mod index) that are overwritten by this one. + // Updates may be delayed. + // + virtual const std::set& getModOverwrite() const { return s_EmptySet; } - /** - * @return list of mods (as mod index) that overwrite this one. Updates may be delayed. - */ - virtual std::set getModOverwritten() const { - return std::set(); } + // retrieve the list of mods (as mod index) that overwrite this one. + // Updates may be delayed. + // + virtual const std::set& getModOverwritten() const { return s_EmptySet; } - /** - * @return retrieve list of mods (as mod index) with archives that are overwritten by - * this one. Updates may be delayed - */ - virtual std::set getModArchiveOverwrite() const { - return std::set(); } + // retrieve the list of mods (as mod index) with archives that are overwritten by + // this one. Updates may be delayed + // + virtual const std::set& getModArchiveOverwrite() const { return s_EmptySet; } - /** - * @return list of mods (as mod index) with archives that overwrite this one. Updates - * may be delayed. - */ - virtual std::set getModArchiveOverwritten() const { - return std::set(); } + // retrieve the list of mods (as mod index) with archives that overwrite this one. Updates + // may be delayed. + // + virtual const std::set& getModArchiveOverwritten() const { return s_EmptySet; } - /** - * @return the list of mods (as mod index) with archives that are overwritten by loose - * files of this mod. Updates may be delayed. - */ - virtual std::set getModArchiveLooseOverwrite() const { - return std::set(); } + // retrieve the list of mods (as mod index) with archives that are overwritten by loose + // files of this mod. Updates may be delayed. + // + virtual const std::set& getModArchiveLooseOverwrite() const { return s_EmptySet; } - /** - * @return the list of mods (as mod index) with loose files that overwrite this one's - * archive files. Updates may be delayed. - */ - virtual std::set getModArchiveLooseOverwritten() const { - return std::set(); } + // retrieve the list of mods (as mod index) with loose files that overwrite this one's + // archive files. Updates may be delayed. + // + virtual const std::set& getModArchiveLooseOverwritten() const { return s_EmptySet; } /** * @brief Update conflict information. @@ -960,6 +949,10 @@ protected: MOBase::VersionInfo m_Version; bool m_PluginSelected = false; + // empty set that can be returned in overwrite functions by + // default + static const std::set s_EmptySet; + protected: friend class OrganizerCore; diff --git a/src/modinfowithconflictinfo.h b/src/modinfowithconflictinfo.h index 889f1246..c9cddb60 100644 --- a/src/modinfowithconflictinfo.h +++ b/src/modinfowithconflictinfo.h @@ -52,21 +52,16 @@ public: /** * @brief clear all caches held for this mod */ - virtual void clearCaches() override; + void clearCaches() override; - virtual std::set getModOverwrite() const override { return m_OverwriteList; } + const std::set& getModOverwrite() const override { return m_OverwriteList; } + const std::set& getModOverwritten() const override { return m_OverwrittenList; } + const std::set& getModArchiveOverwrite() const override { return m_ArchiveOverwriteList; } + const std::set& getModArchiveOverwritten() const override { return m_ArchiveOverwrittenList; } + const std::set& getModArchiveLooseOverwrite() const override { return m_ArchiveLooseOverwriteList; } + const std::set& getModArchiveLooseOverwritten() const override { return m_ArchiveLooseOverwrittenList; } - virtual std::set getModOverwritten() const override { return m_OverwrittenList; } - - virtual std::set getModArchiveOverwrite() const override { return m_ArchiveOverwriteList; } - - virtual std::set getModArchiveOverwritten() const override { return m_ArchiveOverwrittenList; } - - virtual std::set getModArchiveLooseOverwrite() const override { return m_ArchiveLooseOverwriteList; } - - virtual std::set getModArchiveLooseOverwritten() const override { return m_ArchiveLooseOverwrittenList; } - - virtual void doConflictCheck() const override; + void doConflictCheck() const override; public slots: diff --git a/src/modlistview.cpp b/src/modlistview.cpp index 7c770709..2c9634bd 100644 --- a/src/modlistview.cpp +++ b/src/modlistview.cpp @@ -417,7 +417,7 @@ void ModListView::onModPrioritiesChanged(const QModelIndexList& indices) } // update conflict check on the moved mod modInfo->doConflictCheck(); - setOverwriteMarkers(modInfo); + setOverwriteMarkers(selectionModel()->selectedRows()); } } } @@ -682,7 +682,8 @@ void ModListView::setup(OrganizerCore& core, CategoryFactory& factory, MainWindo m_actions = new ModListViewActions(core, *m_filters, factory, this, mwui->espList, mw); ui = { mwui->groupCombo, mwui->activeModsCounter, mwui->modFilterEdit, - mwui->currentCategoryLabel, mwui->clearFiltersButton, mwui->filtersSeparators + mwui->currentCategoryLabel, mwui->clearFiltersButton, mwui->filtersSeparators, + mwui->espList }; connect(m_core, &OrganizerCore::modInstalled, [=](auto&& name) { onModInstalled(name); }); @@ -765,16 +766,6 @@ void ModListView::setup(OrganizerCore& core, CategoryFactory& factory, MainWindo header()->setSectionResizeMode(ModList::COL_NAME, QHeaderView::Stretch); } - // highligth plugins - connect(selectionModel(), &QItemSelectionModel::selectionChanged, [=](auto&& selected) { - std::vector modIndices; - for (auto& idx : selectionModel()->selectedRows()) { - modIndices.push_back(idx.data(ModList::IndexRole).toInt()); - } - m_core->pluginList()->highlightPlugins(modIndices, *m_core->directoryStructure()); - mwui->espList->verticalScrollBar()->repaint(); - }); - // prevent the name-column from being hidden header()->setSectionHidden(ModList::COL_NAME, false); @@ -962,35 +953,23 @@ void ModListView::clearOverwriteMarkers() m_markers.archiveLooseOverwritten.clear(); } -void ModListView::setOverwriteMarkers(const std::set& overwrite, const std::set& overwritten) -{ - m_markers.overwrite = overwrite; - m_markers.overwritten = overwritten; -} - -void ModListView::setArchiveOverwriteMarkers(const std::set& overwrite, const std::set& overwritten) -{ - m_markers.archiveOverwrite = overwrite; - m_markers.archiveOverwritten = overwritten; -} - -void ModListView::setArchiveLooseOverwriteMarkers(const std::set& overwrite, const std::set& overwritten) -{ - m_markers.archiveLooseOverwrite = overwrite; - m_markers.archiveLooseOverwritten = overwritten; -} - -void ModListView::setOverwriteMarkers(ModInfo::Ptr mod) +void ModListView::setOverwriteMarkers(const QModelIndexList& indexes) { - if (mod) { - setOverwriteMarkers(mod->getModOverwrite(), mod->getModOverwritten()); - setArchiveOverwriteMarkers(mod->getModArchiveOverwrite(), mod->getModArchiveOverwritten()); - setArchiveLooseOverwriteMarkers(mod->getModArchiveLooseOverwrite(), mod->getModArchiveLooseOverwritten()); - } - else { - setOverwriteMarkers({}, {}); - setArchiveOverwriteMarkers({}, {}); - setArchiveLooseOverwriteMarkers({}, {}); + const auto insert = [](auto& dest, const auto& from) { + dest.insert(from.begin(), from.end()); + }; + clearOverwriteMarkers(); + for (auto& idx : indexes) { + auto mIndex = idx.data(ModList::IndexRole); + if (mIndex.isValid()) { + auto info = ModInfo::getByIndex(mIndex.toInt()); + insert(m_markers.overwrite, info->getModOverwrite()); + insert(m_markers.overwritten, info->getModOverwritten()); + insert(m_markers.archiveOverwrite, info->getModArchiveOverwrite()); + insert(m_markers.archiveOverwritten, info->getModArchiveOverwritten()); + insert(m_markers.archiveLooseOverwrite, info->getModArchiveLooseOverwrite()); + insert(m_markers.archiveLooseOverwritten, info->getModArchiveLooseOverwritten()); + } } dataChanged(model()->index(0, 0), model()->index(model()->rowCount(), model()->columnCount())); verticalScrollBar()->repaint(); @@ -1207,15 +1186,29 @@ void ModListView::onSelectionChanged(const QItemSelection& selected, const QItem } } - if (selected.count()) { - auto index = selected.indexes().last(); - ModInfo::Ptr selectedMod = ModInfo::getByIndex(index.data(ModList::IndexRole).toInt()); - setOverwriteMarkers(selectedMod); - } - else { - setOverwriteMarkers(nullptr); + QModelIndexList indexes = selectionModel()->selectedRows(); + + if (m_core->settings().interface().collapsibleSeparatorsConflicts()) { + for (auto& idx : selectionModel()->selectedRows()) { + if (hasCollapsibleSeparators() + && model()->hasChildren(idx) + && !isExpanded(idx)) { + for (int i = 0; i < model()->rowCount(idx); ++i) { + indexes.append(model()->index(i, idx.column(), idx)); + } + } + } } + setOverwriteMarkers(indexes); + + // highligth plugins + std::vector modIndices; + for (auto& idx : indexes) { + modIndices.push_back(idx.data(ModList::IndexRole).toInt()); + } + m_core->pluginList()->highlightPlugins(modIndices, *m_core->directoryStructure()); + ui.pluginList->verticalScrollBar()->repaint(); } void ModListView::onFiltersCriteria(const std::vector& criteria) diff --git a/src/modlistview.h b/src/modlistview.h index 08ecd935..53be08c5 100644 --- a/src/modlistview.h +++ b/src/modlistview.h @@ -23,6 +23,7 @@ class MainWindow; class Profile; class ModListByPriorityProxy; class ModListViewActions; +class PluginListView; class ModListView : public QTreeView { @@ -183,15 +184,14 @@ private: void onModInstalled(const QString& modName); void onModFilterActive(bool filterActive); - // overwrite markers + // clear overwrite markers (without repainting) + // void clearOverwriteMarkers(); - void setOverwriteMarkers(const std::set& overwrite, const std::set& overwritten); - void setArchiveOverwriteMarkers(const std::set& overwrite, const std::set& overwritten); - void setArchiveLooseOverwriteMarkers(const std::set& overwrite, const std::set& overwritten); - // set overwrite markers from the mod and repaint (if mod is nullptr, clear overwrite and repaint) + // set overwrite markers from the mod in the given list and repaint (if the list + // is empty, clear overwrite and repaint) // - void setOverwriteMarkers(ModInfo::Ptr mod); + void setOverwriteMarkers(const QModelIndexList& indexes); // retrieve the marker color for the given index // @@ -251,6 +251,9 @@ private: QLabel* currentCategory; QPushButton* clearFilters; QComboBox* filterSeparators; + + // the plugin list (for highligths) + PluginListView* pluginList; }; OrganizerCore* m_core; diff --git a/src/settingsdialog.ui b/src/settingsdialog.ui index a22beacd..527f9a91 100644 --- a/src/settingsdialog.ui +++ b/src/settingsdialog.ui @@ -318,13 +318,13 @@ If you disable this feature, MO will only display official DLCs this way. Please - Display mod conflicts on separator when collapsed. + Display mod conflicts on and from separator when collapsed, and show plugins from collapsed separators. - Display mod conflicts on separator when collapsed. + Display mod conflicts on and from separator when collapsed, and show plugins from collapsed separators. - Show conflicts on separators + Show conflicts and plugins on separators and from separators true -- cgit v1.3.1