summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/modinfodialog.cpp6
-rw-r--r--src/modinfodialog.h1
-rw-r--r--src/modinfodialogconflicts.cpp43
-rw-r--r--src/modinfodialogconflicts.h3
-rw-r--r--src/modinfodialogfiletree.cpp178
-rw-r--r--src/modinfodialogfiletree.h2
6 files changed, 153 insertions, 80 deletions
diff --git a/src/modinfodialog.cpp b/src/modinfodialog.cpp
index 7696023f..2772994c 100644
--- a/src/modinfodialog.cpp
+++ b/src/modinfodialog.cpp
@@ -66,6 +66,12 @@ bool canOpenFile(bool isArchive, const QString&)
return !isArchive;
}
+bool canExploreFile(bool isArchive, const QString&)
+{
+ // can explore anything as long as it's not in an archive
+ return !isArchive;
+}
+
bool canHideFile(bool isArchive, const QString& filename)
{
if (isArchive) {
diff --git a/src/modinfodialog.h b/src/modinfodialog.h
index 6dc66003..273af8c7 100644
--- a/src/modinfodialog.h
+++ b/src/modinfodialog.h
@@ -36,6 +36,7 @@ class MainWindow;
bool canPreviewFile(PluginContainer& pluginContainer, bool isArchive, const QString& filename);
bool canOpenFile(bool isArchive, const QString& filename);
+bool canExploreFile(bool isArchive, const QString& filename);
bool canHideFile(bool isArchive, const QString& filename);
bool canUnhideFile(bool isArchive, const QString& filename);
diff --git a/src/modinfodialogconflicts.cpp b/src/modinfodialogconflicts.cpp
index e631db30..a3383a50 100644
--- a/src/modinfodialogconflicts.cpp
+++ b/src/modinfodialogconflicts.cpp
@@ -7,6 +7,7 @@
using namespace MOShared;
using namespace MOBase;
+namespace shell = MOBase::shell;
// 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
@@ -91,6 +92,11 @@ public:
return canPreviewFile(pluginContainer, isArchive(), fileName());
}
+ bool canExplore() const
+ {
+ return canExploreFile(isArchive(), fileName());
+ }
+
private:
QString m_before;
QString m_relativeName;
@@ -533,6 +539,16 @@ void ConflictsTab::previewItems(QTreeView* tree)
});
}
+void ConflictsTab::exploreItems(QTreeView* tree)
+{
+ // the menu item is only shown for a single selection, but handle all of them
+ // in case this changes
+ for_each_in_selection(tree, [&](const ConflictItem* item) {
+ shell::ExploreFile(item->fileName());
+ return true;
+ });
+}
+
void ConflictsTab::showContextMenu(const QPoint &pos, QTreeView* tree)
{
auto actions = createMenuActions(tree);
@@ -557,6 +573,15 @@ void ConflictsTab::showContextMenu(const QPoint &pos, QTreeView* tree)
menu.addAction(actions.preview);
}
+ // explore
+ if (actions.explore) {
+ connect(actions.explore, &QAction::triggered, [&]{
+ exploreItems(tree);
+ });
+
+ menu.addAction(actions.explore);
+ }
+
// hide
if (actions.hide) {
connect(actions.hide, &QAction::triggered, [&]{
@@ -603,6 +628,7 @@ ConflictsTab::Actions ConflictsTab::createMenuActions(QTreeView* tree)
bool enableUnhide = true;
bool enableOpen = true;
bool enablePreview = true;
+ bool enableExplore = true;
bool enableGoto = true;
const auto n = smallSelectionSize(tree);
@@ -626,6 +652,7 @@ ConflictsTab::Actions ConflictsTab::createMenuActions(QTreeView* tree)
enableUnhide = item->canUnhide();
enableOpen = item->canOpen();
enablePreview = item->canPreview(plugin());
+ enableExplore = item->canExplore();
enableGoto = item->hasAlts();
}
else {
@@ -634,6 +661,9 @@ ConflictsTab::Actions ConflictsTab::createMenuActions(QTreeView* tree)
enableOpen = false;
enablePreview = false;
+ // can't explore multiple files
+ enableExplore = false;
+
// don't bother with this on multiple selection, at least for now
enableGoto = false;
@@ -664,21 +694,24 @@ ConflictsTab::Actions ConflictsTab::createMenuActions(QTreeView* tree)
Actions actions;
- actions.hide = new QAction(tr("Hide"), parentWidget());
+ 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 = new QAction(tr("&Unhide"), parentWidget());
actions.unhide->setEnabled(enableUnhide);
- actions.open = new QAction(tr("Open/Execute"), parentWidget());
+ actions.open = new QAction(tr("&Open/Execute"), parentWidget());
actions.open->setEnabled(enableOpen);
- actions.preview = new QAction(tr("Preview"), parentWidget());
+ actions.preview = new QAction(tr("&Preview"), parentWidget());
actions.preview->setEnabled(enablePreview);
- actions.gotoMenu = new QMenu(tr("Go to..."), parentWidget());
+ actions.explore = new QAction(tr("Open in &Explorer"), parentWidget());
+ actions.explore->setEnabled(enableExplore);
+
+ actions.gotoMenu = new QMenu(tr("&Go to..."), parentWidget());
actions.gotoMenu->setEnabled(enableGoto);
if (enableGoto && n == 1) {
diff --git a/src/modinfodialogconflicts.h b/src/modinfodialogconflicts.h
index fc7dd32a..3fa12231 100644
--- a/src/modinfodialogconflicts.h
+++ b/src/modinfodialogconflicts.h
@@ -115,6 +115,7 @@ public:
void openItems(QTreeView* tree);
void previewItems(QTreeView* tree);
+ void exploreItems(QTreeView* tree);
void changeItemsVisibility(QTreeView* tree, bool visible);
@@ -127,7 +128,9 @@ private:
QAction* unhide = nullptr;
QAction* open = nullptr;
QAction* preview = nullptr;
+ QAction* explore = nullptr;
QMenu* gotoMenu = nullptr;
+
std::vector<QAction*> gotoActions;
};
diff --git a/src/modinfodialogfiletree.cpp b/src/modinfodialogfiletree.cpp
index 24faec5e..6690dd2f 100644
--- a/src/modinfodialogfiletree.cpp
+++ b/src/modinfodialogfiletree.cpp
@@ -24,8 +24,9 @@ FileTreeTab::FileTreeTab(
ui->filetree->setColumnWidth(0, 300);
m_actions.newFolder = new QAction(tr("&New Folder"), ui->filetree);
- m_actions.open = new QAction(tr("&Open"), ui->filetree);
+ m_actions.open = new QAction(tr("&Open/Execute"), ui->filetree);
m_actions.preview = new QAction(tr("&Preview"), ui->filetree);
+ m_actions.explore = new QAction(tr("Open in &Explorer"), ui->filetree);
m_actions.rename = new QAction(tr("&Rename"), ui->filetree);
m_actions.del = new QAction(tr("&Delete"), ui->filetree);
m_actions.hide = new QAction(tr("&Hide"), ui->filetree);
@@ -34,6 +35,7 @@ FileTreeTab::FileTreeTab(
connect(m_actions.newFolder, &QAction::triggered, [&]{ onCreateDirectory(); });
connect(m_actions.open, &QAction::triggered, [&]{ onOpen(); });
connect(m_actions.preview, &QAction::triggered, [&]{ onPreview(); });
+ connect(m_actions.explore, &QAction::triggered, [&]{ onExplore(); });
connect(m_actions.rename, &QAction::triggered, [&]{ onRename(); });
connect(m_actions.del, &QAction::triggered, [&]{ onDelete(); });
connect(m_actions.hide, &QAction::triggered, [&]{ onHide(); });
@@ -140,6 +142,17 @@ void FileTreeTab::onPreview()
core().previewFile(parentWidget(), mod()->name(), m_fs->filePath(selection));
}
+void FileTreeTab::onExplore()
+{
+ auto selection = singleSelection();
+
+ if (selection.isValid()) {
+ shell::ExploreFile(m_fs->filePath(selection));
+ } else {
+ shell::ExploreFile(mod()->absolutePath());
+ }
+}
+
void FileTreeTab::onRename()
{
auto selection = singleSelection();
@@ -316,103 +329,118 @@ void FileTreeTab::onContextMenu(const QPoint &pos)
QMenu menu(ui->filetree);
- menu.addAction(m_actions.newFolder);
-
- if (selection.size() > 0) {
- bool enableOpen = true;
- bool enablePreview = true;
- bool enableRename = true;
- bool enableDelete = true;
- bool enableHide = true;
- bool enableUnhide = true;
+ bool enableNewFolder = true;
+ bool enableOpen = true;
+ bool enablePreview = true;
+ bool enableExplore = true;
+ bool enableRename = true;
+ bool enableDelete = true;
+ bool enableHide = true;
+ bool enableUnhide = true;
- if (selection.size() == 1) {
- // single selection
+ if (selection.size() == 0) {
+ // no selection, only new folder and explore
+ enableOpen = false;
+ enablePreview = false;
+ enableRename = false;
+ enableDelete = false;
+ enableHide = false;
+ enableUnhide = false;
+ } else if (selection.size() == 1) {
+ // single selection
- // only enable open action if a file is selected
- bool hasFiles = false;
+ // only enable open action if a file is selected
+ bool hasFiles = false;
- for (auto index : selection) {
- if (m_fs->fileInfo(index).isFile()) {
- hasFiles = true;
- break;
- }
+ for (auto index : selection) {
+ if (m_fs->fileInfo(index).isFile()) {
+ hasFiles = true;
+ break;
}
+ }
- if (!hasFiles) {
- enableOpen = false;
- enablePreview = false;
- }
+ if (!hasFiles) {
+ enableOpen = false;
+ enablePreview = false;
+ }
- const QString fileName = m_fs->fileName(selection[0]);
+ const QString fileName = m_fs->fileName(selection[0]);
- if (!canPreviewFile(plugin(), false, fileName)) {
- enablePreview = false;
- }
+ if (!canPreviewFile(plugin(), false, fileName)) {
+ enablePreview = false;
+ }
- if (!canHideFile(false, fileName)) {
- enableHide = false;
- }
+ if (!canExploreFile(false, fileName)) {
+ enableExplore = false;
+ }
- if (!canUnhideFile(false, fileName)) {
- enableUnhide = false;
- }
- } else {
- // this is a multiple selection, don't show open action so users don't open
- // a thousand files
- enableOpen = false;
- enablePreview = false;
- enableRename = false;
+ if (!canHideFile(false, fileName)) {
+ enableHide = false;
+ }
+
+ if (!canUnhideFile(false, fileName)) {
+ enableUnhide = false;
+ }
+ } else {
+ // this is a multiple selection, don't show open action so users don't open
+ // a thousand files
+ enableOpen = false;
+ enablePreview = false;
+
+ // can't explore multiple files
+ enableExplore = false;
+
+ // can't rename multiple files
+ enableRename = false;
- if (selection.size() < max_scan_for_context_menu) {
- // if the number of selected items is low, checking them to accurately
- // show the menu items is worth it
- enableHide = false;
- enableUnhide = false;
+ if (selection.size() < max_scan_for_context_menu) {
+ // if the number of selected items is low, checking them to accurately
+ // show the menu items is worth it
+ enableHide = false;
+ enableUnhide = false;
- for (const auto& index : selection) {
- const QString fileName = m_fs->fileName(index);
+ for (const auto& index : selection) {
+ const QString fileName = m_fs->fileName(index);
- if (canHideFile(false, fileName)) {
- enableHide = true;
- }
+ if (canHideFile(false, fileName)) {
+ enableHide = true;
+ }
- if (canUnhideFile(false, fileName)) {
- enableUnhide = true;
- }
+ if (canUnhideFile(false, fileName)) {
+ enableUnhide = true;
+ }
- if (enableHide && enableUnhide) {
- // found both, no need to check more
- break;
- }
+ if (enableHide && enableUnhide) {
+ // found both, no need to check more
+ break;
}
}
}
+ }
- if (enableOpen) {
- menu.addAction(m_actions.open);
- }
+ menu.addAction(m_actions.newFolder);
+ m_actions.newFolder->setEnabled(enableNewFolder);
- if (enablePreview) {
- menu.addAction(m_actions.preview);
- }
+ menu.addAction(m_actions.open);
+ m_actions.open->setEnabled(enableOpen);
- if (enableRename) {
- menu.addAction(m_actions.rename);
- }
+ menu.addAction(m_actions.preview);
+ m_actions.preview->setEnabled(enablePreview);
- if (enableDelete) {
- menu.addAction(m_actions.del);
- }
+ menu.addAction(m_actions.explore);
+ m_actions.explore->setEnabled(enableExplore);
- if (enableHide) {
- menu.addAction(m_actions.hide);
- }
+ menu.addAction(m_actions.rename);
+ m_actions.rename->setEnabled(enableRename);
- if (enableUnhide) {
- menu.addAction(m_actions.unhide);
- }
- }
+ menu.addAction(m_actions.del);
+ m_actions.del->setEnabled(enableDelete);
+
+ menu.addAction(m_actions.hide);
+ m_actions.hide->setEnabled(enableHide);
+
+ menu.addAction(m_actions.unhide);
+ m_actions.unhide->setEnabled(enableUnhide);
menu.exec(ui->filetree->viewport()->mapToGlobal(pos));
}
diff --git a/src/modinfodialogfiletree.h b/src/modinfodialogfiletree.h
index 2145f298..9f5206b9 100644
--- a/src/modinfodialogfiletree.h
+++ b/src/modinfodialogfiletree.h
@@ -20,6 +20,7 @@ private:
QAction *newFolder = nullptr;
QAction *open = nullptr;
QAction *preview = nullptr;
+ QAction *explore = nullptr;
QAction *rename = nullptr;
QAction *del = nullptr;
QAction *hide = nullptr;
@@ -32,6 +33,7 @@ private:
void onCreateDirectory();
void onOpen();
void onPreview();
+ void onExplore();
void onRename();
void onDelete();
void onHide();