diff --git a/src/citron/configuration/configure_network.cpp b/src/citron/configuration/configure_network.cpp index 7757638b1..4de31f8ad 100644 --- a/src/citron/configuration/configure_network.cpp +++ b/src/citron/configuration/configure_network.cpp @@ -2,6 +2,7 @@ // SPDX-FileCopyrightText: Copyright 2025 Citron Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include #include #include "common/settings.h" #include "core/core.h" @@ -19,20 +20,26 @@ ConfigureNetwork::ConfigureNetwork(const Core::System& system_, QWidget* parent) } this->SetConfiguration(); + + // Store the initial URL + original_lobby_api_url = Settings::values.lobby_api_url.GetValue(); + + connect(ui->restore_default_lobby_api, &QPushButton::clicked, this, &ConfigureNetwork::OnRestoreDefaultLobbyApi); } ConfigureNetwork::~ConfigureNetwork() = default; void ConfigureNetwork::ApplyConfiguration() { + // Apply all settings from the UI to the settings system Settings::values.airplane_mode = ui->airplane_mode->isChecked(); Settings::values.network_interface = ui->network_interface->currentText().toStdString(); + Settings::values.lobby_api_url = ui->lobby_api_url->text().toStdString(); } void ConfigureNetwork::changeEvent(QEvent* event) { if (event->type() == QEvent::LanguageChange) { RetranslateUI(); } - QWidget::changeEvent(event); } @@ -47,11 +54,23 @@ void ConfigureNetwork::SetConfiguration() { ui->airplane_mode->setEnabled(runtime_lock); const std::string& network_interface = Settings::values.network_interface.GetValue(); - ui->network_interface->setCurrentText(QString::fromStdString(network_interface)); - ui->network_interface->setEnabled(runtime_lock && !ui->airplane_mode->isChecked()); - connect(ui->airplane_mode, &QCheckBox::toggled, this, [this](bool checked) { - ui->network_interface->setEnabled(!checked && !system.IsPoweredOn()); + ui->lobby_api_url->setText(QString::fromStdString(Settings::values.lobby_api_url.GetValue())); + + const bool networking_enabled = runtime_lock && !ui->airplane_mode->isChecked(); + ui->network_interface->setEnabled(networking_enabled); + ui->lobby_api_url->setEnabled(networking_enabled); + ui->restore_default_lobby_api->setEnabled(networking_enabled); + + connect(ui->airplane_mode, &QCheckBox::toggled, this, [this, runtime_lock](bool checked) { + const bool enabled = !checked && runtime_lock; + ui->network_interface->setEnabled(enabled); + ui->lobby_api_url->setEnabled(enabled); + ui->restore_default_lobby_api->setEnabled(enabled); }); } + +void ConfigureNetwork::OnRestoreDefaultLobbyApi() { + ui->lobby_api_url->setText(QString::fromStdString(Settings::values.lobby_api_url.GetDefault())); +} diff --git a/src/citron/configuration/configure_network.h b/src/citron/configuration/configure_network.h index f666edbd1..379c8c999 100644 --- a/src/citron/configuration/configure_network.h +++ b/src/citron/configuration/configure_network.h @@ -1,15 +1,22 @@ // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project +// SPDX-FileCopyrightText: 2025 citron Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include +#include // Required for std::string #include namespace Ui { class ConfigureNetwork; } +// Forward declare Core::System +namespace Core { +class System; +} + class ConfigureNetwork : public QWidget { Q_OBJECT @@ -19,12 +26,17 @@ public: void ApplyConfiguration(); +private slots: + void OnRestoreDefaultLobbyApi(); + private: void changeEvent(QEvent*) override; void RetranslateUI(); void SetConfiguration(); std::unique_ptr ui; - const Core::System& system; + + // This stores the URL + std::string original_lobby_api_url; }; diff --git a/src/citron/configuration/configure_network.ui b/src/citron/configuration/configure_network.ui index 17dc1a458..84fc75129 100644 --- a/src/citron/configuration/configure_network.ui +++ b/src/citron/configuration/configure_network.ui @@ -25,7 +25,7 @@ General - + Airplane Mode @@ -45,6 +45,23 @@ + + + + Lobby API URL + + + + + + + + + + Restore Default + + + diff --git a/src/citron/configuration/qt_config.cpp b/src/citron/configuration/qt_config.cpp index 00eb7dfc6..ce5d87fb1 100644 --- a/src/citron/configuration/qt_config.cpp +++ b/src/citron/configuration/qt_config.cpp @@ -76,6 +76,7 @@ void QtConfig::ReadQtValues() { ReadUIValues(); } ReadQtControlValues(); + ReadNetworkValues(); } void QtConfig::ReadQtPlayerValues(const std::size_t player_index) { @@ -279,6 +280,12 @@ void QtConfig::ReadUIValues() { EndGroup(); } +void QtConfig::ReadNetworkValues() { + BeginGroup(Settings::TranslateCategory(Settings::Category::Network)); + ReadCategory(Settings::Category::Network); + EndGroup(); +} + void QtConfig::ReadUIGamelistValues() { BeginGroup(Settings::TranslateCategory(Settings::Category::UiGameList)); @@ -337,6 +344,7 @@ void QtConfig::SaveQtValues() { LOG_DEBUG(Config, "Saving Qt configuration values"); } SaveQtControlValues(); + SaveNetworkValues(); WriteToIni(); } @@ -526,6 +534,12 @@ void QtConfig::SaveMultiplayerValues() { EndGroup(); } +void QtConfig::SaveNetworkValues() { + BeginGroup(Settings::TranslateCategory(Settings::Category::Network)); + WriteCategory(Settings::Category::Network); + EndGroup(); +} + std::vector& QtConfig::FindRelevantList(Settings::Category category) { auto& map = Settings::values.linkage.by_category; if (map.contains(category)) { diff --git a/src/citron/configuration/qt_config.h b/src/citron/configuration/qt_config.h index dc2dceb4d..d82093581 100644 --- a/src/citron/configuration/qt_config.h +++ b/src/citron/configuration/qt_config.h @@ -1,4 +1,5 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2025 citron Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once @@ -31,6 +32,7 @@ protected: void ReadUIGamelistValues() override; void ReadUILayoutValues() override; void ReadMultiplayerValues() override; + void ReadNetworkValues(); void SaveQtValues(); void SaveQtPlayerValues(std::size_t player_index); @@ -43,6 +45,7 @@ protected: void SaveUIGamelistValues() override; void SaveUILayoutValues() override; void SaveMultiplayerValues() override; + void SaveNetworkValues(); std::vector& FindRelevantList(Settings::Category category) override; diff --git a/src/citron/multiplayer/host_room.cpp b/src/citron/multiplayer/host_room.cpp index cefb5c1ea..fb0d9df22 100644 --- a/src/citron/multiplayer/host_room.cpp +++ b/src/citron/multiplayer/host_room.cpp @@ -101,7 +101,7 @@ std::unique_ptr HostRoomWindow::CreateVerifyBacken if (use_validation) { #ifdef ENABLE_WEB_SERVICE verify_backend = - std::make_unique(Settings::values.web_api_url.GetValue()); + std::make_unique(Settings::values.lobby_api_url.GetValue()); #else verify_backend = std::make_unique(); #endif @@ -209,7 +209,7 @@ void HostRoomWindow::Host() { std::string token; #ifdef ENABLE_WEB_SERVICE if (is_public) { - WebService::Client client(Settings::values.web_api_url.GetValue(), + WebService::Client client(Settings::values.lobby_api_url.GetValue(), Settings::values.citron_username.GetValue(), Settings::values.citron_token.GetValue()); if (auto room = room_network.GetRoom().lock()) { diff --git a/src/citron/multiplayer/lobby.cpp b/src/citron/multiplayer/lobby.cpp index f086289ff..658e5e1c5 100644 --- a/src/citron/multiplayer/lobby.cpp +++ b/src/citron/multiplayer/lobby.cpp @@ -1,4 +1,5 @@ // SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project +// SPDX-FileCopyrightText: 2025 citron Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include @@ -189,7 +190,7 @@ void Lobby::OnJoinRoom(const QModelIndex& source) { #ifdef ENABLE_WEB_SERVICE if (!Settings::values.citron_username.GetValue().empty() && !Settings::values.citron_token.GetValue().empty() && !verify_uid.empty()) { - WebService::Client client(Settings::values.web_api_url.GetValue(), + WebService::Client client(Settings::values.lobby_api_url.GetValue(), Settings::values.citron_username.GetValue(), Settings::values.citron_token.GetValue()); token = client.GetExternalJWT(verify_uid).returned_data; @@ -396,14 +397,14 @@ bool LobbyFilterProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex& s for (int r = 0; r < game_list->rowCount(); ++r) { owned_games.append(QModelIndex(game_list->index(r, 0))); } - auto current_id = sourceModel()->data(game_name, LobbyItemGame::TitleIDRole).toLongLong(); + auto current_id = sourceModel()->data(game_name, LobbyItemGame::TitleIDRole).toULongLong(); if (current_id == 0) { // TODO(jroweboy): homebrew often doesn't have a game id and this hides them return false; } bool owned = false; for (const auto& game : owned_games) { - auto game_id = game_list->data(game, GameListItemPath::ProgramIdRole).toLongLong(); + auto game_id = game_list->data(game, GameListItemPath::ProgramIdRole).toULongLong(); if (current_id == game_id) { owned = true; } diff --git a/src/network/announce_multiplayer_session.cpp b/src/network/announce_multiplayer_session.cpp index c692be9a5..4a1dd4004 100644 --- a/src/network/announce_multiplayer_session.cpp +++ b/src/network/announce_multiplayer_session.cpp @@ -1,4 +1,5 @@ // SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project +// SPDX-FileCopyrightText: 2025 citron Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include @@ -22,7 +23,7 @@ static constexpr std::chrono::seconds announce_time_interval(15); AnnounceMultiplayerSession::AnnounceMultiplayerSession(Network::RoomNetwork& room_network_) : room_network{room_network_} { #ifdef ENABLE_WEB_SERVICE - backend = std::make_unique(Settings::values.web_api_url.GetValue(), + backend = std::make_unique(Settings::values.lobby_api_url.GetValue(), Settings::values.citron_username.GetValue(), Settings::values.citron_token.GetValue()); #else @@ -155,7 +156,7 @@ void AnnounceMultiplayerSession::UpdateCredentials() { ASSERT_MSG(!IsRunning(), "Credentials can only be updated when session is not running"); #ifdef ENABLE_WEB_SERVICE - backend = std::make_unique(Settings::values.web_api_url.GetValue(), + backend = std::make_unique(Settings::values.lobby_api_url.GetValue(), Settings::values.citron_username.GetValue(), Settings::values.citron_token.GetValue()); #endif