diff options
| author | Mikaël Capelle <capelle.mikael@gmail.com> | 2021-01-07 20:11:26 +0100 |
|---|---|---|
| committer | Mikaël Capelle <capelle.mikael@gmail.com> | 2021-01-10 10:27:30 +0100 |
| commit | f919e0917344d7396f03423ef4fcd4d41fe37b07 (patch) | |
| tree | 3cf695b5ce9d77da121a8088a67272654d689921 /src | |
| parent | 5765439c7cff4e314a0c5732432bdb7b20e91efd (diff) | |
Show conflicts and highligth plugins from collapsed separators.
Diffstat (limited to 'src')
| -rw-r--r-- | src/modinfo.cpp | 1 | ||||
| -rw-r--r-- | src/modinfo.h | 63 | ||||
| -rw-r--r-- | src/modinfowithconflictinfo.h | 21 | ||||
| -rw-r--r-- | src/modlistview.cpp | 87 | ||||
| -rw-r--r-- | src/modlistview.h | 15 | ||||
| -rw-r--r-- | src/settingsdialog.ui | 6 |
6 files changed, 89 insertions, 104 deletions
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<unsigned int> ModInfo::s_EmptySet; std::vector<ModInfo::Ptr> ModInfo::s_Collection; ModInfo::Ptr ModInfo::s_Overwrite; std::map<QString, unsigned int> 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<unsigned int> getModOverwrite() const { - return std::set<unsigned int>(); } + // retrieve the list of mods (as mod index) that are overwritten by this one. + // Updates may be delayed. + // + virtual const std::set<unsigned int>& getModOverwrite() const { return s_EmptySet; } - /** - * @return list of mods (as mod index) that overwrite this one. Updates may be delayed. - */ - virtual std::set<unsigned int> getModOverwritten() const { - return std::set<unsigned int>(); } + // retrieve the list of mods (as mod index) that overwrite this one. + // Updates may be delayed. + // + virtual const std::set<unsigned int>& 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<unsigned int> getModArchiveOverwrite() const { - return std::set<unsigned int>(); } + // retrieve the list of mods (as mod index) with archives that are overwritten by + // this one. Updates may be delayed + // + virtual const std::set<unsigned int>& 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<unsigned int> getModArchiveOverwritten() const { - return std::set<unsigned int>(); } + // retrieve the list of mods (as mod index) with archives that overwrite this one. Updates + // may be delayed. + // + virtual const std::set<unsigned int>& 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<unsigned int> getModArchiveLooseOverwrite() const { - return std::set<unsigned int>(); } + // 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<unsigned int>& 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<unsigned int> getModArchiveLooseOverwritten() const { - return std::set<unsigned int>(); } + // 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<unsigned int>& 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<unsigned int> 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<unsigned int> getModOverwrite() const override { return m_OverwriteList; } + const std::set<unsigned int>& getModOverwrite() const override { return m_OverwriteList; } + const std::set<unsigned int>& getModOverwritten() const override { return m_OverwrittenList; } + const std::set<unsigned int>& getModArchiveOverwrite() const override { return m_ArchiveOverwriteList; } + const std::set<unsigned int>& getModArchiveOverwritten() const override { return m_ArchiveOverwrittenList; } + const std::set<unsigned int>& getModArchiveLooseOverwrite() const override { return m_ArchiveLooseOverwriteList; } + const std::set<unsigned int>& getModArchiveLooseOverwritten() const override { return m_ArchiveLooseOverwrittenList; } - virtual std::set<unsigned int> getModOverwritten() const override { return m_OverwrittenList; } - - virtual std::set<unsigned int> getModArchiveOverwrite() const override { return m_ArchiveOverwriteList; } - - virtual std::set<unsigned int> getModArchiveOverwritten() const override { return m_ArchiveOverwrittenList; } - - virtual std::set<unsigned int> getModArchiveLooseOverwrite() const override { return m_ArchiveLooseOverwriteList; } - - virtual std::set<unsigned int> 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<unsigned int> 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<unsigned int>& overwrite, const std::set<unsigned int>& overwritten)
-{
- m_markers.overwrite = overwrite;
- m_markers.overwritten = overwritten;
-}
-
-void ModListView::setArchiveOverwriteMarkers(const std::set<unsigned int>& overwrite, const std::set<unsigned int>& overwritten)
-{
- m_markers.archiveOverwrite = overwrite;
- m_markers.archiveOverwritten = overwritten;
-}
-
-void ModListView::setArchiveLooseOverwriteMarkers(const std::set<unsigned int>& overwrite, const std::set<unsigned int>& 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<unsigned int> 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<ModListSortProxy::Criteria>& 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<unsigned int>& overwrite, const std::set<unsigned int>& overwritten);
- void setArchiveOverwriteMarkers(const std::set<unsigned int>& overwrite, const std::set<unsigned int>& overwritten);
- void setArchiveLooseOverwriteMarkers(const std::set<unsigned int>& overwrite, const std::set<unsigned int>& 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 <item> <widget class="QCheckBox" name="collapsibleSeparatorsConflictsBox"> <property name="toolTip"> - <string>Display mod conflicts on separator when collapsed.</string> + <string>Display mod conflicts on and from separator when collapsed, and show plugins from collapsed separators.</string> </property> <property name="whatsThis"> - <string>Display mod conflicts on separator when collapsed.</string> + <string>Display mod conflicts on and from separator when collapsed, and show plugins from collapsed separators.</string> </property> <property name="text"> - <string>Show conflicts on separators</string> + <string>Show conflicts and plugins on separators and from separators</string> </property> <property name="checked"> <bool>true</bool> |
