2021-02-10 23:48:25 +13:00
|
|
|
from logging import getLogger
|
|
|
|
|
2022-06-19 06:45:36 +12:00
|
|
|
from PyQt5.QtCore import QEvent, pyqtSignal, Qt
|
2021-03-25 23:49:05 +13:00
|
|
|
from PyQt5.QtGui import QMouseEvent
|
2022-06-19 06:45:36 +12:00
|
|
|
from PyQt5.QtWidgets import QVBoxLayout, QHBoxLayout, QPushButton, QWidget
|
2021-02-10 23:48:25 +13:00
|
|
|
|
2021-12-24 22:09:50 +13:00
|
|
|
from rare.components.tabs.games.game_widgets.base_installed_widget import (
|
|
|
|
BaseInstalledWidget,
|
|
|
|
)
|
2022-06-19 06:45:36 +12:00
|
|
|
from rare.shared import LegendaryCoreSingleton
|
|
|
|
from rare.shared.image_manager import ImageSize
|
2022-07-27 02:58:17 +12:00
|
|
|
from rare.utils.misc import icon
|
2022-06-19 06:45:36 +12:00
|
|
|
from rare.widgets.elide_label import ElideLabel
|
2021-02-10 23:48:25 +13:00
|
|
|
|
2021-02-18 01:58:29 +13:00
|
|
|
logger = getLogger("GameWidgetInstalled")
|
2021-02-10 23:48:25 +13:00
|
|
|
|
|
|
|
|
2021-09-14 08:27:37 +12:00
|
|
|
class InstalledIconWidget(BaseInstalledWidget):
|
2021-03-09 05:20:28 +13:00
|
|
|
update_game = pyqtSignal()
|
2021-02-18 05:46:03 +13:00
|
|
|
|
2021-11-02 10:53:04 +13:00
|
|
|
def __init__(self, app_name, pixmap, game_utils):
|
|
|
|
super(InstalledIconWidget, self).__init__(app_name, pixmap, game_utils)
|
2022-06-22 11:38:04 +12:00
|
|
|
self.setObjectName(type(self).__name__)
|
2021-03-10 04:52:51 +13:00
|
|
|
|
2021-03-18 23:35:07 +13:00
|
|
|
self.setContextMenuPolicy(Qt.ActionsContextMenu)
|
2022-06-19 06:45:36 +12:00
|
|
|
layout = QVBoxLayout()
|
2022-06-20 21:44:57 +12:00
|
|
|
layout.setContentsMargins(0, 0, 0, 0)
|
|
|
|
self.setFixedWidth(ImageSize.Display.size.width())
|
2022-02-26 06:43:27 +13:00
|
|
|
self.core = LegendaryCoreSingleton()
|
2021-03-26 00:14:34 +13:00
|
|
|
|
2021-02-18 01:58:29 +13:00
|
|
|
if self.update_available:
|
2022-02-02 10:29:34 +13:00
|
|
|
logger.info(f"Update available for game: {self.game.app_name}")
|
2021-02-10 23:48:25 +13:00
|
|
|
|
2022-06-19 06:45:36 +12:00
|
|
|
layout.addWidget(self.image)
|
2021-02-10 23:48:25 +13:00
|
|
|
|
2021-11-02 10:53:04 +13:00
|
|
|
self.game_utils.finished.connect(self.game_finished)
|
2021-11-04 07:54:04 +13:00
|
|
|
self.game_utils.cloud_save_finished.connect(self.sync_finished)
|
2021-11-02 10:53:04 +13:00
|
|
|
|
2022-06-19 06:45:36 +12:00
|
|
|
miniwidget = QWidget(self)
|
|
|
|
miniwidget.setFixedWidth(ImageSize.Display.size.width())
|
2021-02-10 23:48:25 +13:00
|
|
|
minilayout = QHBoxLayout()
|
2022-06-19 06:45:36 +12:00
|
|
|
minilayout.setContentsMargins(0, 0, 0, 0)
|
|
|
|
minilayout.setSpacing(0)
|
|
|
|
miniwidget.setLayout(minilayout)
|
|
|
|
|
2022-08-01 08:00:50 +12:00
|
|
|
self.title_label = ElideLabel(f"<b>{self.game.app_title}</b>", parent=miniwidget)
|
2022-06-20 21:44:57 +12:00
|
|
|
self.title_label.setAlignment(Qt.AlignTop)
|
2021-02-10 23:48:25 +13:00
|
|
|
self.title_label.setObjectName("game_widget")
|
2022-06-19 06:45:36 +12:00
|
|
|
minilayout.addWidget(self.title_label, stretch=2)
|
2021-03-09 08:36:42 +13:00
|
|
|
|
|
|
|
# Info Button
|
2022-06-19 06:45:36 +12:00
|
|
|
self.menu_btn = QPushButton(parent=miniwidget)
|
2021-08-29 06:03:25 +12:00
|
|
|
self.menu_btn.setIcon(icon("ei.info-circle"))
|
2021-03-09 08:36:42 +13:00
|
|
|
# self.menu_btn.setObjectName("installed_menu_button")
|
2022-06-19 06:45:36 +12:00
|
|
|
self.menu_btn.enterEvent = lambda x: self.info_label.setText(self.tr("Information"))
|
2021-11-03 09:57:19 +13:00
|
|
|
self.menu_btn.leaveEvent = lambda x: self.enterEvent(None)
|
2021-03-09 08:36:42 +13:00
|
|
|
# remove Border
|
2021-03-10 06:13:04 +13:00
|
|
|
|
|
|
|
self.menu_btn.setObjectName("menu_button")
|
|
|
|
|
2021-12-06 08:11:11 +13:00
|
|
|
self.menu_btn.clicked.connect(lambda: self.show_info.emit(self.game.app_name))
|
2022-06-19 06:45:36 +12:00
|
|
|
self.menu_btn.setFixedSize(22, 22)
|
|
|
|
minilayout.addWidget(self.menu_btn, stretch=0)
|
|
|
|
minilayout.setAlignment(Qt.AlignTop)
|
|
|
|
layout.addWidget(miniwidget)
|
2021-02-10 23:48:25 +13:00
|
|
|
|
2022-06-19 06:45:36 +12:00
|
|
|
self.info_label = ElideLabel(" ", parent=self)
|
|
|
|
self.info_label.setFixedWidth(ImageSize.Display.size.width())
|
2021-11-03 09:57:19 +13:00
|
|
|
self.leaveEvent(None)
|
2021-02-10 23:48:25 +13:00
|
|
|
self.info_label.setObjectName("info_label")
|
2022-06-19 06:45:36 +12:00
|
|
|
layout.addWidget(self.info_label)
|
2021-02-10 23:48:25 +13:00
|
|
|
|
2021-12-23 06:00:31 +13:00
|
|
|
if self.igame and self.igame.needs_verification:
|
2021-11-03 09:57:19 +13:00
|
|
|
self.info_label.setText(self.texts["needs_verification"])
|
2021-03-10 04:52:51 +13:00
|
|
|
|
2022-06-19 06:45:36 +12:00
|
|
|
self.setLayout(layout)
|
2021-02-10 23:48:25 +13:00
|
|
|
|
2021-11-14 11:56:07 +13:00
|
|
|
self.game_utils.game_launched.connect(self.game_started)
|
|
|
|
|
2021-11-03 09:57:19 +13:00
|
|
|
def enterEvent(self, a0: QEvent = None) -> None:
|
2021-04-10 08:40:27 +12:00
|
|
|
if self.game_running:
|
2021-11-03 09:57:19 +13:00
|
|
|
self.info_label.setText(self.texts["hover"]["running"])
|
2021-12-23 07:27:25 +13:00
|
|
|
elif self.igame and self.igame.needs_verification:
|
2021-11-04 07:39:40 +13:00
|
|
|
self.info_label.setText(self.texts["needs_verification"])
|
2022-04-26 09:30:52 +12:00
|
|
|
elif self.is_only_offline:
|
|
|
|
self.info_label.setText(self.texts["hover"]["launch_offline"])
|
2021-04-10 08:40:27 +12:00
|
|
|
elif self.update_available:
|
2021-11-03 09:57:19 +13:00
|
|
|
self.info_label.setText(self.texts["hover"]["update_available"])
|
2021-03-10 04:52:51 +13:00
|
|
|
else:
|
2021-12-24 22:09:50 +13:00
|
|
|
self.info_label.setText(
|
|
|
|
self.texts["hover"]["launch" if self.igame else "launch_origin"]
|
|
|
|
)
|
2021-02-10 23:48:25 +13:00
|
|
|
|
2021-11-03 09:57:19 +13:00
|
|
|
def leaveEvent(self, a0: QEvent = None) -> None:
|
|
|
|
if self.game_running:
|
|
|
|
self.info_label.setText(self.texts["default"]["running"])
|
|
|
|
elif self.syncing_cloud_saves:
|
|
|
|
self.info_label.setText(self.texts["default"]["syncing"])
|
2022-04-26 09:30:52 +12:00
|
|
|
elif self.is_only_offline:
|
|
|
|
self.info_label.setText(self.texts["default"]["no_meta"])
|
2021-11-03 09:57:19 +13:00
|
|
|
elif self.update_available:
|
|
|
|
self.info_label.setText(self.texts["default"]["update_available"])
|
2021-12-06 08:11:11 +13:00
|
|
|
elif self.igame and self.igame.needs_verification:
|
|
|
|
self.info_label.setText(self.texts["needs_verification"])
|
2021-03-10 04:52:51 +13:00
|
|
|
else:
|
2022-06-19 06:45:36 +12:00
|
|
|
self.info_label.setText(" ") # invisible text, cheap way to always vertical have size in label
|
2021-02-10 23:48:25 +13:00
|
|
|
|
2021-03-19 00:45:59 +13:00
|
|
|
def mousePressEvent(self, e: QMouseEvent):
|
2021-03-18 23:35:07 +13:00
|
|
|
# left button
|
2021-10-04 06:37:46 +13:00
|
|
|
if e.button() == 1 and not self.game_running:
|
2021-12-23 06:00:31 +13:00
|
|
|
if self.igame and self.igame.needs_verification:
|
2021-10-04 06:37:46 +13:00
|
|
|
return
|
2021-03-18 23:35:07 +13:00
|
|
|
if self.update_available:
|
|
|
|
self.launch(skip_version_check=True)
|
|
|
|
else:
|
|
|
|
self.launch()
|
2021-03-25 23:49:05 +13:00
|
|
|
|
2021-03-18 23:35:07 +13:00
|
|
|
# right
|
|
|
|
elif e.button() == 2:
|
2021-04-10 08:40:27 +12:00
|
|
|
pass # self.showMenu(e)
|
2021-11-02 10:53:04 +13:00
|
|
|
|
2021-11-04 07:54:04 +13:00
|
|
|
def sync_finished(self, app_name):
|
|
|
|
if not app_name == self.game.app_name:
|
|
|
|
return
|
|
|
|
super().sync_finished(app_name)
|
|
|
|
self.leaveEvent(None)
|
|
|
|
|
2021-11-03 09:57:19 +13:00
|
|
|
def game_finished(self, app_name, error):
|
2021-11-02 10:53:04 +13:00
|
|
|
if app_name != self.game.app_name:
|
|
|
|
return
|
2021-11-17 10:54:23 +13:00
|
|
|
self.game_running = False
|
2021-11-03 09:57:19 +13:00
|
|
|
self.leaveEvent(None)
|
2021-11-14 11:56:07 +13:00
|
|
|
|
|
|
|
def game_started(self, app_name):
|
|
|
|
if app_name == self.game.app_name:
|
|
|
|
self.game_running = True
|
|
|
|
self.leaveEvent(None)
|