summaryrefslogtreecommitdiff
path: root/src/modinfodialogconflicts.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/modinfodialogconflicts.cpp')
-rw-r--r--src/modinfodialogconflicts.cpp122
1 files changed, 74 insertions, 48 deletions
diff --git a/src/modinfodialogconflicts.cpp b/src/modinfodialogconflicts.cpp
index 715214b3..f405f0e1 100644
--- a/src/modinfodialogconflicts.cpp
+++ b/src/modinfodialogconflicts.cpp
@@ -11,6 +11,7 @@
using namespace MOShared;
using namespace MOBase;
+namespace fs = std::filesystem;
// if there are more than 50 selected items in the conflict tree, don't bother
// checking whether menu items apply to them, just show all of them
@@ -110,7 +111,7 @@ bool ConflictsTab::canHandleUnmanaged() const
return true;
}
-void ConflictsTab::changeItemsVisibility(QTreeView* tree, bool visible)
+void ConflictsTab::hideItems(QTreeView* tree)
{
bool changed = false;
bool stop = false;
@@ -119,19 +120,16 @@ void ConflictsTab::changeItemsVisibility(QTreeView* tree, bool visible)
// logging
{
- const QString action = (visible ? "unhiding" : "hiding");
-
QString files;
if (n > max_small_selection)
files = "a lot of";
else
files = QString("%1").arg(n);
- log::debug("{} {} conflict files", action, files);
+ log::debug("hiding {} conflict files", files);
}
- QFlags<FileRenamer::RenameFlags> flags =
- (visible ? FileRenamer::UNHIDE : FileRenamer::HIDE);
+ QFlags<FileRenamer::RenameFlags> flags = FileRenamer::HIDE;
if (n > 1) {
flags |= FileRenamer::MULTIPLE;
@@ -158,25 +156,13 @@ void ConflictsTab::changeItemsVisibility(QTreeView* tree, bool visible)
return false;
}
- auto result = FileRenamer::RESULT_CANCEL;
-
- if (visible) {
- if (!item->canUnhide()) {
- log::debug("cannot unhide {}, skipping", item->relativeName());
- return true;
- }
-
- result = unhideFile(renamer, item->fileName());
-
- } else {
- if (!item->canHide()) {
- log::debug("cannot hide {}, skipping", item->relativeName());
- return true;
- }
-
- result = hideFile(renamer, item->fileName());
+ if (!item->canHide()) {
+ log::debug("cannot hide {}, skipping", item->relativeName());
+ return true;
}
+ auto result = hideFile(renamer, item->fileName());
+
switch (result) {
case FileRenamer::RESULT_OK: {
// will trigger a refresh at the end
@@ -199,7 +185,7 @@ void ConflictsTab::changeItemsVisibility(QTreeView* tree, bool visible)
return true;
});
- log::debug("{} conflict files done", (visible ? "unhiding" : "hiding"));
+ log::debug("hiding conflict files done");
if (changed) {
log::debug("triggering refresh");
@@ -351,21 +337,12 @@ void ConflictsTab::showContextMenu(const QPoint& pos, QTreeView* tree)
// hide
if (actions.hide) {
connect(actions.hide, &QAction::triggered, [&] {
- changeItemsVisibility(tree, false);
+ hideItems(tree);
});
menu.addAction(actions.hide);
}
- // unhide
- if (actions.unhide) {
- connect(actions.unhide, &QAction::triggered, [&] {
- changeItemsVisibility(tree, true);
- });
-
- menu.addAction(actions.unhide);
- }
-
if (!menu.isEmpty()) {
if (actions.open || actions.preview || actions.runHooked) {
// bold the first option
@@ -386,7 +363,6 @@ ConflictsTab::Actions ConflictsTab::createMenuActions(QTreeView* tree)
}
bool enableHide = true;
- bool enableUnhide = true;
bool enableRun = true;
bool enableOpen = true;
bool enablePreview = true;
@@ -421,7 +397,6 @@ ConflictsTab::Actions ConflictsTab::createMenuActions(QTreeView* tree)
}
enableHide = item->canHide();
- enableUnhide = item->canUnhide();
enableRun = item->canRun();
enableOpen = item->canOpen();
enablePreview = item->canPreview(plugin());
@@ -443,19 +418,14 @@ ConflictsTab::Actions ConflictsTab::createMenuActions(QTreeView* tree)
if (n <= max_small_selection) {
// if the number of selected items is low, checking them to accurately
// show the menu items is worth it
- enableHide = false;
- enableUnhide = false;
+ enableHide = false;
forEachInSelection(tree, [&](const ConflictItem* item) {
if (item->canHide()) {
enableHide = true;
}
- if (item->canUnhide()) {
- enableUnhide = true;
- }
-
- if (enableHide && enableUnhide && enableGoto) {
+ if (enableHide && enableGoto) {
// found all, no need to check more
return false;
}
@@ -487,11 +457,6 @@ ConflictsTab::Actions ConflictsTab::createMenuActions(QTreeView* tree)
actions.hide = new QAction(tr("&Hide"), parentWidget());
actions.hide->setEnabled(enableHide);
- // note that it is possible for hidden files to appear if they override other
- // hidden files from another mod
- actions.unhide = new QAction(tr("&Unhide"), parentWidget());
- actions.unhide->setEnabled(enableUnhide);
-
if (enableGoto && n == 1) {
const auto* item =
model->getItem(static_cast<std::size_t>(modelSel.indexes()[0].row()));
@@ -633,8 +598,39 @@ bool GeneralConflictsTab::update()
if (m_tab->origin() != nullptr) {
const auto rootPath = m_tab->mod().absolutePath();
+ std::set<const DirectoryEntry*> checkedDirs;
for (const auto& file : m_tab->origin()->getFiles()) {
+ if (QString::fromStdWString(file->getName())
+ .endsWith(ModInfo::s_HiddenExt, Qt::CaseInsensitive)) {
+ // skip hidden file conflicts
+ continue;
+ } else {
+ const DirectoryEntry* parent = file->getParent();
+ auto hidden = false;
+ // iterate on all parent directory entries to check for .mohiddden
+ while (parent != nullptr) {
+ auto insertResult = checkedDirs.insert(parent);
+
+ if (insertResult.second == false) {
+ // if already present break as we can assume to have checked the parents as
+ // well
+ break;
+ } else {
+ if (QString::fromStdWString(parent->getName())
+ .endsWith(ModInfo::s_HiddenExt, Qt::CaseInsensitive)) {
+ hidden = true;
+ break;
+ }
+ parent = parent->getParent();
+ }
+ }
+ if (hidden) {
+ // skip hidden file conflicts
+ continue;
+ }
+ }
+
// careful: these two strings are moved into createXItem() below
QString relativeName =
QDir::fromNativeSeparators(ToQString(file->getRelativePath()));
@@ -954,8 +950,38 @@ void AdvancedConflictsTab::update()
const auto& files = m_tab->origin()->getFiles();
m_model->reserve(files.size());
+ std::set<const DirectoryEntry*> checkedDirs;
for (const auto& file : files) {
+ if (QString::fromStdWString(file->getName())
+ .endsWith(ModInfo::s_HiddenExt, Qt::CaseInsensitive)) {
+ // skip hidden file conflicts
+ continue;
+ } else {
+ const DirectoryEntry* parent = file->getParent();
+ auto hidden = false;
+ // iterate on all parent directory entries to check for .mohiddden
+ while (parent != nullptr) {
+ auto insertResult = checkedDirs.insert(parent);
+
+ if (insertResult.second == false) {
+ // if already present break as we can assume to have checked the parents as
+ // well
+ break;
+ } else {
+ if (QString::fromStdWString(parent->getName())
+ .endsWith(ModInfo::s_HiddenExt, Qt::CaseInsensitive)) {
+ hidden = true;
+ break;
+ }
+ parent = parent->getParent();
+ }
+ }
+ if (hidden) {
+ // skip hidden file conflicts
+ continue;
+ }
+ }
// careful: these two strings are moved into createItem() below
QString relativeName =
QDir::fromNativeSeparators(ToQString(file->getRelativePath()));