mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-30 21:30:04 +00:00 
			
		
		
		
	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(); | ||||
|         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); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | @ -365,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<std::string> 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<std::string>(this); | ||||
|                 connect(future_watcher, &QFutureWatcher<std::string>::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<const u8*>(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<std::string> 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<std::string>(this); | ||||
|             connect(future_watcher, &QFutureWatcher<std::string>::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<const u8*>(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
 | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -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; | ||||
|  |  | |||
|  | @ -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(); | ||||
| } | ||||
|  |  | |||
|  | @ -18,6 +18,7 @@ public: | |||
|     ~ClientRoomWindow(); | ||||
| 
 | ||||
|     void RetranslateUi(); | ||||
|     void UpdateIconDisplay(); | ||||
| 
 | ||||
| public slots: | ||||
|     void OnRoomUpdate(const Network::RoomInformation&); | ||||
|  |  | |||
|  | @ -194,6 +194,7 @@ void MultiplayerState::UpdateThemedIcons() { | |||
|     } else { | ||||
|         status_icon->setPixmap(QIcon::fromTheme("disconnected").pixmap(16)); | ||||
|     } | ||||
|     client_room->UpdateIconDisplay(); | ||||
| } | ||||
| 
 | ||||
| static void BringWidgetToFront(QWidget* widget) { | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue