Merge pull request #6805 from spycrab/qt_netplay

Qt/NetPlayDialog: Multiple improvements
This commit is contained in:
Léo Lam 2018-05-11 10:39:53 +02:00 committed by GitHub
commit 5071973a51
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 74 additions and 58 deletions

View File

@ -4,6 +4,7 @@
#include "DolphinQt2/NetPlay/NetPlayDialog.h" #include "DolphinQt2/NetPlay/NetPlayDialog.h"
#include <QAction>
#include <QApplication> #include <QApplication>
#include <QCheckBox> #include <QCheckBox>
#include <QClipboard> #include <QClipboard>
@ -14,11 +15,14 @@
#include <QLabel> #include <QLabel>
#include <QLineEdit> #include <QLineEdit>
#include <QListWidget> #include <QListWidget>
#include <QMenu>
#include <QMessageBox> #include <QMessageBox>
#include <QProgressDialog> #include <QProgressDialog>
#include <QPushButton> #include <QPushButton>
#include <QSpinBox> #include <QSpinBox>
#include <QTextEdit> #include <QSplitter>
#include <QTextBrowser>
#include <QToolButton>
#include <sstream> #include <sstream>
@ -52,13 +56,26 @@ NetPlayDialog::NetPlayDialog(QWidget* parent)
CreatePlayersLayout(); CreatePlayersLayout();
CreateMainLayout(); CreateMainLayout();
ConnectWidgets(); ConnectWidgets();
auto& settings = Settings::Instance().GetQSettings();
restoreGeometry(settings.value(QStringLiteral("netplaydialog/geometry")).toByteArray());
m_splitter->restoreState(settings.value(QStringLiteral("netplaydialog/splitter")).toByteArray());
}
NetPlayDialog::~NetPlayDialog()
{
auto& settings = Settings::Instance().GetQSettings();
settings.setValue(QStringLiteral("netplaydialog/geometry"), saveGeometry());
settings.setValue(QStringLiteral("netplaydialog/splitter"), m_splitter->saveState());
} }
void NetPlayDialog::CreateMainLayout() void NetPlayDialog::CreateMainLayout()
{ {
m_main_layout = new QGridLayout; m_main_layout = new QGridLayout;
m_game_button = new QPushButton; m_game_button = new QPushButton;
m_md5_box = new QComboBox; m_md5_button = new QToolButton;
m_start_button = new QPushButton(tr("Start")); m_start_button = new QPushButton(tr("Start"));
m_buffer_size_box = new QSpinBox; m_buffer_size_box = new QSpinBox;
m_save_sd_box = new QCheckBox(tr("Write save/SD data")); m_save_sd_box = new QCheckBox(tr("Write save/SD data"));
@ -66,18 +83,44 @@ void NetPlayDialog::CreateMainLayout()
m_record_input_box = new QCheckBox(tr("Record inputs")); m_record_input_box = new QCheckBox(tr("Record inputs"));
m_buffer_label = new QLabel(tr("Buffer:")); m_buffer_label = new QLabel(tr("Buffer:"));
m_quit_button = new QPushButton(tr("Quit")); m_quit_button = new QPushButton(tr("Quit"));
m_splitter = new QSplitter(Qt::Horizontal);
m_game_button->setDefault(false); m_game_button->setDefault(false);
m_game_button->setAutoDefault(false); m_game_button->setAutoDefault(false);
for (const QString& text : auto* default_button = new QAction(tr("Calculate MD5 hash"), m_md5_button);
{tr("MD5 Check:"), tr("Current game"), tr("Other game"), tr("SD card")})
m_md5_box->addItem(text); auto* menu = new QMenu(this);
auto* other_game_button = new QAction(tr("Other game"), this);
auto* sdcard_button = new QAction(tr("SD Card"), this);
menu->addAction(other_game_button);
menu->addAction(sdcard_button);
connect(default_button, &QAction::triggered,
[this] { Settings::Instance().GetNetPlayServer()->ComputeMD5(m_current_game); });
connect(other_game_button, &QAction::triggered, [this] {
GameListDialog gld(this);
if (gld.exec() == QDialog::Accepted)
{
Settings::Instance().GetNetPlayServer()->ComputeMD5(gld.GetSelectedUniqueID().toStdString());
}
});
connect(sdcard_button, &QAction::triggered,
[] { Settings::Instance().GetNetPlayServer()->ComputeMD5(WII_SDCARD); });
m_md5_button->setDefaultAction(default_button);
m_md5_button->setPopupMode(QToolButton::MenuButtonPopup);
m_md5_button->setMenu(menu);
m_main_layout->addWidget(m_game_button, 0, 0); m_main_layout->addWidget(m_game_button, 0, 0);
m_main_layout->addWidget(m_md5_box, 0, 1); m_main_layout->addWidget(m_md5_button, 0, 1);
m_main_layout->addWidget(m_chat_box, 1, 0); m_main_layout->addWidget(m_splitter, 1, 0, 1, -1);
m_main_layout->addWidget(m_players_box, 1, 1);
m_splitter->addWidget(m_chat_box);
m_splitter->addWidget(m_players_box);
auto* options_widget = new QHBoxLayout; auto* options_widget = new QHBoxLayout;
@ -96,7 +139,7 @@ void NetPlayDialog::CreateMainLayout()
void NetPlayDialog::CreateChatLayout() void NetPlayDialog::CreateChatLayout()
{ {
m_chat_box = new QGroupBox(tr("Chat")); m_chat_box = new QGroupBox(tr("Chat"));
m_chat_edit = new QTextEdit; m_chat_edit = new QTextBrowser;
m_chat_type_edit = new QLineEdit; m_chat_type_edit = new QLineEdit;
m_chat_send_button = new QPushButton(tr("Send")); m_chat_send_button = new QPushButton(tr("Send"));
@ -170,14 +213,15 @@ void NetPlayDialog::ConnectWidgets()
// Other // Other
connect(m_buffer_size_box, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), connect(m_buffer_size_box, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
[this](int value) { [this](int value) {
if (value == m_buffer_size)
return;
if (Settings::Instance().GetNetPlayServer() != nullptr) if (Settings::Instance().GetNetPlayServer() != nullptr)
Settings::Instance().GetNetPlayServer()->AdjustPadBufferSize(value); Settings::Instance().GetNetPlayServer()->AdjustPadBufferSize(value);
}); });
connect(m_start_button, &QPushButton::clicked, this, &NetPlayDialog::OnStart); connect(m_start_button, &QPushButton::clicked, this, &NetPlayDialog::OnStart);
connect(m_quit_button, &QPushButton::clicked, this, &NetPlayDialog::reject); connect(m_quit_button, &QPushButton::clicked, this, &NetPlayDialog::reject);
connect(m_md5_box, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this,
&NetPlayDialog::OnMD5Combo);
connect(m_game_button, &QPushButton::clicked, [this] { connect(m_game_button, &QPushButton::clicked, [this] {
GameListDialog gld(this); GameListDialog gld(this);
@ -201,8 +245,8 @@ void NetPlayDialog::OnChat()
Settings::Instance().GetNetPlayClient()->SendChatMessage(msg); Settings::Instance().GetNetPlayClient()->SendChatMessage(msg);
m_chat_type_edit->clear(); m_chat_type_edit->clear();
DisplayMessage(QStringLiteral("%1: %2").arg(QString::fromStdString(m_nickname), DisplayMessage(QStringLiteral("%1: %2").arg(QString::fromStdString(m_nickname).toHtmlEscaped(),
QString::fromStdString(msg)), QString::fromStdString(msg).toHtmlEscaped()),
"blue"); "blue");
}); });
} }
@ -241,40 +285,6 @@ void NetPlayDialog::OnStart()
Settings::Instance().GetNetPlayServer()->StartGame(); Settings::Instance().GetNetPlayServer()->StartGame();
} }
void NetPlayDialog::OnMD5Combo(int index)
{
std::string identifier;
switch (index)
{
case 0:
return;
case 1: // Current game
identifier = m_current_game;
break;
case 2: // Other game
{
GameListDialog gld(this);
if (gld.exec() == QDialog::Accepted)
{
identifier = gld.GetSelectedUniqueID().toStdString();
break;
}
else
{
m_md5_box->setCurrentIndex(0);
return;
}
}
case 3: // SD Card
identifier = WII_SDCARD;
break;
}
Settings::Instance().GetNetPlayServer()->ComputeMD5(identifier);
}
void NetPlayDialog::reject() void NetPlayDialog::reject()
{ {
if (QMessageBox::question(this, tr("Confirmation"), if (QMessageBox::question(this, tr("Confirmation"),
@ -288,6 +298,7 @@ void NetPlayDialog::show(std::string nickname, bool use_traversal)
{ {
m_nickname = nickname; m_nickname = nickname;
m_use_traversal = use_traversal; m_use_traversal = use_traversal;
m_buffer_size = 0;
m_room_box->clear(); m_room_box->clear();
m_chat_edit->clear(); m_chat_edit->clear();
@ -301,7 +312,7 @@ void NetPlayDialog::show(std::string nickname, bool use_traversal)
m_room_box->addItem(tr("Room ID")); m_room_box->addItem(tr("Room ID"));
for (const auto& iface : Settings::Instance().GetNetPlayServer()->GetInterfaceSet()) for (const auto& iface : Settings::Instance().GetNetPlayServer()->GetInterfaceSet())
m_room_box->addItem(QString::fromStdString(iface)); m_room_box->addItem(iface == "!local!" ? tr("Local") : QString::fromStdString(iface));
} }
m_start_button->setHidden(!is_hosting); m_start_button->setHidden(!is_hosting);
@ -311,7 +322,7 @@ void NetPlayDialog::show(std::string nickname, bool use_traversal)
m_buffer_label->setHidden(!is_hosting); m_buffer_label->setHidden(!is_hosting);
m_kick_button->setHidden(!is_hosting); m_kick_button->setHidden(!is_hosting);
m_assign_ports_button->setHidden(!is_hosting); m_assign_ports_button->setHidden(!is_hosting);
m_md5_box->setHidden(!is_hosting); m_md5_button->setHidden(!is_hosting);
m_room_box->setHidden(!is_hosting); m_room_box->setHidden(!is_hosting);
m_hostcode_label->setHidden(!is_hosting); m_hostcode_label->setHidden(!is_hosting);
m_hostcode_action_button->setHidden(!is_hosting); m_hostcode_action_button->setHidden(!is_hosting);
@ -439,7 +450,7 @@ void NetPlayDialog::DisplayMessage(const QString& msg, const std::string& color,
void NetPlayDialog::AppendChat(const std::string& msg) void NetPlayDialog::AppendChat(const std::string& msg)
{ {
DisplayMessage(QString::fromStdString(msg), ""); DisplayMessage(QString::fromStdString(msg).toHtmlEscaped(), "");
} }
void NetPlayDialog::OnMsgChangeGame(const std::string& title) void NetPlayDialog::OnMsgChangeGame(const std::string& title)
@ -449,7 +460,7 @@ void NetPlayDialog::OnMsgChangeGame(const std::string& title)
m_game_button->setText(qtitle); m_game_button->setText(qtitle);
m_current_game = title; m_current_game = title;
}); });
DisplayMessage(tr("Game changed to \"%1\"").arg(qtitle), "pink"); DisplayMessage(tr("Game changed to \"%1\"").arg(qtitle), "magenta");
} }
void NetPlayDialog::GameStatusChanged(bool running) void NetPlayDialog::GameStatusChanged(bool running)
@ -487,7 +498,9 @@ void NetPlayDialog::OnMsgStopGame()
void NetPlayDialog::OnPadBufferChanged(u32 buffer) void NetPlayDialog::OnPadBufferChanged(u32 buffer)
{ {
QueueOnObject(this, [this, buffer] { m_buffer_size_box->setValue(buffer); }); QueueOnObject(this, [this, buffer] { m_buffer_size_box->setValue(buffer); });
DisplayMessage(tr("Buffer size changed to %1").arg(buffer), "gray"); DisplayMessage(tr("Buffer size changed to %1").arg(buffer), "");
m_buffer_size = static_cast<int>(buffer);
} }
void NetPlayDialog::OnDesync(u32 frame, const std::string& player) void NetPlayDialog::OnDesync(u32 frame, const std::string& player)
@ -545,8 +558,7 @@ std::string NetPlayDialog::FindGame(const std::string& game)
void NetPlayDialog::ShowMD5Dialog(const std::string& file_identifier) void NetPlayDialog::ShowMD5Dialog(const std::string& file_identifier)
{ {
QueueOnObject(this, [this, file_identifier] { QueueOnObject(this, [this, file_identifier] {
m_md5_box->setEnabled(false); m_md5_button->setEnabled(false);
m_md5_box->setCurrentIndex(0);
if (m_md5_dialog->isVisible()) if (m_md5_dialog->isVisible())
m_md5_dialog->close(); m_md5_dialog->close();
@ -567,7 +579,7 @@ void NetPlayDialog::SetMD5Result(int pid, const std::string& result)
{ {
QueueOnObject(this, [this, pid, result] { QueueOnObject(this, [this, pid, result] {
m_md5_dialog->SetResult(pid, result); m_md5_dialog->SetResult(pid, result);
m_md5_box->setEnabled(true); m_md5_button->setEnabled(true);
}); });
} }
@ -575,6 +587,6 @@ void NetPlayDialog::AbortMD5()
{ {
QueueOnObject(this, [this] { QueueOnObject(this, [this] {
m_md5_dialog->close(); m_md5_dialog->close();
m_md5_box->setEnabled(true); m_md5_button->setEnabled(true);
}); });
} }

View File

@ -22,13 +22,16 @@ class QLineEdit;
class QListWidget; class QListWidget;
class QPushButton; class QPushButton;
class QSpinBox; class QSpinBox;
class QSplitter;
class QTextEdit; class QTextEdit;
class QToolButton;
class NetPlayDialog : public QDialog, public NetPlayUI class NetPlayDialog : public QDialog, public NetPlayUI
{ {
Q_OBJECT Q_OBJECT
public: public:
NetPlayDialog(QWidget* parent); NetPlayDialog(QWidget* parent);
~NetPlayDialog();
void show(std::string nickname, bool use_traversal); void show(std::string nickname, bool use_traversal);
void reject() override; void reject() override;
@ -64,7 +67,6 @@ private:
void ConnectWidgets(); void ConnectWidgets();
void OnChat(); void OnChat();
void OnStart(); void OnStart();
void OnMD5Combo(int index);
void DisplayMessage(const QString& msg, const std::string& color, void DisplayMessage(const QString& msg, const std::string& color,
int duration = OSD::Duration::NORMAL); int duration = OSD::Duration::NORMAL);
void UpdateGUI(); void UpdateGUI();
@ -89,7 +91,7 @@ private:
// Other // Other
QPushButton* m_game_button; QPushButton* m_game_button;
QComboBox* m_md5_box; QToolButton* m_md5_button;
QPushButton* m_start_button; QPushButton* m_start_button;
QLabel* m_buffer_label; QLabel* m_buffer_label;
QSpinBox* m_buffer_size_box; QSpinBox* m_buffer_size_box;
@ -97,6 +99,7 @@ private:
QCheckBox* m_load_wii_box; QCheckBox* m_load_wii_box;
QCheckBox* m_record_input_box; QCheckBox* m_record_input_box;
QPushButton* m_quit_button; QPushButton* m_quit_button;
QSplitter* m_splitter;
QGridLayout* m_main_layout; QGridLayout* m_main_layout;
MD5Dialog* m_md5_dialog; MD5Dialog* m_md5_dialog;
@ -106,4 +109,5 @@ private:
GameListModel* m_game_list_model = nullptr; GameListModel* m_game_list_model = nullptr;
bool m_use_traversal = false; bool m_use_traversal = false;
bool m_is_copy_button_retry = false; bool m_is_copy_button_retry = false;
int m_buffer_size = 0;
}; };