mirror of
https://github.com/ModOrganizer2/modorganizer.git
synced 2026-07-27 13:58:24 -07:00
Show conflicts and highligth plugins from collapsed separators.
This commit is contained in:
@@ -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;
|
||||
|
||||
+28
-35
@@ -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;
|
||||
|
||||
@@ -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:
|
||||
|
||||
|
||||
+40
-47
@@ -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)
|
||||
void ModListView::setOverwriteMarkers(const QModelIndexList& indexes)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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)
|
||||
|
||||
+11
-8
@@ -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
|
||||
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)
|
||||
// clear overwrite markers (without repainting)
|
||||
//
|
||||
void setOverwriteMarkers(ModInfo::Ptr mod);
|
||||
void clearOverwriteMarkers();
|
||||
|
||||
// set overwrite markers from the mod in the given list and repaint (if the list
|
||||
// is empty, clear overwrite and repaint)
|
||||
//
|
||||
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;
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user