From 61b64d94313c8d6d456d44ec53c61d10e899d28c Mon Sep 17 00:00:00 2001 From: Al <26797547+Al12rs@users.noreply.github.com> Date: Mon, 20 Jan 2020 19:41:09 +0100 Subject: Make hidden files extension checks case insensitive --- src/modinfodialog.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/modinfodialog.cpp') diff --git a/src/modinfodialog.cpp b/src/modinfodialog.cpp index f5ca1de7..4b049a78 100644 --- a/src/modinfodialog.cpp +++ b/src/modinfodialog.cpp @@ -97,7 +97,7 @@ bool canHideFile(bool isArchive, const QString& filename) return false; } - if (filename.endsWith(ModInfo::s_HiddenExt)) { + if (filename.endsWith(ModInfo::s_HiddenExt, Qt::CaseInsensitive)) { // already hidden return false; } @@ -112,7 +112,7 @@ bool canUnhideFile(bool isArchive, const QString& filename) return false; } - if (!filename.endsWith(ModInfo::s_HiddenExt)) { + if (!filename.endsWith(ModInfo::s_HiddenExt, Qt::CaseInsensitive)) { // already visible return false; } -- cgit v1.3.1 From 7c55ae3a2233c1031504cefeab059b7a83fc5bf9 Mon Sep 17 00:00:00 2001 From: Al <26797547+Al12rs@users.noreply.github.com> Date: Mon, 20 Jan 2020 19:46:03 +0100 Subject: Add "Restore hidden files" context menu option to modlist. Recursively restores all hidden files in the mod or mods if more than one is selected. --- src/mainwindow.cpp | 99 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/mainwindow.h | 1 + src/modinfodialog.cpp | 40 ++++++++++++++++++++ src/modinfodialogfwd.h | 4 +- 4 files changed, 143 insertions(+), 1 deletion(-) (limited to 'src/modinfodialog.cpp') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 4f665872..a50e38e7 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -3201,6 +3201,99 @@ void MainWindow::markConverted_clicked() } +void MainWindow::restoreHiddenFiles_clicked() +{ + const int max_items = 20; + QItemSelectionModel* selection = ui->modList->selectionModel(); + + QFlags flags = FileRenamer::UNHIDE; + flags |= FileRenamer::MULTIPLE; + + FileRenamer renamer(this, flags); + + FileRenamer::RenameResults result = FileRenamer::RESULT_OK; + + // multi selection + if (selection->hasSelection() && selection->selectedRows().count() > 1) { + QString mods; + QStringList modNames; + int i = 0; + + for (QModelIndex idx : selection->selectedRows()) { + + QString name = idx.data().toString(); + int row_idx = idx.data(Qt::UserRole + 1).toInt(); + ModInfo::Ptr modInfo = ModInfo::getByIndex(row_idx); + const auto flags = modInfo->getFlags(); + + if (!modInfo->isRegular() || + std::find(flags.begin(), flags.end(), ModInfo::FLAG_HIDDEN_FILES) == flags.end()) { + continue; + } + + // adds an item for the mod name until `i` reaches `max_items`, which + // adds one "..." item; subsequent mods are not shown on the list but + // are still added to `modNames` below so they can be removed correctly + if (i < max_items) { + mods += "
  • " + name + "
  • "; + } + else if (i == max_items) { + mods += "
  • ...
  • "; + } + + modNames.append(ModInfo::getByIndex(idx.data(Qt::UserRole + 1).toInt())->name()); + ++i; + } + if (QMessageBox::question(this, tr("Confirm"), + tr("Restore all hidden files in the following mods?
    ").arg(mods), + QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { + + for (QModelIndex idx : selection->selectedRows()) { + + int row_idx = idx.data(Qt::UserRole + 1).toInt(); + ModInfo::Ptr modInfo = ModInfo::getByIndex(row_idx); + + const auto flags = modInfo->getFlags(); + if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_HIDDEN_FILES) != flags.end()) { + const QString modDir = modInfo->absolutePath(); + + auto partialResult = restoreHiddenFilesRecursive(renamer, modDir); + + if (partialResult == FileRenamer::RESULT_CANCEL) { + result = FileRenamer::RESULT_CANCEL; + break; + } + originModified((m_OrganizerCore.directoryStructure()->getOriginByName( + ToWString(modInfo->internalName()))).getID()); + } + } + } + } + else { + //single selection + ModInfo::Ptr modInfo = ModInfo::getByIndex(m_ContextRow); + const QString modDir = modInfo->absolutePath(); + + if (QMessageBox::question(this, tr("Are you sure?"), + tr("About to restore all hidden files in:\n") + modInfo->name(), + QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Ok) { + + result = restoreHiddenFilesRecursive(renamer, modDir); + + originModified((m_OrganizerCore.directoryStructure()->getOriginByName( + ToWString(modInfo->internalName()))).getID()); + } + } + + if (result == FileRenamer::RESULT_CANCEL){ + log::debug("Restoring hidden files operation cancelled"); + } + else { + log::debug("Finished restoring hidden files"); + } +} + + void MainWindow::visitOnNexus_clicked() { QItemSelectionModel *selection = ui->modList->selectionModel(); @@ -4725,6 +4818,10 @@ void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos) menu.addAction(tr("Remove Mod..."), this, SLOT(removeMod_clicked())); menu.addAction(tr("Create Backup"), this, SLOT(backupMod_clicked())); + if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_HIDDEN_FILES) != flags.end()) { + menu.addAction(tr("Restore hidden files"), this, SLOT(restoreHiddenFiles_clicked())); + } + menu.addSeparator(); if (info->getNexusID() > 0 && Settings::instance().nexus().endorsementIntegration()) { @@ -4774,6 +4871,8 @@ void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos) menu.addAction(tr("Mark as converted/working"), this, SLOT(markConverted_clicked())); } + menu.addSeparator(); + if (info->getNexusID() > 0) { menu.addAction(tr("Visit on Nexus"), this, SLOT(visitOnNexus_clicked())); } diff --git a/src/mainwindow.h b/src/mainwindow.h index 8f000983..2c45049a 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -421,6 +421,7 @@ private slots: void untrack_clicked(); void ignoreMissingData_clicked(); void markConverted_clicked(); + void restoreHiddenFiles_clicked(); void visitOnNexus_clicked(); void visitWebPage_clicked(); void openExplorer_clicked(); diff --git a/src/modinfodialog.cpp b/src/modinfodialog.cpp index 4b049a78..302175aa 100644 --- a/src/modinfodialog.cpp +++ b/src/modinfodialog.cpp @@ -133,6 +133,46 @@ FileRenamer::RenameResults unhideFile(FileRenamer& renamer, const QString &oldNa } +FileRenamer::RenameResults restoreHiddenFilesRecursive(FileRenamer& renamer, const QString& targetDir) +{ + FileRenamer::RenameResults results = FileRenamer::RESULT_OK; + QDir currentDir = targetDir; + for (QString hiddenFile : currentDir.entryList( + (QStringList() << "*" + ModInfo::s_HiddenExt), + QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot)) { + + QString oldName = currentDir.absoluteFilePath(hiddenFile); + QString newName = oldName.left(oldName.length() - ModInfo::s_HiddenExt.length()); + + auto partialResult = renamer.rename(oldName, newName); + + if (partialResult == FileRenamer::RESULT_CANCEL) { + return FileRenamer::RESULT_CANCEL; + } + + if (partialResult == FileRenamer::RESULT_SKIP) { + results = FileRenamer::RESULT_SKIP; + } + } + + for (QString dirName : currentDir.entryList(QDir::AllDirs | QDir::NoDotAndDotDot)) { + + const QString dirPath = currentDir.absoluteFilePath(dirName); + // recurse on childrend directories + auto partialResult = restoreHiddenFilesRecursive(renamer, dirPath); + + if (partialResult == FileRenamer::RESULT_CANCEL) { + return FileRenamer::RESULT_CANCEL; + } + + if (partialResult == FileRenamer::RESULT_SKIP) { + results = FileRenamer::RESULT_SKIP; + } + } + return results; +} + + ModInfoDialog::TabInfo::TabInfo(std::unique_ptr tab) : tab(std::move(tab)), realPos(-1), widget(nullptr) { diff --git a/src/modinfodialogfwd.h b/src/modinfodialogfwd.h index 2147fc04..5d949ce9 100644 --- a/src/modinfodialogfwd.h +++ b/src/modinfodialogfwd.h @@ -30,7 +30,9 @@ bool canHideFile(bool isArchive, const QString& filename); bool canUnhideFile(bool isArchive, const QString& filename); FileRenamer::RenameResults hideFile(FileRenamer& renamer, const QString &oldName); -FileRenamer::RenameResults unhideFile(FileRenamer& renamer, const QString &oldName); +FileRenamer::RenameResults unhideFile(FileRenamer& renamer, const QString& oldName); +FileRenamer::RenameResults restoreHiddenFilesRecursive(FileRenamer& renamer, const QString &targetDir); + int naturalCompare(const QString& a, const QString& b); -- cgit v1.3.1