diff --git a/apps/launcher/datafilespage.cpp b/apps/launcher/datafilespage.cpp index a4fb7fb0d9..6986b69030 100644 --- a/apps/launcher/datafilespage.cpp +++ b/apps/launcher/datafilespage.cpp @@ -39,8 +39,6 @@ #include "utils/profilescombobox.hpp" #include "utils/textinputdialog.hpp" -#include "ui_directorypicker.h" - const char* Launcher::DataFilesPage::mDefaultContentListName = "Default"; namespace @@ -155,6 +153,7 @@ namespace Launcher Launcher::DataFilesPage::DataFilesPage(const Files::ConfigurationManager& cfg, Config::GameSettings& gameSettings, Config::LauncherSettings& launcherSettings, MainDialog* parent) : QWidget(parent) + , mDirectoryPickerDialog(new QDialog(this)) , mMainDialog(parent) , mCfgMgr(cfg) , mGameSettings(gameSettings) @@ -163,6 +162,7 @@ Launcher::DataFilesPage::DataFilesPage(const Files::ConfigurationManager& cfg, C , mReloadCellsThread(&DataFilesPage::reloadCells, this) { ui.setupUi(this); + mDirectoryPicker.setupUi(mDirectoryPickerDialog); setObjectName("DataFilesPage"); mSelector = new ContentSelectorView::ContentSelector(ui.contentSelectorWidget, /*showOMWScripts=*/true); const QString encoding = mGameSettings.value("encoding", { "win1252" }).value; @@ -266,6 +266,7 @@ void Launcher::DataFilesPage::buildView() buildArchiveContextMenu(); buildDataFilesContextMenu(); + buildDirectoryPickerContextMenu(); } void Launcher::DataFilesPage::slotCopySelectedItemsPaths() @@ -298,8 +299,10 @@ void Launcher::DataFilesPage::buildArchiveContextMenu() &DataFilesPage::slotShowArchiveContextMenu); mArchiveContextMenu = new QMenu(ui.archiveListWidget); - mArchiveContextMenu->addAction(tr("&Check Selected"), this, SLOT(slotCheckMultiSelectedItems())); - mArchiveContextMenu->addAction(tr("&Uncheck Selected"), this, SLOT(slotUncheckMultiSelectedItems())); + mArchiveContextMenu->addAction(tr("&Check Selected"), this, + [this]() { setCheckStateForMultiSelectedItems(ui.archiveListWidget, Qt::Checked); }); + mArchiveContextMenu->addAction(tr("&Uncheck Selected"), this, + [this]() { setCheckStateForMultiSelectedItems(ui.archiveListWidget, Qt::Unchecked); }); } void Launcher::DataFilesPage::buildDataFilesContextMenu() @@ -314,6 +317,18 @@ void Launcher::DataFilesPage::buildDataFilesContextMenu() tr("&Open Path in File Explorer"), this, &Launcher::DataFilesPage::slotOpenSelectedItemsPaths); } +void Launcher::DataFilesPage::buildDirectoryPickerContextMenu() +{ + connect(mDirectoryPicker.dirListWidget, &QListWidget::customContextMenuRequested, this, + &DataFilesPage::slotShowDirectoryPickerContextMenu); + + mDirectoryPickerMenu = new QMenu(mDirectoryPicker.dirListWidget); + mDirectoryPickerMenu->addAction(tr("&Check Selected"), this, + [this]() { setCheckStateForMultiSelectedItems(mDirectoryPicker.dirListWidget, Qt::Checked); }); + mDirectoryPickerMenu->addAction(tr("&Uncheck Selected"), this, + [this]() { setCheckStateForMultiSelectedItems(mDirectoryPicker.dirListWidget, Qt::Unchecked); }); +} + bool Launcher::DataFilesPage::loadSettings() { ui.navMeshMaxSizeSpinBox->setValue(getMaxNavMeshDbFileSizeMiB()); @@ -821,28 +836,22 @@ void Launcher::DataFilesPage::addSubdirectories(bool append) return; } - QDialog dialog; - Ui::SelectSubdirs select; - - select.setupUi(&dialog); + mDirectoryPicker.dirListWidget->clear(); for (const auto& dir : subdirs) { if (!ui.directoryListWidget->findItems(dir, Qt::MatchFixedString).isEmpty()) continue; - const auto lastRow = select.dirListWidget->count(); - select.dirListWidget->addItem(dir); - select.dirListWidget->item(lastRow)->setCheckState(Qt::Unchecked); + QListWidgetItem* newDir = new QListWidgetItem(dir, mDirectoryPicker.dirListWidget); + newDir->setCheckState(Qt::Unchecked); } - dialog.show(); - - if (dialog.exec() == QDialog::Rejected) + if (mDirectoryPickerDialog->exec() == QDialog::Rejected) return; - for (int i = 0; i < select.dirListWidget->count(); ++i) + for (int i = 0; i < mDirectoryPicker.dirListWidget->count(); ++i) { - const auto* dir = select.dirListWidget->item(i); + const auto* dir = mDirectoryPicker.dirListWidget->item(i); if (dir->checkState() == Qt::Checked) { ui.directoryListWidget->insertItem(selectedRow, dir->text()); @@ -893,38 +902,35 @@ void Launcher::DataFilesPage::removeDirectory() refreshDataFilesView(); } +void Launcher::DataFilesPage::showContextMenu(QMenu* menu, QListWidget* list, const QPoint& pos) +{ + QPoint globalPos = list->viewport()->mapToGlobal(pos); + menu->exec(globalPos); +} + void Launcher::DataFilesPage::slotShowArchiveContextMenu(const QPoint& pos) { - QPoint globalPos = ui.archiveListWidget->viewport()->mapToGlobal(pos); - mArchiveContextMenu->exec(globalPos); + showContextMenu(mArchiveContextMenu, ui.archiveListWidget, pos); } void Launcher::DataFilesPage::slotShowDataFilesContextMenu(const QPoint& pos) { - QPoint globalPos = ui.directoryListWidget->viewport()->mapToGlobal(pos); - mDataFilesContextMenu->exec(globalPos); + showContextMenu(mDataFilesContextMenu, ui.directoryListWidget, pos); } -void Launcher::DataFilesPage::setCheckStateForMultiSelectedItems(bool checked) +void Launcher::DataFilesPage::slotShowDirectoryPickerContextMenu(const QPoint& pos) { - Qt::CheckState checkState = checked ? Qt::Checked : Qt::Unchecked; + showContextMenu(mDirectoryPickerMenu, mDirectoryPicker.dirListWidget, pos); +} - for (QListWidgetItem* selectedItem : ui.archiveListWidget->selectedItems()) +void Launcher::DataFilesPage::setCheckStateForMultiSelectedItems(QListWidget* list, Qt::CheckState checkState) +{ + for (QListWidgetItem* selectedItem : list->selectedItems()) { selectedItem->setCheckState(checkState); } } -void Launcher::DataFilesPage::slotUncheckMultiSelectedItems() -{ - setCheckStateForMultiSelectedItems(false); -} - -void Launcher::DataFilesPage::slotCheckMultiSelectedItems() -{ - setCheckStateForMultiSelectedItems(true); -} - void Launcher::DataFilesPage::moveSources(QListWidget* sourceList, int step) { const QList> sortedItems = sortedSelectedItems(sourceList, step > 0); diff --git a/apps/launcher/datafilespage.hpp b/apps/launcher/datafilespage.hpp index ca40bd1319..847cfe5a18 100644 --- a/apps/launcher/datafilespage.hpp +++ b/apps/launcher/datafilespage.hpp @@ -2,6 +2,7 @@ #define DATAFILESPAGE_H #include "ui_datafilespage.h" +#include "ui_directorypicker.h" #include @@ -46,8 +47,11 @@ namespace Launcher ContentSelectorView::ContentSelector* mSelector; Ui::DataFilesPage ui; + QDialog* mDirectoryPickerDialog; + Ui::SelectSubdirs mDirectoryPicker; QMenu* mArchiveContextMenu; QMenu* mDataFilesContextMenu; + QMenu* mDirectoryPickerMenu; public: explicit DataFilesPage(const Files::ConfigurationManager& cfg, Config::GameSettings& gameSettings, @@ -87,8 +91,7 @@ namespace Launcher void slotShowArchiveContextMenu(const QPoint& pos); void slotShowDataFilesContextMenu(const QPoint& pos); - void slotCheckMultiSelectedItems(); - void slotUncheckMultiSelectedItems(); + void slotShowDirectoryPickerContextMenu(const QPoint& pos); void on_newProfileAction_triggered(); void on_cloneProfileAction_triggered(); @@ -145,7 +148,9 @@ namespace Launcher void buildView(); void buildArchiveContextMenu(); void buildDataFilesContextMenu(); - void setCheckStateForMultiSelectedItems(bool checked); + void buildDirectoryPickerContextMenu(); + void showContextMenu(QMenu* menu, QListWidget* list, const QPoint& pos); + void setCheckStateForMultiSelectedItems(QListWidget* list, Qt::CheckState checkState); void setProfile(int index, bool savePrevious); void setProfile(const QString& previous, const QString& current, bool savePrevious); void removeProfile(const QString& profile); diff --git a/apps/launcher/ui/directorypicker.ui b/apps/launcher/ui/directorypicker.ui index 6350bcd2d3..c32a78b53e 100644 --- a/apps/launcher/ui/directorypicker.ui +++ b/apps/launcher/ui/directorypicker.ui @@ -25,7 +25,14 @@ - + + + QAbstractItemView::ExtendedSelection + + + Qt::CustomContextMenu + +