2021-09-12 23:23:40 +12:00
|
|
|
import os
|
|
|
|
import platform
|
2022-04-11 07:14:46 +12:00
|
|
|
import shutil
|
2021-11-17 10:54:23 +13:00
|
|
|
from logging import getLogger
|
2023-02-16 03:59:33 +13:00
|
|
|
from typing import Optional
|
2021-09-12 23:23:40 +12:00
|
|
|
|
2022-04-22 10:28:33 +12:00
|
|
|
from PyQt5.QtCore import (
|
|
|
|
Qt,
|
|
|
|
pyqtSlot,
|
2023-04-17 06:53:42 +12:00
|
|
|
pyqtSignal,
|
2022-04-22 10:28:33 +12:00
|
|
|
)
|
2022-04-11 07:14:46 +12:00
|
|
|
from PyQt5.QtWidgets import (
|
|
|
|
QWidget,
|
|
|
|
QMessageBox,
|
|
|
|
)
|
2022-06-19 06:45:36 +12:00
|
|
|
|
2024-01-03 10:11:47 +13:00
|
|
|
from rare.models.install import SelectiveDownloadsModel, MoveGameModel
|
2023-12-26 11:05:11 +13:00
|
|
|
from rare.components.dialogs.selective_dialog import SelectiveDialog
|
2022-12-25 15:21:23 +13:00
|
|
|
from rare.models.game import RareGame
|
2023-02-16 03:59:33 +13:00
|
|
|
from rare.shared import RareCore
|
2023-02-01 02:43:26 +13:00
|
|
|
from rare.shared.workers import VerifyWorker, MoveWorker
|
2021-09-14 06:24:09 +12:00
|
|
|
from rare.ui.components.tabs.games.game_info.game_info import Ui_GameInfo
|
2023-08-23 06:36:16 +12:00
|
|
|
from rare.utils.misc import format_size, icon
|
2023-04-17 01:45:36 +12:00
|
|
|
from rare.widgets.image_widget import ImageWidget, ImageSize
|
2023-02-22 02:26:19 +13:00
|
|
|
from rare.widgets.side_tab import SideTabContents
|
2024-01-03 10:11:47 +13:00
|
|
|
from rare.components.dialogs.move_dialog import MoveDialog, is_game_dir
|
2021-09-12 23:23:40 +12:00
|
|
|
|
2021-11-17 10:54:23 +13:00
|
|
|
logger = getLogger("GameInfo")
|
|
|
|
|
2021-09-12 23:23:40 +12:00
|
|
|
|
2023-02-22 02:26:19 +13:00
|
|
|
class GameInfo(QWidget, SideTabContents):
|
2023-04-17 06:53:42 +12:00
|
|
|
# str: app_name
|
|
|
|
import_clicked = pyqtSignal(str)
|
|
|
|
|
2023-01-27 03:18:32 +13:00
|
|
|
def __init__(self, parent=None):
|
2021-09-12 23:23:40 +12:00
|
|
|
super(GameInfo, self).__init__(parent=parent)
|
2022-12-27 02:18:48 +13:00
|
|
|
self.ui = Ui_GameInfo()
|
|
|
|
self.ui.setupUi(self)
|
2023-01-27 03:18:32 +13:00
|
|
|
# lk: set object names for CSS properties
|
|
|
|
self.ui.install_button.setObjectName("InstallButton")
|
2023-08-01 18:50:51 +12:00
|
|
|
self.ui.modify_button.setObjectName("InstallButton")
|
2023-01-27 03:18:32 +13:00
|
|
|
self.ui.uninstall_button.setObjectName("UninstallButton")
|
|
|
|
|
2023-08-23 06:36:16 +12:00
|
|
|
self.ui.install_button.setIcon(icon("ri.install-line"))
|
2024-01-03 02:34:35 +13:00
|
|
|
self.ui.import_button.setIcon(icon("mdi.application-import"))
|
2023-08-23 06:36:16 +12:00
|
|
|
|
|
|
|
self.ui.modify_button.setIcon(icon("fa.gear"))
|
|
|
|
self.ui.verify_button.setIcon(icon("fa.check"))
|
|
|
|
self.ui.repair_button.setIcon(icon("fa.wrench"))
|
2024-01-03 02:34:35 +13:00
|
|
|
self.ui.move_button.setIcon(icon("mdi.folder-move-outline"))
|
2023-08-23 06:36:16 +12:00
|
|
|
self.ui.uninstall_button.setIcon(icon("ri.uninstall-line"))
|
|
|
|
|
2023-01-25 02:35:12 +13:00
|
|
|
self.rcore = RareCore.instance()
|
2023-02-16 03:59:33 +13:00
|
|
|
self.core = RareCore.instance().core()
|
|
|
|
self.args = RareCore.instance().args()
|
|
|
|
# self.image_manager = RareCore.instance().image_manager()
|
2021-09-12 23:23:40 +12:00
|
|
|
|
2022-12-27 02:11:23 +13:00
|
|
|
self.rgame: Optional[RareGame] = None
|
2022-12-25 01:47:48 +13:00
|
|
|
|
2022-06-20 05:42:49 +12:00
|
|
|
self.image = ImageWidget(self)
|
|
|
|
self.image.setFixedSize(ImageSize.Display)
|
2023-03-30 22:50:42 +13:00
|
|
|
self.ui.left_layout.insertWidget(0, self.image, alignment=Qt.AlignTop)
|
2022-06-20 05:42:49 +12:00
|
|
|
|
2023-01-25 02:35:12 +13:00
|
|
|
self.ui.install_button.clicked.connect(self.__on_install)
|
2023-04-17 06:53:42 +12:00
|
|
|
self.ui.import_button.clicked.connect(self.__on_import)
|
2023-08-01 18:50:51 +12:00
|
|
|
self.ui.modify_button.clicked.connect(self.__on_modify)
|
2023-02-16 03:59:33 +13:00
|
|
|
self.ui.verify_button.clicked.connect(self.__on_verify)
|
|
|
|
self.ui.repair_button.clicked.connect(self.__on_repair)
|
2024-01-03 10:11:47 +13:00
|
|
|
self.ui.move_button.clicked.connect(self.__on_move)
|
2023-02-16 03:59:33 +13:00
|
|
|
self.ui.uninstall_button.clicked.connect(self.__on_uninstall)
|
2022-04-11 07:14:46 +12:00
|
|
|
|
2023-02-16 03:59:33 +13:00
|
|
|
self.steam_grade_ratings = {
|
|
|
|
"platinum": self.tr("Platinum"),
|
|
|
|
"gold": self.tr("Gold"),
|
|
|
|
"silver": self.tr("Silver"),
|
|
|
|
"bronze": self.tr("Bronze"),
|
|
|
|
"borked": self.tr("Borked"),
|
|
|
|
"fail": self.tr("Failed to get rating"),
|
|
|
|
"pending": self.tr("Loading..."),
|
|
|
|
"na": self.tr("Not applicable"),
|
|
|
|
}
|
2022-01-19 09:46:12 +13:00
|
|
|
|
2023-08-23 06:36:16 +12:00
|
|
|
# lk: hide unfinished things
|
2023-09-02 10:07:25 +12:00
|
|
|
self.ui.tags_group.setVisible(False)
|
2023-03-30 22:50:42 +13:00
|
|
|
self.ui.requirements_group.setVisible(False)
|
|
|
|
|
2022-12-27 02:11:23 +13:00
|
|
|
@pyqtSlot()
|
2023-01-25 02:35:12 +13:00
|
|
|
def __on_install(self):
|
2023-02-16 03:59:33 +13:00
|
|
|
if self.rgame.is_non_asset:
|
2023-01-25 02:35:12 +13:00
|
|
|
self.rgame.launch()
|
2022-12-27 02:11:23 +13:00
|
|
|
else:
|
2023-01-05 09:38:05 +13:00
|
|
|
self.rgame.install()
|
2022-12-27 02:11:23 +13:00
|
|
|
|
2023-04-17 06:53:42 +12:00
|
|
|
@pyqtSlot()
|
|
|
|
def __on_import(self):
|
|
|
|
self.import_clicked.emit(self.rgame.app_name)
|
|
|
|
|
2022-12-27 02:11:23 +13:00
|
|
|
@pyqtSlot()
|
2023-01-25 02:35:12 +13:00
|
|
|
def __on_uninstall(self):
|
2023-02-16 03:59:33 +13:00
|
|
|
""" This method is to be called from the button only """
|
2023-01-25 23:59:00 +13:00
|
|
|
self.rgame.uninstall()
|
2021-11-17 10:54:23 +13:00
|
|
|
|
2023-08-01 18:50:51 +12:00
|
|
|
@pyqtSlot()
|
|
|
|
def __on_modify(self):
|
|
|
|
""" This method is to be called from the button only """
|
|
|
|
self.rgame.modify()
|
|
|
|
|
2022-08-01 08:00:50 +12:00
|
|
|
@pyqtSlot()
|
2023-01-25 02:35:12 +13:00
|
|
|
def __on_repair(self):
|
2023-02-16 03:59:33 +13:00
|
|
|
""" This method is to be called from the button only """
|
2023-01-07 08:55:41 +13:00
|
|
|
repair_file = os.path.join(self.core.lgd.get_tmp_path(), f"{self.rgame.app_name}.repair")
|
2021-09-12 23:23:40 +12:00
|
|
|
if not os.path.exists(repair_file):
|
2021-12-24 22:09:50 +13:00
|
|
|
QMessageBox.warning(
|
|
|
|
self,
|
2023-12-15 10:08:08 +13:00
|
|
|
self.tr("Error - {}").format(self.rgame.app_title),
|
2021-12-24 22:09:50 +13:00
|
|
|
self.tr(
|
|
|
|
"Repair file does not exist or game does not need a repair. Please verify game first"
|
|
|
|
),
|
|
|
|
)
|
2021-09-12 23:23:40 +12:00
|
|
|
return
|
2023-01-07 08:55:41 +13:00
|
|
|
self.repair_game(self.rgame)
|
2022-08-01 08:00:50 +12:00
|
|
|
|
2023-01-07 08:55:41 +13:00
|
|
|
def repair_game(self, rgame: RareGame):
|
|
|
|
rgame.update_game()
|
2022-08-01 08:00:50 +12:00
|
|
|
ans = False
|
2023-01-07 08:55:41 +13:00
|
|
|
if rgame.has_update:
|
2022-08-01 08:00:50 +12:00
|
|
|
ans = QMessageBox.question(
|
|
|
|
self,
|
2023-12-15 10:08:08 +13:00
|
|
|
self.tr("Repair and update? - {}").format(self.rgame.app_title),
|
2022-08-01 08:00:50 +12:00
|
|
|
self.tr(
|
2022-09-23 20:32:57 +12:00
|
|
|
"There is an update for <b>{}</b> from <b>{}</b> to <b>{}</b>. "
|
2022-08-01 08:00:50 +12:00
|
|
|
"Do you want to update the game while repairing it?"
|
2023-12-15 10:08:08 +13:00
|
|
|
).format(rgame.app_title, rgame.version, rgame.remote_version),
|
2022-08-01 08:00:50 +12:00
|
|
|
) == QMessageBox.Yes
|
2023-01-10 06:58:29 +13:00
|
|
|
rgame.repair(repair_and_update=ans)
|
2021-09-12 23:23:40 +12:00
|
|
|
|
2023-02-16 03:59:33 +13:00
|
|
|
@pyqtSlot(RareGame, str)
|
|
|
|
def __on_worker_error(self, rgame: RareGame, message: str):
|
|
|
|
QMessageBox.warning(
|
|
|
|
self,
|
2023-12-15 10:08:08 +13:00
|
|
|
self.tr("Error - {}").format(rgame.app_title),
|
2023-02-16 03:59:33 +13:00
|
|
|
message
|
|
|
|
)
|
|
|
|
|
2022-08-01 08:00:50 +12:00
|
|
|
@pyqtSlot()
|
2023-01-25 02:35:12 +13:00
|
|
|
def __on_verify(self):
|
2023-02-16 03:59:33 +13:00
|
|
|
""" This method is to be called from the button only """
|
2023-01-07 08:55:41 +13:00
|
|
|
if not os.path.exists(self.rgame.igame.install_path):
|
2023-12-15 10:08:08 +13:00
|
|
|
logger.error(f"Installation path {self.rgame.igame.install_path} for {self.rgame.app_title} does not exist")
|
2021-12-24 22:09:50 +13:00
|
|
|
QMessageBox.warning(
|
|
|
|
self,
|
2023-12-15 10:08:08 +13:00
|
|
|
self.tr("Error - {}").format(self.rgame.app_title),
|
|
|
|
self.tr("Installation path for <b>{}</b> does not exist. Cannot continue.").format(self.rgame.app_title),
|
2021-12-24 22:09:50 +13:00
|
|
|
)
|
2021-11-17 10:54:23 +13:00
|
|
|
return
|
2023-12-20 07:53:21 +13:00
|
|
|
if self.rgame.sdl_name is not None:
|
2023-12-26 11:05:11 +13:00
|
|
|
selective_dialog = SelectiveDialog(
|
2023-12-20 07:53:21 +13:00
|
|
|
self.rgame, parent=self
|
|
|
|
)
|
|
|
|
selective_dialog.result_ready.connect(self.verify_game)
|
2023-12-26 11:05:11 +13:00
|
|
|
selective_dialog.open()
|
2023-12-20 07:53:21 +13:00
|
|
|
else:
|
|
|
|
self.verify_game(self.rgame)
|
|
|
|
|
|
|
|
@pyqtSlot(RareGame, SelectiveDownloadsModel)
|
|
|
|
def verify_game(self, rgame: RareGame, sdl_model: SelectiveDownloadsModel = None):
|
2023-12-26 11:05:11 +13:00
|
|
|
if sdl_model is not None:
|
|
|
|
if not sdl_model.accepted or sdl_model.install_tag is None:
|
2023-12-20 07:53:21 +13:00
|
|
|
return
|
2023-12-26 11:05:11 +13:00
|
|
|
self.core.lgd.config.set(rgame.app_name, "install_tags", ','.join(sdl_model.install_tag))
|
|
|
|
self.core.lgd.save_config()
|
2023-02-03 21:55:56 +13:00
|
|
|
worker = VerifyWorker(self.core, self.args, rgame)
|
|
|
|
worker.signals.progress.connect(self.__on_verify_progress)
|
|
|
|
worker.signals.result.connect(self.__on_verify_result)
|
2023-02-16 03:59:33 +13:00
|
|
|
worker.signals.error.connect(self.__on_worker_error)
|
2023-02-03 21:55:56 +13:00
|
|
|
self.rcore.enqueue_worker(rgame, worker)
|
2021-09-12 23:23:40 +12:00
|
|
|
|
2023-01-07 08:55:41 +13:00
|
|
|
@pyqtSlot(RareGame, int, int, float, float)
|
2023-01-25 02:35:12 +13:00
|
|
|
def __on_verify_progress(self, rgame: RareGame, num, total, percentage, speed):
|
2023-02-16 03:59:33 +13:00
|
|
|
# lk: the check is NOT REQUIRED because signals are disconnected but protect against it anyway
|
|
|
|
if rgame is not self.rgame:
|
|
|
|
return
|
2023-01-07 08:55:41 +13:00
|
|
|
self.ui.verify_progress.setValue(num * 100 // total)
|
2021-09-12 23:23:40 +12:00
|
|
|
|
2023-01-07 08:55:41 +13:00
|
|
|
@pyqtSlot(RareGame, bool, int, int)
|
2023-01-25 02:35:12 +13:00
|
|
|
def __on_verify_result(self, rgame: RareGame, success, failed, missing):
|
2022-12-27 02:18:48 +13:00
|
|
|
self.ui.repair_button.setDisabled(success)
|
2022-07-11 04:32:42 +12:00
|
|
|
if success:
|
2021-12-24 22:09:50 +13:00
|
|
|
QMessageBox.information(
|
|
|
|
self,
|
2023-12-15 10:08:08 +13:00
|
|
|
self.tr("Summary - {}").format(rgame.app_title),
|
2022-08-01 08:00:50 +12:00
|
|
|
self.tr("<b>{}</b> has been verified successfully. "
|
2023-12-15 10:08:08 +13:00
|
|
|
"No missing or corrupt files found").format(rgame.app_title),
|
2021-12-24 22:09:50 +13:00
|
|
|
)
|
2021-09-12 23:23:40 +12:00
|
|
|
else:
|
2021-12-24 22:09:50 +13:00
|
|
|
ans = QMessageBox.question(
|
|
|
|
self,
|
2023-12-15 10:08:08 +13:00
|
|
|
self.tr("Summary - {}").format(rgame.app_title),
|
2021-12-24 22:09:50 +13:00
|
|
|
self.tr(
|
2023-03-13 23:29:04 +13:00
|
|
|
"<b>{}</b> failed verification, <b>{}</b> file(s) corrupted, <b>{}</b> file(s) are missing. "
|
2022-08-01 08:00:50 +12:00
|
|
|
"Do you want to repair them?"
|
2023-12-15 10:08:08 +13:00
|
|
|
).format(rgame.app_title, failed, missing),
|
2021-12-24 22:09:50 +13:00
|
|
|
QMessageBox.Yes | QMessageBox.No,
|
|
|
|
QMessageBox.Yes,
|
|
|
|
)
|
2021-09-12 23:23:40 +12:00
|
|
|
if ans == QMessageBox.Yes:
|
2023-01-07 08:55:41 +13:00
|
|
|
self.repair_game(rgame)
|
2021-09-12 23:23:40 +12:00
|
|
|
|
2024-01-03 10:11:47 +13:00
|
|
|
@pyqtSlot()
|
|
|
|
def __on_move(self):
|
2023-02-16 03:59:33 +13:00
|
|
|
""" This method is to be called from the button only """
|
2024-01-03 10:11:47 +13:00
|
|
|
move_dialog = MoveDialog(self.rgame, parent=self)
|
|
|
|
move_dialog.result_ready.connect(self.move_game)
|
|
|
|
move_dialog.open()
|
2023-02-16 03:59:33 +13:00
|
|
|
|
2024-01-03 10:11:47 +13:00
|
|
|
def move_game(self, rgame: RareGame, model: MoveGameModel):
|
|
|
|
if not model.accepted:
|
|
|
|
return
|
|
|
|
|
|
|
|
new_install_path = os.path.join(model.target_path, os.path.basename(self.rgame.install_path))
|
2023-02-16 03:59:33 +13:00
|
|
|
dir_exists = False
|
|
|
|
if os.path.isdir(new_install_path):
|
|
|
|
dir_exists = is_game_dir(self.rgame.install_path, new_install_path)
|
|
|
|
|
|
|
|
if not dir_exists:
|
2024-01-03 10:11:47 +13:00
|
|
|
for item in os.listdir(model.target_path):
|
2023-02-16 03:59:33 +13:00
|
|
|
if os.path.basename(self.rgame.install_path) in os.path.basename(item):
|
|
|
|
ans = QMessageBox.question(
|
|
|
|
self,
|
2023-12-15 10:08:08 +13:00
|
|
|
self.tr("Move game? - {}").format(self.rgame.app_title),
|
2023-02-16 03:59:33 +13:00
|
|
|
self.tr(
|
|
|
|
"Destination <b>{}</b> already exists. "
|
|
|
|
"Are you sure you want to overwrite it?"
|
|
|
|
).format(new_install_path),
|
|
|
|
QMessageBox.Yes | QMessageBox.No,
|
|
|
|
QMessageBox.Yes,
|
2022-04-22 10:28:33 +12:00
|
|
|
)
|
2022-04-11 07:14:46 +12:00
|
|
|
|
2023-02-16 03:59:33 +13:00
|
|
|
if ans == QMessageBox.Yes:
|
|
|
|
if os.path.isdir(new_install_path):
|
|
|
|
shutil.rmtree(new_install_path)
|
2022-04-22 10:28:33 +12:00
|
|
|
else:
|
2023-02-16 03:59:33 +13:00
|
|
|
os.remove(new_install_path)
|
2022-04-22 10:28:33 +12:00
|
|
|
else:
|
|
|
|
return
|
2022-04-11 07:14:46 +12:00
|
|
|
|
2023-02-16 03:59:33 +13:00
|
|
|
worker = MoveWorker(
|
2024-01-03 10:11:47 +13:00
|
|
|
self.core, rgame=rgame, dst_path=model.target_path, dst_exists=dir_exists
|
2023-02-16 03:59:33 +13:00
|
|
|
)
|
|
|
|
worker.signals.progress.connect(self.__on_move_progress)
|
|
|
|
worker.signals.result.connect(self.__on_move_result)
|
|
|
|
worker.signals.error.connect(self.__on_worker_error)
|
|
|
|
self.rcore.enqueue_worker(self.rgame, worker)
|
2022-04-11 07:14:46 +12:00
|
|
|
|
2023-03-17 01:04:12 +13:00
|
|
|
@pyqtSlot(RareGame, int, object, object)
|
|
|
|
def __on_move_progress(self, rgame: RareGame, progress: int, total_size: int, copied_size: int):
|
2023-02-16 03:59:33 +13:00
|
|
|
# lk: the check is NOT REQUIRED because signals are disconnected but protect against it anyway
|
|
|
|
if rgame is not self.rgame:
|
|
|
|
return
|
|
|
|
self.ui.move_progress.setValue(progress)
|
2022-04-11 07:14:46 +12:00
|
|
|
|
2023-02-16 03:59:33 +13:00
|
|
|
@pyqtSlot(RareGame, str)
|
|
|
|
def __on_move_result(self, rgame: RareGame, dst_path: str):
|
|
|
|
QMessageBox.information(
|
|
|
|
self,
|
2023-12-15 10:08:08 +13:00
|
|
|
self.tr("Summary - {}").format(rgame.app_title),
|
|
|
|
self.tr("<b>{}</b> successfully moved to <b>{}<b>.").format(rgame.app_title, dst_path),
|
2023-02-16 03:59:33 +13:00
|
|
|
)
|
2022-04-22 10:28:33 +12:00
|
|
|
|
2023-02-16 03:59:33 +13:00
|
|
|
@pyqtSlot()
|
|
|
|
def __update_widget(self):
|
|
|
|
""" React to state updates from RareGame """
|
|
|
|
# self.image.setPixmap(self.image_manager.get_pixmap(self.rgame.app_name, True))
|
|
|
|
self.image.setPixmap(self.rgame.pixmap)
|
|
|
|
|
|
|
|
self.ui.lbl_version.setDisabled(self.rgame.is_non_asset)
|
|
|
|
self.ui.version.setDisabled(self.rgame.is_non_asset)
|
|
|
|
self.ui.version.setText(
|
|
|
|
self.rgame.version if not self.rgame.is_non_asset else "N/A"
|
|
|
|
)
|
2022-04-22 10:28:33 +12:00
|
|
|
|
2023-02-02 11:02:46 +13:00
|
|
|
self.ui.lbl_install_size.setEnabled(bool(self.rgame.install_size))
|
|
|
|
self.ui.install_size.setEnabled(bool(self.rgame.install_size))
|
2023-02-16 03:59:33 +13:00
|
|
|
self.ui.install_size.setText(
|
2023-03-08 09:53:18 +13:00
|
|
|
format_size(self.rgame.install_size) if self.rgame.install_size else "N/A"
|
2022-04-22 10:28:33 +12:00
|
|
|
)
|
|
|
|
|
2023-01-10 06:11:20 +13:00
|
|
|
self.ui.lbl_install_path.setEnabled(bool(self.rgame.install_path))
|
|
|
|
self.ui.install_path.setEnabled(bool(self.rgame.install_path))
|
2023-02-16 03:59:33 +13:00
|
|
|
self.ui.install_path.setText(
|
2023-01-10 06:11:20 +13:00
|
|
|
self.rgame.install_path if self.rgame.install_path else "N/A"
|
2023-02-16 03:59:33 +13:00
|
|
|
)
|
2022-04-22 10:28:33 +12:00
|
|
|
|
2023-02-16 03:59:33 +13:00
|
|
|
self.ui.platform.setText(
|
2023-12-16 03:57:32 +13:00
|
|
|
self.rgame.igame.platform
|
|
|
|
if self.rgame.is_installed and not self.rgame.is_non_asset
|
2023-12-17 01:02:53 +13:00
|
|
|
else self.rgame.default_platform
|
2023-02-16 03:59:33 +13:00
|
|
|
)
|
2022-04-11 07:14:46 +12:00
|
|
|
|
2023-02-16 03:59:33 +13:00
|
|
|
self.ui.lbl_grade.setDisabled(
|
2023-03-16 05:07:20 +13:00
|
|
|
self.rgame.is_unreal or platform.system() == "Windows"
|
2023-02-16 03:59:33 +13:00
|
|
|
)
|
|
|
|
self.ui.grade.setDisabled(
|
2023-03-16 05:07:20 +13:00
|
|
|
self.rgame.is_unreal or platform.system() == "Windows"
|
2023-02-16 03:59:33 +13:00
|
|
|
)
|
|
|
|
self.ui.grade.setText(self.steam_grade_ratings[self.rgame.steam_grade()])
|
2023-02-01 02:43:26 +13:00
|
|
|
|
2023-02-16 03:59:33 +13:00
|
|
|
self.ui.install_button.setEnabled(
|
|
|
|
(not self.rgame.is_installed or self.rgame.is_non_asset) and self.rgame.is_idle
|
|
|
|
)
|
|
|
|
|
2023-04-17 06:53:42 +12:00
|
|
|
self.ui.import_button.setEnabled(
|
|
|
|
(not self.rgame.is_installed or self.rgame.is_non_asset) and self.rgame.is_idle
|
|
|
|
)
|
2023-02-16 03:59:33 +13:00
|
|
|
|
2023-08-01 18:50:51 +12:00
|
|
|
self.ui.modify_button.setEnabled(
|
2023-09-04 09:23:14 +12:00
|
|
|
self.rgame.is_installed
|
|
|
|
and (not self.rgame.is_non_asset)
|
|
|
|
and self.rgame.is_idle
|
|
|
|
and self.rgame.sdl_name is not None
|
2023-08-01 18:50:51 +12:00
|
|
|
)
|
|
|
|
|
2023-02-16 03:59:33 +13:00
|
|
|
self.ui.verify_button.setEnabled(
|
|
|
|
self.rgame.is_installed and (not self.rgame.is_non_asset) and self.rgame.is_idle
|
|
|
|
)
|
2023-03-02 12:05:53 +13:00
|
|
|
self.ui.verify_progress.setValue(self.rgame.progress if self.rgame.state == RareGame.State.VERIFYING else 0)
|
2023-02-16 03:59:33 +13:00
|
|
|
if self.rgame.state == RareGame.State.VERIFYING:
|
|
|
|
self.ui.verify_stack.setCurrentWidget(self.ui.verify_progress_page)
|
|
|
|
else:
|
|
|
|
self.ui.verify_stack.setCurrentWidget(self.ui.verify_button_page)
|
|
|
|
|
|
|
|
self.ui.repair_button.setEnabled(
|
|
|
|
self.rgame.is_installed and (not self.rgame.is_non_asset) and self.rgame.is_idle
|
2023-03-13 23:29:04 +13:00
|
|
|
and self.rgame.needs_repair
|
2023-02-16 03:59:33 +13:00
|
|
|
and not self.args.offline
|
|
|
|
)
|
2023-01-25 02:35:12 +13:00
|
|
|
|
2023-02-16 03:59:33 +13:00
|
|
|
self.ui.move_button.setEnabled(
|
|
|
|
self.rgame.is_installed and (not self.rgame.is_non_asset) and self.rgame.is_idle
|
|
|
|
)
|
|
|
|
self.ui.move_progress.setValue(self.rgame.progress if self.rgame.state == RareGame.State.MOVING else 0)
|
|
|
|
if self.rgame.state == RareGame.State.MOVING:
|
|
|
|
self.ui.move_stack.setCurrentWidget(self.ui.move_progress_page)
|
|
|
|
else:
|
|
|
|
self.ui.move_stack.setCurrentWidget(self.ui.move_button_page)
|
|
|
|
|
|
|
|
self.ui.uninstall_button.setEnabled(
|
|
|
|
self.rgame.is_installed and (not self.rgame.is_non_asset) and self.rgame.is_idle
|
|
|
|
)
|
|
|
|
|
|
|
|
if self.rgame.is_installed and not self.rgame.is_non_asset:
|
|
|
|
self.ui.game_actions_stack.setCurrentWidget(self.ui.installed_page)
|
|
|
|
else:
|
|
|
|
self.ui.game_actions_stack.setCurrentWidget(self.ui.uninstalled_page)
|
|
|
|
|
|
|
|
@pyqtSlot(RareGame)
|
|
|
|
def update_game(self, rgame: RareGame):
|
2023-01-07 08:55:41 +13:00
|
|
|
if self.rgame is not None:
|
2023-02-03 21:55:56 +13:00
|
|
|
if (worker := self.rgame.worker()) is not None:
|
2023-01-07 08:55:41 +13:00
|
|
|
if isinstance(worker, VerifyWorker):
|
|
|
|
try:
|
2023-01-25 02:35:12 +13:00
|
|
|
worker.signals.progress.disconnect(self.__on_verify_progress)
|
2023-01-07 08:55:41 +13:00
|
|
|
except TypeError as e:
|
2023-02-01 02:43:26 +13:00
|
|
|
logger.warning(f"{self.rgame.app_name} verify worker: {e}")
|
|
|
|
if isinstance(worker, MoveWorker):
|
|
|
|
try:
|
|
|
|
worker.signals.progress.disconnect(self.__on_move_progress)
|
|
|
|
except TypeError as e:
|
|
|
|
logger.warning(f"{self.rgame.app_name} move worker: {e}")
|
2023-02-16 03:59:33 +13:00
|
|
|
self.rgame.signals.widget.update.disconnect(self.__update_widget)
|
2023-02-01 02:43:26 +13:00
|
|
|
|
2023-02-03 21:55:56 +13:00
|
|
|
self.rgame = None
|
2023-02-01 02:43:26 +13:00
|
|
|
|
2023-02-16 03:59:33 +13:00
|
|
|
rgame.signals.widget.update.connect(self.__update_widget)
|
2023-02-03 21:55:56 +13:00
|
|
|
if (worker := rgame.worker()) is not None:
|
2023-01-07 08:55:41 +13:00
|
|
|
if isinstance(worker, VerifyWorker):
|
2023-01-25 02:35:12 +13:00
|
|
|
worker.signals.progress.connect(self.__on_verify_progress)
|
2023-02-01 02:43:26 +13:00
|
|
|
if isinstance(worker, MoveWorker):
|
|
|
|
worker.signals.progress.connect(self.__on_move_progress)
|
2021-09-12 23:23:40 +12:00
|
|
|
|
2023-02-22 02:26:19 +13:00
|
|
|
self.set_title.emit(rgame.app_title)
|
2023-02-03 21:55:56 +13:00
|
|
|
self.ui.app_name.setText(rgame.app_name)
|
|
|
|
self.ui.dev.setText(rgame.developer)
|
|
|
|
|
2023-02-16 03:59:33 +13:00
|
|
|
if rgame.is_non_asset:
|
2023-01-10 06:11:20 +13:00
|
|
|
self.ui.install_button.setText(self.tr("Link/Launch"))
|
2023-01-25 05:16:23 +13:00
|
|
|
self.ui.game_actions_stack.setCurrentWidget(self.ui.uninstalled_page)
|
2021-09-19 02:50:13 +12:00
|
|
|
else:
|
2024-01-03 02:34:35 +13:00
|
|
|
self.ui.install_button.setText(self.tr("Install"))
|
2021-09-19 02:50:13 +12:00
|
|
|
|
2023-02-03 21:55:56 +13:00
|
|
|
self.rgame = rgame
|
2023-02-16 03:59:33 +13:00
|
|
|
self.__update_widget()
|