diff --git a/rare/components/tabs/games/game_info/__init__.py b/rare/components/tabs/games/game_info/__init__.py index 465fd8b6..b9729dfa 100644 --- a/rare/components/tabs/games/game_info/__init__.py +++ b/rare/components/tabs/games/game_info/__init__.py @@ -7,7 +7,7 @@ from PyQt5.QtWidgets import QWidget, QTabWidget, QMessageBox from qtawesome import icon from custom_legendary.core import LegendaryCore -from custom_legendary.models.game import InstalledGame, Game +from custom_legendary.models.game import Game, InstalledGame from rare.components.tabs.games.game_info.dlcs import DlcTab from rare.components.tabs.games.game_info.game_settings import GameSettings from rare.ui.components.tabs.games.game_info.game_info import Ui_GameInfo @@ -65,22 +65,26 @@ class GameInfo(QWidget, Ui_GameInfo): def __init__(self, core: LegendaryCore, parent): super(GameInfo, self).__init__(parent=parent) self.setupUi(self) - self.ratings = {"platinum": self.tr("Platimum"), + self.core = core + + self.ratings = {"platinum": self.tr("Platinum"), "gold": self.tr("Gold"), "silver": self.tr("Silver"), "bronze": self.tr("Bronze"), - "fail": self.tr("Could not get grade from ProtonDB"), - "pending": "Not enough reports"} + "fail": self.tr("Could not get grade"), + "pending": self.tr("Not enough reports")} if os.path.exists(p := os.path.expanduser("~/.cache/rare/game_list.json")): self.grade_table = json.load(open(p)) else: self.grade_table = {} - self.widget = QWidget() - self.core = core + if os.name == "nt": self.lbl_grade.setVisible(False) self.grade.setVisible(False) + self.game_actions_stack.setCurrentIndex(0) + self.game_actions_stack.resize(self.game_actions_stack.minimumSize()) + self.uninstall_button.clicked.connect(self.uninstall) self.verify_button.clicked.connect(self.verify) self.repair_button.clicked.connect(self.repair) @@ -153,14 +157,15 @@ class GameInfo(QWidget, Ui_GameInfo): if os.name != "nt" and self.grade_table: try: - grade = self.ratings.get(self.grade_table[app_name].get("grade")) + grade = self.grade_table[app_name]["grade"] except KeyError: - grade = (self.tr("Error")) - self.grade.setText(grade) + grade = "fail" + self.grade.setText(self.ratings[grade]) if len(self.verify_threads.keys()) == 0 or not self.verify_threads.get(app_name): self.verify_widget.setCurrentIndex(0) elif self.verify_threads.get(app_name): self.verify_widget.setCurrentIndex(1) self.verify_progress.setValue( - self.verify_threads[app_name].num / self.verify_threads[app_name].total * 100) + self.verify_threads[app_name].num / self.verify_threads[app_name].total * 100 + ) diff --git a/rare/components/tabs/games/game_info/uninstalled_info.py b/rare/components/tabs/games/game_info/uninstalled_info.py index fcb5b781..8a230516 100644 --- a/rare/components/tabs/games/game_info/uninstalled_info.py +++ b/rare/components/tabs/games/game_info/uninstalled_info.py @@ -1,15 +1,17 @@ import json import os -from PyQt5.QtCore import pyqtSignal, QSettings, Qt +from PyQt5.QtCore import Qt, pyqtSignal from PyQt5.QtGui import QPixmap, QKeyEvent -from PyQt5.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLabel, QTabWidget, QTreeView +from PyQt5.QtWidgets import QWidget, QTabWidget, QTreeView from qtawesome import icon from custom_legendary.core import LegendaryCore from custom_legendary.models.game import Game +from rare.ui.components.tabs.games.game_info.game_info import Ui_GameInfo from rare.utils.extra_widgets import SideTabBar from rare.utils.json_formatter import QJsonModel +from rare.utils.utils import IMAGE_DIR class UninstalledTabInfo(QTabWidget): @@ -18,7 +20,6 @@ class UninstalledTabInfo(QTabWidget): self.app_name = "" self.core = core self.setTabBar(SideTabBar()) - self.setTabPosition(QTabWidget.West) self.addTab(QWidget(), icon("mdi.keyboard-backspace", color="white"), self.tr("Back")) @@ -49,69 +50,44 @@ class UninstalledTabInfo(QTabWidget): self.parent().layout.setCurrentIndex(0) -class UninstalledInfo(QWidget): +class UninstalledInfo(QWidget, Ui_GameInfo): game: Game install_game = pyqtSignal(str) - def __init__(self, core: LegendaryCore, parent): + def __init__(self, core: LegendaryCore, parent=None): super(UninstalledInfo, self).__init__(parent=parent) - self.layout = QVBoxLayout() - - if os.path.exists(p := os.path.expanduser("~/.cache/rare/game_list.json")): - self.grade_table = json.load(open(p)) - else: - self.grade_table = {} + self.setupUi(self) + self.core = core self.ratings = {"platinum": self.tr("Platinum"), "gold": self.tr("Gold"), "silver": self.tr("Silver"), "bronze": self.tr("Bronze"), - "fail": self.tr("Could not get grade from ProtonDB"), - "pending": "Not enough reports"} + "fail": self.tr("Could not get grade"), + "pending": self.tr("Not enough reports")} + if os.path.exists(p := os.path.expanduser("~/.cache/rare/game_list.json")): + self.grade_table = json.load(open(p)) + else: + self.grade_table = {} - self.core = core + if os.name == "nt": + self.lbl_grade.setVisible(False) + self.grade.setVisible(False) - self.settings = QSettings() + self.install_size.setEnabled(False) + self.lbl_install_size.setEnabled(False) + self.install_path.setEnabled(False) + self.lbl_install_path.setEnabled(False) - self.top_layout = QHBoxLayout() - left_layout = QVBoxLayout() - self.image = QLabel() - left_layout.addWidget(self.image) - left_layout.addStretch(1) - self.top_layout.addLayout(left_layout) - self.right_layout = QVBoxLayout() + self.game_actions_stack.setCurrentIndex(1) + self.game_actions_stack.resize(self.game_actions_stack.minimumSize()) - self.title = QLabel("Error") - self.right_layout.addWidget(self.title) - - self.app_name = QLabel("Error") - self.right_layout.addWidget(self.app_name) - if os.name != "nt": - self.rating = QLabel("Rating: Error") - self.right_layout.addWidget(self.rating) - - self.install_button = QPushButton(self.tr("Install")) - self.install_button.setFixedWidth(300) - self.install_button.setStyleSheet("""background-color: #090""") self.install_button.clicked.connect(lambda: self.install_game.emit(self.game.app_name)) - self.right_layout.addWidget(self.install_button) - self.version = QLabel("Error") - self.right_layout.addWidget(self.version) - self.right_layout.addStretch(1) - self.top_layout.addLayout(self.right_layout) - - self.top_layout.addStretch(1) - self.layout.addLayout(self.top_layout) - - self.setLayout(self.layout) def update_game(self, app_name): self.game = self.core.get_game(app_name) - self.title.setText(f"

{self.game.app_title}

") - self.app_name.setText("Appname: " + app_name) - - IMAGE_DIR = self.settings.value("img_dir", os.path.expanduser("~/.cache/rare/images"), str) + self.game_title.setText(f"

{self.game.app_title}

") if os.path.exists(f"{IMAGE_DIR}/{self.game.app_name}/FinalArt.png"): pixmap = QPixmap(f"{IMAGE_DIR}/{self.game.app_name}/FinalArt.png") @@ -127,13 +103,15 @@ class UninstalledInfo(QWidget): pixmap = pixmap.scaled(w, int(w * 4 / 3)) self.image.setPixmap(pixmap) - self.version.setText(self.game.asset_info.build_version) - if self.grade_table and (not os.name == "nt"): + self.app_name.setText(self.game.app_name) + self.version.setText(self.game.app_version) + self.dev.setText(self.game.metadata["developer"]) + self.install_size.setText("N/A") + self.install_path.setText("N/A") + + if os.name != "nt" and self.grade_table: try: - rating = self.grade_table[app_name]["grade"] + grade = self.grade_table[app_name]["grade"] except KeyError: - rating = "fail" - if rating not in ["fail", "pending"]: - self.rating.setText(self.tr("Rating from ProtonDB: ") + self.ratings[rating]) - else: - self.rating.setText(self.ratings[rating]) + grade = "fail" + self.grade.setText(self.ratings[grade]) diff --git a/rare/ui/components/tabs/games/game_info/game_info.py b/rare/ui/components/tabs/games/game_info/game_info.py index 11f5b1d9..d320f7a9 100644 --- a/rare/ui/components/tabs/games/game_info/game_info.py +++ b/rare/ui/components/tabs/games/game_info/game_info.py @@ -22,7 +22,7 @@ class Ui_GameInfo(object): self.layout_game_info_form.setObjectName("layout_game_info_form") self.install_size = QtWidgets.QLabel(GameInfo) self.install_size.setText("error") - self.install_size.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse | QtCore.Qt.TextSelectableByMouse) + self.install_size.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse) self.install_size.setObjectName("install_size") self.layout_game_info_form.addWidget(self.install_size, 4, 1, 1, 1) self.lbl_dev = QtWidgets.QLabel(GameInfo) @@ -39,7 +39,7 @@ class Ui_GameInfo(object): self.layout_game_info_form.addWidget(self.lbl_dev, 0, 0, 1, 1, QtCore.Qt.AlignRight) self.version = QtWidgets.QLabel(GameInfo) self.version.setText("error") - self.version.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse | QtCore.Qt.TextSelectableByMouse) + self.version.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse) self.version.setObjectName("version") self.layout_game_info_form.addWidget(self.version, 2, 1, 1, 1) self.lbl_install_path = QtWidgets.QLabel(GameInfo) @@ -70,43 +70,6 @@ class Ui_GameInfo(object): self.layout_game_info_form.addItem(spacerItem, 7, 1, 1, 1) spacerItem1 = QtWidgets.QSpacerItem(20, 0, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.layout_game_info_form.addItem(spacerItem1, 7, 0, 1, 1) - self.wg_game_actions = QtWidgets.QWidget(GameInfo) - self.wg_game_actions.setMinimumSize(QtCore.QSize(250, 0)) - self.wg_game_actions.setObjectName("wg_game_actions") - self.layout_game_actions = QtWidgets.QVBoxLayout(self.wg_game_actions) - self.layout_game_actions.setContentsMargins(0, 0, 0, 0) - self.layout_game_actions.setObjectName("layout_game_actions") - self.uninstall_button = QtWidgets.QPushButton(self.wg_game_actions) - self.uninstall_button.setObjectName("uninstall_button") - self.layout_game_actions.addWidget(self.uninstall_button) - self.verify_widget = QtWidgets.QStackedWidget(self.wg_game_actions) - self.verify_widget.setObjectName("verify_widget") - self.page_verify_button = QtWidgets.QWidget() - self.page_verify_button.setObjectName("page_verify_button") - self.layout_verify_button = QtWidgets.QVBoxLayout(self.page_verify_button) - self.layout_verify_button.setContentsMargins(0, 0, 0, 0) - self.layout_verify_button.setSpacing(0) - self.layout_verify_button.setObjectName("layout_verify_button") - self.verify_button = QtWidgets.QPushButton(self.page_verify_button) - self.verify_button.setObjectName("verify_button") - self.layout_verify_button.addWidget(self.verify_button) - self.verify_widget.addWidget(self.page_verify_button) - self.page_verify_progress = QtWidgets.QWidget() - self.page_verify_progress.setObjectName("page_verify_progress") - self.layout_verify_progress = QtWidgets.QVBoxLayout(self.page_verify_progress) - self.layout_verify_progress.setContentsMargins(0, 0, 0, 0) - self.layout_verify_progress.setSpacing(0) - self.layout_verify_progress.setObjectName("layout_verify_progress") - self.verify_progress = QtWidgets.QProgressBar(self.page_verify_progress) - self.verify_progress.setProperty("value", 24) - self.verify_progress.setObjectName("verify_progress") - self.layout_verify_progress.addWidget(self.verify_progress) - self.verify_widget.addWidget(self.page_verify_progress) - self.layout_game_actions.addWidget(self.verify_widget) - self.repair_button = QtWidgets.QPushButton(self.wg_game_actions) - self.repair_button.setObjectName("repair_button") - self.layout_game_actions.addWidget(self.repair_button) - self.layout_game_info_form.addWidget(self.wg_game_actions, 6, 1, 1, 1, QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop) self.lbl_version = QtWidgets.QLabel(GameInfo) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) @@ -133,18 +96,18 @@ class Ui_GameInfo(object): self.layout_game_info_form.addWidget(self.lbl_app_name, 1, 0, 1, 1, QtCore.Qt.AlignRight) self.dev = QtWidgets.QLabel(GameInfo) self.dev.setText("error") - self.dev.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse | QtCore.Qt.TextSelectableByMouse) + self.dev.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse) self.dev.setObjectName("dev") self.layout_game_info_form.addWidget(self.dev, 0, 1, 1, 1) self.app_name = QtWidgets.QLabel(GameInfo) self.app_name.setText("error") - self.app_name.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse | QtCore.Qt.TextSelectableByMouse) + self.app_name.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse) self.app_name.setObjectName("app_name") self.layout_game_info_form.addWidget(self.app_name, 1, 1, 1, 1) self.install_path = QtWidgets.QLabel(GameInfo) self.install_path.setText("error") self.install_path.setWordWrap(True) - self.install_path.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse | QtCore.Qt.TextSelectableByMouse) + self.install_path.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse) self.install_path.setObjectName("install_path") self.layout_game_info_form.addWidget(self.install_path, 5, 1, 1, 1) self.lbl_game_actions = QtWidgets.QLabel(GameInfo) @@ -168,23 +131,74 @@ class Ui_GameInfo(object): self.layout_game_info_form.addWidget(self.lbl_grade, 3, 0, 1, 1, QtCore.Qt.AlignRight) self.grade = QtWidgets.QLabel(GameInfo) self.grade.setText("error") - self.grade.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse | QtCore.Qt.TextSelectableByMouse) + self.grade.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse) self.grade.setObjectName("grade") self.layout_game_info_form.addWidget(self.grade, 3, 1, 1, 1) + self.game_actions_stack = QtWidgets.QStackedWidget(GameInfo) + self.game_actions_stack.setMinimumSize(QtCore.QSize(250, 0)) + self.game_actions_stack.setObjectName("game_actions_stack") + self.installed_page = QtWidgets.QWidget() + self.installed_page.setObjectName("installed_page") + self.installed_layout = QtWidgets.QVBoxLayout(self.installed_page) + self.installed_layout.setContentsMargins(0, 0, 0, 0) + self.installed_layout.setObjectName("installed_layout") + self.verify_widget = QtWidgets.QStackedWidget(self.installed_page) + self.verify_widget.setObjectName("verify_widget") + self.page_verify_button = QtWidgets.QWidget() + self.page_verify_button.setObjectName("page_verify_button") + self.layout_verify_button = QtWidgets.QVBoxLayout(self.page_verify_button) + self.layout_verify_button.setContentsMargins(0, 0, 0, 0) + self.layout_verify_button.setSpacing(0) + self.layout_verify_button.setObjectName("layout_verify_button") + self.verify_button = QtWidgets.QPushButton(self.page_verify_button) + self.verify_button.setObjectName("verify_button") + self.layout_verify_button.addWidget(self.verify_button) + self.verify_widget.addWidget(self.page_verify_button) + self.page_verify_progress = QtWidgets.QWidget() + self.page_verify_progress.setObjectName("page_verify_progress") + self.layout_verify_progress = QtWidgets.QVBoxLayout(self.page_verify_progress) + self.layout_verify_progress.setContentsMargins(0, 0, 0, 0) + self.layout_verify_progress.setSpacing(0) + self.layout_verify_progress.setObjectName("layout_verify_progress") + self.verify_progress = QtWidgets.QProgressBar(self.page_verify_progress) + self.verify_progress.setProperty("value", 24) + self.verify_progress.setObjectName("verify_progress") + self.layout_verify_progress.addWidget(self.verify_progress) + self.verify_widget.addWidget(self.page_verify_progress) + self.installed_layout.addWidget(self.verify_widget) + self.repair_button = QtWidgets.QPushButton(self.installed_page) + self.repair_button.setObjectName("repair_button") + self.installed_layout.addWidget(self.repair_button) + self.uninstall_button = QtWidgets.QPushButton(self.installed_page) + self.uninstall_button.setStyleSheet("background-color: #900") + self.uninstall_button.setObjectName("uninstall_button") + self.installed_layout.addWidget(self.uninstall_button) + self.game_actions_stack.addWidget(self.installed_page) + self.uninstalled_page = QtWidgets.QWidget() + self.uninstalled_page.setObjectName("uninstalled_page") + self.uninstalled_layout = QtWidgets.QVBoxLayout(self.uninstalled_page) + self.uninstalled_layout.setObjectName("uninstalled_layout") + self.install_button = QtWidgets.QPushButton(self.uninstalled_page) + self.install_button.setStyleSheet("background-color: #090") + self.install_button.setObjectName("install_button") + self.uninstalled_layout.addWidget(self.install_button) + self.game_actions_stack.addWidget(self.uninstalled_page) + self.layout_game_info_form.addWidget(self.game_actions_stack, 6, 1, 1, 1, QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop) self.layout_game_info.addLayout(self.layout_game_info_form, 2, 1, 1, 1) self.image = QtWidgets.QLabel(GameInfo) self.image.setFrameShape(QtWidgets.QFrame.StyledPanel) self.image.setFrameShadow(QtWidgets.QFrame.Sunken) self.image.setText("") self.image.setObjectName("image") - self.layout_game_info.addWidget(self.image, 2, 0, 1, 1, QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop) + self.layout_game_info.addWidget(self.image, 2, 0, 1, 1, QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop) self.game_title = QtWidgets.QLabel(GameInfo) self.game_title.setText("error") - self.game_title.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse | QtCore.Qt.TextSelectableByMouse) + self.game_title.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse) self.game_title.setObjectName("game_title") self.layout_game_info.addWidget(self.game_title, 0, 0, 1, 3) self.retranslateUi(GameInfo) + self.game_actions_stack.setCurrentIndex(0) self.verify_widget.setCurrentIndex(0) QtCore.QMetaObject.connectSlotsByName(GameInfo) @@ -194,18 +208,18 @@ class Ui_GameInfo(object): self.lbl_dev.setText(_translate("GameInfo", "Developer")) self.lbl_install_path.setText(_translate("GameInfo", "Installation Path")) self.lbl_install_size.setText(_translate("GameInfo", "Installation Size")) - self.uninstall_button.setText(_translate("GameInfo", "Uninstall Game")) - self.verify_button.setText(_translate("GameInfo", "Verify Installation")) - self.repair_button.setText(_translate("GameInfo", "Repair Instalation")) self.lbl_version.setText(_translate("GameInfo", "Version")) self.lbl_app_name.setText(_translate("GameInfo", "Application Name")) self.lbl_game_actions.setText(_translate("GameInfo", "Actions")) self.lbl_grade.setText(_translate("GameInfo", "ProtonDB Grade")) + self.verify_button.setText(_translate("GameInfo", "Verify Installation")) + self.repair_button.setText(_translate("GameInfo", "Repair Instalation")) + self.uninstall_button.setText(_translate("GameInfo", "Uninstall Game")) + self.install_button.setText(_translate("GameInfo", "Install Game")) if __name__ == "__main__": import sys - app = QtWidgets.QApplication(sys.argv) GameInfo = QtWidgets.QWidget() ui = Ui_GameInfo() diff --git a/rare/ui/components/tabs/games/game_info/game_info.ui b/rare/ui/components/tabs/games/game_info/game_info.ui index 1d1926b6..edec48ef 100644 --- a/rare/ui/components/tabs/games/game_info/game_info.ui +++ b/rare/ui/components/tabs/games/game_info/game_info.ui @@ -1,376 +1,390 @@ - GameInfo - - - - 0 - 0 - 436 - 317 - - - - Game Info - - - - - - 6 - - - 6 - - - 6 - - - 6 - - - 12 - - - - - error - - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse - - - - - - - - 0 - 0 - - - - - 75 - true - - - - Developer - - - - - - - error - - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse - - - - - - - - 0 - 0 - - - - - 75 - true - - - - Installation Path - - - - - - - - 0 - 0 - - - - - 75 - true - - - - Installation Size - - - - - - - Qt::Horizontal - - - - 0 - 20 - - - - - - - - Qt::Vertical - - - - 20 - 0 - - - - - - - - - 250 - 0 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - Uninstall Game - - - - - - - 0 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - Verify Installation - - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - 24 - - - - - - - - - - - Repair Instalation - - - - - - - - - - - 0 - 0 - - - - - 75 - true - - - - Version - - - - - - - - 0 - 0 - - - - - 75 - true - - - - Application Name - - - - - - - error - - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse - - - - - - - error - - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse - - - - - - - error - - - true - - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse - - - - - - - - 0 - 0 - - - - - 75 - true - - - - Actions - - - - - - - - 75 - true - - - - ProtonDB Grade - - - - - - - error - - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse - - - - - - - - - QFrame::StyledPanel - - - QFrame::Sunken - - - - - - - - - - error - - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse - - - + GameInfo + + + Game Info + + + + + + 6 + + + 6 + + + 6 + + + 6 + + + 12 + + + + + error + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + + 0 + 0 + + + + + 75 + true + + + + Developer + + + + + + + error + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + + 0 + 0 + + + + + 75 + true + + + + Installation Path + + + + + + + + 0 + 0 + + + + + 75 + true + + + + Installation Size + + + + + + + Qt::Horizontal + + + + 0 + 20 + + + + + + + + Qt::Vertical + + + + 20 + 0 + + + + + + + + + 0 + 0 + + + + + 75 + true + + + + Version + + + + + + + + 0 + 0 + + + + + 75 + true + + + + Application Name + + + + + + + error + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + error + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + error + + + true + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + + 0 + 0 + + + + + 75 + true + + + + Actions + + + + + + + + 75 + true + + + + ProtonDB Grade + + + + + + + error + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + + 250 + 0 + + + + 0 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 0 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Verify Installation + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 24 + + + + + + + + + + + Repair Instalation + + + + + + + background-color: #900 + + + Uninstall Game + + + + + + + + + + background-color: #090 + + + Install Game + + + + + + + + + + + + + QFrame::StyledPanel + + + QFrame::Sunken + + + + - - + + + + + error + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + +