mirror of
https://git.suyu.dev/suyu/suyu.git
synced 2024-11-25 22:57:22 +00:00
a75542ad2d
This PR rearranges things in the CMake system to make compiling with Qt6 possible 1. Camera API has changed in Qt6, so the camera feature is disabled 2. A previous fix involving QLocale is now version gated. 3. QRegExp replaced with QRegularExpression, see #5343 4. Qt6_LOCATION option added to specify a location to search for Qt6 (see examples below) 5. windeployqt is used to copy Qt6 files into the build directory on Windows Notes for Arch Linux Arch install happened to have qt6-base qt6-declarative qt6-translations installed mkdir build && cd build cmake .. -GNinja -DYUZU_USE_BUNDLED_VCPKG=ON -DYUZU_TESTS=OFF -DENABLE_QT6=YES -DYUZU_USE_BUNDLED_QT=NO Windows (MSVC) Qt wants users to download precompiled libraries via an online installer, it is worth noting that the GPL/LGPL takes precendence over any ... In the Qt Maintenance tool, under a version, such as 6.3.1 Select "MSVC 2019 64-bit" Under Additional Libraries Qt Multimedia may be of use for Camera support For the Web Applet I had to select the following: PDF Positioning WebChannel WebEngine mkdir build && cd build cmake -G "Visual Studio 16 2019" -DQt6_LOCATION=C:/Qt/6.4.0/msvc2019_64/ \ -DENABLE_COMPATIBILITY_LIST_DOWNLOAD=YES -DYUZU_USE_BUNDLED_QT=NO \ -DENABLE_QT_TRANSLATION=YES -DENABLE_QT6=YES .. Some numbers for reference (msvc2019_64) Qt5 (slimmed down) 508 MB Qt5.15.2 all in 929 MB Qt6.3.1 1.71 GB Qt6.3.2 1.73 GB Qt6.4.0-beta3 1.83 GB Qt6.4.0 1.67 GB
143 lines
5.3 KiB
C++
143 lines
5.3 KiB
C++
// SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
#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);
|
|
|
|
// 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.multiplayer_nickname.GetValue());
|
|
if (ui->nickname->text().isEmpty() && !Settings::values.yuzu_username.GetValue().empty()) {
|
|
// Use yuzu Web Service user name as nickname by default
|
|
ui->nickname->setText(QString::fromStdString(Settings::values.yuzu_username.GetValue()));
|
|
}
|
|
ui->ip->setValidator(validation.GetIP());
|
|
ui->ip->setText(UISettings::values.multiplayer_ip.GetValue());
|
|
ui->port->setValidator(validation.GetPort());
|
|
ui->port->setText(QString::number(UISettings::values.multiplayer_port.GetValue()));
|
|
|
|
// 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 (!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()) {
|
|
// 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;
|
|
}
|
|
}
|
|
}
|
|
switch (static_cast<ConnectionType>(ui->connection_type->currentIndex())) {
|
|
case ConnectionType::TraversalServer:
|
|
break;
|
|
case ConnectionType::IP:
|
|
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;
|
|
}
|
|
break;
|
|
}
|
|
|
|
// Store settings
|
|
UISettings::values.multiplayer_nickname = ui->nickname->text();
|
|
UISettings::values.multiplayer_ip = ui->ip->text();
|
|
if (ui->port->isModified() && !ui->port->text().isEmpty()) {
|
|
UISettings::values.multiplayer_port = ui->port->text().toInt();
|
|
} else {
|
|
UISettings::values.multiplayer_port = UISettings::values.multiplayer_port.GetDefault();
|
|
}
|
|
|
|
emit SaveConfig();
|
|
|
|
// attempt to connect in a different thread
|
|
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);
|
|
// 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 = room_network.GetRoomMember().lock()) {
|
|
if (room_member->IsConnected()) {
|
|
close();
|
|
}
|
|
}
|
|
}
|