From d8a95834f3ca2a6ee0ea63676cf58b489e542114 Mon Sep 17 00:00:00 2001 From: spycrab Date: Sat, 12 May 2018 15:13:30 +0200 Subject: [PATCH] Qt/NetPlayDialog: Improve player list --- Source/Core/Core/NetPlayClient.cpp | 10 ++ Source/Core/Core/NetPlayClient.h | 3 + .../Core/DolphinQt2/NetPlay/NetPlayDialog.cpp | 91 +++++++++++++------ .../Core/DolphinQt2/NetPlay/NetPlayDialog.h | 4 +- 4 files changed, 79 insertions(+), 29 deletions(-) diff --git a/Source/Core/Core/NetPlayClient.cpp b/Source/Core/Core/NetPlayClient.cpp index be766d81ad..cd8bb32a3f 100644 --- a/Source/Core/Core/NetPlayClient.cpp +++ b/Source/Core/Core/NetPlayClient.cpp @@ -1271,6 +1271,16 @@ void NetPlayClient::ComputeMD5(const std::string& file_identifier) m_MD5_thread.detach(); } +const PadMappingArray& NetPlayClient::GetPadMapping() const +{ + return m_pad_map; +} + +const PadMappingArray& NetPlayClient::GetWiimoteMapping() const +{ + return m_wiimote_map; +} + // stuff hacked into dolphin // called from ---CPU--- thread diff --git a/Source/Core/Core/NetPlayClient.h b/Source/Core/Core/NetPlayClient.h index 36134d5eb8..2373f72084 100644 --- a/Source/Core/Core/NetPlayClient.h +++ b/Source/Core/Core/NetPlayClient.h @@ -98,6 +98,9 @@ public: static void SendTimeBase(); bool DoAllPlayersHaveGame(); + const PadMappingArray& GetPadMapping() const; + const PadMappingArray& GetWiimoteMapping() const; + protected: void ClearBuffers(); diff --git a/Source/Core/DolphinQt2/NetPlay/NetPlayDialog.cpp b/Source/Core/DolphinQt2/NetPlay/NetPlayDialog.cpp index 920ac11f27..8dcd4df9db 100644 --- a/Source/Core/DolphinQt2/NetPlay/NetPlayDialog.cpp +++ b/Source/Core/DolphinQt2/NetPlay/NetPlayDialog.cpp @@ -12,15 +12,16 @@ #include #include #include +#include #include #include -#include #include #include #include #include #include #include +#include #include #include @@ -163,10 +164,18 @@ void NetPlayDialog::CreatePlayersLayout() m_room_box = new QComboBox; m_hostcode_label = new QLabel; m_hostcode_action_button = new QPushButton(tr("Copy")); - m_players_list = new QListWidget; + m_players_list = new QTableWidget; m_kick_button = new QPushButton(tr("Kick Player")); m_assign_ports_button = new QPushButton(tr("Assign Controller Ports")); + m_players_list->setColumnCount(5); + m_players_list->verticalHeader()->hide(); + m_players_list->setSelectionBehavior(QAbstractItemView::SelectRows); + m_players_list->horizontalHeader()->setStretchLastSection(true); + + for (int i = 0; i < 4; i++) + m_players_list->horizontalHeader()->setSectionResizeMode(i, QHeaderView::ResizeToContents); + auto* layout = new QGridLayout; layout->addWidget(m_room_box, 0, 0); @@ -190,7 +199,7 @@ void NetPlayDialog::ConnectWidgets() else QApplication::clipboard()->setText(m_hostcode_label->text()); }); - connect(m_players_list, &QListWidget::itemSelectionChanged, [this] { + connect(m_players_list, &QTableWidget::itemSelectionChanged, [this] { int row = m_players_list->currentRow(); m_kick_button->setEnabled(row > 0 && !m_players_list->currentItem()->data(Qt::UserRole).isNull()); @@ -338,38 +347,66 @@ void NetPlayDialog::show(std::string nickname, bool use_traversal) void NetPlayDialog::UpdateGUI() { - // Update player list - std::vector player_ids; - std::string tmp; + auto* client = Settings::Instance().GetNetPlayClient(); - Settings::Instance().GetNetPlayClient()->GetPlayerList(tmp, player_ids); + // Update Player List + const auto players = client->GetPlayers(); + const auto player_count = static_cast(players.size()); - std::istringstream ss(tmp); - - int row = m_players_list->currentRow(); - unsigned int i = 0; + int selection_pid = m_players_list->currentItem() ? + m_players_list->currentItem()->data(Qt::UserRole).toInt() : + -1; m_players_list->clear(); + m_players_list->setHorizontalHeaderLabels( + {tr("Player"), tr("Game Status"), tr("Ping"), tr("Mapping"), tr("Revision")}); + m_players_list->setRowCount(player_count); - while (std::getline(ss, tmp)) - { - auto text = QString::fromStdString(tmp); - if (!text.isEmpty()) + const auto get_mapping_string = [](const Player* player, const PadMappingArray& array) { + std::string str; + for (size_t i = 0; i < array.size(); i++) { - QListWidgetItem* item = new QListWidgetItem(text); - - if (player_ids.size() > i && !text.startsWith(QStringLiteral("Ping:")) && - !text.startsWith(QStringLiteral("Status:"))) - { - item->setData(Qt::UserRole, player_ids[i]); - i++; - } - m_players_list->addItem(item); + if (player->pid == array[i]) + str += std::to_string(i + 1); + else + str += '-'; } - } - if (row != -1) - m_players_list->setCurrentRow(row, QItemSelectionModel::SelectCurrent); + return '|' + str + '|'; + }; + + static const std::map player_status{ + {PlayerGameStatus::Ok, tr("OK")}, {PlayerGameStatus::NotFound, tr("Not Found")}}; + + for (int i = 0; i < player_count; i++) + { + const auto* p = players[i]; + + auto* name_item = new QTableWidgetItem(QString::fromStdString(p->name)); + auto* status_item = new QTableWidgetItem(player_status.count(p->game_status) ? + player_status.at(p->game_status) : + QStringLiteral("?")); + auto* ping_item = new QTableWidgetItem(QStringLiteral("%1 ms").arg(p->ping)); + auto* mapping_item = new QTableWidgetItem( + QString::fromStdString(get_mapping_string(p, client->GetPadMapping()) + + get_mapping_string(p, client->GetWiimoteMapping()))); + auto* revision_item = new QTableWidgetItem(QString::fromStdString(p->revision)); + + for (auto* item : {name_item, status_item, ping_item, mapping_item, revision_item}) + { + item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); + item->setData(Qt::UserRole, static_cast(p->pid)); + } + + m_players_list->setItem(i, 0, name_item); + m_players_list->setItem(i, 1, status_item); + m_players_list->setItem(i, 2, ping_item); + m_players_list->setItem(i, 3, mapping_item); + m_players_list->setItem(i, 4, revision_item); + + if (p->pid == selection_pid) + m_players_list->selectRow(i); + } // Update Room ID / IP label if (m_use_traversal && m_room_box->currentIndex() == 0) diff --git a/Source/Core/DolphinQt2/NetPlay/NetPlayDialog.h b/Source/Core/DolphinQt2/NetPlay/NetPlayDialog.h index 3abba20987..61ecc2de85 100644 --- a/Source/Core/DolphinQt2/NetPlay/NetPlayDialog.h +++ b/Source/Core/DolphinQt2/NetPlay/NetPlayDialog.h @@ -19,10 +19,10 @@ class QGridLayout; class QGroupBox; class QLabel; class QLineEdit; -class QListWidget; class QPushButton; class QSpinBox; class QSplitter; +class QTableWidget; class QTextEdit; class QToolButton; @@ -85,7 +85,7 @@ private: QComboBox* m_room_box; QLabel* m_hostcode_label; QPushButton* m_hostcode_action_button; - QListWidget* m_players_list; + QTableWidget* m_players_list; QPushButton* m_kick_button; QPushButton* m_assign_ports_button;