Skip to content

Commit 4850471

Browse files
authored
Qt: Remove a few more instances of QDialog::exec() (#3623)
1 parent e3a044a commit 4850471

28 files changed

+341
-314
lines changed

src/duckstation-qt/aboutdialog.cpp

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -57,17 +57,18 @@ AboutDialog::~AboutDialog() = default;
5757

5858
void AboutDialog::showThirdPartyNotices(QWidget* parent)
5959
{
60-
QDialog dialog(parent);
61-
dialog.setMinimumSize(700, 400);
62-
dialog.setWindowTitle(tr("DuckStation Third-Party Notices"));
60+
QDialog* const dialog = new QDialog(parent);
61+
dialog->setAttribute(Qt::WA_DeleteOnClose);
62+
dialog->setMinimumSize(700, 400);
63+
dialog->setWindowTitle(tr("DuckStation Third-Party Notices"));
6364

6465
QIcon icon;
6566
icon.addFile(QString::fromUtf8(":/icons/duck.png"), QSize(), QIcon::Normal, QIcon::Off);
66-
dialog.setWindowIcon(icon);
67+
dialog->setWindowIcon(icon);
6768

68-
QVBoxLayout* layout = new QVBoxLayout(&dialog);
69+
QVBoxLayout* layout = new QVBoxLayout(dialog);
6970

70-
QTextBrowser* tb = new QTextBrowser(&dialog);
71+
QTextBrowser* tb = new QTextBrowser(dialog);
7172
tb->setAcceptRichText(true);
7273
tb->setReadOnly(true);
7374
tb->setOpenExternalLinks(true);
@@ -83,9 +84,9 @@ void AboutDialog::showThirdPartyNotices(QWidget* parent)
8384
}
8485
layout->addWidget(tb, 1);
8586

86-
QDialogButtonBox* bb = new QDialogButtonBox(QDialogButtonBox::Close, &dialog);
87-
connect(bb, &QDialogButtonBox::rejected, &dialog, &QDialog::accept);
87+
QDialogButtonBox* bb = new QDialogButtonBox(QDialogButtonBox::Close, dialog);
88+
connect(bb, &QDialogButtonBox::rejected, dialog, &QDialog::accept);
8889
layout->addWidget(bb, 0);
8990

90-
dialog.exec();
91+
dialog->open();
9192
}

src/duckstation-qt/aboutdialog.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,4 @@ class AboutDialog final : public QDialog
1818

1919
private:
2020
Ui::AboutDialog m_ui;
21-
2221
};

src/duckstation-qt/achievementlogindialog.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ AchievementLoginDialog::AchievementLoginDialog(QWidget* parent, Achievements::Lo
2020
title_font.setPixelSize(20);
2121
m_ui.titleLabel->setFont(title_font);
2222
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
23-
setAttribute(Qt::WA_DeleteOnClose, true);
23+
setAttribute(Qt::WA_DeleteOnClose);
2424

2525
// Adjust text if needed based on reason.
2626
if (reason == Achievements::LoginRequestReason::TokenInvalid)

src/duckstation-qt/achievementlogindialog.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ namespace Achievements {
1010
enum class LoginRequestReason;
1111
}
1212

13-
class AchievementLoginDialog : public QDialog
13+
class AchievementLoginDialog final : public QDialog
1414
{
1515
Q_OBJECT
1616

src/duckstation-qt/achievementlogindialog.ui

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,6 @@
22
<ui version="4.0">
33
<class>AchievementLoginDialog</class>
44
<widget class="QDialog" name="AchievementLoginDialog">
5-
<property name="windowModality">
6-
<enum>Qt::WindowModality::WindowModal</enum>
7-
</property>
85
<property name="geometry">
96
<rect>
107
<x>0</x>
@@ -28,9 +25,6 @@
2825
<property name="windowTitle">
2926
<string comment="Window title">RetroAchievements Login</string>
3027
</property>
31-
<property name="modal">
32-
<bool>true</bool>
33-
</property>
3428
<layout class="QGridLayout" name="gridLayout">
3529
<item row="2" column="0">
3630
<widget class="QLabel" name="label_4">

src/duckstation-qt/achievementsettingswidget.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ void AchievementSettingsWidget::onLoginLogoutPressed()
240240

241241
AchievementLoginDialog* login = new AchievementLoginDialog(this, Achievements::LoginRequestReason::UserInitiated);
242242
connect(login, &AchievementLoginDialog::accepted, this, &AchievementSettingsWidget::onLoginCompleted);
243-
login->show();
243+
login->open();
244244
}
245245

246246
void AchievementSettingsWidget::onLoginCompleted()

src/duckstation-qt/audiosettingswidget.cpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -281,9 +281,10 @@ void AudioSettingsWidget::onOutputMutedChanged(int new_state)
281281

282282
void AudioSettingsWidget::onStretchSettingsClicked()
283283
{
284-
QDialog dlg(QtUtils::GetRootWidget(this));
284+
QDialog* const dlg = new QDialog(QtUtils::GetRootWidget(this));
285+
dlg->setAttribute(Qt::WA_DeleteOnClose);
285286
Ui::AudioStretchSettingsDialog dlgui;
286-
dlgui.setupUi(&dlg);
287+
dlgui.setupUi(dlg);
287288
dlgui.icon->setPixmap(QIcon::fromTheme(QStringLiteral("volume-up-line")).pixmap(32));
288289
dlgui.buttonBox->button(QDialogButtonBox::Close)->setDefault(true);
289290

@@ -302,8 +303,8 @@ void AudioSettingsWidget::onStretchSettingsClicked()
302303
SettingWidgetBinder::BindWidgetToBoolSetting(sif, dlgui.useAAFilter, "Audio", "StretchUseAAFilter",
303304
AudioStreamParameters::DEFAULT_STRETCH_USE_AA_FILTER);
304305

305-
connect(dlgui.buttonBox, &QDialogButtonBox::rejected, &dlg, &QDialog::accept);
306-
connect(dlgui.buttonBox->button(QDialogButtonBox::RestoreDefaults), &QPushButton::clicked, this, [this, &dlg]() {
306+
connect(dlgui.buttonBox, &QDialogButtonBox::rejected, dlg, &QDialog::accept);
307+
connect(dlgui.buttonBox->button(QDialogButtonBox::RestoreDefaults), &QPushButton::clicked, this, [this, dlg]() {
307308
m_dialog->setIntSettingValue("Audio", "StretchSequenceLengthMS",
308309
m_dialog->isPerGameSettings() ?
309310
std::nullopt :
@@ -325,12 +326,12 @@ void AudioSettingsWidget::onStretchSettingsClicked()
325326
std::nullopt :
326327
std::optional<bool>(AudioStreamParameters::DEFAULT_STRETCH_USE_AA_FILTER));
327328

328-
dlg.reject();
329+
dlg->reject();
329330

330331
QMetaObject::invokeMethod(this, &AudioSettingsWidget::onStretchSettingsClicked, Qt::QueuedConnection);
331332
});
332333

333-
dlg.exec();
334+
dlg->open();
334335
}
335336

336337
void AudioSettingsWidget::resetVolume(bool fast_forward)

src/duckstation-qt/consolesettingswidget.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,6 @@ void ConsoleSettingsWidget::onEnableCPUClockSpeedControlChecked(int state)
194194

195195
QMessageBox* const mb = QtUtils::NewMessageBox(QMessageBox::Warning, tr("CPU Overclocking Warning"), message,
196196
QMessageBox::NoButton, QMessageBox::NoButton, Qt::WindowModal, this);
197-
mb->setAttribute(Qt::WA_DeleteOnClose, true);
198197
const QPushButton* const yes_button =
199198
mb->addButton(tr("Yes, I will confirm bugs without overclocking before reporting."), QMessageBox::YesRole);
200199
const QPushButton* const no_button = mb->addButton(tr("No, take me back to safety."), QMessageBox::NoRole);

src/duckstation-qt/controllerbindingwidgets.cpp

Lines changed: 100 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -368,101 +368,13 @@ void ControllerBindingWidget::doDeviceAutomaticBinding(const QString& device)
368368

369369
void ControllerBindingWidget::onMultipleDeviceAutomaticBindingTriggered()
370370
{
371-
// force a refresh after mapping
372-
if (doMultipleDeviceAutomaticBinding(this, m_dialog, m_port_number))
373-
onTypeChanged();
374-
}
375-
376-
bool ControllerBindingWidget::doMultipleDeviceAutomaticBinding(QWidget* parent, ControllerSettingsWindow* parent_dialog,
377-
u32 port)
378-
{
379-
QDialog dialog(parent);
380-
381-
QVBoxLayout* layout = new QVBoxLayout(&dialog);
382-
QLabel help(tr("Select the devices from the list below that you want to bind to this controller."), &dialog);
383-
layout->addWidget(&help);
384-
385-
QListWidget list(&dialog);
386-
list.setSelectionMode(QListWidget::SingleSelection);
387-
layout->addWidget(&list);
388-
389-
for (const InputDeviceListModel::Device& dev : g_emu_thread->getInputDeviceListModel()->getDeviceList())
390-
{
391-
QListWidgetItem* item = new QListWidgetItem;
392-
item->setText(QStringLiteral("%1 (%2)").arg(dev.identifier).arg(dev.display_name));
393-
item->setData(Qt::UserRole, dev.identifier);
394-
item->setIcon(InputDeviceListModel::getIconForKey(dev.key));
395-
item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
396-
item->setCheckState(Qt::Unchecked);
397-
list.addItem(item);
398-
}
399-
400-
QDialogButtonBox bb(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, &dialog);
401-
connect(&bb, &QDialogButtonBox::accepted, &dialog, &QDialog::accept);
402-
connect(&bb, &QDialogButtonBox::rejected, &dialog, &QDialog::reject);
403-
layout->addWidget(&bb);
404-
405-
if (dialog.exec() == QDialog::Rejected)
406-
return false;
407-
408-
auto lock = Host::GetSettingsLock();
409-
const bool global = (!parent_dialog || parent_dialog->isEditingGlobalSettings());
410-
SettingsInterface& si =
411-
*(global ? Host::Internal::GetBaseSettingsLayer() : parent_dialog->getEditingSettingsInterface());
412-
413-
// first device should clear mappings
414-
bool tried_any = false;
415-
bool mapped_any = false;
416-
const int count = list.count();
417-
for (int i = 0; i < count; i++)
418-
{
419-
QListWidgetItem* item = list.item(i);
420-
if (item->checkState() != Qt::Checked)
421-
continue;
422-
423-
tried_any = true;
424-
425-
const QString identifier = item->data(Qt::UserRole).toString();
426-
std::vector<std::pair<GenericInputBinding, std::string>> mapping =
427-
InputManager::GetGenericBindingMapping(identifier.toStdString());
428-
if (mapping.empty())
429-
{
430-
lock.unlock();
431-
QtUtils::MessageBoxCritical(
432-
parent, tr("Automatic Mapping"),
433-
tr("No generic bindings were generated for device '%1'. The controller/source may not "
434-
"support automatic mapping.")
435-
.arg(identifier));
436-
lock.lock();
437-
continue;
438-
}
439-
440-
mapped_any |= InputManager::MapController(si, port, mapping, !mapped_any);
441-
}
442-
443-
lock.unlock();
444-
445-
if (!tried_any)
446-
{
447-
QtUtils::MessageBoxInformation(parent, tr("Automatic Mapping"), tr("No devices were selected."));
448-
return false;
449-
}
371+
QDialog* const dialog = new MultipleDeviceAutobindDialog(this, m_dialog, m_port_number);
372+
dialog->setAttribute(Qt::WA_DeleteOnClose);
450373

451-
if (mapped_any)
452-
{
453-
if (global)
454-
{
455-
QtHost::SaveGameSettings(&si, false);
456-
g_emu_thread->reloadGameSettings(false);
457-
}
458-
else
459-
{
460-
QtHost::QueueSettingsSave();
461-
g_emu_thread->reloadInputBindings();
462-
}
463-
}
374+
// force a refresh after mapping
375+
connect(dialog, &QDialog::accepted, this, [this] { onTypeChanged(); });
464376

465-
return mapped_any;
377+
dialog->open();
466378
}
467379

468380
void ControllerBindingWidget::saveAndRefresh()
@@ -1077,3 +989,98 @@ ControllerCustomSettingsDialog::ControllerCustomSettingsDialog(QWidget* parent,
1077989
}
1078990

1079991
ControllerCustomSettingsDialog::~ControllerCustomSettingsDialog() = default;
992+
993+
MultipleDeviceAutobindDialog::MultipleDeviceAutobindDialog(QWidget* parent, ControllerSettingsWindow* settings_window,
994+
u32 port)
995+
: QDialog(parent), m_settings_window(settings_window), m_port(port)
996+
{
997+
QVBoxLayout* layout = new QVBoxLayout(this);
998+
layout->addWidget(new QLabel(tr("Select the devices from the list below that you want to bind to this controller.")));
999+
1000+
m_list = new QListWidget;
1001+
m_list->setSelectionMode(QListWidget::SingleSelection);
1002+
layout->addWidget(m_list);
1003+
1004+
for (const InputDeviceListModel::Device& dev : g_emu_thread->getInputDeviceListModel()->getDeviceList())
1005+
{
1006+
QListWidgetItem* item = new QListWidgetItem;
1007+
item->setIcon(InputDeviceListModel::getIconForKey(dev.key));
1008+
item->setText(QStringLiteral("%1 (%2)").arg(dev.identifier).arg(dev.display_name));
1009+
item->setData(Qt::UserRole, dev.identifier);
1010+
item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
1011+
item->setCheckState(Qt::Unchecked);
1012+
m_list->addItem(item);
1013+
}
1014+
1015+
QDialogButtonBox* bb = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
1016+
connect(bb, &QDialogButtonBox::accepted, this, &MultipleDeviceAutobindDialog::doAutomaticBinding);
1017+
connect(bb, &QDialogButtonBox::rejected, this, &QDialog::reject);
1018+
layout->addWidget(bb);
1019+
}
1020+
1021+
MultipleDeviceAutobindDialog::~MultipleDeviceAutobindDialog() = default;
1022+
1023+
void MultipleDeviceAutobindDialog::doAutomaticBinding()
1024+
{
1025+
auto lock = Host::GetSettingsLock();
1026+
const bool global = (!m_settings_window || m_settings_window->isEditingGlobalSettings());
1027+
SettingsInterface* si =
1028+
global ? Host::Internal::GetBaseSettingsLayer() : m_settings_window->getEditingSettingsInterface();
1029+
1030+
// first device should clear mappings
1031+
bool tried_any = false;
1032+
bool mapped_any = false;
1033+
const int count = m_list->count();
1034+
for (int i = 0; i < count; i++)
1035+
{
1036+
const QListWidgetItem* item = m_list->item(i);
1037+
if (item->checkState() != Qt::Checked)
1038+
continue;
1039+
1040+
tried_any = true;
1041+
1042+
const QString identifier = item->data(Qt::UserRole).toString();
1043+
std::vector<std::pair<GenericInputBinding, std::string>> mapping =
1044+
InputManager::GetGenericBindingMapping(identifier.toStdString());
1045+
if (mapping.empty())
1046+
{
1047+
lock.unlock();
1048+
QtUtils::MessageBoxCritical(
1049+
this, tr("Automatic Mapping"),
1050+
tr("No generic bindings were generated for device '%1'. The controller/source may not "
1051+
"support automatic mapping.")
1052+
.arg(identifier));
1053+
lock.lock();
1054+
continue;
1055+
}
1056+
1057+
mapped_any |= InputManager::MapController(*si, m_port, mapping, !mapped_any);
1058+
}
1059+
1060+
lock.unlock();
1061+
1062+
if (!tried_any)
1063+
{
1064+
QtUtils::MessageBoxInformation(this, tr("Automatic Mapping"), tr("No devices were selected."));
1065+
return;
1066+
}
1067+
1068+
if (mapped_any)
1069+
{
1070+
if (global)
1071+
{
1072+
QtHost::SaveGameSettings(si, false);
1073+
g_emu_thread->reloadGameSettings(false);
1074+
}
1075+
else
1076+
{
1077+
QtHost::QueueSettingsSave();
1078+
g_emu_thread->reloadInputBindings();
1079+
}
1080+
accept();
1081+
}
1082+
else
1083+
{
1084+
reject();
1085+
}
1086+
}

src/duckstation-qt/controllerbindingwidgets.h

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,6 @@ class ControllerBindingWidget final : public QWidget
3838
ALWAYS_INLINE u32 getPortNumber() const { return m_port_number; }
3939
ALWAYS_INLINE const QIcon& getIcon() { return m_icon; }
4040

41-
static bool doMultipleDeviceAutomaticBinding(QWidget* parent, ControllerSettingsWindow* parent_dialog, u32 port);
42-
4341
private:
4442
void populateControllerTypes();
4543
void populateWidgets();
@@ -142,11 +140,29 @@ class ControllerCustomSettingsWidget : public QWidget
142140

143141
//////////////////////////////////////////////////////////////////////////
144142

145-
class ControllerCustomSettingsDialog : public QDialog
143+
class ControllerCustomSettingsDialog final : public QDialog
146144
{
147145
public:
148-
explicit ControllerCustomSettingsDialog(QWidget* parent, SettingsInterface* sif, const std::string& section,
149-
std::span<const SettingInfo> settings, const char* tr_context,
150-
const QString& window_title);
146+
ControllerCustomSettingsDialog(QWidget* parent, SettingsInterface* sif, const std::string& section,
147+
std::span<const SettingInfo> settings, const char* tr_context,
148+
const QString& window_title);
151149
~ControllerCustomSettingsDialog();
152150
};
151+
152+
//////////////////////////////////////////////////////////////////////////
153+
154+
class MultipleDeviceAutobindDialog final : public QDialog
155+
{
156+
Q_OBJECT
157+
158+
public:
159+
MultipleDeviceAutobindDialog(QWidget* parent, ControllerSettingsWindow* settings_window, u32 port);
160+
~MultipleDeviceAutobindDialog();
161+
162+
private:
163+
void doAutomaticBinding();
164+
165+
QListWidget* m_list;
166+
ControllerSettingsWindow* m_settings_window;
167+
u32 m_port;
168+
};

0 commit comments

Comments
 (0)