Update new Signal System
This commit is contained in:
parent
746aa671e0
commit
4f25fd8a20
33
rare/app.py
33
rare/app.py
|
@ -9,6 +9,7 @@ import qtawesome
|
|||
from PyQt5.QtCore import QSettings, QTranslator
|
||||
from PyQt5.QtGui import QIcon, QPalette
|
||||
from PyQt5.QtWidgets import QApplication, QSystemTrayIcon, QStyleFactory, QMessageBox
|
||||
from requests import HTTPError
|
||||
|
||||
from legendary.core import LegendaryCore
|
||||
from rare import languages_path, resources_path, cache_dir
|
||||
|
@ -29,6 +30,17 @@ logger = logging.getLogger("Rare")
|
|||
def excepthook(exc_type, exc_value, exc_tb):
|
||||
tb = "".join(traceback.format_exception(exc_type, exc_value, exc_tb))
|
||||
print("Error")
|
||||
if exc_tb == HTTPError:
|
||||
try:
|
||||
if shared.legendary_core.login():
|
||||
return
|
||||
else:
|
||||
raise ValueError
|
||||
except Exception as e:
|
||||
logger.fatal(str(e))
|
||||
QMessageBox.warning(None, "Error", QApplication.tr("Failed to login"))
|
||||
QApplication.exit(1)
|
||||
return
|
||||
logger.fatal(tb)
|
||||
QMessageBox.warning(None, "Error", tb)
|
||||
QApplication.exit(1)
|
||||
|
@ -74,7 +86,15 @@ class App(QApplication):
|
|||
self.settings = QSettings()
|
||||
|
||||
self.signals = shared.init_signals()
|
||||
self.signals.app.connect(lambda x: self.handle_signal(*x))
|
||||
|
||||
self.signals.exit_app.connect(self.exit)
|
||||
self.signals.send_notification.connect(
|
||||
lambda title:
|
||||
self.tray_icon.showMessage(
|
||||
self.tr("Download finished"),
|
||||
self.tr("Download finished. {} is playable now").format(title),
|
||||
QSystemTrayIcon.Information, 4000)
|
||||
if self.settings.value("notification", True, bool) else None)
|
||||
|
||||
# Translator
|
||||
self.translator = QTranslator()
|
||||
|
@ -135,17 +155,6 @@ class App(QApplication):
|
|||
if not self.args.silent:
|
||||
self.mainwindow.show()
|
||||
|
||||
def handle_signal(self, action, data):
|
||||
if action == self.signals.actions.quit_app:
|
||||
self.exit_app(data)
|
||||
elif action == self.signals.actions.installation_finished:
|
||||
# data: (notification, app_title)
|
||||
if self.settings.value("notification", True, bool):
|
||||
self.tray_icon.showMessage(
|
||||
self.tr("Download finished"),
|
||||
self.tr("Download finished. {} is playable now").format(data),
|
||||
QSystemTrayIcon.Information, 4000)
|
||||
|
||||
def tray(self, reason):
|
||||
if reason == QSystemTrayIcon.DoubleClick:
|
||||
self.mainwindow.show()
|
||||
|
|
|
@ -21,7 +21,6 @@ class MainWindow(QMainWindow):
|
|||
self.core = shared.legendary_core
|
||||
|
||||
self.signals = shared.signals
|
||||
self.signals.main_window.connect(lambda x: self.handle_signal(*x))
|
||||
|
||||
self.offline = shared.args.offline
|
||||
width, height = 1200, 800
|
||||
|
@ -35,11 +34,7 @@ class MainWindow(QMainWindow):
|
|||
self.tab_widget = TabWidget(self)
|
||||
self.setCentralWidget(self.tab_widget)
|
||||
if not shared.args.offline:
|
||||
self.rpc = DiscordRPC(shared.legendary_core)
|
||||
# Discord RPC on game launch
|
||||
# self.tab_widget.games_tab.default_widget.game_list.game_started.connect(
|
||||
# lambda: self.rpc.set_discord_rpc(self.tab_widget.games_tab.default_widget.game_list.running_games[0]))
|
||||
# Remove RPC
|
||||
self.rpc = DiscordRPC()
|
||||
self.tab_widget.delete_presence.connect(self.rpc.set_discord_rpc)
|
||||
# Show RPC on changed rare_settings
|
||||
self.tab_widget.settings.rare_settings.rpc.update_settings.connect(
|
||||
|
|
|
@ -35,4 +35,4 @@ class MiniWidget(QWidget):
|
|||
|
||||
if reply == QMessageBox.Yes:
|
||||
self.core.lgd.invalidate_userdata()
|
||||
self.signals.app.emit((self.signals.actions.quit_app, -133742)) # restart exit code
|
||||
self.signals.exit_app.emit(-133742) # restart exit code
|
||||
|
|
|
@ -32,13 +32,9 @@ class SyncSaves(QScrollArea):
|
|||
super(SyncSaves, self).__init__()
|
||||
self.core = shared.legendary_core
|
||||
self.signals = shared.signals
|
||||
self.signals.cloud_saves.connect(self.signal_received)
|
||||
self.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
|
||||
self.load_saves()
|
||||
|
||||
def signal_received(self, action, data):
|
||||
pass
|
||||
|
||||
def load_saves(self, app_name=None, auto=False):
|
||||
self.widget = QWidget()
|
||||
layout = QVBoxLayout()
|
||||
|
|
|
@ -20,7 +20,7 @@ logger = getLogger("Download")
|
|||
|
||||
class DownloadTab(QWidget):
|
||||
thread: QThread
|
||||
dl_queue = []
|
||||
dl_queue = list()
|
||||
dl_status = pyqtSignal(int)
|
||||
|
||||
def __init__(self, updates: list):
|
||||
|
@ -30,7 +30,6 @@ class DownloadTab(QWidget):
|
|||
self.active_game: Game = None
|
||||
self.analysis = None
|
||||
self.signals = shared.signals
|
||||
self.signals.dl_tab.connect(lambda x: self.signal_received(*x))
|
||||
self.info_layout = QGridLayout()
|
||||
|
||||
self.installing_game = QLabel(self.tr("No active Download"))
|
||||
|
@ -82,9 +81,7 @@ class DownloadTab(QWidget):
|
|||
|
||||
self.setLayout(self.layout)
|
||||
|
||||
def signal_received(self, action, data):
|
||||
if action == self.signals.actions.install_game:
|
||||
self.get_install_options(data)
|
||||
self.signals.install_game.connect(self.get_install_options)
|
||||
|
||||
def add_update(self, igame: InstalledGame):
|
||||
widget = UpdateWidget(self.core, igame, self)
|
||||
|
@ -121,7 +118,7 @@ class DownloadTab(QWidget):
|
|||
self.analysis = queue_item.download.analysis
|
||||
self.installing_game.setText(self.tr("Installing Game: ") + self.active_game.app_title)
|
||||
|
||||
self.signals.games_tab.emit((self.signals.actions.start_installation, self.active_game))
|
||||
self.signals.installation_started.emit(self.active_game)
|
||||
|
||||
def status(self, text):
|
||||
if text == "dl_finished":
|
||||
|
@ -145,10 +142,12 @@ class DownloadTab(QWidget):
|
|||
if len(self.update_widgets) == 0:
|
||||
self.update_text.setVisible(True)
|
||||
|
||||
self.signals.app.emit((self.signals.actions.installation_finished, game.app_title))
|
||||
self.signals.games_tab.emit((self.signals.actions.installation_finished, (game.app_name, True)))
|
||||
self.signals.tab_widget.emit(
|
||||
(self.signals.actions.set_dl_tab_text, len(self.dl_queue) + len(self.update_widgets.keys())))
|
||||
self.signals.send_notification.emit(game.app_title)
|
||||
self.signals.update_gamelist.emit(game.app_name)
|
||||
self.signals.update_download_tab_text.emit()
|
||||
|
||||
self.signals.installation_finished.emit(True, game.app_name)
|
||||
|
||||
self.reset_infos()
|
||||
|
||||
if len(self.dl_queue) != 0:
|
||||
|
@ -161,8 +160,7 @@ class DownloadTab(QWidget):
|
|||
|
||||
elif text == "stop":
|
||||
self.reset_infos()
|
||||
self.signals.games_tab.emit(
|
||||
(self.signals.actions.installation_finished, (self.active_game.app_name, False)))
|
||||
self.signals.installation_finished.emit(False, self.active_game.app_name)
|
||||
self.active_game = None
|
||||
if self.dl_queue:
|
||||
self.start_installation(self.dl_queue[0])
|
||||
|
@ -185,8 +183,7 @@ class DownloadTab(QWidget):
|
|||
self.downloaded.setText(
|
||||
self.tr("Downloaded") + f": {get_size(ui_update.total_downloaded)} / {get_size(self.analysis.dl_size)}")
|
||||
self.time_left.setText(self.tr("Time left: ") + self.get_time(ui_update.estimated_time_left))
|
||||
self.signals.games_tab.emit(
|
||||
(self.signals.actions.dl_status, int(100 * ui_update.total_downloaded / self.analysis.dl_size)))
|
||||
self.signals.dl_progress.emit(int(100 * ui_update.total_downloaded / self.analysis.dl_size))
|
||||
|
||||
def get_time(self, seconds: int) -> str:
|
||||
return str(datetime.timedelta(seconds=seconds))
|
||||
|
@ -194,7 +191,7 @@ class DownloadTab(QWidget):
|
|||
def on_install_dialog_closed(self, download_item: InstallQueueItemModel):
|
||||
if download_item:
|
||||
self.install_game(download_item)
|
||||
self.signals.tab_widget.emit((self.signals.actions.set_index, 1))
|
||||
self.signals.set_main_tab_index.emit(1)
|
||||
else:
|
||||
if w := self.update_widgets.get(download_item.options.app_name):
|
||||
w.update_button.setDisabled(False)
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
from logging import getLogger
|
||||
|
||||
from PyQt5.QtCore import pyqtSignal, QSettings, QObjectCleanupHandler
|
||||
from PyQt5.QtCore import QSettings, QObjectCleanupHandler
|
||||
from PyQt5.QtWidgets import QStackedWidget, QVBoxLayout, QWidget
|
||||
|
||||
import rare.shared as shared
|
||||
from legendary.models.game import Game, InstalledGame
|
||||
from rare.components.dialogs.uninstall_dialog import UninstallDialog
|
||||
from rare.components.tabs.games.game_info import GameInfoTabs
|
||||
from rare.components.tabs.games.game_info.uninstalled_info import UninstalledInfoTabs
|
||||
|
@ -27,8 +28,6 @@ logger = getLogger("GamesTab")
|
|||
class GamesTab(QStackedWidget, Ui_GamesTab):
|
||||
widgets = {}
|
||||
running_games = []
|
||||
game_exited = pyqtSignal(str)
|
||||
game_started = pyqtSignal(str)
|
||||
updates = set()
|
||||
|
||||
def __init__(self):
|
||||
|
@ -36,7 +35,6 @@ class GamesTab(QStackedWidget, Ui_GamesTab):
|
|||
self.setupUi(self)
|
||||
self.core = shared.legendary_core
|
||||
self.signals = shared.signals
|
||||
self.signals.games_tab.connect(lambda x: self.signal_received(*x))
|
||||
self.settings = QSettings()
|
||||
|
||||
self.game_list = shared.api_results.game_list
|
||||
|
@ -85,30 +83,32 @@ class GamesTab(QStackedWidget, Ui_GamesTab):
|
|||
|
||||
self.filter(self.head_bar.available_filters[self.settings.value("filter", 0, int)])
|
||||
|
||||
def signal_received(self, action, data):
|
||||
if action == self.signals.actions.dl_status:
|
||||
self.installing_widget.set_status(data)
|
||||
elif action == self.signals.actions.set_index:
|
||||
self.setCurrentIndex(data)
|
||||
elif action == self.signals.actions.start_installation:
|
||||
self.installing_widget.set_game(data)
|
||||
self.installing_widget.setVisible(True)
|
||||
elif action == self.signals.actions.installation_finished:
|
||||
if data[1]: # update list
|
||||
self.update_list(data[0])
|
||||
self.installing_widget.setVisible(False)
|
||||
elif action == self.signals.actions.uninstall:
|
||||
infos = UninstallDialog(data).get_information()
|
||||
if infos == 0:
|
||||
return
|
||||
legendary_utils.uninstall(data.app_name, self.core, infos)
|
||||
self.setCurrentIndex(0)
|
||||
self.update_list(data.app_name)
|
||||
elif action == self.signals.actions.verification_finished:
|
||||
i_widget, l_widget = self.widgets[data.app_name]
|
||||
i_widget.igame = data
|
||||
l_widget.igame = data
|
||||
i_widget.info_text = ""
|
||||
# signals
|
||||
self.signals.dl_progress.connect(self.installing_widget.set_status)
|
||||
self.signals.installation_started.connect(self.installation_started)
|
||||
self.signals.update_gamelist.connect(self.update_list)
|
||||
self.signals.installation_finished.connect(lambda x: self.installing_widget.setVisible(False))
|
||||
|
||||
def installation_started(self, game: Game):
|
||||
if game.is_dlc:
|
||||
return
|
||||
self.installing_widget.set_game(game)
|
||||
self.installing_widget.setVisible(True)
|
||||
|
||||
def verification_finished(self, igame: InstalledGame):
|
||||
# only if igame needs verification
|
||||
i_widget, l_widget = self.widgets[igame.app_name]
|
||||
i_widget.igame = igame
|
||||
l_widget.igame = igame
|
||||
i_widget.info_text = ""
|
||||
|
||||
def uninstall_game(self, game: Game):
|
||||
infos = UninstallDialog(game).get_information()
|
||||
if infos == 0:
|
||||
return
|
||||
legendary_utils.uninstall(game.app_name, self.core, infos)
|
||||
self.setCurrentIndex(0)
|
||||
self.update_list(game.app_name)
|
||||
|
||||
def show_game_info(self, game):
|
||||
self.game_info_tabs.update_game(game, self.dlcs)
|
||||
|
@ -224,16 +224,18 @@ class GamesTab(QStackedWidget, Ui_GamesTab):
|
|||
self.widgets[app_name][0].info_text = self.tr("Sync CLoud saves")
|
||||
self.widgets[app_name][0].info_label.setText(self.tr("Sync CLoud saves"))
|
||||
self.widgets[app_name][1].info_label.setText(self.tr("Sync CLoud saves"))
|
||||
self.game_exited.emit(app_name)
|
||||
self.signals.set_discord_rpc.emit(None)
|
||||
|
||||
def launch(self, app_name):
|
||||
self.running_games.append(app_name)
|
||||
self.game_started.emit(app_name)
|
||||
# self.game_started.emit(app_name)
|
||||
self.widgets[app_name][0].info_text = self.tr("Game running")
|
||||
self.widgets[app_name][0].info_label.setText(self.tr("Game running"))
|
||||
self.widgets[app_name][1].launch_button.setDisabled(True)
|
||||
self.widgets[app_name][1].launch_button.setText(self.tr("Game running"))
|
||||
|
||||
self.signals.set_discord_rpc.emit(app_name)
|
||||
|
||||
def search(self, text: str):
|
||||
for t in self.widgets.values():
|
||||
for w in t:
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
from PyQt5.QtCore import Qt
|
||||
from PyQt5.QtGui import QKeyEvent
|
||||
from legendary.models.game import Game
|
||||
|
||||
import rare.shared as shared
|
||||
from legendary.models.game import Game
|
||||
from rare.utils.extra_widgets import SideTabWidget
|
||||
from .game_dlc import GameDlc
|
||||
from .game_info import GameInfo
|
||||
|
@ -15,7 +15,7 @@ class GameInfoTabs(SideTabWidget):
|
|||
self.core = shared.legendary_core
|
||||
self.signals = shared.signals
|
||||
|
||||
self.info = GameInfo(self.core, self.signals, self)
|
||||
self.info = GameInfo(self)
|
||||
self.addTab(self.info, self.tr("Information"))
|
||||
|
||||
self.settings = GameSettings(self.core, self)
|
||||
|
|
|
@ -75,8 +75,7 @@ class GameDlc(QWidget, Ui_GameDlc):
|
|||
self.game.app_title))
|
||||
return
|
||||
|
||||
self.signals.dl_tab.emit(
|
||||
(self.signals.actions.install_game, (InstallOptionsModel(app_name=app_name, update=True))))
|
||||
self.signals.install_game.emit(InstallOptionsModel(app_name=app_name, update=True))
|
||||
|
||||
|
||||
class GameDlcWidget(QFrame, Ui_GameDlcWidget):
|
||||
|
|
|
@ -1,13 +1,14 @@
|
|||
import os
|
||||
import platform
|
||||
|
||||
from PyQt5.QtCore import pyqtSignal
|
||||
from PyQt5.QtWidgets import QWidget, QMessageBox
|
||||
|
||||
from legendary.core import LegendaryCore
|
||||
from legendary.models.game import Game, InstalledGame
|
||||
from rare import shared
|
||||
from rare.ui.components.tabs.games.game_info.game_info import Ui_GameInfo
|
||||
from rare.utils.legendary_utils import VerifyThread
|
||||
from rare.utils.models import Signals, InstallOptionsModel
|
||||
from rare.utils.models import InstallOptionsModel
|
||||
from rare.utils.steam_grades import SteamWorker
|
||||
from rare.utils.utils import get_size, get_pixmap
|
||||
|
||||
|
@ -16,12 +17,13 @@ class GameInfo(QWidget, Ui_GameInfo):
|
|||
igame: InstalledGame
|
||||
game: Game = None
|
||||
verify_threads = dict()
|
||||
verification_finished = pyqtSignal(InstalledGame)
|
||||
|
||||
def __init__(self, core: LegendaryCore, signals: Signals, parent):
|
||||
def __init__(self, parent):
|
||||
super(GameInfo, self).__init__(parent=parent)
|
||||
self.setupUi(self)
|
||||
self.core = core
|
||||
self.signals = signals
|
||||
self.core = shared.legendary_core
|
||||
self.signals = shared.signals
|
||||
|
||||
if platform.system() == "Windows":
|
||||
self.lbl_grade.setVisible(False)
|
||||
|
@ -34,26 +36,18 @@ class GameInfo(QWidget, Ui_GameInfo):
|
|||
self.install_button.setText(self.tr("Link to Origin/Launch"))
|
||||
self.game_actions_stack.resize(self.game_actions_stack.minimumSize())
|
||||
|
||||
self.uninstall_button.clicked.connect(self.uninstall)
|
||||
self.uninstall_button.clicked.connect(lambda: self.signals.uninstall_game.emit(self.game))
|
||||
self.verify_button.clicked.connect(self.verify)
|
||||
self.repair_button.clicked.connect(self.repair)
|
||||
|
||||
def uninstall(self):
|
||||
# uninstall game
|
||||
self.signals.games_tab.emit((self.signals.actions.uninstall, self.game))
|
||||
|
||||
# remove from update or dl_queue
|
||||
self.signals.dl_tab.emit((self.signals.actions.uninstall, self.game))
|
||||
|
||||
def repair(self):
|
||||
repair_file = os.path.join(self.core.lgd.get_tmp_path(), f'{self.game.app_name}.repair')
|
||||
if not os.path.exists(repair_file):
|
||||
QMessageBox.warning(self, "Warning", self.tr(
|
||||
"Repair file does not exist or game does not need a repair. Please verify game first"))
|
||||
return
|
||||
self.signals.dl_tab.emit(
|
||||
(self.signals.actions.install_game, InstallOptionsModel(app_name=self.game.app_name, repair=True,
|
||||
base_path=self.igame.install_path)))
|
||||
self.signals.install_game.emit(InstallOptionsModel(app_name=self.game.app_name, repair=True,
|
||||
update=True))
|
||||
|
||||
def verify(self):
|
||||
self.verify_widget.setCurrentIndex(1)
|
||||
|
@ -70,22 +64,22 @@ class GameInfo(QWidget, Ui_GameInfo):
|
|||
if progress[2] == self.game.app_name:
|
||||
self.verify_progress.setValue(progress[0] * 100 / progress[1])
|
||||
|
||||
def finish_verify(self, failed):
|
||||
failed, missing, app_name = failed
|
||||
if failed == 0 and missing == 0:
|
||||
def finish_verify(self, failed, missing, app_name):
|
||||
if failed == missing == 0:
|
||||
QMessageBox.information(self, "Summary",
|
||||
"Game was verified successfully. No missing or corrupt files found")
|
||||
self.igame.needs_verification = False
|
||||
self.core.lgd.set_installed_game(self.igame.app_name, self.igame)
|
||||
self.signals.games_tab.emit((self.signals.actions.verification_finished, self.igame))
|
||||
igame = self.core.get_installed_game(app_name)
|
||||
if igame.needs_verification:
|
||||
igame.needs_verification = False
|
||||
self.core.lgd.set_installed_game(self.igame.app_name, igame)
|
||||
self.verification_finished.emit(igame)
|
||||
else:
|
||||
ans = QMessageBox.question(self, "Summary", self.tr(
|
||||
'Verification failed, {} file(s) corrupted, {} file(s) are missing. Do you want to repair them?').format(
|
||||
failed, missing), QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes)
|
||||
if ans == QMessageBox.Yes:
|
||||
self.signals.dl_tab.emit(
|
||||
(self.signals.actions.install_game, InstallOptionsModel(app_name=self.game.app_name, repair=True,
|
||||
base_path=self.igame.install_path)))
|
||||
self.signals.install_game.emit(InstallOptionsModel(app_name=self.game.app_name, repair=True,
|
||||
update=True))
|
||||
self.verify_widget.setCurrentIndex(0)
|
||||
self.verify_threads.pop(app_name)
|
||||
|
||||
|
@ -102,6 +96,7 @@ class GameInfo(QWidget, Ui_GameInfo):
|
|||
self.app_name.setText(self.game.app_name)
|
||||
self.version.setText(self.game.app_version)
|
||||
self.dev.setText(self.game.metadata["developer"])
|
||||
|
||||
if self.igame:
|
||||
self.install_size.setText(get_size(self.igame.install_size))
|
||||
self.install_path.setText(self.igame.install_path)
|
||||
|
|
|
@ -3,9 +3,9 @@ import platform
|
|||
from PyQt5.QtCore import Qt
|
||||
from PyQt5.QtGui import QKeyEvent
|
||||
from PyQt5.QtWidgets import QWidget, QTreeView
|
||||
from legendary.models.game import Game
|
||||
|
||||
import rare.shared as shared
|
||||
from legendary.models.game import Game
|
||||
from rare.ui.components.tabs.games.game_info.game_info import Ui_GameInfo
|
||||
from rare.utils.extra_widgets import SideTabWidget
|
||||
from rare.utils.json_formatter import QJsonModel
|
||||
|
@ -75,7 +75,7 @@ class UninstalledInfo(QWidget, Ui_GameInfo):
|
|||
self.game_actions_stack.resize(self.game_actions_stack.minimumSize())
|
||||
|
||||
def install_game(self):
|
||||
self.signals.dl_tab.emit((self.signals.actions.install_game, InstallOptionsModel(app_name=self.game.app_name)))
|
||||
self.signals.install_game.emit(InstallOptionsModel(app_name=self.game.app_name))
|
||||
|
||||
def update_game(self, game: Game):
|
||||
self.game = game
|
||||
|
|
|
@ -32,6 +32,11 @@ class GameWidget(QWidget):
|
|||
mini_layout = QHBoxLayout()
|
||||
self.layout.addLayout(mini_layout)
|
||||
|
||||
if not json_info:
|
||||
self.layout.addWidget(QLabel("An error occurred"))
|
||||
self.setLayout(self.layout)
|
||||
return
|
||||
|
||||
self.title_label = QLabel(json_info.get("title"))
|
||||
self.title_label.setWordWrap(True)
|
||||
mini_layout.addWidget(self.title_label)
|
||||
|
|
|
@ -26,7 +26,7 @@ class TabWidget(QTabWidget):
|
|||
# Generate Tabs
|
||||
self.games_tab = GamesTab()
|
||||
self.addTab(self.games_tab, self.tr("Games"))
|
||||
self.signals.tab_widget.connect(lambda x: self.handle_signal(*x))
|
||||
|
||||
if not shared.args.offline:
|
||||
# updates = self.games_tab.default_widget.game_list.updates
|
||||
self.downloadTab = DownloadTab(self.games_tab.updates)
|
||||
|
@ -61,8 +61,13 @@ class TabWidget(QTabWidget):
|
|||
"(!)" if self.settings.about.update_available else "")
|
||||
|
||||
# Signals
|
||||
# set current index
|
||||
self.signals.set_main_tab_index.connect(self.setCurrentIndex)
|
||||
|
||||
# update dl tab text
|
||||
self.signals.update_download_tab_text.connect(self.update_dl_tab_text)
|
||||
# imported
|
||||
self.games_tab.import_widget.update_list.connect(self.game_imported)
|
||||
# self.games_tab.import_widget.update_list.connect(self.game_imported)
|
||||
|
||||
if not shared.args.offline:
|
||||
# install dlc
|
||||
|
@ -74,7 +79,6 @@ class TabWidget(QTabWidget):
|
|||
# Finished sync
|
||||
self.cloud_saves.finished.connect(self.finished_sync)
|
||||
# Game finished
|
||||
self.games_tab.game_exited.connect(self.game_finished)
|
||||
|
||||
# Open game list on click on Games tab button
|
||||
self.tabBarClicked.connect(self.mouse_clicked)
|
||||
|
@ -86,11 +90,14 @@ class TabWidget(QTabWidget):
|
|||
QShortcut("Alt+3", self).activated.connect(lambda: self.setCurrentIndex(2))
|
||||
QShortcut("Alt+4", self).activated.connect(lambda: self.setCurrentIndex(5))
|
||||
|
||||
def handle_signal(self, action, data):
|
||||
if action == self.signals.actions.set_index:
|
||||
self.setCurrentIndex(data)
|
||||
if action == self.signals.actions.set_dl_tab_text:
|
||||
self.setTabText(1, "Downloads" + ((" (" + str(data) + ")") if data != 0 else ""))
|
||||
def update_dl_tab_text(self):
|
||||
num_downloads = len(set([i.options.app_name for i in self.downloadTab.dl_queue] + [i for i in
|
||||
self.downloadTab.update_widgets.keys()]))
|
||||
|
||||
if num_downloads != 0:
|
||||
self.setTabText(1, f"Downloads ({num_downloads})")
|
||||
else:
|
||||
self.setTabText(1, "Downloads")
|
||||
|
||||
def mouse_clicked(self, tab_num):
|
||||
if tab_num == 0:
|
||||
|
@ -108,13 +115,6 @@ class TabWidget(QTabWidget):
|
|||
self.games_tab.update_list(app_name)
|
||||
self.games_tab.setCurrentIndex(0)
|
||||
|
||||
# Sync game and delete dc rpc
|
||||
def game_finished(self, app_name):
|
||||
self.delete_presence.emit()
|
||||
game = self.core.get_game(app_name)
|
||||
if game and game.supports_cloud_saves:
|
||||
self.cloud_saves.sync_game(app_name, True)
|
||||
|
||||
def resizeEvent(self, event):
|
||||
self.tabBar().setMinimumWidth(self.width())
|
||||
super(TabWidget, self).resizeEvent(event)
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
from argparse import Namespace
|
||||
|
||||
from legendary.core import LegendaryCore
|
||||
from rare.utils.models import Signals, ApiResults
|
||||
from rare.utils.models import ApiResults, Signals
|
||||
|
||||
legendary_core: LegendaryCore = None
|
||||
signals: Signals = None
|
||||
|
|
|
@ -2,7 +2,6 @@ import os
|
|||
import platform
|
||||
import shutil
|
||||
from logging import getLogger
|
||||
from sys import stdout
|
||||
|
||||
from PyQt5.QtCore import QProcess, QProcessEnvironment, QThread, pyqtSignal
|
||||
from PyQt5.QtWidgets import QMessageBox
|
||||
|
@ -106,7 +105,7 @@ def uninstall(app_name: str, core: LegendaryCore, options=None):
|
|||
|
||||
class VerifyThread(QThread):
|
||||
status = pyqtSignal(tuple)
|
||||
summary = pyqtSignal(tuple)
|
||||
summary = pyqtSignal(int, int, str)
|
||||
|
||||
def __init__(self, core, app_name):
|
||||
super(VerifyThread, self).__init__()
|
||||
|
@ -159,8 +158,6 @@ class VerifyThread(QThread):
|
|||
QMessageBox.warning(None, "Error", self.tr("No files to validate"))
|
||||
logger.error(str(e))
|
||||
|
||||
stdout.write(f'Verification progress: {self.num}/{self.total} ({self.num * 100 / self.total:.01f}%)\t\n')
|
||||
|
||||
# always write repair file, even if all match
|
||||
if repair_file:
|
||||
repair_filename = os.path.join(self.core.lgd.get_tmp_path(), f'{self.app_name}.repair')
|
||||
|
@ -174,7 +171,7 @@ class VerifyThread(QThread):
|
|||
|
||||
else:
|
||||
logger.error(f'Verification finished, {len(failed)} file(s) corrupted, {len(missing)} file(s) are missing.')
|
||||
self.summary.emit((len(failed), len(missing), self.app_name))
|
||||
self.summary.emit(len(failed), len(missing), self.app_name)
|
||||
|
||||
|
||||
def import_game(core: LegendaryCore, app_name: str, path: str):
|
||||
|
|
|
@ -44,29 +44,6 @@ class InstallQueueItemModel:
|
|||
return (self.status_q is not None) and (self.download is not None) and (self.options is not None)
|
||||
|
||||
|
||||
class SignalActions:
|
||||
quit_app = "quit_app"
|
||||
dl_status = "dl_status"
|
||||
install_game = "install_game"
|
||||
start_installation = "start_installation"
|
||||
installation_finished = "installation_finished"
|
||||
uninstall = "uninstall"
|
||||
set_index = "set_index"
|
||||
set_dl_tab_text = "set_dl_tab_text"
|
||||
verification_finished = "verification_finished"
|
||||
|
||||
|
||||
class Signals(QObject):
|
||||
actions = SignalActions()
|
||||
|
||||
tab_widget = pyqtSignal(tuple)
|
||||
games_tab = pyqtSignal(tuple)
|
||||
cloud_saves = pyqtSignal(tuple)
|
||||
dl_tab = pyqtSignal(tuple)
|
||||
main_window = pyqtSignal(tuple)
|
||||
app = pyqtSignal(tuple)
|
||||
|
||||
|
||||
@dataclass
|
||||
class ApiResults:
|
||||
game_list: list = None
|
||||
|
@ -83,3 +60,23 @@ class ApiResults:
|
|||
and self.mac_games is not None \
|
||||
and self.assets is not None \
|
||||
and self.no_asset_games is not None
|
||||
|
||||
|
||||
class Signals(QObject):
|
||||
exit_app = pyqtSignal(int)
|
||||
send_notification = pyqtSignal(str)
|
||||
|
||||
set_main_tab_index = pyqtSignal(int)
|
||||
update_download_tab_text = pyqtSignal()
|
||||
|
||||
dl_progress = pyqtSignal(int)
|
||||
# set visibility of installing widget in games tab
|
||||
installation_started = pyqtSignal(Game)
|
||||
|
||||
install_game = pyqtSignal(InstallOptionsModel)
|
||||
installation_finished = pyqtSignal(bool, str)
|
||||
|
||||
update_gamelist = pyqtSignal(str)
|
||||
uninstall_game = pyqtSignal(Game)
|
||||
|
||||
set_discord_rpc = pyqtSignal(str)
|
||||
|
|
|
@ -6,23 +6,30 @@ import pypresence.exceptions
|
|||
from PyQt5.QtCore import QObject, QSettings
|
||||
from pypresence import Presence
|
||||
|
||||
from legendary.core import LegendaryCore
|
||||
from rare import shared
|
||||
|
||||
client_id = "830732538225360908"
|
||||
logger = getLogger("RPC")
|
||||
|
||||
|
||||
class DiscordRPC(QObject):
|
||||
def __init__(self, core: LegendaryCore):
|
||||
def __init__(self):
|
||||
super(DiscordRPC, self).__init__()
|
||||
self.RPC = None
|
||||
self.state = 1 # 0: game, 1: always active, 2: off
|
||||
self.core = core
|
||||
self.core = shared.legendary_core
|
||||
self.signals = shared.signals
|
||||
|
||||
self.settings = QSettings()
|
||||
if self.settings.value("rpc_enable", 0, int) == 1: # show always
|
||||
self.state = 2
|
||||
self.set_discord_rpc()
|
||||
|
||||
self.signals.set_discord_rpc.connect(self.update_presence)
|
||||
|
||||
def update_presence(self, app_name):
|
||||
self.set_discord_rpc(app_name)
|
||||
|
||||
def changed_settings(self, game_running: list):
|
||||
value = self.settings.value("rpc_enable", 0, int)
|
||||
if value == 2:
|
||||
|
@ -54,7 +61,7 @@ class DiscordRPC(QObject):
|
|||
def set_discord_rpc(self, app_name=None):
|
||||
if not self.RPC:
|
||||
try:
|
||||
self.RPC = Presence("830732538225360908") # Rare app: https://discord.com/developers/applications
|
||||
self.RPC = Presence(client_id) # Rare app: https://discord.com/developers/applications
|
||||
self.RPC.connect()
|
||||
except ConnectionRefusedError as e:
|
||||
logger.warning("Discord is not active\n" + str(e))
|
||||
|
|
Loading…
Reference in a new issue