citra_qt/multiplayer: Update themed icon on theme change
This commit is contained in:
parent
5f0dcd52ae
commit
2d65371c20
5 changed files with 39 additions and 35 deletions
|
@ -352,6 +352,8 @@ void ChatRoom::UpdateIconDisplay() {
|
||||||
item->data(PlayerListItem::AvatarUrlRole).toString().toStdString();
|
item->data(PlayerListItem::AvatarUrlRole).toString().toStdString();
|
||||||
if (icon_cache.count(avatar_url)) {
|
if (icon_cache.count(avatar_url)) {
|
||||||
item->setData(icon_cache.at(avatar_url), Qt::DecorationRole);
|
item->setData(icon_cache.at(avatar_url), Qt::DecorationRole);
|
||||||
|
} else {
|
||||||
|
item->setData(QIcon::fromTheme("no_avatar").pixmap(48), Qt::DecorationRole);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -365,45 +367,41 @@ void ChatRoom::SetPlayerList(const Network::RoomMember::MemberList& member_list)
|
||||||
QStandardItem* name_item = new PlayerListItem(member.nickname, member.username,
|
QStandardItem* name_item = new PlayerListItem(member.nickname, member.username,
|
||||||
member.avatar_url, member.game_info.name);
|
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
|
#ifdef ENABLE_WEB_SERVICE
|
||||||
// Start a request to get the member's avatar
|
if (!icon_cache.count(member.avatar_url) && !member.avatar_url.empty()) {
|
||||||
const QUrl url(QString::fromStdString(member.avatar_url));
|
// Start a request to get the member's avatar
|
||||||
QFuture<std::string> future = QtConcurrent::run([url] {
|
const QUrl url(QString::fromStdString(member.avatar_url));
|
||||||
WebService::Client client(
|
QFuture<std::string> future = QtConcurrent::run([url] {
|
||||||
QString("%1://%2").arg(url.scheme(), url.host()).toStdString(), "", "");
|
WebService::Client client(
|
||||||
auto result = client.GetImage(url.path().toStdString(), true);
|
QString("%1://%2").arg(url.scheme(), url.host()).toStdString(), "", "");
|
||||||
if (result.returned_data.empty()) {
|
auto result = client.GetImage(url.path().toStdString(), true);
|
||||||
LOG_ERROR(WebService, "Failed to get avatar");
|
if (result.returned_data.empty()) {
|
||||||
}
|
LOG_ERROR(WebService, "Failed to get avatar");
|
||||||
return result.returned_data;
|
}
|
||||||
});
|
return result.returned_data;
|
||||||
auto* future_watcher = new QFutureWatcher<std::string>(this);
|
});
|
||||||
connect(future_watcher, &QFutureWatcher<std::string>::finished, this,
|
auto* future_watcher = new QFutureWatcher<std::string>(this);
|
||||||
[this, future_watcher, avatar_url = member.avatar_url] {
|
connect(future_watcher, &QFutureWatcher<std::string>::finished, this,
|
||||||
const std::string result = future_watcher->result();
|
[this, future_watcher, avatar_url = member.avatar_url] {
|
||||||
if (result.empty())
|
const std::string result = future_watcher->result();
|
||||||
return;
|
if (result.empty())
|
||||||
QPixmap pixmap;
|
return;
|
||||||
if (!pixmap.loadFromData(reinterpret_cast<const u8*>(result.data()),
|
QPixmap pixmap;
|
||||||
result.size()))
|
if (!pixmap.loadFromData(reinterpret_cast<const u8*>(result.data()),
|
||||||
return;
|
result.size()))
|
||||||
icon_cache[avatar_url] = pixmap.scaled(48, 48, Qt::IgnoreAspectRatio,
|
return;
|
||||||
Qt::SmoothTransformation);
|
icon_cache[avatar_url] =
|
||||||
// Update all the displayed icons with the new icon_cache
|
pixmap.scaled(48, 48, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
|
||||||
UpdateIconDisplay();
|
// Update all the displayed icons with the new icon_cache
|
||||||
});
|
UpdateIconDisplay();
|
||||||
future_watcher->setFuture(future);
|
});
|
||||||
#endif
|
future_watcher->setFuture(future);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
name_item->setData(icon_cache.at(member.avatar_url), Qt::DecorationRole);
|
#endif
|
||||||
|
|
||||||
player_list->invisibleRootItem()->appendRow(name_item);
|
player_list->invisibleRootItem()->appendRow(name_item);
|
||||||
}
|
}
|
||||||
|
UpdateIconDisplay();
|
||||||
// TODO(B3N30): Restore row selection
|
// TODO(B3N30): Restore row selection
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -37,6 +37,7 @@ public:
|
||||||
~ChatRoom();
|
~ChatRoom();
|
||||||
|
|
||||||
void SetModPerms(bool is_mod);
|
void SetModPerms(bool is_mod);
|
||||||
|
void UpdateIconDisplay();
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void OnRoomUpdate(const Network::RoomInformation& info);
|
void OnRoomUpdate(const Network::RoomInformation& info);
|
||||||
|
@ -58,7 +59,6 @@ private:
|
||||||
void AppendChatMessage(const QString&);
|
void AppendChatMessage(const QString&);
|
||||||
bool ValidateMessage(const std::string&);
|
bool ValidateMessage(const std::string&);
|
||||||
void SendModerationRequest(Network::RoomMessageTypes type, const std::string& nickname);
|
void SendModerationRequest(Network::RoomMessageTypes type, const std::string& nickname);
|
||||||
void UpdateIconDisplay();
|
|
||||||
|
|
||||||
bool has_mod_perms = false;
|
bool has_mod_perms = false;
|
||||||
QStandardItemModel* player_list;
|
QStandardItemModel* player_list;
|
||||||
|
|
|
@ -109,3 +109,7 @@ void ClientRoomWindow::UpdateView() {
|
||||||
// TODO(B3N30): can't get RoomMember*, show error and close window
|
// TODO(B3N30): can't get RoomMember*, show error and close window
|
||||||
close();
|
close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ClientRoomWindow::UpdateIconDisplay() {
|
||||||
|
ui->chat->UpdateIconDisplay();
|
||||||
|
}
|
||||||
|
|
|
@ -18,6 +18,7 @@ public:
|
||||||
~ClientRoomWindow();
|
~ClientRoomWindow();
|
||||||
|
|
||||||
void RetranslateUi();
|
void RetranslateUi();
|
||||||
|
void UpdateIconDisplay();
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void OnRoomUpdate(const Network::RoomInformation&);
|
void OnRoomUpdate(const Network::RoomInformation&);
|
||||||
|
|
|
@ -194,6 +194,7 @@ void MultiplayerState::UpdateThemedIcons() {
|
||||||
} else {
|
} else {
|
||||||
status_icon->setPixmap(QIcon::fromTheme("disconnected").pixmap(16));
|
status_icon->setPixmap(QIcon::fromTheme("disconnected").pixmap(16));
|
||||||
}
|
}
|
||||||
|
client_room->UpdateIconDisplay();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void BringWidgetToFront(QWidget* widget) {
|
static void BringWidgetToFront(QWidget* widget) {
|
||||||
|
|
Loading…
Reference in a new issue