diff --git a/src/citra_qt/multiplayer/chat_room.cpp b/src/citra_qt/multiplayer/chat_room.cpp
index 47eb2da2c..e16b86217 100644
--- a/src/citra_qt/multiplayer/chat_room.cpp
+++ b/src/citra_qt/multiplayer/chat_room.cpp
@@ -42,8 +42,12 @@ public:
cur_nickname = QString::fromStdString(room->GetNickname());
cur_username = QString::fromStdString(room->GetUsername());
}
- if (message.contains(QString("@").append(cur_nickname)) ||
- (!cur_username.isEmpty() && message.contains(QString("@").append(cur_username)))) {
+
+ // Handle pings at the beginning and end of message
+ QString fixed_message = QString(" %1 ").arg(message);
+ if (fixed_message.contains(QString(" @%1 ").arg(cur_nickname)) ||
+ (!cur_username.isEmpty() &&
+ fixed_message.contains(QString(" @%1 ").arg(cur_username)))) {
contains_ping = true;
} else {
@@ -65,15 +69,18 @@ public:
name = QString("%1 (%2)").arg(nickname, username);
}
- QString style;
+ QString style, text_color;
if (ContainsPing()) {
// Add a background color to these messages
style = QString("background-color: %1").arg(ping_color);
+ // Add a font color
+ text_color = "color='#000000'";
}
return QString("[%1] <%3> %5")
- .arg(timestamp, color, name.toHtmlEscaped(), style, message.toHtmlEscaped());
+ "%5>%6")
+ .arg(timestamp, color, name.toHtmlEscaped(), style, text_color,
+ message.toHtmlEscaped());
}
private:
@@ -345,6 +352,8 @@ void ChatRoom::UpdateIconDisplay() {
item->data(PlayerListItem::AvatarUrlRole).toString().toStdString();
if (icon_cache.count(avatar_url)) {
item->setData(icon_cache.at(avatar_url), Qt::DecorationRole);
+ } else {
+ item->setData(QIcon::fromTheme("no_avatar").pixmap(48), Qt::DecorationRole);
}
}
}
@@ -358,45 +367,41 @@ void ChatRoom::SetPlayerList(const Network::RoomMember::MemberList& member_list)
QStandardItem* name_item = new PlayerListItem(member.nickname, member.username,
member.avatar_url, member.game_info.name);
- if (!icon_cache.count(member.avatar_url)) {
- // Emplace a default question mark icon as avatar
- icon_cache.emplace(member.avatar_url, QIcon::fromTheme("no_avatar").pixmap(48));
- if (!member.avatar_url.empty()) {
#ifdef ENABLE_WEB_SERVICE
- // Start a request to get the member's avatar
- const QUrl url(QString::fromStdString(member.avatar_url));
- QFuture future = QtConcurrent::run([url] {
- WebService::Client client(
- QString("%1://%2").arg(url.scheme(), url.host()).toStdString(), "", "");
- auto result = client.GetImage(url.path().toStdString(), true);
- if (result.returned_data.empty()) {
- LOG_ERROR(WebService, "Failed to get avatar");
- }
- return result.returned_data;
- });
- auto* future_watcher = new QFutureWatcher(this);
- connect(future_watcher, &QFutureWatcher::finished, this,
- [this, future_watcher, avatar_url = member.avatar_url] {
- const std::string result = future_watcher->result();
- if (result.empty())
- return;
- QPixmap pixmap;
- if (!pixmap.loadFromData(reinterpret_cast(result.data()),
- result.size()))
- return;
- icon_cache[avatar_url] = pixmap.scaled(48, 48, Qt::IgnoreAspectRatio,
- Qt::SmoothTransformation);
- // Update all the displayed icons with the new icon_cache
- UpdateIconDisplay();
- });
- future_watcher->setFuture(future);
-#endif
- }
+ if (!icon_cache.count(member.avatar_url) && !member.avatar_url.empty()) {
+ // Start a request to get the member's avatar
+ const QUrl url(QString::fromStdString(member.avatar_url));
+ QFuture future = QtConcurrent::run([url] {
+ WebService::Client client(
+ QString("%1://%2").arg(url.scheme(), url.host()).toStdString(), "", "");
+ auto result = client.GetImage(url.path().toStdString(), true);
+ if (result.returned_data.empty()) {
+ LOG_ERROR(WebService, "Failed to get avatar");
+ }
+ return result.returned_data;
+ });
+ auto* future_watcher = new QFutureWatcher(this);
+ connect(future_watcher, &QFutureWatcher::finished, this,
+ [this, future_watcher, avatar_url = member.avatar_url] {
+ const std::string result = future_watcher->result();
+ if (result.empty())
+ return;
+ QPixmap pixmap;
+ if (!pixmap.loadFromData(reinterpret_cast(result.data()),
+ result.size()))
+ return;
+ icon_cache[avatar_url] =
+ pixmap.scaled(48, 48, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
+ // Update all the displayed icons with the new icon_cache
+ UpdateIconDisplay();
+ });
+ future_watcher->setFuture(future);
}
- name_item->setData(icon_cache.at(member.avatar_url), Qt::DecorationRole);
+#endif
player_list->invisibleRootItem()->appendRow(name_item);
}
+ UpdateIconDisplay();
// TODO(B3N30): Restore row selection
}
diff --git a/src/citra_qt/multiplayer/chat_room.h b/src/citra_qt/multiplayer/chat_room.h
index 70f786dbe..a810377f7 100644
--- a/src/citra_qt/multiplayer/chat_room.h
+++ b/src/citra_qt/multiplayer/chat_room.h
@@ -37,6 +37,7 @@ public:
~ChatRoom();
void SetModPerms(bool is_mod);
+ void UpdateIconDisplay();
public slots:
void OnRoomUpdate(const Network::RoomInformation& info);
@@ -58,7 +59,6 @@ private:
void AppendChatMessage(const QString&);
bool ValidateMessage(const std::string&);
void SendModerationRequest(Network::RoomMessageTypes type, const std::string& nickname);
- void UpdateIconDisplay();
bool has_mod_perms = false;
QStandardItemModel* player_list;
diff --git a/src/citra_qt/multiplayer/client_room.cpp b/src/citra_qt/multiplayer/client_room.cpp
index 458f8c864..4b5446508 100644
--- a/src/citra_qt/multiplayer/client_room.cpp
+++ b/src/citra_qt/multiplayer/client_room.cpp
@@ -109,3 +109,7 @@ void ClientRoomWindow::UpdateView() {
// TODO(B3N30): can't get RoomMember*, show error and close window
close();
}
+
+void ClientRoomWindow::UpdateIconDisplay() {
+ ui->chat->UpdateIconDisplay();
+}
diff --git a/src/citra_qt/multiplayer/client_room.h b/src/citra_qt/multiplayer/client_room.h
index 584a51642..cbbcff61f 100644
--- a/src/citra_qt/multiplayer/client_room.h
+++ b/src/citra_qt/multiplayer/client_room.h
@@ -18,6 +18,7 @@ public:
~ClientRoomWindow();
void RetranslateUi();
+ void UpdateIconDisplay();
public slots:
void OnRoomUpdate(const Network::RoomInformation&);
diff --git a/src/citra_qt/multiplayer/state.cpp b/src/citra_qt/multiplayer/state.cpp
index 75d74e189..ba717650a 100644
--- a/src/citra_qt/multiplayer/state.cpp
+++ b/src/citra_qt/multiplayer/state.cpp
@@ -194,6 +194,7 @@ void MultiplayerState::UpdateThemedIcons() {
} else {
status_icon->setPixmap(QIcon::fromTheme("disconnected").pixmap(16));
}
+ client_room->UpdateIconDisplay();
}
static void BringWidgetToFront(QWidget* widget) {