From 8fafcce33f1d5633cf1cb1acbb067fd485869bbf Mon Sep 17 00:00:00 2001 From: Mikaël Capelle Date: Sat, 16 Jan 2021 13:22:20 +0100 Subject: Add send to last conflict action for modlist. --- src/modlistviewactions.cpp | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'src/modlistviewactions.cpp') diff --git a/src/modlistviewactions.cpp b/src/modlistviewactions.cpp index ed26faa8..ded43284 100644 --- a/src/modlistviewactions.cpp +++ b/src/modlistviewactions.cpp @@ -576,10 +576,35 @@ void ModListViewActions::sendModsToSeparator(const QModelIndexList& index) const } m_core.modList()->changeModsPriority(index, newPriority); + m_view->scrollToAndSelect(index.first()); } } } +void ModListViewActions::sendModsToLastConflict(const QModelIndexList& indexes) const +{ + std::set conflicts; + + for (auto& idx : indexes) { + if (!idx.data(ModList::IndexRole).isValid()) { + continue; + } + auto info = ModInfo::getByIndex(idx.data(ModList::IndexRole).toInt()); + conflicts.insert(info->getModOverwritten().begin(), info->getModOverwritten().end()); + conflicts.insert(info->getModArchiveOverwritten().begin(), info->getModArchiveOverwritten().end()); + conflicts.insert(info->getModArchiveLooseOverwritten().begin(), info->getModArchiveLooseOverwritten().end()); + } + + std::set priorities; + std::transform(conflicts.begin(), conflicts.end(), std::inserter(priorities, priorities.end()), [=](auto index) { + return m_core.currentProfile()->getModPriority(index); + }); + + if (!priorities.empty()) { + m_core.modList()->changeModsPriority(indexes, *priorities.rbegin()); + } +} + void ModListViewActions::renameMod(const QModelIndex& index) const { try { -- cgit v1.3.1 From 56d039274776078cfff0565cf66fbb0b4852f90e Mon Sep 17 00:00:00 2001 From: Mikaël Capelle Date: Sat, 16 Jan 2021 15:01:33 +0100 Subject: Only consider loose files vs. loose files conflicts for 'Send to last conflict' entry. --- src/modlistcontextmenu.cpp | 5 +---- src/modlistviewactions.cpp | 2 -- 2 files changed, 1 insertion(+), 6 deletions(-) (limited to 'src/modlistviewactions.cpp') diff --git a/src/modlistcontextmenu.cpp b/src/modlistcontextmenu.cpp index dafffbff..cdadbf8a 100644 --- a/src/modlistcontextmenu.cpp +++ b/src/modlistcontextmenu.cpp @@ -244,10 +244,7 @@ void ModListContextMenu::addSendToContextMenu() static const std::vector overwritten_flags{ ModInfo::EConflictFlag::FLAG_CONFLICT_MIXED, ModInfo::EConflictFlag::FLAG_CONFLICT_OVERWRITTEN, - ModInfo::EConflictFlag::FLAG_CONFLICT_REDUNDANT, - ModInfo::EConflictFlag::FLAG_ARCHIVE_LOOSE_CONFLICT_OVERWRITTEN, - ModInfo::EConflictFlag::FLAG_ARCHIVE_CONFLICT_OVERWRITTEN, - ModInfo::EConflictFlag::FLAG_ARCHIVE_CONFLICT_MIXED + ModInfo::EConflictFlag::FLAG_CONFLICT_REDUNDANT }; bool overwritten = false; diff --git a/src/modlistviewactions.cpp b/src/modlistviewactions.cpp index ded43284..097c2538 100644 --- a/src/modlistviewactions.cpp +++ b/src/modlistviewactions.cpp @@ -591,8 +591,6 @@ void ModListViewActions::sendModsToLastConflict(const QModelIndexList& indexes) } auto info = ModInfo::getByIndex(idx.data(ModList::IndexRole).toInt()); conflicts.insert(info->getModOverwritten().begin(), info->getModOverwritten().end()); - conflicts.insert(info->getModArchiveOverwritten().begin(), info->getModArchiveOverwritten().end()); - conflicts.insert(info->getModArchiveLooseOverwritten().begin(), info->getModArchiveLooseOverwritten().end()); } std::set priorities; -- cgit v1.3.1 From 89a735d6e11b8339b5b350d15ddd8fbfdf7998f5 Mon Sep 17 00:00:00 2001 From: Mikaël Capelle Date: Sat, 16 Jan 2021 15:55:56 +0100 Subject: Maintain selection after 'Send to... ' and add send to first conflict. --- src/modlistcontextmenu.cpp | 15 +++++++++++-- src/modlistviewactions.cpp | 52 +++++++++++++++++++++++++++++++++++----------- src/modlistviewactions.h | 6 ++++++ 3 files changed, 59 insertions(+), 14 deletions(-) (limited to 'src/modlistviewactions.cpp') diff --git a/src/modlistcontextmenu.cpp b/src/modlistcontextmenu.cpp index cdadbf8a..8bc73e40 100644 --- a/src/modlistcontextmenu.cpp +++ b/src/modlistcontextmenu.cpp @@ -247,7 +247,12 @@ void ModListContextMenu::addSendToContextMenu() ModInfo::EConflictFlag::FLAG_CONFLICT_REDUNDANT }; - bool overwritten = false; + static const std::vector overwrite_flags{ + ModInfo::EConflictFlag::FLAG_CONFLICT_MIXED, + ModInfo::EConflictFlag::FLAG_CONFLICT_OVERWRITE + }; + + bool overwrite = false, overwritten = false; for (auto& idx : m_selected) { auto index = idx.data(ModList::IndexRole); if (index.isValid()) { @@ -256,7 +261,10 @@ void ModListContextMenu::addSendToContextMenu() if (std::find_first_of(flags.begin(), flags.end(), overwritten_flags.begin(), overwritten_flags.end()) != flags.end()) { overwritten = true; - break; + } + if (std::find_first_of(flags.begin(), flags.end(), + overwrite_flags.begin(), overwrite_flags.end()) != flags.end()) { + overwrite = true; } } } @@ -267,6 +275,9 @@ void ModListContextMenu::addSendToContextMenu() menu->addAction(tr("Highest priority"), [this] { m_actions.sendModsToBottom(m_selected); }); menu->addAction(tr("Priority..."), [this] { m_actions.sendModsToPriority(m_selected); }); menu->addAction(tr("Separator..."), [this] { m_actions.sendModsToSeparator(m_selected); }); + if (overwrite) { + menu->addAction(tr("First conflict"), [this] { m_actions.sendModsToFirstConflict(m_selected); }); + } if (overwritten) { menu->addAction(tr("Last conflict"), [this] { m_actions.sendModsToLastConflict(m_selected); }); } diff --git a/src/modlistviewactions.cpp b/src/modlistviewactions.cpp index 097c2538..03afa587 100644 --- a/src/modlistviewactions.cpp +++ b/src/modlistviewactions.cpp @@ -513,17 +513,24 @@ void ModListViewActions::displayModInformation(ModInfo::Ptr modInfo, unsigned in } } -void ModListViewActions::sendModsToTop(const QModelIndexList& index) const +void ModListViewActions::setModsPriority(const QModelIndexList& indexes, int priority) const { - m_core.modList()->changeModsPriority(index, 0); + auto [current, selected] = m_view->selected(); + m_core.modList()->changeModsPriority(indexes, priority); + m_view->setSelected(current, selected); } -void ModListViewActions::sendModsToBottom(const QModelIndexList& index) const +void ModListViewActions::sendModsToTop(const QModelIndexList& indexes) const { - m_core.modList()->changeModsPriority(index, std::numeric_limits::max()); + setModsPriority(indexes, 0); } -void ModListViewActions::sendModsToPriority(const QModelIndexList& index) const +void ModListViewActions::sendModsToBottom(const QModelIndexList& indexes) const +{ + setModsPriority(indexes, std::numeric_limits::max()); +} + +void ModListViewActions::sendModsToPriority(const QModelIndexList& indexes) const { bool ok; int priority = QInputDialog::getInt(m_parent, @@ -531,10 +538,10 @@ void ModListViewActions::sendModsToPriority(const QModelIndexList& index) const 0, 0, std::numeric_limits::max(), 1, &ok); if (!ok) return; - m_core.modList()->changeModsPriority(index, priority); + setModsPriority(indexes, priority); } -void ModListViewActions::sendModsToSeparator(const QModelIndexList& index) const +void ModListViewActions::sendModsToSeparator(const QModelIndexList& indexes) const { QStringList separators; auto indexesByPriority = m_core.currentProfile()->getAllIndexesByPriority(); @@ -570,14 +577,35 @@ void ModListViewActions::sendModsToSeparator(const QModelIndexList& index) const } } - if (index.size() == 1 - && m_core.currentProfile()->getModPriority(index[0].data(ModList::IndexRole).toInt()) < newPriority) { + if (indexes.size() == 1 + && m_core.currentProfile()->getModPriority(indexes[0].data(ModList::IndexRole).toInt()) < newPriority) { --newPriority; } - m_core.modList()->changeModsPriority(index, newPriority); - m_view->scrollToAndSelect(index.first()); + setModsPriority(indexes, newPriority); + } + } +} + +void ModListViewActions::sendModsToFirstConflict(const QModelIndexList& indexes) const +{ + std::set conflicts; + + for (auto& idx : indexes) { + if (!idx.data(ModList::IndexRole).isValid()) { + continue; } + auto info = ModInfo::getByIndex(idx.data(ModList::IndexRole).toInt()); + conflicts.insert(info->getModOverwrite().begin(), info->getModOverwrite().end()); + } + + std::set priorities; + std::transform(conflicts.begin(), conflicts.end(), std::inserter(priorities, priorities.end()), [=](auto index) { + return m_core.currentProfile()->getModPriority(index); + }); + + if (!priorities.empty()) { + setModsPriority(indexes, *priorities.begin()); } } @@ -599,7 +627,7 @@ void ModListViewActions::sendModsToLastConflict(const QModelIndexList& indexes) }); if (!priorities.empty()) { - m_core.modList()->changeModsPriority(indexes, *priorities.rbegin()); + setModsPriority(indexes, *priorities.rbegin()); } } diff --git a/src/modlistviewactions.h b/src/modlistviewactions.h index 153d0d2b..a3ae1b1a 100644 --- a/src/modlistviewactions.h +++ b/src/modlistviewactions.h @@ -62,6 +62,7 @@ public: void sendModsToBottom(const QModelIndexList& index) const; void sendModsToPriority(const QModelIndexList& index) const; void sendModsToSeparator(const QModelIndexList& index) const; + void sendModsToFirstConflict(const QModelIndexList& index) const; void sendModsToLastConflict(const QModelIndexList& index) const; // actions for most regular mods @@ -145,6 +146,11 @@ private: // void checkModsForUpdates(std::multimap const& IDs) const; + // set the priorities of the given mods while maintaining the + // mod list selection (which may be different from the list of mods) + // + void setModsPriority(const QModelIndexList& indexes, int priority) const; + private: OrganizerCore& m_core; -- cgit v1.3.1