diff options
| author | Joshua Vandaƫle <joshua@vandaele.software> | 2025-02-28 08:07:17 +0100 |
|---|---|---|
| committer | Joshua Vandaƫle <joshua@vandaele.software> | 2025-04-23 02:19:28 +0200 |
| commit | 4773a6f323537fb5bff9fd19eea69787f2927ee7 (patch) | |
| tree | bfe634d8451681c6a003775f6d76d0dca466dedc /Source/Core/DolphinQt/Config/WiimoteControllersWidget.cpp | |
| parent | 826625c7be9e0104eb4de4fc2b2d3d7b6184c580 (diff) | |
Add a GUI option to select a bluetooth device
Diffstat (limited to 'Source/Core/DolphinQt/Config/WiimoteControllersWidget.cpp')
| -rw-r--r-- | Source/Core/DolphinQt/Config/WiimoteControllersWidget.cpp | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/Source/Core/DolphinQt/Config/WiimoteControllersWidget.cpp b/Source/Core/DolphinQt/Config/WiimoteControllersWidget.cpp index 9159402be2..69de3837ad 100644 --- a/Source/Core/DolphinQt/Config/WiimoteControllersWidget.cpp +++ b/Source/Core/DolphinQt/Config/WiimoteControllersWidget.cpp @@ -13,6 +13,7 @@ #include <QRadioButton> #include <QScreen> #include <QVBoxLayout> +#include <QVariant> #include <map> #include <optional> @@ -57,6 +58,50 @@ void WiimoteControllersWidget::UpdateBluetoothAvailableStatus() m_bluetooth_unavailable->setHidden(WiimoteReal::IsScannerReady()); } +void WiimoteControllersWidget::RefreshBluetoothAdapters() +{ + m_bluetooth_adapters->clear(); + + const int configured_vid = Config::Get(Config::MAIN_BLUETOOTH_PASSTHROUGH_VID); + const int configured_pid = Config::Get(Config::MAIN_BLUETOOTH_PASSTHROUGH_PID); + bool found_configured_device = configured_vid == -1 || configured_pid == -1; + + m_bluetooth_adapters->addItem(tr("Automatic")); + + for (auto& device : IOS::HLE::BluetoothRealDevice::ListDevices()) + { + std::string name = device.name.empty() ? tr("Unknown Device").toStdString() : device.name; + QString device_info = + QString::fromStdString(fmt::format("{} ({:04x}:{:04x})", name, device.vid, device.pid)); + m_bluetooth_adapters->addItem(device_info, QVariant::fromValue(device)); + + if (!found_configured_device && + IOS::HLE::BluetoothRealDevice::IsConfiguredBluetoothDevice(device.vid, device.pid)) + { + found_configured_device = true; + m_bluetooth_adapters->setCurrentIndex(m_bluetooth_adapters->count() - 1); + } + } + + if (!found_configured_device) + { + const QString name = QLatin1Char{'['} + tr("disconnected") + QLatin1Char(']'); + const std::string name_str = name.toStdString(); + + IOS::HLE::BluetoothRealDevice::BluetoothDeviceInfo disconnected_device; + disconnected_device.vid = configured_vid; + disconnected_device.pid = configured_pid; + disconnected_device.name = name_str; + + QString device_info = QString::fromStdString( + fmt::format("{} ({:04x}:{:04x})", name_str, configured_vid, configured_pid)); + + m_bluetooth_adapters->insertSeparator(m_bluetooth_adapters->count()); + m_bluetooth_adapters->addItem(device_info, QVariant::fromValue(disconnected_device)); + m_bluetooth_adapters->setCurrentIndex(m_bluetooth_adapters->count() - 1); + } +} + static int GetRadioButtonIndicatorWidth() { const QStyle* style = QApplication::style(); @@ -104,6 +149,8 @@ void WiimoteControllersWidget::CreateLayout() m_wiimote_box->setLayout(m_wiimote_layout); m_wiimote_passthrough = new QRadioButton(tr("Passthrough a Bluetooth adapter")); + m_bluetooth_adapters_label = new QLabel(tr("Bluetooth adapter")); + m_bluetooth_adapters = new QComboBox(); m_wiimote_sync = new NonDefaultQPushButton(tr("Sync")); m_wiimote_reset = new NonDefaultQPushButton(tr("Reset")); m_wiimote_refresh = new NonDefaultQPushButton(tr("Refresh")); @@ -123,6 +170,10 @@ void WiimoteControllersWidget::CreateLayout() // Passthrough BT m_wiimote_layout->addWidget(m_wiimote_passthrough, m_wiimote_layout->rowCount(), 0, 1, -1); + int adapter_row = m_wiimote_layout->rowCount(); + m_wiimote_layout->addWidget(m_bluetooth_adapters_label, adapter_row, 1, 1, 1); + m_wiimote_layout->addWidget(m_bluetooth_adapters, adapter_row, 2, 1, 2); + int sync_row = m_wiimote_layout->rowCount(); m_wiimote_layout->addWidget(m_wiimote_pt_labels[0], sync_row, 1, 1, 2); m_wiimote_layout->addWidget(m_wiimote_sync, sync_row, 3); @@ -189,6 +240,8 @@ void WiimoteControllersWidget::ConnectWidgets() &WiimoteControllersWidget::SaveSettings); connect(m_wiimote_speaker_data, &QCheckBox::toggled, this, &WiimoteControllersWidget::SaveSettings); + connect(m_bluetooth_adapters, &QComboBox::activated, this, + &WiimoteControllersWidget::OnBluetoothPassthroughDeviceChanged); connect(m_wiimote_sync, &QPushButton::clicked, this, &WiimoteControllersWidget::OnBluetoothPassthroughSyncPressed); connect(m_wiimote_reset, &QPushButton::clicked, this, @@ -207,6 +260,25 @@ void WiimoteControllersWidget::ConnectWidgets() } } +void WiimoteControllersWidget::OnBluetoothPassthroughDeviceChanged(int index) +{ + // "Automatic" selection + if (index == 0) + { + Config::DeleteKey(Config::GetActiveLayerForConfig(Config::MAIN_BLUETOOTH_PASSTHROUGH_PID), + Config::MAIN_BLUETOOTH_PASSTHROUGH_PID); + Config::DeleteKey(Config::GetActiveLayerForConfig(Config::MAIN_BLUETOOTH_PASSTHROUGH_VID), + Config::MAIN_BLUETOOTH_PASSTHROUGH_VID); + return; + } + + auto device_info = m_bluetooth_adapters->itemData(index) + .value<IOS::HLE::BluetoothRealDevice::BluetoothDeviceInfo>(); + + Config::SetBaseOrCurrent(Config::MAIN_BLUETOOTH_PASSTHROUGH_PID, device_info.pid); + Config::SetBaseOrCurrent(Config::MAIN_BLUETOOTH_PASSTHROUGH_VID, device_info.vid); +} + void WiimoteControllersWidget::OnBluetoothPassthroughResetPressed() { const auto ios = Core::System::GetInstance().GetIOS(); @@ -297,11 +369,15 @@ void WiimoteControllersWidget::LoadSettings(Core::State state) m_wiimote_passthrough->setEnabled(!running); const bool running_gc = running && !Core::System::GetInstance().IsWii(); + const bool running_wii = running && Core::System::GetInstance().IsWii(); const bool enable_passthrough = m_wiimote_passthrough->isChecked() && !running_gc; + const bool enable_adapter_selection = m_wiimote_passthrough->isChecked() && !running_wii; const bool enable_emu_bt = !m_wiimote_passthrough->isChecked() && !running_gc; const bool is_netplay = NetPlay::IsNetPlayRunning(); const bool running_netplay = running && is_netplay; + m_bluetooth_adapters_label->setEnabled(enable_adapter_selection); + m_bluetooth_adapters->setEnabled(enable_adapter_selection); m_wiimote_sync->setEnabled(enable_passthrough); m_wiimote_reset->setEnabled(enable_passthrough); |
