From 03592e8de8a29ec725cb224f1524e6458d7e6935 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Wed, 29 Nov 2023 18:47:38 +1000 Subject: [PATCH] Qt: De-dialogify memory card editor --- src/duckstation-qt/CMakeLists.txt | 6 +- src/duckstation-qt/duckstation-qt.vcxproj | 8 +- .../duckstation-qt.vcxproj.filters | 8 +- src/duckstation-qt/mainwindow.cpp | 28 +++++-- src/duckstation-qt/mainwindow.h | 4 +- ...rdialog.cpp => memorycardeditorwindow.cpp} | 82 +++++++++---------- ...ditordialog.h => memorycardeditorwindow.h} | 13 +-- ...tordialog.ui => memorycardeditorwindow.ui} | 6 +- 8 files changed, 86 insertions(+), 69 deletions(-) rename src/duckstation-qt/{memorycardeditordialog.cpp => memorycardeditorwindow.cpp} (88%) rename src/duckstation-qt/{memorycardeditordialog.h => memorycardeditorwindow.h} (90%) rename src/duckstation-qt/{memorycardeditordialog.ui => memorycardeditorwindow.ui} (96%) diff --git a/src/duckstation-qt/CMakeLists.txt b/src/duckstation-qt/CMakeLists.txt index d8fa32b9b..7f66e472c 100644 --- a/src/duckstation-qt/CMakeLists.txt +++ b/src/duckstation-qt/CMakeLists.txt @@ -116,9 +116,9 @@ set(SRCS mainwindow.cpp mainwindow.h mainwindow.ui - memorycardeditordialog.cpp - memorycardeditordialog.h - memorycardeditordialog.ui + memorycardeditorwindow.cpp + memorycardeditorwindow.h + memorycardeditorwindow.ui memorycardsettingswidget.cpp memorycardsettingswidget.h memoryviewwidget.cpp diff --git a/src/duckstation-qt/duckstation-qt.vcxproj b/src/duckstation-qt/duckstation-qt.vcxproj index 9838684bc..5b62a3d88 100644 --- a/src/duckstation-qt/duckstation-qt.vcxproj +++ b/src/duckstation-qt/duckstation-qt.vcxproj @@ -41,7 +41,7 @@ - + Create @@ -64,7 +64,7 @@ - + @@ -146,7 +146,7 @@ Document - + Document @@ -263,7 +263,7 @@ - + diff --git a/src/duckstation-qt/duckstation-qt.vcxproj.filters b/src/duckstation-qt/duckstation-qt.vcxproj.filters index 90e5ee721..e68a43847 100644 --- a/src/duckstation-qt/duckstation-qt.vcxproj.filters +++ b/src/duckstation-qt/duckstation-qt.vcxproj.filters @@ -27,7 +27,7 @@ - + @@ -162,7 +162,7 @@ moc - + moc @@ -229,7 +229,7 @@ - + @@ -267,7 +267,7 @@ - + diff --git a/src/duckstation-qt/mainwindow.cpp b/src/duckstation-qt/mainwindow.cpp index 54840fce5..f13e3badb 100644 --- a/src/duckstation-qt/mainwindow.cpp +++ b/src/duckstation-qt/mainwindow.cpp @@ -13,7 +13,7 @@ #include "gamelistwidget.h" #include "generalsettingswidget.h" #include "logwindow.h" -#include "memorycardeditordialog.h" +#include "memorycardeditorwindow.h" #include "qthost.h" #include "qtutils.h" #include "settingswindow.h" @@ -740,6 +740,13 @@ void MainWindow::destroySubWindows() m_debugger_window = nullptr; } + if (m_memory_card_editor_window) + { + m_memory_card_editor_window->close(); + m_memory_card_editor_window->deleteLater(); + m_memory_card_editor_window = nullptr; + } + if (m_controller_settings_window) { m_controller_settings_window->close(); @@ -2342,6 +2349,7 @@ void MainWindow::doSettings(const char* category /* = nullptr */) else { dlg->raise(); + dlg->activateWindow(); dlg->setFocus(); } @@ -2362,6 +2370,7 @@ void MainWindow::doControllerSettings( else { m_controller_settings_window->raise(); + m_controller_settings_window->activateWindow(); m_controller_settings_window->setFocus(); } @@ -2682,25 +2691,26 @@ void MainWindow::openMemoryCardEditor(const QString& card_a_path, const QString& tr("Memory card '%1' does not exist. Do you want to create an empty memory card?").arg(card_path), QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes) { - if (!MemoryCardEditorDialog::createMemoryCard(card_path)) + if (!MemoryCardEditorWindow::createMemoryCard(card_path)) QMessageBox::critical(this, tr("Memory Card Not Found"), tr("Failed to create memory card '%1'").arg(card_path)); } } } - if (!m_memory_card_editor_dialog) + if (!m_memory_card_editor_window) { - m_memory_card_editor_dialog = new MemoryCardEditorDialog(this); - m_memory_card_editor_dialog->setModal(false); + m_memory_card_editor_window = new MemoryCardEditorWindow(); + m_memory_card_editor_window->show(); } - m_memory_card_editor_dialog->show(); - m_memory_card_editor_dialog->activateWindow(); + m_memory_card_editor_window->raise(); + m_memory_card_editor_window->activateWindow(); + m_memory_card_editor_window->setFocus(); if (!card_a_path.isEmpty()) { - if (!m_memory_card_editor_dialog->setCardA(card_a_path)) + if (!m_memory_card_editor_window->setCardA(card_a_path)) { QMessageBox::critical( this, tr("Memory Card Not Found"), @@ -2709,7 +2719,7 @@ void MainWindow::openMemoryCardEditor(const QString& card_a_path, const QString& } if (!card_b_path.isEmpty()) { - if (!m_memory_card_editor_dialog->setCardB(card_b_path)) + if (!m_memory_card_editor_window->setCardB(card_b_path)) { QMessageBox::critical( this, tr("Memory Card Not Found"), diff --git a/src/duckstation-qt/mainwindow.h b/src/duckstation-qt/mainwindow.h index cc98935a3..4f165f741 100644 --- a/src/duckstation-qt/mainwindow.h +++ b/src/duckstation-qt/mainwindow.h @@ -27,7 +27,7 @@ class QProgressBar; class GameListWidget; class EmuThread; class AutoUpdaterDialog; -class MemoryCardEditorDialog; +class MemoryCardEditorWindow; class CheatManagerDialog; class DebuggerWindow; class MainWindow; @@ -284,7 +284,7 @@ private: ControllerSettingsWindow* m_controller_settings_window = nullptr; AutoUpdaterDialog* m_auto_updater_dialog = nullptr; - MemoryCardEditorDialog* m_memory_card_editor_dialog = nullptr; + MemoryCardEditorWindow* m_memory_card_editor_window = nullptr; CheatManagerDialog* m_cheat_manager_dialog = nullptr; DebuggerWindow* m_debugger_window = nullptr; diff --git a/src/duckstation-qt/memorycardeditordialog.cpp b/src/duckstation-qt/memorycardeditorwindow.cpp similarity index 88% rename from src/duckstation-qt/memorycardeditordialog.cpp rename to src/duckstation-qt/memorycardeditorwindow.cpp index 0f928ebf3..6d39222d6 100644 --- a/src/duckstation-qt/memorycardeditordialog.cpp +++ b/src/duckstation-qt/memorycardeditorwindow.cpp @@ -1,7 +1,7 @@ -// SPDX-FileCopyrightText: 2019-2022 Connor McLaughlin +// SPDX-FileCopyrightText: 2019-2023 Connor McLaughlin // SPDX-License-Identifier: (GPL-3.0 OR CC-BY-NC-ND-4.0) -#include "memorycardeditordialog.h" +#include "memorycardeditorwindow.h" #include "common/file_system.h" #include "common/path.h" #include "common/string_util.h" @@ -19,7 +19,7 @@ static constexpr char MEMORY_CARD_IMPORT_FILTER[] = static constexpr char SINGLE_SAVEFILE_FILTER[] = TRANSLATE_NOOP("MemoryCardEditorDialog", "Single Save Files (*.mcs);;All Files (*.*)"); -MemoryCardEditorDialog::MemoryCardEditorDialog(QWidget* parent) : QDialog(parent) +MemoryCardEditorWindow::MemoryCardEditorWindow() : QWidget() { m_ui.setupUi(this); setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); @@ -53,9 +53,9 @@ MemoryCardEditorDialog::MemoryCardEditorDialog(QWidget* parent) : QDialog(parent m_ui.openCardB->setToolTip(open_card_hover_text); } -MemoryCardEditorDialog::~MemoryCardEditorDialog() = default; +MemoryCardEditorWindow::~MemoryCardEditorWindow() = default; -bool MemoryCardEditorDialog::setCardA(const QString& path) +bool MemoryCardEditorWindow::setCardA(const QString& path) { int index = m_ui.cardAPath->findData(QVariant(QDir::toNativeSeparators(path))); if (index < 0) @@ -73,7 +73,7 @@ bool MemoryCardEditorDialog::setCardA(const QString& path) return true; } -bool MemoryCardEditorDialog::setCardB(const QString& path) +bool MemoryCardEditorWindow::setCardB(const QString& path) { int index = m_ui.cardBPath->findData(QVariant(QDir::toNativeSeparators(path))); if (index < 0) @@ -91,7 +91,7 @@ bool MemoryCardEditorDialog::setCardB(const QString& path) return true; } -bool MemoryCardEditorDialog::createMemoryCard(const QString& path) +bool MemoryCardEditorWindow::createMemoryCard(const QString& path) { MemoryCardImage::DataArray data; MemoryCardImage::Format(&data); @@ -99,19 +99,19 @@ bool MemoryCardEditorDialog::createMemoryCard(const QString& path) return MemoryCardImage::SaveToFile(data, path.toUtf8().constData()); } -void MemoryCardEditorDialog::resizeEvent(QResizeEvent* ev) +void MemoryCardEditorWindow::resizeEvent(QResizeEvent* ev) { QtUtils::ResizeColumnsForTableView(m_card_a.table, {32, -1, 155, 45}); QtUtils::ResizeColumnsForTableView(m_card_b.table, {32, -1, 155, 45}); } -void MemoryCardEditorDialog::closeEvent(QCloseEvent* ev) +void MemoryCardEditorWindow::closeEvent(QCloseEvent* ev) { m_card_a.path_cb->setCurrentIndex(0); m_card_b.path_cb->setCurrentIndex(0); } -void MemoryCardEditorDialog::createCardButtons(Card* card, QDialogButtonBox* buttonBox) +void MemoryCardEditorWindow::createCardButtons(Card* card, QDialogButtonBox* buttonBox) { card->format_button = buttonBox->addButton(tr("Format Card"), QDialogButtonBox::ActionRole); card->import_file_button = buttonBox->addButton(tr("Import File..."), QDialogButtonBox::ActionRole); @@ -119,7 +119,7 @@ void MemoryCardEditorDialog::createCardButtons(Card* card, QDialogButtonBox* but card->save_button = buttonBox->addButton(tr("Save"), QDialogButtonBox::ActionRole); } -void MemoryCardEditorDialog::connectCardUi(Card* card, QDialogButtonBox* buttonBox) +void MemoryCardEditorWindow::connectCardUi(Card* card, QDialogButtonBox* buttonBox) { connect(card->save_button, &QPushButton::clicked, [this, card] { saveCard(card); }); connect(card->format_button, &QPushButton::clicked, [this, card] { formatCard(card); }); @@ -127,14 +127,14 @@ void MemoryCardEditorDialog::connectCardUi(Card* card, QDialogButtonBox* buttonB connect(card->import_button, &QPushButton::clicked, [this, card] { importCard(card); }); } -void MemoryCardEditorDialog::connectUi() +void MemoryCardEditorWindow::connectUi() { - connect(m_ui.cardA, &QTableWidget::itemSelectionChanged, this, &MemoryCardEditorDialog::onCardASelectionChanged); - connect(m_ui.cardB, &QTableWidget::itemSelectionChanged, this, &MemoryCardEditorDialog::onCardBSelectionChanged); - connect(m_moveLeft, &QPushButton::clicked, this, &MemoryCardEditorDialog::doCopyFile); - connect(m_moveRight, &QPushButton::clicked, this, &MemoryCardEditorDialog::doCopyFile); - connect(m_deleteFile, &QPushButton::clicked, this, &MemoryCardEditorDialog::doDeleteFile); - connect(m_undeleteFile, &QPushButton::clicked, this, &MemoryCardEditorDialog::doUndeleteFile); + connect(m_ui.cardA, &QTableWidget::itemSelectionChanged, this, &MemoryCardEditorWindow::onCardASelectionChanged); + connect(m_ui.cardB, &QTableWidget::itemSelectionChanged, this, &MemoryCardEditorWindow::onCardBSelectionChanged); + connect(m_moveLeft, &QPushButton::clicked, this, &MemoryCardEditorWindow::doCopyFile); + connect(m_moveRight, &QPushButton::clicked, this, &MemoryCardEditorWindow::doCopyFile); + connect(m_deleteFile, &QPushButton::clicked, this, &MemoryCardEditorWindow::doDeleteFile); + connect(m_undeleteFile, &QPushButton::clicked, this, &MemoryCardEditorWindow::doUndeleteFile); connect(m_ui.cardAPath, QOverload::of(&QComboBox::currentIndexChanged), [this](int index) { loadCardFromComboBox(&m_card_a, index); }); @@ -144,10 +144,10 @@ void MemoryCardEditorDialog::connectUi() connect(m_ui.newCardB, &QPushButton::clicked, [this]() { newCard(&m_card_b); }); connect(m_ui.openCardA, &QPushButton::clicked, [this]() { openCard(&m_card_a); }); connect(m_ui.openCardB, &QPushButton::clicked, [this]() { openCard(&m_card_b); }); - connect(m_exportFile, &QPushButton::clicked, this, &MemoryCardEditorDialog::doExportSaveFile); + connect(m_exportFile, &QPushButton::clicked, this, &MemoryCardEditorWindow::doExportSaveFile); } -void MemoryCardEditorDialog::populateComboBox(QComboBox* cb) +void MemoryCardEditorWindow::populateComboBox(QComboBox* cb) { QSignalBlocker sb(cb); @@ -169,12 +169,12 @@ void MemoryCardEditorDialog::populateComboBox(QComboBox* cb) } } -void MemoryCardEditorDialog::loadCardFromComboBox(Card* card, int index) +void MemoryCardEditorWindow::loadCardFromComboBox(Card* card, int index) { loadCard(card->path_cb->itemData(index).toString(), card); } -void MemoryCardEditorDialog::onCardASelectionChanged() +void MemoryCardEditorWindow::onCardASelectionChanged() { { QSignalBlocker cb(m_card_b.table); @@ -184,7 +184,7 @@ void MemoryCardEditorDialog::onCardASelectionChanged() updateButtonState(); } -void MemoryCardEditorDialog::onCardBSelectionChanged() +void MemoryCardEditorWindow::onCardBSelectionChanged() { { QSignalBlocker cb(m_card_a.table); @@ -194,7 +194,7 @@ void MemoryCardEditorDialog::onCardBSelectionChanged() updateButtonState(); } -void MemoryCardEditorDialog::clearSelection() +void MemoryCardEditorWindow::clearSelection() { { QSignalBlocker cb(m_card_a.table); @@ -209,7 +209,7 @@ void MemoryCardEditorDialog::clearSelection() updateButtonState(); } -bool MemoryCardEditorDialog::loadCard(const QString& filename, Card* card) +bool MemoryCardEditorWindow::loadCard(const QString& filename, Card* card) { promptForSave(card); @@ -250,7 +250,7 @@ static void setCardTableItemProperties(QTableWidgetItem* item, const MemoryCardI } } -void MemoryCardEditorDialog::updateCardTable(Card* card) +void MemoryCardEditorWindow::updateCardTable(Card* card) { card->table->setRowCount(0); @@ -289,20 +289,20 @@ void MemoryCardEditorDialog::updateCardTable(Card* card) } } -void MemoryCardEditorDialog::updateCardBlocksFree(Card* card) +void MemoryCardEditorWindow::updateCardBlocksFree(Card* card) { card->blocks_free = MemoryCardImage::GetFreeBlockCount(card->data); card->blocks_free_label->setText( tr("%n block(s) free%1", "", card->blocks_free).arg(card->dirty ? QStringLiteral(" (*)") : QString())); } -void MemoryCardEditorDialog::setCardDirty(Card* card) +void MemoryCardEditorWindow::setCardDirty(Card* card) { card->dirty = true; card->save_button->setEnabled(true); } -void MemoryCardEditorDialog::newCard(Card* card) +void MemoryCardEditorWindow::newCard(Card* card) { promptForSave(card); @@ -328,7 +328,7 @@ void MemoryCardEditorDialog::newCard(Card* card) saveCard(card); } -void MemoryCardEditorDialog::openCard(Card* card) +void MemoryCardEditorWindow::openCard(Card* card) { promptForSave(card); @@ -357,7 +357,7 @@ void MemoryCardEditorDialog::openCard(Card* card) updateButtonState(); } -void MemoryCardEditorDialog::saveCard(Card* card) +void MemoryCardEditorWindow::saveCard(Card* card) { if (card->filename.empty()) return; @@ -374,7 +374,7 @@ void MemoryCardEditorDialog::saveCard(Card* card) updateCardBlocksFree(card); } -void MemoryCardEditorDialog::promptForSave(Card* card) +void MemoryCardEditorWindow::promptForSave(Card* card) { if (card->filename.empty() || !card->dirty) return; @@ -390,7 +390,7 @@ void MemoryCardEditorDialog::promptForSave(Card* card) saveCard(card); } -void MemoryCardEditorDialog::doCopyFile() +void MemoryCardEditorWindow::doCopyFile() { const auto [src, fi] = getSelectedFile(); if (!fi) @@ -440,7 +440,7 @@ void MemoryCardEditorDialog::doCopyFile() updateButtonState(); } -void MemoryCardEditorDialog::doDeleteFile() +void MemoryCardEditorWindow::doDeleteFile() { const auto [card, fi] = getSelectedFile(); if (!fi) @@ -459,7 +459,7 @@ void MemoryCardEditorDialog::doDeleteFile() updateButtonState(); } -void MemoryCardEditorDialog::doUndeleteFile() +void MemoryCardEditorWindow::doUndeleteFile() { const auto [card, fi] = getSelectedFile(); if (!fi) @@ -481,7 +481,7 @@ void MemoryCardEditorDialog::doUndeleteFile() updateButtonState(); } -void MemoryCardEditorDialog::doExportSaveFile() +void MemoryCardEditorWindow::doExportSaveFile() { QString filename = QDir::toNativeSeparators( QFileDialog::getSaveFileName(this, tr("Select Single Savefile"), QString(), tr(SINGLE_SAVEFILE_FILTER))); @@ -502,7 +502,7 @@ void MemoryCardEditorDialog::doExportSaveFile() } } -void MemoryCardEditorDialog::importCard(Card* card) +void MemoryCardEditorWindow::importCard(Card* card) { promptForSave(card); @@ -527,7 +527,7 @@ void MemoryCardEditorDialog::importCard(Card* card) updateButtonState(); } -void MemoryCardEditorDialog::formatCard(Card* card) +void MemoryCardEditorWindow::formatCard(Card* card) { promptForSave(card); @@ -550,7 +550,7 @@ void MemoryCardEditorDialog::formatCard(Card* card) updateButtonState(); } -void MemoryCardEditorDialog::importSaveFile(Card* card) +void MemoryCardEditorWindow::importSaveFile(Card* card) { QString filename = QFileDialog::getOpenFileName(this, tr("Select Import Save File"), QString(), tr(SINGLE_SAVEFILE_FILTER)); @@ -571,7 +571,7 @@ void MemoryCardEditorDialog::importSaveFile(Card* card) updateCardBlocksFree(card); } -std::tuple MemoryCardEditorDialog::getSelectedFile() +std::tuple MemoryCardEditorWindow::getSelectedFile() { QList sel = m_card_a.table->selectedRanges(); Card* card = &m_card_a; @@ -591,7 +591,7 @@ std::tuple Memo return std::tuple(card, &card->files[index]); } -void MemoryCardEditorDialog::updateButtonState() +void MemoryCardEditorWindow::updateButtonState() { const auto [selected_card, selected_file] = getSelectedFile(); const bool is_card_b = (selected_card == &m_card_b); diff --git a/src/duckstation-qt/memorycardeditordialog.h b/src/duckstation-qt/memorycardeditorwindow.h similarity index 90% rename from src/duckstation-qt/memorycardeditordialog.h rename to src/duckstation-qt/memorycardeditorwindow.h index e1582435d..e204565f3 100644 --- a/src/duckstation-qt/memorycardeditordialog.h +++ b/src/duckstation-qt/memorycardeditorwindow.h @@ -1,9 +1,12 @@ -// SPDX-FileCopyrightText: 2019-2022 Connor McLaughlin +// SPDX-FileCopyrightText: 2019-2023 Connor McLaughlin // SPDX-License-Identifier: (GPL-3.0 OR CC-BY-NC-ND-4.0) #pragma once + +#include "ui_memorycardeditorwindow.h" + #include "core/memory_card_image.h" -#include "ui_memorycardeditordialog.h" + #include #include #include @@ -11,13 +14,13 @@ #include #include -class MemoryCardEditorDialog : public QDialog +class MemoryCardEditorWindow : public QWidget { Q_OBJECT public: - MemoryCardEditorDialog(QWidget* parent); - ~MemoryCardEditorDialog(); + MemoryCardEditorWindow(); + ~MemoryCardEditorWindow(); bool setCardA(const QString& path); bool setCardB(const QString& path); diff --git a/src/duckstation-qt/memorycardeditordialog.ui b/src/duckstation-qt/memorycardeditorwindow.ui similarity index 96% rename from src/duckstation-qt/memorycardeditordialog.ui rename to src/duckstation-qt/memorycardeditorwindow.ui index ad3958c0a..c87a8cc2c 100644 --- a/src/duckstation-qt/memorycardeditordialog.ui +++ b/src/duckstation-qt/memorycardeditorwindow.ui @@ -1,7 +1,7 @@ MemoryCardEditorDialog - + 0 @@ -13,6 +13,10 @@ Memory Card Editor + + + :/icons/duck.png:/icons/duck.png +