summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorisanae <14251494+isanae@users.noreply.github.com>2019-05-27 12:07:10 -0400
committerisanae <14251494+isanae@users.noreply.github.com>2019-05-27 12:07:10 -0400
commit2d52299743d056ae6da3c98ca9dc34abca3138bf (patch)
tree4709050f6b5e7577033ede8de49b2e80e30566fb
parent622908ee20ae5d74bff6524ff7c8eb044e25238b (diff)
multiple selection for noconflict and overwritten lists
set uniformRowHeights for all three lists for faster rendering, all items are text only all three lists use the same code for the context menu: - createConflictMenuActions() returns a struct with the QActions that are valid for the selection - showConflictMenu() plugs in the handlers and shows the menu
-rw-r--r--src/modinfodialog.cpp190
-rw-r--r--src/modinfodialog.h37
-rw-r--r--src/modinfodialog.ui21
3 files changed, 119 insertions, 129 deletions
diff --git a/src/modinfodialog.cpp b/src/modinfodialog.cpp
index 19a03ea7..024679f3 100644
--- a/src/modinfodialog.cpp
+++ b/src/modinfodialog.cpp
@@ -1636,13 +1636,12 @@ FileRenamer::RenameResults ModInfoDialog::unhideFile(FileRenamer& renamer, const
return renamer.rename(oldName, newName);
}
-void ModInfoDialog::changeConflictFilesVisibility(bool hide)
+void ModInfoDialog::changeConflictItemsVisibility(
+ const QList<QTreeWidgetItem*>& items, bool hide)
{
bool changed = false;
bool stop = false;
- const auto items = ui->overwriteTree->selectedItems();
-
qDebug().nospace()
<< (hide ? "hiding" : "unhiding") << " "
<< items.size() << " conflict files";
@@ -1707,63 +1706,21 @@ void ModInfoDialog::changeConflictFilesVisibility(bool hide)
}
}
-void ModInfoDialog::hideConflictFiles()
-{
- changeConflictFilesVisibility(true);
-}
-
-void ModInfoDialog::unhideConflictFiles()
-{
- changeConflictFilesVisibility(false);
-}
-
-void ModInfoDialog::previewOverwriteDataFile()
-{
- // the menu item is only shown for a single selection, but check just in case
- const auto selection = ui->overwriteTree->selectedItems();
- if (!selection.empty()) {
- previewDataFile(selection[0]);
- }
-}
-
-void ModInfoDialog::openOverwriteDataFile()
+void ModInfoDialog::openConflictItems(const QList<QTreeWidgetItem*>& items)
{
- // the menu item is only shown for a single selection, but check just in case
- const auto selection = ui->overwriteTree->selectedItems();
- if (!selection.empty()) {
- openDataFile(selection[0]);
+ // the menu item is only shown for a single selection, but handle all of them
+ // in case this changes
+ for (auto* item : items) {
+ openDataFile(item);
}
}
-void ModInfoDialog::previewOverwrittenDataFile()
+void ModInfoDialog::previewConflictItems(const QList<QTreeWidgetItem*>& items)
{
- const auto selection = ui->overwrittenTree->selectedItems();
- if (!selection.empty()) {
- previewDataFile(selection[0]);
- }
-}
-
-void ModInfoDialog::openOverwrittenDataFile()
-{
- const auto selection = ui->overwrittenTree->selectedItems();
- if (!selection.empty()) {
- openDataFile(selection[0]);
- }
-}
-
-void ModInfoDialog::previewNoConflictDataFile()
-{
- const auto selection = ui->noConflictTree->selectedItems();
- if (!selection.empty()) {
- previewDataFile(selection[0]);
- }
-}
-
-void ModInfoDialog::openNoConflictDataFile()
-{
- const auto selection = ui->noConflictTree->selectedItems();
- if (!selection.empty()) {
- openDataFile(selection[0]);
+ // the menu item is only shown for a single selection, but handle all of them
+ // in case this changes
+ for (auto* item : items) {
+ previewDataFile(item);
}
}
@@ -1846,17 +1803,71 @@ bool ModInfoDialog::canPreviewConflictItem(const QTreeWidgetItem* item) const
void ModInfoDialog::on_overwriteTree_customContextMenuRequested(const QPoint &pos)
{
- const auto selection = ui->overwriteTree->selectedItems();
- if (selection.empty()) {
+ showConflictMenu(pos, ui->overwriteTree);
+}
+
+void ModInfoDialog::on_overwrittenTree_customContextMenuRequested(const QPoint &pos)
+{
+ showConflictMenu(pos, ui->overwrittenTree);
+}
+
+void ModInfoDialog::on_noConflictTree_customContextMenuRequested(const QPoint &pos)
+{
+ showConflictMenu(pos, ui->noConflictTree);
+}
+
+void ModInfoDialog::showConflictMenu(const QPoint &pos, QTreeWidget* tree)
+{
+ auto actions = createConflictMenuActions(tree->selectedItems());
+
+ QMenu menu;
+
+ if (actions.open) {
+ connect(actions.open, &QAction::triggered, [&]{
+ openConflictItems(tree->selectedItems());
+ });
+
+ menu.addAction(actions.open);
+ }
+
+ if (actions.preview) {
+ connect(actions.preview, &QAction::triggered, [&]{
+ previewConflictItems(tree->selectedItems());
+ });
+
+ menu.addAction(actions.preview);
+ }
+
+ if (actions.hide) {
+ connect(actions.hide, &QAction::triggered, [&]{
+ changeConflictItemsVisibility(tree->selectedItems(), false);
+ });
+
+ menu.addAction(actions.hide);
+ }
+
+ if (actions.unhide) {
+ connect(actions.unhide, &QAction::triggered, [&]{
+ changeConflictItemsVisibility(tree->selectedItems(), true);
+ });
+
+ menu.addAction(actions.unhide);
+ }
+
+ if (menu.isEmpty()) {
return;
}
- // for a single selection, hide/unhide is not shown for files from
- // archives and whether the action is hide or unhide depends on the current
- // state
- //
- // for multiple selection, both actions are shown unconditionally and
- // handled in hideConflictFiles() and unhideConflictFiles()
+ menu.exec(tree->viewport()->mapToGlobal(pos));
+}
+
+ModInfoDialog::ConflictActions ModInfoDialog::createConflictMenuActions(
+ const QList<QTreeWidgetItem*> selection)
+{
+ if (selection.empty()) {
+ return {};
+ }
+
bool enableHide = true;
bool enableUnhide = true;
bool enableOpen = true;
@@ -1866,7 +1877,7 @@ void ModInfoDialog::on_overwriteTree_customContextMenuRequested(const QPoint &po
// this is a single selection
const auto* item = selection[0];
if (!item) {
- return;
+ return {};
}
enableHide = canHideConflictItem(item);
@@ -1903,66 +1914,27 @@ void ModInfoDialog::on_overwriteTree_customContextMenuRequested(const QPoint &po
}
}
-
- QMenu menu;
+ ConflictActions actions;
if (enableHide) {
- menu.addAction(tr("Hide"), this, SLOT(hideConflictFiles()));
+ actions.hide = new QAction(tr("Hide"));
}
// note that it is possible for hidden files to appear if they override other
// hidden files from another mod
if (enableUnhide) {
- menu.addAction(tr("Unhide"), this, SLOT(unhideConflictFiles()));
+ actions.unhide = new QAction(tr("Unhide"));
}
if (enableOpen) {
- menu.addAction(tr("Open/Execute"), this, SLOT(openOverwriteDataFile()));
+ actions.open = new QAction(tr("Open/Execute"));
}
if (enablePreview) {
- menu.addAction(tr("Preview"), this, SLOT(previewOverwriteDataFile()));
+ actions.preview = new QAction(tr("Preview"));
}
- menu.exec(ui->overwriteTree->viewport()->mapToGlobal(pos));
-}
-
-void ModInfoDialog::on_overwrittenTree_customContextMenuRequested(const QPoint &pos)
-{
- auto* item = ui->overwrittenTree->itemAt(pos.x(), pos.y());
-
- if (item != nullptr) {
- if (!item->data(1, Qt::UserRole + 2).toBool()) {
- QMenu menu;
-
- menu.addAction(tr("Open/Execute"), this, SLOT(openOverwrittenDataFile()));
-
- if (canPreviewConflictItem(item)) {
- menu.addAction(tr("Preview"), this, SLOT(previewOverwrittenDataFile()));
- }
-
- menu.exec(ui->overwrittenTree->viewport()->mapToGlobal(pos));
- }
- }
-}
-
-void ModInfoDialog::on_noConflictTree_customContextMenuRequested(const QPoint &pos)
-{
- auto* item = ui->noConflictTree->itemAt(pos.x(), pos.y());
-
- if (item != nullptr) {
- if (!item->data(1, Qt::UserRole + 2).toBool()) {
- QMenu menu;
-
- menu.addAction(tr("Open/Execute"), this, SLOT(openNoConflictDataFile()));
-
- if (canPreviewConflictItem(item)) {
- menu.addAction(tr("Preview"), this, SLOT(previewNoConflictDataFile()));
- }
-
- menu.exec(ui->noConflictTree->viewport()->mapToGlobal(pos));
- }
- }
+ return actions;
}
void ModInfoDialog::on_overwrittenTree_itemDoubleClicked(QTreeWidgetItem *item, int)
diff --git a/src/modinfodialog.h b/src/modinfodialog.h
index c0730afa..983da8d4 100644
--- a/src/modinfodialog.h
+++ b/src/modinfodialog.h
@@ -329,18 +329,6 @@ private:
int tabIndex(const QString &tabId);
private slots:
-
- void hideConflictFiles();
- void unhideConflictFiles();
- void previewOverwriteDataFile();
- void openOverwriteDataFile();
-
- void previewOverwrittenDataFile();
- void openOverwrittenDataFile();
-
- void previewNoConflictDataFile();
- void openNoConflictDataFile();
-
void thumbnailClicked(const QString &fileName);
void linkClicked(const QUrl &url);
void linkClicked(QString url);
@@ -393,6 +381,18 @@ private slots:
void createTweak();
private:
+ struct ConflictActions
+ {
+ QAction* hide;
+ QAction* unhide;
+ QAction* open;
+ QAction* preview;
+
+ ConflictActions()
+ : hide(nullptr), unhide(nullptr), open(nullptr), preview(nullptr)
+ {
+ }
+ };
Ui::ModInfoDialog *ui;
@@ -442,12 +442,21 @@ private:
void openDataFile(const QTreeWidgetItem* item);
void previewDataFile(const QTreeWidgetItem* item);
- void changeConflictFilesVisibility(bool hide);
- void changeFiletreeVisibility(bool hide);
+ void changeFiletreeVisibility(bool visible);
+
+ void openConflictItems(const QList<QTreeWidgetItem*>& items);
+ void previewConflictItems(const QList<QTreeWidgetItem*>& items);
+ void changeConflictItemsVisibility(
+ const QList<QTreeWidgetItem*>& items, bool visible);
bool canPreviewFile(bool isArchive, const QString& filename) const;
bool canHideFile(bool isArchive, const QString& filename) const;
bool canUnhideFile(bool isArchive, const QString& filename) const;
+
+ void showConflictMenu(const QPoint &pos, QTreeWidget* tree);
+
+ ConflictActions createConflictMenuActions(
+ const QList<QTreeWidgetItem*> selection);
};
#endif // MODINFODIALOG_H
diff --git a/src/modinfodialog.ui b/src/modinfodialog.ui
index 1187de87..840c81ee 100644
--- a/src/modinfodialog.ui
+++ b/src/modinfodialog.ui
@@ -453,24 +453,21 @@ text-align: left;</string>
<property name="textElideMode">
<enum>Qt::ElideLeft</enum>
</property>
+ <property name="uniformRowHeights">
+ <bool>true</bool>
+ </property>
<property name="sortingEnabled">
<bool>true</bool>
</property>
<property name="animated">
<bool>true</bool>
</property>
- <property name="headerHidden">
- <bool>false</bool>
- </property>
<property name="columnCount">
<number>2</number>
</property>
<attribute name="headerDefaultSectionSize">
<number>365</number>
</attribute>
- <attribute name="headerHighlightSections">
- <bool>false</bool>
- </attribute>
<attribute name="headerMinimumSectionSize">
<number>200</number>
</attribute>
@@ -526,9 +523,15 @@ text-align: left;</string>
<property name="contextMenuPolicy">
<enum>Qt::CustomContextMenu</enum>
</property>
+ <property name="selectionMode">
+ <enum>QAbstractItemView::ExtendedSelection</enum>
+ </property>
<property name="textElideMode">
<enum>Qt::ElideLeft</enum>
</property>
+ <property name="uniformRowHeights">
+ <bool>true</bool>
+ </property>
<property name="sortingEnabled">
<bool>true</bool>
</property>
@@ -596,9 +599,15 @@ text-align: left;</string>
<property name="contextMenuPolicy">
<enum>Qt::CustomContextMenu</enum>
</property>
+ <property name="selectionMode">
+ <enum>QAbstractItemView::ExtendedSelection</enum>
+ </property>
<property name="textElideMode">
<enum>Qt::ElideLeft</enum>
</property>
+ <property name="uniformRowHeights">
+ <bool>true</bool>
+ </property>
<property name="sortingEnabled">
<bool>true</bool>
</property>