From 61964d21c7426a24b94a96396a724f3d6fd4e346 Mon Sep 17 00:00:00 2001 From: Boris Yumankulov Date: Wed, 4 Jun 2025 19:57:30 +0500 Subject: [PATCH] feat(ui): add PortProton badge to game cards and detail pages Signed-off-by: Boris Yumankulov --- portprotonqt/game_card.py | 36 ++++++++++++++++++++++++++++-------- portprotonqt/main_window.py | 27 +++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 8 deletions(-) diff --git a/portprotonqt/game_card.py b/portprotonqt/game_card.py index 93a371e..fe8c3b8 100644 --- a/portprotonqt/game_card.py +++ b/portprotonqt/game_card.py @@ -105,7 +105,6 @@ class GameCard(QFrame): def on_cover_loaded(pixmap): label = label_ref() if label is None: - # QLabel уже удалён — ничего не делаем return label.setPixmap(round_corners(pixmap, 15)) @@ -134,11 +133,11 @@ class GameCard(QFrame): icon_space=3, ) self.protondbLabel.setStyleSheet(self.theme.get_protondb_badge_style(protondb_tier)) - self.protondbLabel.setFixedWidth(int(card_width * 2/3)) # Устанавливаем ширину в 2/3 ширины карточки + self.protondbLabel.setFixedWidth(int(card_width * 2/3)) protondb_visible = True else: self.protondbLabel = ClickableLabel("", parent=coverWidget, icon_size=16, icon_space=3) - self.protondbLabel.setFixedWidth(int(card_width * 2/3)) # Устанавливаем ширину даже для невидимого бейджа + self.protondbLabel.setFixedWidth(int(card_width * 2/3)) self.protondbLabel.setVisible(False) protondb_visible = False @@ -152,7 +151,7 @@ class GameCard(QFrame): icon_space=5, ) self.steamLabel.setStyleSheet(self.theme.STEAM_BADGE_STYLE) - self.steamLabel.setFixedWidth(int(card_width * 2/3)) # Устанавливаем ширину в 2/3 ширины карточки + self.steamLabel.setFixedWidth(int(card_width * 2/3)) steam_visible = (str(steam_game).lower() == "true") self.steamLabel.setVisible(steam_visible) @@ -167,10 +166,25 @@ class GameCard(QFrame): change_cursor=False ) self.egsLabel.setStyleSheet(self.theme.STEAM_BADGE_STYLE) - self.egsLabel.setFixedWidth(int(card_width * 2/3)) # Устанавливаем ширину в 2/3 ширины карточки + self.egsLabel.setFixedWidth(int(card_width * 2/3)) egs_visible = (str(steam_game).lower() == "epic") self.egsLabel.setVisible(egs_visible) + # PortProton badge + portproton_icon = self.theme_manager.get_icon("ppqt-tray") + self.portprotonLabel = ClickableLabel( + "PortProton", + icon=portproton_icon, + parent=coverWidget, + icon_size=16, + icon_space=5, + change_cursor=False + ) + self.portprotonLabel.setStyleSheet(self.theme.STEAM_BADGE_STYLE) + self.portprotonLabel.setFixedWidth(int(card_width * 2/3)) + portproton_visible = (str(steam_game).lower() == "false") + self.portprotonLabel.setVisible(portproton_visible) + # WeAntiCheatYet бейдж anticheat_text = self.getAntiCheatText(anticheat_status) if anticheat_text: @@ -184,11 +198,11 @@ class GameCard(QFrame): icon_space=3, ) self.anticheatLabel.setStyleSheet(self.theme.STEAM_BADGE_STYLE) - self.anticheatLabel.setFixedWidth(int(card_width * 2/3)) # Устанавливаем ширину в 2/3 ширины карточки + self.anticheatLabel.setFixedWidth(int(card_width * 2/3)) anticheat_visible = True else: self.anticheatLabel = ClickableLabel("", parent=coverWidget, icon_size=16, icon_space=3) - self.anticheatLabel.setFixedWidth(int(card_width * 2/3)) # Устанавливаем ширину даже для невидимого бейджа + self.anticheatLabel.setFixedWidth(int(card_width * 2/3)) self.anticheatLabel.setVisible(False) anticheat_visible = False @@ -197,7 +211,7 @@ class GameCard(QFrame): badge_spacing = 5 top_y = 10 badge_y_positions = [] - badge_width = int(card_width * 2/3) # Фиксированная ширина бейджей + badge_width = int(card_width * 2/3) if steam_visible: steam_x = card_width - badge_width - right_margin self.steamLabel.move(steam_x, top_y) @@ -207,6 +221,11 @@ class GameCard(QFrame): egs_y = badge_y_positions[-1] + badge_spacing if badge_y_positions else top_y self.egsLabel.move(egs_x, egs_y) badge_y_positions.append(egs_y + self.egsLabel.height()) + if portproton_visible: + portproton_x = card_width - badge_width - right_margin + portproton_y = badge_y_positions[-1] + badge_spacing if badge_y_positions else top_y + self.portprotonLabel.move(portproton_x, portproton_y) + badge_y_positions.append(portproton_y + self.portprotonLabel.height()) if protondb_visible: protondb_x = card_width - badge_width - right_margin protondb_y = badge_y_positions[-1] + badge_spacing if badge_y_positions else top_y @@ -219,6 +238,7 @@ class GameCard(QFrame): self.anticheatLabel.raise_() self.protondbLabel.raise_() + self.portprotonLabel.raise_() self.egsLabel.raise_() self.steamLabel.raise_() self.protondbLabel.clicked.connect(self.open_protondb_report) diff --git a/portprotonqt/main_window.py b/portprotonqt/main_window.py index 63785d9..c7e8085 100644 --- a/portprotonqt/main_window.py +++ b/portprotonqt/main_window.py @@ -1447,6 +1447,21 @@ class MainWindow(QMainWindow): egs_visible = (str(steam_game).lower() == "epic") egsLabel.setVisible(egs_visible) + # PortProton badge + portproton_icon = self.theme_manager.get_icon("ppqt-tray") + portprotonLabel = ClickableLabel( + "PortProton", + icon=portproton_icon, + parent=coverFrame, + icon_size=16, + icon_space=5, + change_cursor=False + ) + portprotonLabel.setStyleSheet(self.theme.STEAM_BADGE_STYLE) + portprotonLabel.setFixedWidth(badge_width) + portproton_visible = (str(steam_game).lower() == "false") + portprotonLabel.setVisible(portproton_visible) + # WeAntiCheatYet бейдж anticheat_text = GameCard.getAntiCheatText(anticheat_status) if anticheat_text: @@ -1470,6 +1485,11 @@ class MainWindow(QMainWindow): anticheat_visible = False # Расположение бейджей + right_margin = 8 + badge_spacing = 5 + top_y = 10 + badge_y_positions = [] + badge_width = int(300 * 2/3) if steam_visible: steam_x = 300 - badge_width - right_margin steamLabel.move(steam_x, top_y) @@ -1479,6 +1499,11 @@ class MainWindow(QMainWindow): egs_y = badge_y_positions[-1] + badge_spacing if badge_y_positions else top_y egsLabel.move(egs_x, egs_y) badge_y_positions.append(egs_y + egsLabel.height()) + if portproton_visible: + portproton_x = 300 - badge_width - right_margin + portproton_y = badge_y_positions[-1] + badge_spacing if badge_y_positions else top_y + portprotonLabel.move(portproton_x, portproton_y) + badge_y_positions.append(portproton_y + portprotonLabel.height()) if protondb_visible: protondb_x = 300 - badge_width - right_margin protondb_y = badge_y_positions[-1] + badge_spacing if badge_y_positions else top_y @@ -1491,6 +1516,8 @@ class MainWindow(QMainWindow): anticheatLabel.raise_() protondbLabel.raise_() + portprotonLabel.raise_() + egsLabel.raise_() steamLabel.raise_() contentFrameLayout.addWidget(coverFrame)