From 1d00f96f89cd285edb0917e22b91bc9cc3cb540b Mon Sep 17 00:00:00 2001 From: Connor McLaughlin Date: Wed, 3 Mar 2021 21:33:24 +1000 Subject: [PATCH] Qt: Populate controller tabs based on multitap mode --- src/duckstation-qt/consolesettingswidget.cpp | 2 + src/duckstation-qt/consolesettingswidget.h | 3 + .../controllersettingswidget.cpp | 83 ++++++++++++++++++- src/duckstation-qt/controllersettingswidget.h | 9 +- src/duckstation-qt/settingsdialog.cpp | 3 + 5 files changed, 96 insertions(+), 4 deletions(-) diff --git a/src/duckstation-qt/consolesettingswidget.cpp b/src/duckstation-qt/consolesettingswidget.cpp index 7b78b1b6b..a244f413e 100644 --- a/src/duckstation-qt/consolesettingswidget.cpp +++ b/src/duckstation-qt/consolesettingswidget.cpp @@ -79,6 +79,8 @@ ConsoleSettingsWidget::ConsoleSettingsWidget(QtHostInterface* host_interface, QW connect(m_ui.cpuClockSpeed, &QSlider::valueChanged, this, &ConsoleSettingsWidget::onCPUClockSpeedValueChanged); connect(m_ui.cdromReadSpeedup, QOverload::of(&QComboBox::currentIndexChanged), this, &ConsoleSettingsWidget::onCDROMReadSpeedupValueChanged); + connect(m_ui.multitapMode, QOverload::of(&QComboBox::currentIndexChanged), + [this](int index) { emit multitapModeChanged(); }); calculateCPUClockValue(); } diff --git a/src/duckstation-qt/consolesettingswidget.h b/src/duckstation-qt/consolesettingswidget.h index 3d9248928..90b4f1243 100644 --- a/src/duckstation-qt/consolesettingswidget.h +++ b/src/duckstation-qt/consolesettingswidget.h @@ -15,6 +15,9 @@ public: explicit ConsoleSettingsWidget(QtHostInterface* host_interface, QWidget* parent, SettingsDialog* dialog); ~ConsoleSettingsWidget(); +Q_SIGNALS: + void multitapModeChanged(); + private Q_SLOTS: void onEnableCPUClockSpeedControlChecked(int state); void onCPUClockSpeedValueChanged(int value); diff --git a/src/duckstation-qt/controllersettingswidget.cpp b/src/duckstation-qt/controllersettingswidget.cpp index a66014163..d747b2ec9 100644 --- a/src/duckstation-qt/controllersettingswidget.cpp +++ b/src/duckstation-qt/controllersettingswidget.cpp @@ -28,20 +28,95 @@ ControllerSettingsWidget::ControllerSettingsWidget(QtHostInterface* host_interfa ControllerSettingsWidget::~ControllerSettingsWidget() = default; +MultitapMode ControllerSettingsWidget::getMultitapMode() +{ + return Settings::ParseMultitapModeName( + QtHostInterface::GetInstance() + ->GetStringSettingValue("ControllerPorts", "MultitapMode", + Settings::GetMultitapModeName(Settings::DEFAULT_MULTITAP_MODE)) + .c_str()) + .value_or(Settings::DEFAULT_MULTITAP_MODE); +} + +QString ControllerSettingsWidget::getTabTitleForPort(u32 index, MultitapMode mode) const +{ + constexpr u32 NUM_PORTS_PER_MULTITAP = 4; + + u32 port_number, subport_number; + + switch (mode) + { + case MultitapMode::Port1Only: + { + if (index == NUM_PORTS_PER_MULTITAP) + return tr("Port %1").arg((index / NUM_PORTS_PER_MULTITAP) + 1); + else if (index > NUM_PORTS_PER_MULTITAP) + return QString(); + + port_number = 0; + subport_number = index; + } + break; + + case MultitapMode::Port2Only: + { + if (index == 0) + return tr("Port %1").arg(index + 1); + else if (index > NUM_PORTS_PER_MULTITAP) + return QString(); + + port_number = 1; + subport_number = (index - 1); + } + break; + + case MultitapMode::BothPorts: + { + port_number = index / NUM_PORTS_PER_MULTITAP; + subport_number = (index % NUM_PORTS_PER_MULTITAP); + } + break; + + case MultitapMode::Disabled: + default: + { + if (index >= (NUM_CONTROLLER_AND_CARD_PORTS / NUM_PORTS_PER_MULTITAP)) + return QString(); + + return tr("Port %1").arg(index + 1); + } + } + + return tr("Port %1%2").arg(port_number + 1).arg(QChar::fromLatin1('A' + subport_number)); +} + void ControllerSettingsWidget::createUi() { QGridLayout* layout = new QGridLayout(this); layout->setContentsMargins(0, 0, 0, 0); + const MultitapMode multitap_mode = getMultitapMode(); m_tab_widget = new QTabWidget(this); for (int i = 0; i < static_cast(m_port_ui.size()); i++) - createPortSettingsUi(i, &m_port_ui[i]); + createPortSettingsUi(i, &m_port_ui[i], multitap_mode); layout->addWidget(m_tab_widget, 0, 0, 1, 1); setLayout(layout); } +void ControllerSettingsWidget::updateMultitapControllerTitles() +{ + const MultitapMode mode = getMultitapMode(); + + for (int i = 0; i < static_cast(m_port_ui.size()); i++) + { + const QString tab_title(getTabTitleForPort(i, mode)); + m_tab_widget->setTabVisible(i, !tab_title.isEmpty()); + m_tab_widget->setTabText(i, tab_title); + } +} + void ControllerSettingsWidget::onProfileLoaded() { for (int i = 0; i < static_cast(m_port_ui.size()); i++) @@ -74,7 +149,7 @@ void ControllerSettingsWidget::reloadBindingButtons() } } -void ControllerSettingsWidget::createPortSettingsUi(int index, PortSettingsUI* ui) +void ControllerSettingsWidget::createPortSettingsUi(int index, PortSettingsUI* ui, MultitapMode multitap_mode) { ui->widget = new QWidget(m_tab_widget); ui->layout = new QVBoxLayout(ui->widget); @@ -165,7 +240,9 @@ void ControllerSettingsWidget::createPortSettingsUi(int index, PortSettingsUI* u ui->widget->setLayout(ui->layout); - m_tab_widget->addTab(ui->widget, tr("Port %1").arg(index + 1)); + const QString tab_title(getTabTitleForPort(index, multitap_mode)); + m_tab_widget->addTab(ui->widget, tab_title); + m_tab_widget->setTabVisible(index, !tab_title.isEmpty()); } void ControllerSettingsWidget::createPortBindingSettingsUi(int index, PortSettingsUI* ui, ControllerType ctype) diff --git a/src/duckstation-qt/controllersettingswidget.h b/src/duckstation-qt/controllersettingswidget.h index ddb607399..7afecb8b5 100644 --- a/src/duckstation-qt/controllersettingswidget.h +++ b/src/duckstation-qt/controllersettingswidget.h @@ -24,6 +24,9 @@ public: ControllerSettingsWidget(QtHostInterface* host_interface, QWidget* parent = nullptr); ~ControllerSettingsWidget(); +public Q_SLOTS: + void updateMultitapControllerTitles(); + private Q_SLOTS: void onProfileLoaded(); @@ -42,9 +45,13 @@ private: InputBindingWidget* first_button; }; + static MultitapMode getMultitapMode(); + + QString getTabTitleForPort(u32 index, MultitapMode mode) const; + void createUi(); void reloadBindingButtons(); - void createPortSettingsUi(int index, PortSettingsUI* ui); + void createPortSettingsUi(int index, PortSettingsUI* ui, MultitapMode multitap_mode); void createPortBindingSettingsUi(int index, PortSettingsUI* ui, ControllerType ctype); void onControllerTypeChanged(int index); void onLoadProfileClicked(); diff --git a/src/duckstation-qt/settingsdialog.cpp b/src/duckstation-qt/settingsdialog.cpp index e26b614c0..337f9c0ac 100644 --- a/src/duckstation-qt/settingsdialog.cpp +++ b/src/duckstation-qt/settingsdialog.cpp @@ -76,6 +76,9 @@ SettingsDialog::SettingsDialog(QtHostInterface* host_interface, QWidget* parent m_ui.helpText->setText(m_category_help_text[0]); connect(m_ui.settingsCategory, &QListWidget::currentRowChanged, this, &SettingsDialog::onCategoryCurrentRowChanged); connect(m_ui.closeButton, &QPushButton::clicked, this, &SettingsDialog::accept); + + connect(m_console_settings, &ConsoleSettingsWidget::multitapModeChanged, m_controller_settings, + &ControllerSettingsWidget::updateMultitapControllerTitles); } SettingsDialog::~SettingsDialog() = default;