| |
| |
|
|
| #include <QComboBox> |
| #include <QFuture> |
| #include <QIntValidator> |
| #include <QRegularExpressionValidator> |
| #include <QString> |
| #include <QtConcurrent/QtConcurrentRun> |
| #include "common/settings.h" |
| #include "core/core.h" |
| #include "core/internal_network/network_interface.h" |
| #include "network/network.h" |
| #include "ui_direct_connect.h" |
| #include "yuzu/main.h" |
| #include "yuzu/multiplayer/client_room.h" |
| #include "yuzu/multiplayer/direct_connect.h" |
| #include "yuzu/multiplayer/message.h" |
| #include "yuzu/multiplayer/state.h" |
| #include "yuzu/multiplayer/validation.h" |
| #include "yuzu/uisettings.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_}, room_network{ |
| system.GetRoomNetwork()} { |
|
|
| ui->setupUi(this); |
|
|
| |
| watcher = new QFutureWatcher<void>; |
| connect(watcher, &QFutureWatcher<void>::finished, this, &DirectConnectWindow::OnConnection); |
|
|
| ui->nickname->setValidator(validation.GetNickname()); |
| ui->nickname->setText( |
| QString::fromStdString(UISettings::values.multiplayer_nickname.GetValue())); |
| if (ui->nickname->text().isEmpty() && !Settings::values.yuzu_username.GetValue().empty()) { |
| |
| ui->nickname->setText(QString::fromStdString(Settings::values.yuzu_username.GetValue())); |
| } |
| ui->ip->setValidator(validation.GetIP()); |
| ui->ip->setText(QString::fromStdString(UISettings::values.multiplayer_ip.GetValue())); |
| ui->port->setValidator(validation.GetPort()); |
| ui->port->setText(QString::number(UISettings::values.multiplayer_port.GetValue())); |
|
|
| |
| |
| connect(ui->connect, &QPushButton::clicked, this, &DirectConnectWindow::Connect); |
| } |
|
|
| DirectConnectWindow::~DirectConnectWindow() = default; |
|
|
| void DirectConnectWindow::RetranslateUi() { |
| ui->retranslateUi(this); |
| } |
|
|
| void DirectConnectWindow::Connect() { |
| if (!Network::GetSelectedNetworkInterface()) { |
| NetworkMessage::ErrorManager::ShowError( |
| NetworkMessage::ErrorManager::NO_INTERFACE_SELECTED); |
| return; |
| } |
| if (!ui->nickname->hasAcceptableInput()) { |
| NetworkMessage::ErrorManager::ShowError(NetworkMessage::ErrorManager::USERNAME_NOT_VALID); |
| return; |
| } |
| if (system.IsPoweredOn()) { |
| if (!NetworkMessage::WarnGameRunning()) { |
| return; |
| } |
| } |
| if (const auto member = room_network.GetRoomMember().lock()) { |
| |
| if (member->GetState() == Network::RoomMember::State::Joining) { |
| return; |
| } else if (member->IsConnected()) { |
| |
| 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; |
| } |
|
|
| |
| UISettings::values.multiplayer_nickname = ui->nickname->text().toStdString(); |
| UISettings::values.multiplayer_ip = ui->ip->text().toStdString(); |
| if (!ui->port->text().isEmpty()) { |
| UISettings::values.multiplayer_port = ui->port->text().toInt(); |
| } else { |
| UISettings::values.multiplayer_port = UISettings::values.multiplayer_port.GetDefault(); |
| } |
|
|
| emit SaveConfig(); |
|
|
| |
| QFuture<void> f = QtConcurrent::run([&] { |
| if (auto room_member = room_network.GetRoomMember().lock()) { |
| auto port = UISettings::values.multiplayer_port.GetValue(); |
| room_member->Join(ui->nickname->text().toStdString(), |
| ui->ip->text().toStdString().c_str(), port, 0, Network::NoPreferredIP, |
| ui->password->text().toStdString().c_str()); |
| } |
| }); |
| watcher->setFuture(f); |
| |
| 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 = room_network.GetRoomMember().lock()) { |
| if (room_member->IsConnected()) { |
| close(); |
| } |
| } |
| } |
|
|