mirror of
https://github.com/azahar-emu/azahar.git
synced 2025-03-06 02:27:41 +01:00

* yuzu: Use displayed port on direct connect * Color player counts in the multiplayer public lobby list - Full lobbies have their player count displayed in red. - Lobbies with one slot left have their player count displayed in orange. - Empty lobbies have their player count grayed out. * Add hotkeys for multiplayer actions Default shortcuts were chosen as to be intuitive (use the first letter of the action, or the second word's first letter) and work on all types of keyboards. The hotkeys can be used while playing a game too, as they are application-wide. * Persist filters in multiplayer public lobby list After connecting to a room, the chosen filter text, "Games I Own", "Hide Empty Rooms" and "Hide Full Rooms" values are persisted to configuration so they are preserved across restarts. This makes it easier to rejoin a room if you regularly play the same game, or after a crash. * citra_qt/lobby: Fix multiplayer player count color in dark theme Co-Authored-By: Kevnkkm <56404895+kevnkkm@users.noreply.github.com> * Address review comments --------- Co-authored-by: Narr the Reg <juangerman-13@hotmail.com> Co-authored-by: Hugo Locurcio <hugo.locurcio@hugo.pro> Co-authored-by: Kevnkkm <56404895+kevnkkm@users.noreply.github.com>
122 lines
4.5 KiB
C++
122 lines
4.5 KiB
C++
// Copyright 2017 Citra Emulator Project
|
|
// Licensed under GPLv2 or any later version
|
|
// Refer to the license.txt file included.
|
|
|
|
#include <QComboBox>
|
|
#include <QFuture>
|
|
#include <QIntValidator>
|
|
#include <QRegularExpression>
|
|
#include <QString>
|
|
#include <QtConcurrent/QtConcurrentRun>
|
|
#include "citra_qt/main.h"
|
|
#include "citra_qt/multiplayer/direct_connect.h"
|
|
#include "citra_qt/multiplayer/message.h"
|
|
#include "citra_qt/multiplayer/validation.h"
|
|
#include "citra_qt/uisettings.h"
|
|
#include "core/hle/service/cfg/cfg.h"
|
|
#include "network/network.h"
|
|
#include "network/network_settings.h"
|
|
#include "ui_direct_connect.h"
|
|
|
|
enum class ConnectionType : u8 { TraversalServer, IP };
|
|
|
|
DirectConnectWindow::DirectConnectWindow(Core::System& system_, QWidget* parent)
|
|
: QDialog(parent, Qt::WindowTitleHint | Qt::WindowCloseButtonHint | Qt::WindowSystemMenuHint),
|
|
ui(std::make_unique<Ui::DirectConnect>()), system{system_} {
|
|
|
|
ui->setupUi(this);
|
|
|
|
// setup the watcher for background connections
|
|
watcher = new QFutureWatcher<void>;
|
|
connect(watcher, &QFutureWatcher<void>::finished, this, &DirectConnectWindow::OnConnection);
|
|
|
|
ui->nickname->setValidator(validation.GetNickname());
|
|
ui->nickname->setText(UISettings::values.nickname);
|
|
if (ui->nickname->text().isEmpty() && !NetSettings::values.citra_username.empty()) {
|
|
// Use Citra Web Service user name as nickname by default
|
|
ui->nickname->setText(QString::fromStdString(NetSettings::values.citra_username));
|
|
}
|
|
ui->ip->setValidator(validation.GetIP());
|
|
ui->ip->setText(UISettings::values.ip);
|
|
ui->port->setValidator(validation.GetPort());
|
|
ui->port->setText(UISettings::values.port);
|
|
|
|
// TODO(jroweboy): Show or hide the connection options based on the current value of the combo
|
|
// box. Add this back in when the traversal server support is added.
|
|
connect(ui->connect, &QPushButton::clicked, this, &DirectConnectWindow::Connect);
|
|
}
|
|
|
|
DirectConnectWindow::~DirectConnectWindow() = default;
|
|
|
|
void DirectConnectWindow::RetranslateUi() {
|
|
ui->retranslateUi(this);
|
|
}
|
|
|
|
void DirectConnectWindow::Connect() {
|
|
if (!ui->nickname->hasAcceptableInput()) {
|
|
NetworkMessage::ErrorManager::ShowError(NetworkMessage::ErrorManager::USERNAME_NOT_VALID);
|
|
return;
|
|
}
|
|
if (const auto member = Network::GetRoomMember().lock()) {
|
|
// Prevent the user from trying to join a room while they are already joining.
|
|
if (member->GetState() == Network::RoomMember::State::Joining) {
|
|
return;
|
|
} else if (member->IsConnected()) {
|
|
// And ask if they want to leave the room if they are already in one.
|
|
if (!NetworkMessage::WarnDisconnect()) {
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
if (!ui->ip->hasAcceptableInput()) {
|
|
NetworkMessage::ErrorManager::ShowError(NetworkMessage::ErrorManager::IP_ADDRESS_NOT_VALID);
|
|
return;
|
|
}
|
|
if (!ui->port->hasAcceptableInput()) {
|
|
NetworkMessage::ErrorManager::ShowError(NetworkMessage::ErrorManager::PORT_NOT_VALID);
|
|
return;
|
|
}
|
|
|
|
// Store settings
|
|
UISettings::values.nickname = ui->nickname->text();
|
|
UISettings::values.ip = ui->ip->text();
|
|
UISettings::values.port =
|
|
!ui->port->text().isEmpty() ? ui->port->text() : UISettings::values.port;
|
|
|
|
// attempt to connect in a different thread
|
|
QFuture<void> f = QtConcurrent::run([&] {
|
|
if (auto room_member = Network::GetRoomMember().lock()) {
|
|
auto port = UISettings::values.port.toUInt();
|
|
room_member->Join(ui->nickname->text().toStdString(),
|
|
Service::CFG::GetConsoleIdHash(system),
|
|
ui->ip->text().toStdString().c_str(), port, 0,
|
|
Network::NoPreferredMac, ui->password->text().toStdString().c_str());
|
|
}
|
|
});
|
|
watcher->setFuture(f);
|
|
// and disable widgets and display a connecting while we wait
|
|
BeginConnecting();
|
|
}
|
|
|
|
void DirectConnectWindow::BeginConnecting() {
|
|
ui->connect->setEnabled(false);
|
|
ui->connect->setText(tr("Connecting"));
|
|
}
|
|
|
|
void DirectConnectWindow::EndConnecting() {
|
|
ui->connect->setEnabled(true);
|
|
ui->connect->setText(tr("Connect"));
|
|
}
|
|
|
|
void DirectConnectWindow::OnConnection() {
|
|
EndConnecting();
|
|
|
|
if (auto room_member = Network::GetRoomMember().lock()) {
|
|
if (room_member->GetState() == Network::RoomMember::State::Joined ||
|
|
room_member->GetState() == Network::RoomMember::State::Moderator) {
|
|
|
|
close();
|
|
}
|
|
}
|
|
}
|