Delete unused classes GameUtils and CloudSaveUtils and move cloud save dialog to dialogs
Signed-off-by: loathingKernel <142770+loathingKernel@users.noreply.github.com>
This commit is contained in:
parent
4ec1f39109
commit
b4586c9272
7 changed files with 92 additions and 600 deletions
82
rare/components/dialogs/cloud_save_dialog.py
Normal file
82
rare/components/dialogs/cloud_save_dialog.py
Normal file
|
@ -0,0 +1,82 @@
|
||||||
|
import datetime
|
||||||
|
import sys
|
||||||
|
from logging import getLogger
|
||||||
|
|
||||||
|
from PyQt5.QtCore import Qt
|
||||||
|
from PyQt5.QtWidgets import QDialog, QSizePolicy, QLayout, QApplication, QWidget
|
||||||
|
from legendary.core import LegendaryCore
|
||||||
|
from legendary.models.game import InstalledGame
|
||||||
|
|
||||||
|
from rare.ui.components.dialogs.sync_save_dialog import Ui_SyncSaveDialog
|
||||||
|
from rare.ui.components.tabs.games.game_info.sync_widget import Ui_SyncWidget
|
||||||
|
from rare.utils.misc import icon
|
||||||
|
|
||||||
|
logger = getLogger("Cloud Saves")
|
||||||
|
|
||||||
|
|
||||||
|
class CloudSaveDialog(QDialog, Ui_SyncSaveDialog):
|
||||||
|
DOWNLOAD = 2
|
||||||
|
UPLOAD = 1
|
||||||
|
CANCEL = 0
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
igame: InstalledGame,
|
||||||
|
dt_local: datetime.datetime,
|
||||||
|
dt_remote: datetime.datetime,
|
||||||
|
newer: str,
|
||||||
|
):
|
||||||
|
super(CloudSaveDialog, self).__init__()
|
||||||
|
self.setupUi(self)
|
||||||
|
|
||||||
|
self.sync_widget = QWidget()
|
||||||
|
self.sync_ui = Ui_SyncWidget()
|
||||||
|
self.sync_ui.setupUi(self.sync_widget)
|
||||||
|
|
||||||
|
self.sync_widget_layout.addWidget(self.sync_widget)
|
||||||
|
|
||||||
|
self.setAttribute(Qt.WA_DeleteOnClose, True)
|
||||||
|
self.setWindowFlags(Qt.Dialog | Qt.CustomizeWindowHint | Qt.WindowTitleHint)
|
||||||
|
|
||||||
|
self.status = self.CANCEL
|
||||||
|
|
||||||
|
self.title_label.setText(self.title_label.text() + igame.title)
|
||||||
|
|
||||||
|
self.sync_ui.date_info_local.setText(dt_local.strftime("%A, %d. %B %Y %X"))
|
||||||
|
self.sync_ui.date_info_remote.setText(dt_remote.strftime("%A, %d. %B %Y %X"))
|
||||||
|
|
||||||
|
new_text = self.tr(" (newer)")
|
||||||
|
if newer == "remote":
|
||||||
|
self.sync_ui.cloud_gb.setTitle(self.sync_ui.cloud_gb.title() + new_text)
|
||||||
|
elif newer == "local":
|
||||||
|
self.sync_ui.local_gb.setTitle(self.sync_ui.local_gb.title() + new_text)
|
||||||
|
|
||||||
|
self.sync_ui.icon_local.setPixmap(icon("mdi.harddisk", "fa.desktop").pixmap(128, 128))
|
||||||
|
self.sync_ui.icon_remote.setPixmap(icon("mdi.cloud-outline", "ei.cloud").pixmap(128, 128))
|
||||||
|
|
||||||
|
self.sync_ui.upload_button.clicked.connect(lambda: self.btn_clicked(self.UPLOAD))
|
||||||
|
self.sync_ui.download_button.clicked.connect(lambda: self.btn_clicked(self.DOWNLOAD))
|
||||||
|
self.cancel_button.clicked.connect(self.close)
|
||||||
|
|
||||||
|
self.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum)
|
||||||
|
self.layout().setSizeConstraint(QLayout.SetFixedSize)
|
||||||
|
|
||||||
|
def get_action(self):
|
||||||
|
self.exec_()
|
||||||
|
return self.status
|
||||||
|
|
||||||
|
def btn_clicked(self, status):
|
||||||
|
self.status = status
|
||||||
|
self.close()
|
||||||
|
|
||||||
|
|
||||||
|
def test_dialog():
|
||||||
|
app = QApplication(sys.argv)
|
||||||
|
core = LegendaryCore()
|
||||||
|
dlg = CloudSaveDialog(core.get_installed_list()[0], datetime.datetime.now(),
|
||||||
|
datetime.datetime.strptime("2021,1", "%Y,%M"), "local")
|
||||||
|
print(dlg.get_action())
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
test_dialog()
|
|
@ -1,331 +0,0 @@
|
||||||
import datetime
|
|
||||||
import sys
|
|
||||||
from dataclasses import dataclass
|
|
||||||
from logging import getLogger
|
|
||||||
from typing import Union, List, Dict
|
|
||||||
|
|
||||||
from PyQt5.QtCore import QObject, pyqtSignal, QRunnable, QThreadPool, Qt, QSettings
|
|
||||||
from PyQt5.QtWidgets import QDialog, QMessageBox, QSizePolicy, QLayout, QApplication
|
|
||||||
from legendary.core import LegendaryCore
|
|
||||||
from legendary.models.game import SaveGameStatus, InstalledGame, SaveGameFile
|
|
||||||
|
|
||||||
from rare.models.game import RareGame
|
|
||||||
from rare.shared import LegendaryCoreSingleton, ArgumentsSingleton, ApiResultsSingleton
|
|
||||||
from rare.ui.components.dialogs.sync_save_dialog import Ui_SyncSaveDialog
|
|
||||||
from rare.utils.misc import icon
|
|
||||||
|
|
||||||
logger = getLogger("Cloud Saves")
|
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
|
||||||
class UploadModel:
|
|
||||||
rgame: RareGame
|
|
||||||
date_time: datetime.datetime
|
|
||||||
path: str
|
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
|
||||||
class DownloadModel:
|
|
||||||
rgame: RareGame
|
|
||||||
latest_save: SaveGameFile
|
|
||||||
path: str
|
|
||||||
|
|
||||||
|
|
||||||
class SaveWorker(QRunnable):
|
|
||||||
|
|
||||||
class Signals(QObject):
|
|
||||||
finished = pyqtSignal(RareGame, str)
|
|
||||||
|
|
||||||
def __init__(self, model: Union[UploadModel, DownloadModel]):
|
|
||||||
super(SaveWorker, self).__init__()
|
|
||||||
self.signals = SaveWorker.Signals()
|
|
||||||
self.setAutoDelete(True)
|
|
||||||
self.core = LegendaryCoreSingleton()
|
|
||||||
self.api_results = ApiResultsSingleton()
|
|
||||||
self.model = model
|
|
||||||
|
|
||||||
def run(self) -> None:
|
|
||||||
try:
|
|
||||||
if isinstance(self.model, DownloadModel):
|
|
||||||
self.core.download_saves(
|
|
||||||
self.model.rgame.app_name,
|
|
||||||
self.model.latest_save.manifest_name,
|
|
||||||
self.model.path,
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
self.core.upload_save(
|
|
||||||
self.model.rgame.app_name,
|
|
||||||
self.model.path,
|
|
||||||
self.model.date_time
|
|
||||||
)
|
|
||||||
except Exception as e:
|
|
||||||
self.signals.finished.emit(self.model.rgame, str(e))
|
|
||||||
logger.error(str(e))
|
|
||||||
return
|
|
||||||
try:
|
|
||||||
if isinstance(self.model, UploadModel):
|
|
||||||
logger.info("Updating cloud saves...")
|
|
||||||
result = self.core.get_save_games(self.model.rgame.app_name)
|
|
||||||
self.api_results.saves = result
|
|
||||||
except Exception as e:
|
|
||||||
self.signals.finished.emit(self.model.rgame, str(e))
|
|
||||||
logger.error(str(e))
|
|
||||||
return
|
|
||||||
|
|
||||||
self.signals.finished.emit(self.model.rgame, "")
|
|
||||||
|
|
||||||
|
|
||||||
class CloudSaveDialog(QDialog, Ui_SyncSaveDialog):
|
|
||||||
DOWNLOAD = 2
|
|
||||||
UPLOAD = 1
|
|
||||||
CANCEL = 0
|
|
||||||
|
|
||||||
def __init__(
|
|
||||||
self,
|
|
||||||
igame: InstalledGame,
|
|
||||||
dt_local: datetime.datetime,
|
|
||||||
dt_remote: datetime.datetime,
|
|
||||||
newer: str,
|
|
||||||
):
|
|
||||||
super(CloudSaveDialog, self).__init__()
|
|
||||||
self.setupUi(self)
|
|
||||||
|
|
||||||
self.setAttribute(Qt.WA_DeleteOnClose, True)
|
|
||||||
self.setWindowFlags(Qt.Dialog | Qt.CustomizeWindowHint | Qt.WindowTitleHint)
|
|
||||||
|
|
||||||
self.status = self.CANCEL
|
|
||||||
|
|
||||||
self.title_label.setText(self.title_label.text() + igame.title)
|
|
||||||
|
|
||||||
self.date_info_local.setText(dt_local.strftime("%A, %d. %B %Y %X"))
|
|
||||||
self.date_info_remote.setText(dt_remote.strftime("%A, %d. %B %Y %X"))
|
|
||||||
|
|
||||||
new_text = self.tr(" (newer)")
|
|
||||||
if newer == "remote":
|
|
||||||
self.cloud_gb.setTitle(self.cloud_gb.title() + new_text)
|
|
||||||
elif newer == "local":
|
|
||||||
self.local_gb.setTitle(self.local_gb.title() + new_text)
|
|
||||||
|
|
||||||
self.icon_local.setPixmap(icon("mdi.harddisk", "fa.desktop").pixmap(128, 128))
|
|
||||||
self.icon_remote.setPixmap(icon("mdi.cloud-outline", "ei.cloud").pixmap(128, 128))
|
|
||||||
|
|
||||||
self.upload_button.clicked.connect(lambda: self.btn_clicked(self.UPLOAD))
|
|
||||||
self.download_button.clicked.connect(lambda: self.btn_clicked(self.DOWNLOAD))
|
|
||||||
self.cancel_button.clicked.connect(self.close)
|
|
||||||
|
|
||||||
self.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum)
|
|
||||||
self.layout().setSizeConstraint(QLayout.SetFixedSize)
|
|
||||||
|
|
||||||
def get_action(self):
|
|
||||||
self.exec_()
|
|
||||||
return self.status
|
|
||||||
|
|
||||||
def btn_clicked(self, status):
|
|
||||||
self.status = status
|
|
||||||
self.close()
|
|
||||||
|
|
||||||
|
|
||||||
class CloudSaveUtils(QObject):
|
|
||||||
sync_finished = pyqtSignal(RareGame)
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
super(CloudSaveUtils, self).__init__()
|
|
||||||
self.core = LegendaryCoreSingleton()
|
|
||||||
self.args = ArgumentsSingleton()
|
|
||||||
self.api_results = ApiResultsSingleton()
|
|
||||||
saves = self.api_results.saves
|
|
||||||
if not self.args.offline:
|
|
||||||
self.latest_saves = self.get_latest_saves(saves)
|
|
||||||
else:
|
|
||||||
self.latest_saves = dict()
|
|
||||||
self.settings = QSettings()
|
|
||||||
|
|
||||||
self.thread_pool = QThreadPool.globalInstance()
|
|
||||||
|
|
||||||
def get_latest_saves(self, saves: List[SaveGameFile]) -> Dict[str, SaveGameFile]:
|
|
||||||
save_games = set()
|
|
||||||
for igame in self.core.get_installed_list():
|
|
||||||
game = self.core.get_game(igame.app_name)
|
|
||||||
if self.core.is_installed(igame.app_name) and game.supports_cloud_saves:
|
|
||||||
save_games.add(igame.app_name)
|
|
||||||
|
|
||||||
latest_saves = dict()
|
|
||||||
for s in sorted(saves, key=lambda a: a.datetime):
|
|
||||||
if s.app_name in save_games:
|
|
||||||
latest_saves[s.app_name] = s
|
|
||||||
return latest_saves
|
|
||||||
|
|
||||||
def sync_before_launch_game(self, rgame: RareGame, ignore_settings=False) -> int:
|
|
||||||
if not ignore_settings:
|
|
||||||
default = self.settings.value("auto_sync_cloud", True, bool)
|
|
||||||
if not self.settings.value(f"{rgame.app_name}/auto_sync_cloud", default, bool):
|
|
||||||
return False
|
|
||||||
|
|
||||||
if not rgame.igame.save_path:
|
|
||||||
try:
|
|
||||||
savepath = self.core.get_save_path(rgame.app_name)
|
|
||||||
except Exception as e:
|
|
||||||
logger.error(e)
|
|
||||||
savepath = ""
|
|
||||||
if savepath:
|
|
||||||
rgame.igame.save_path = savepath
|
|
||||||
self.core.lgd.set_installed_game(rgame.app_name, rgame.igame)
|
|
||||||
logger.info(f"Set save path of {rgame.title} to {savepath}")
|
|
||||||
elif not ignore_settings: # sync on startup
|
|
||||||
if (
|
|
||||||
QMessageBox.question(
|
|
||||||
None,
|
|
||||||
"Warning",
|
|
||||||
self.tr(
|
|
||||||
"Could not compute cloud save path. Please set it in Game settings manually. \nDo you want to launch {} anyway?"
|
|
||||||
).format(rgame.title),
|
|
||||||
QMessageBox.Yes | QMessageBox.No,
|
|
||||||
QMessageBox.No,
|
|
||||||
)
|
|
||||||
== QMessageBox.Yes
|
|
||||||
):
|
|
||||||
return False
|
|
||||||
else:
|
|
||||||
raise ValueError("No savepath detected")
|
|
||||||
else:
|
|
||||||
QMessageBox.warning(
|
|
||||||
None,
|
|
||||||
"Warning",
|
|
||||||
self.tr(
|
|
||||||
"No savepath found. Please set it in Game Settings manually"
|
|
||||||
),
|
|
||||||
)
|
|
||||||
return False
|
|
||||||
|
|
||||||
res, (dt_local, dt_remote) = self.core.check_savegame_state(
|
|
||||||
rgame.igame.save_path, self.latest_saves.get(rgame.app_name)
|
|
||||||
)
|
|
||||||
|
|
||||||
if res == SaveGameStatus.NO_SAVE:
|
|
||||||
return False
|
|
||||||
|
|
||||||
if res != SaveGameStatus.SAME_AGE:
|
|
||||||
newer = ""
|
|
||||||
if res == SaveGameStatus.REMOTE_NEWER:
|
|
||||||
newer = "remote"
|
|
||||||
elif res == SaveGameStatus.LOCAL_NEWER:
|
|
||||||
newer = "local"
|
|
||||||
|
|
||||||
if res == SaveGameStatus.REMOTE_NEWER and not dt_local:
|
|
||||||
self.download_saves(rgame)
|
|
||||||
return True
|
|
||||||
|
|
||||||
elif res == SaveGameStatus.LOCAL_NEWER and not dt_remote:
|
|
||||||
self.upload_saves(rgame, dt_local)
|
|
||||||
return True
|
|
||||||
|
|
||||||
result = CloudSaveDialog(rgame.igame, dt_local, dt_remote, newer).get_action()
|
|
||||||
if result == CloudSaveDialog.UPLOAD:
|
|
||||||
self.upload_saves(rgame, dt_local)
|
|
||||||
elif result == CloudSaveDialog.DOWNLOAD:
|
|
||||||
self.download_saves(rgame)
|
|
||||||
elif result == CloudSaveDialog.CANCEL:
|
|
||||||
raise AssertionError()
|
|
||||||
return True
|
|
||||||
|
|
||||||
return False
|
|
||||||
|
|
||||||
def game_finished(self, rgame: RareGame, ignore_settings=False, always_ask: bool = False):
|
|
||||||
if not ignore_settings:
|
|
||||||
default = self.settings.value("auto_sync_cloud", True, bool)
|
|
||||||
if not self.settings.value(f"{rgame.app_name}/auto_sync_cloud", default, bool):
|
|
||||||
self.sync_finished.emit(rgame)
|
|
||||||
return
|
|
||||||
|
|
||||||
if not rgame.igame.save_path:
|
|
||||||
try:
|
|
||||||
savepath = self.core.get_save_path(rgame.app_name)
|
|
||||||
except Exception as e:
|
|
||||||
logger.error(e)
|
|
||||||
savepath = ""
|
|
||||||
if savepath:
|
|
||||||
rgame.igame.save_path = savepath
|
|
||||||
self.core.lgd.set_installed_game(rgame.app_name, rgame.igame)
|
|
||||||
logger.info(f"Set save path of {rgame.title} to {savepath}")
|
|
||||||
else:
|
|
||||||
QMessageBox.warning(
|
|
||||||
None, "Warning", self.tr("No savepath set. Skip syncing with cloud")
|
|
||||||
)
|
|
||||||
return False
|
|
||||||
|
|
||||||
res, (dt_local, dt_remote) = self.core.check_savegame_state(
|
|
||||||
rgame.igame.save_path, self.latest_saves.get(rgame.app_name)
|
|
||||||
)
|
|
||||||
|
|
||||||
if res == SaveGameStatus.LOCAL_NEWER and not always_ask:
|
|
||||||
self.upload_saves(rgame, dt_local)
|
|
||||||
return
|
|
||||||
|
|
||||||
elif res == SaveGameStatus.NO_SAVE and not always_ask:
|
|
||||||
QMessageBox.warning(
|
|
||||||
None,
|
|
||||||
"No saves",
|
|
||||||
self.tr(
|
|
||||||
"There are no saves local and online. Maybe you have to change save path of {}"
|
|
||||||
).format(rgame.title),
|
|
||||||
)
|
|
||||||
self.sync_finished.emit(rgame)
|
|
||||||
return
|
|
||||||
|
|
||||||
elif res == SaveGameStatus.SAME_AGE and not always_ask:
|
|
||||||
self.sync_finished.emit(rgame)
|
|
||||||
return
|
|
||||||
|
|
||||||
# Remote newer
|
|
||||||
newer = ""
|
|
||||||
if res == SaveGameStatus.REMOTE_NEWER:
|
|
||||||
newer = "remote"
|
|
||||||
elif res == SaveGameStatus.LOCAL_NEWER:
|
|
||||||
newer = "local"
|
|
||||||
result = CloudSaveDialog(rgame.igame, dt_local, dt_remote, newer).get_action()
|
|
||||||
if result == CloudSaveDialog.UPLOAD:
|
|
||||||
self.upload_saves(rgame, dt_local)
|
|
||||||
elif result == CloudSaveDialog.DOWNLOAD:
|
|
||||||
self.download_saves(rgame)
|
|
||||||
|
|
||||||
def upload_saves(self, rgame: RareGame, dt_local):
|
|
||||||
logger.info(f"Uploading saves for {rgame.title}")
|
|
||||||
w = SaveWorker(UploadModel(rgame, dt_local, rgame.igame.save_path))
|
|
||||||
w.signals.finished.connect(self.worker_finished)
|
|
||||||
self.thread_pool.start(w)
|
|
||||||
|
|
||||||
def download_saves(self, rgame: RareGame):
|
|
||||||
logger.info(f"Downloading saves for {rgame.title}")
|
|
||||||
w = SaveWorker(
|
|
||||||
DownloadModel(
|
|
||||||
rgame, self.latest_saves.get(rgame.app_name), rgame.igame.save_path
|
|
||||||
)
|
|
||||||
)
|
|
||||||
w.signals.finished.connect(self.worker_finished)
|
|
||||||
self.thread_pool.start(w)
|
|
||||||
|
|
||||||
def worker_finished(self, rgame: RareGame, error_message: str,):
|
|
||||||
if not error_message:
|
|
||||||
|
|
||||||
self.sync_finished.emit(rgame)
|
|
||||||
self.latest_saves = self.get_latest_saves(self.api_results.saves)
|
|
||||||
else:
|
|
||||||
QMessageBox.warning(
|
|
||||||
None,
|
|
||||||
"Warning",
|
|
||||||
self.tr("Syncing with cloud failed: \n {}").format(error_message)
|
|
||||||
)
|
|
||||||
self.sync_finished.emit(rgame)
|
|
||||||
|
|
||||||
|
|
||||||
def test_dialog():
|
|
||||||
app = QApplication(sys.argv)
|
|
||||||
core = LegendaryCore()
|
|
||||||
dlg = CloudSaveDialog(core.get_installed_list()[0], datetime.datetime.now(),
|
|
||||||
datetime.datetime.strptime("2021,1", "%Y,%M"), "local")
|
|
||||||
dlg.show()
|
|
||||||
app.exec_()
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
test_dialog()
|
|
|
@ -1,124 +0,0 @@
|
||||||
from logging import getLogger
|
|
||||||
|
|
||||||
from PyQt5.QtCore import QObject, pyqtSignal, QUrl, pyqtSlot
|
|
||||||
from PyQt5.QtGui import QDesktopServices
|
|
||||||
from PyQt5.QtWidgets import QMessageBox, QPushButton
|
|
||||||
|
|
||||||
from rare.models.game import RareGame
|
|
||||||
from rare.shared import LegendaryCoreSingleton, GlobalSignalsSingleton, ArgumentsSingleton
|
|
||||||
from .cloud_save_utils import CloudSaveUtils
|
|
||||||
|
|
||||||
logger = getLogger("GameUtils")
|
|
||||||
|
|
||||||
|
|
||||||
class GameUtils(QObject):
|
|
||||||
finished = pyqtSignal(str, str) # app_name, error
|
|
||||||
cloud_save_finished = pyqtSignal(str)
|
|
||||||
update_list = pyqtSignal(str)
|
|
||||||
|
|
||||||
def __init__(self, parent=None):
|
|
||||||
super(GameUtils, self).__init__(parent=parent)
|
|
||||||
self.core = LegendaryCoreSingleton()
|
|
||||||
self.signals = GlobalSignalsSingleton()
|
|
||||||
self.args = ArgumentsSingleton()
|
|
||||||
|
|
||||||
self.running_games = {}
|
|
||||||
self.launch_queue = {}
|
|
||||||
|
|
||||||
self.cloud_save_utils = CloudSaveUtils()
|
|
||||||
self.cloud_save_utils.sync_finished.connect(self.sync_finished)
|
|
||||||
|
|
||||||
def prepare_launch(
|
|
||||||
self, rgame: RareGame, offline: bool = False, skip_update_check: bool = False
|
|
||||||
):
|
|
||||||
dont_sync_after_finish = False
|
|
||||||
|
|
||||||
# TODO move this to helper
|
|
||||||
if rgame.game.supports_cloud_saves and not offline:
|
|
||||||
try:
|
|
||||||
sync = self.cloud_save_utils.sync_before_launch_game(rgame)
|
|
||||||
except ValueError:
|
|
||||||
logger.info("Cancel startup")
|
|
||||||
self.sync_finished(rgame)
|
|
||||||
return
|
|
||||||
except AssertionError:
|
|
||||||
dont_sync_after_finish = True
|
|
||||||
else:
|
|
||||||
if sync:
|
|
||||||
self.launch_queue[rgame.app_name] = (rgame, skip_update_check, offline)
|
|
||||||
return
|
|
||||||
self.sync_finished(rgame)
|
|
||||||
|
|
||||||
self.launch_game(
|
|
||||||
rgame, offline, skip_update_check, ask_sync_saves=dont_sync_after_finish
|
|
||||||
)
|
|
||||||
|
|
||||||
@pyqtSlot(RareGame, int)
|
|
||||||
def game_finished(self, rgame: RareGame, exit_code):
|
|
||||||
if self.running_games.get(rgame.app_name):
|
|
||||||
self.running_games.pop(rgame.app_name)
|
|
||||||
if exit_code == -1234:
|
|
||||||
return
|
|
||||||
|
|
||||||
self.finished.emit(rgame.app_name, "")
|
|
||||||
rgame.signals.game.finished.emit()
|
|
||||||
|
|
||||||
logger.info(f"Game exited with exit code: {exit_code}")
|
|
||||||
self.signals.discord_rpc.set_title.emit("")
|
|
||||||
if exit_code == 1 and rgame.is_origin:
|
|
||||||
msg_box = QMessageBox()
|
|
||||||
msg_box.setText(
|
|
||||||
self.tr(
|
|
||||||
"Origin is not installed. Do you want to download installer file? "
|
|
||||||
)
|
|
||||||
)
|
|
||||||
msg_box.addButton(QPushButton("Download"), QMessageBox.YesRole)
|
|
||||||
msg_box.addButton(QPushButton("Cancel"), QMessageBox.RejectRole)
|
|
||||||
resp = msg_box.exec()
|
|
||||||
# click install button
|
|
||||||
if resp == 0:
|
|
||||||
QDesktopServices.openUrl(QUrl("https://www.dm.origin.com/download"))
|
|
||||||
return
|
|
||||||
|
|
||||||
if exit_code != 0:
|
|
||||||
pass
|
|
||||||
"""
|
|
||||||
QMessageBox.warning(
|
|
||||||
None,
|
|
||||||
"Warning",
|
|
||||||
self.tr("Failed to launch {}. Check logs to find error").format(
|
|
||||||
self.core.get_game(app_name).app_title
|
|
||||||
),
|
|
||||||
)
|
|
||||||
"""
|
|
||||||
|
|
||||||
if rgame.app_name in self.running_games.keys():
|
|
||||||
self.running_games.pop(rgame.app_name)
|
|
||||||
|
|
||||||
if rgame.game.supports_cloud_saves:
|
|
||||||
if exit_code != 0:
|
|
||||||
r = QMessageBox.question(
|
|
||||||
None,
|
|
||||||
"Question",
|
|
||||||
self.tr(
|
|
||||||
"Game exited with code {}, which is not a normal code. "
|
|
||||||
"It could be caused by a crash. Do you want to sync cloud saves"
|
|
||||||
).format(exit_code),
|
|
||||||
buttons=QMessageBox.Yes | QMessageBox.No,
|
|
||||||
defaultButton=QMessageBox.Yes,
|
|
||||||
)
|
|
||||||
if r != QMessageBox.Yes:
|
|
||||||
return
|
|
||||||
|
|
||||||
# TODO move this to helper
|
|
||||||
self.cloud_save_utils.game_finished(rgame, always_ask=False)
|
|
||||||
|
|
||||||
@pyqtSlot(RareGame)
|
|
||||||
def sync_finished(self, rgame: RareGame):
|
|
||||||
if rgame.app_name in self.launch_queue.keys():
|
|
||||||
self.cloud_save_finished.emit(rgame.app_name)
|
|
||||||
params = self.launch_queue[rgame.app_name]
|
|
||||||
self.launch_queue.pop(rgame.app_name)
|
|
||||||
self.launch_game(*params)
|
|
||||||
else:
|
|
||||||
self.cloud_save_finished.emit(rgame.app_name)
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
# Form implementation generated from reading ui file 'rare/ui/components/dialogs/sync_save_dialog.ui'
|
# Form implementation generated from reading ui file 'rare/ui/components/dialogs/sync_save_dialog.ui'
|
||||||
#
|
#
|
||||||
# Created by: PyQt5 UI code generator 5.15.5
|
# Created by: PyQt5 UI code generator 5.15.7
|
||||||
#
|
#
|
||||||
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
|
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
|
||||||
# run again. Do not edit this file unless you know what you are doing.
|
# run again. Do not edit this file unless you know what you are doing.
|
||||||
|
@ -25,55 +25,9 @@ class Ui_SyncSaveDialog(object):
|
||||||
self.title_label.setSizePolicy(sizePolicy)
|
self.title_label.setSizePolicy(sizePolicy)
|
||||||
self.title_label.setObjectName("title_label")
|
self.title_label.setObjectName("title_label")
|
||||||
self.verticalLayout.addWidget(self.title_label)
|
self.verticalLayout.addWidget(self.title_label)
|
||||||
self.horizontalLayout = QtWidgets.QHBoxLayout()
|
self.sync_widget_layout = QtWidgets.QHBoxLayout()
|
||||||
self.horizontalLayout.setObjectName("horizontalLayout")
|
self.sync_widget_layout.setObjectName("sync_widget_layout")
|
||||||
self.local_gb = QtWidgets.QGroupBox(SyncSaveDialog)
|
self.verticalLayout.addLayout(self.sync_widget_layout)
|
||||||
self.local_gb.setObjectName("local_gb")
|
|
||||||
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.local_gb)
|
|
||||||
self.verticalLayout_2.setObjectName("verticalLayout_2")
|
|
||||||
self.date_info_local = QtWidgets.QLabel(self.local_gb)
|
|
||||||
self.date_info_local.setText("TextLabel")
|
|
||||||
self.date_info_local.setAlignment(QtCore.Qt.AlignCenter)
|
|
||||||
self.date_info_local.setObjectName("date_info_local")
|
|
||||||
self.verticalLayout_2.addWidget(self.date_info_local)
|
|
||||||
self.icon_local = QtWidgets.QLabel(self.local_gb)
|
|
||||||
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred)
|
|
||||||
sizePolicy.setHorizontalStretch(0)
|
|
||||||
sizePolicy.setVerticalStretch(0)
|
|
||||||
sizePolicy.setHeightForWidth(self.icon_local.sizePolicy().hasHeightForWidth())
|
|
||||||
self.icon_local.setSizePolicy(sizePolicy)
|
|
||||||
self.icon_local.setText("")
|
|
||||||
self.icon_local.setAlignment(QtCore.Qt.AlignCenter)
|
|
||||||
self.icon_local.setObjectName("icon_local")
|
|
||||||
self.verticalLayout_2.addWidget(self.icon_local)
|
|
||||||
self.upload_button = QtWidgets.QPushButton(self.local_gb)
|
|
||||||
self.upload_button.setObjectName("upload_button")
|
|
||||||
self.verticalLayout_2.addWidget(self.upload_button)
|
|
||||||
self.horizontalLayout.addWidget(self.local_gb)
|
|
||||||
self.cloud_gb = QtWidgets.QGroupBox(SyncSaveDialog)
|
|
||||||
self.cloud_gb.setObjectName("cloud_gb")
|
|
||||||
self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.cloud_gb)
|
|
||||||
self.verticalLayout_3.setObjectName("verticalLayout_3")
|
|
||||||
self.date_info_remote = QtWidgets.QLabel(self.cloud_gb)
|
|
||||||
self.date_info_remote.setText("TextLabel")
|
|
||||||
self.date_info_remote.setAlignment(QtCore.Qt.AlignCenter)
|
|
||||||
self.date_info_remote.setObjectName("date_info_remote")
|
|
||||||
self.verticalLayout_3.addWidget(self.date_info_remote)
|
|
||||||
self.icon_remote = QtWidgets.QLabel(self.cloud_gb)
|
|
||||||
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred)
|
|
||||||
sizePolicy.setHorizontalStretch(0)
|
|
||||||
sizePolicy.setVerticalStretch(0)
|
|
||||||
sizePolicy.setHeightForWidth(self.icon_remote.sizePolicy().hasHeightForWidth())
|
|
||||||
self.icon_remote.setSizePolicy(sizePolicy)
|
|
||||||
self.icon_remote.setText("")
|
|
||||||
self.icon_remote.setAlignment(QtCore.Qt.AlignCenter)
|
|
||||||
self.icon_remote.setObjectName("icon_remote")
|
|
||||||
self.verticalLayout_3.addWidget(self.icon_remote)
|
|
||||||
self.download_button = QtWidgets.QPushButton(self.cloud_gb)
|
|
||||||
self.download_button.setObjectName("download_button")
|
|
||||||
self.verticalLayout_3.addWidget(self.download_button)
|
|
||||||
self.horizontalLayout.addWidget(self.cloud_gb)
|
|
||||||
self.verticalLayout.addLayout(self.horizontalLayout)
|
|
||||||
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
|
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
|
||||||
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
|
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
|
||||||
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
|
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
|
||||||
|
@ -89,10 +43,6 @@ class Ui_SyncSaveDialog(object):
|
||||||
_translate = QtCore.QCoreApplication.translate
|
_translate = QtCore.QCoreApplication.translate
|
||||||
SyncSaveDialog.setWindowTitle(_translate("SyncSaveDialog", "Sync saves with cloud"))
|
SyncSaveDialog.setWindowTitle(_translate("SyncSaveDialog", "Sync saves with cloud"))
|
||||||
self.title_label.setText(_translate("SyncSaveDialog", "Select save, you want to use for "))
|
self.title_label.setText(_translate("SyncSaveDialog", "Select save, you want to use for "))
|
||||||
self.local_gb.setTitle(_translate("SyncSaveDialog", "Local"))
|
|
||||||
self.upload_button.setText(_translate("SyncSaveDialog", "Upload"))
|
|
||||||
self.cloud_gb.setTitle(_translate("SyncSaveDialog", "Cloud"))
|
|
||||||
self.download_button.setText(_translate("SyncSaveDialog", "Download"))
|
|
||||||
self.cancel_button.setText(_translate("SyncSaveDialog", "Cancel"))
|
self.cancel_button.setText(_translate("SyncSaveDialog", "Cancel"))
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -28,92 +28,7 @@
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
<layout class="QHBoxLayout" name="sync_widget_layout"/>
|
||||||
<item>
|
|
||||||
<widget class="QGroupBox" name="local_gb">
|
|
||||||
<property name="title">
|
|
||||||
<string>Local</string>
|
|
||||||
</property>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="date_info_local">
|
|
||||||
<property name="text">
|
|
||||||
<string notr="true">TextLabel</string>
|
|
||||||
</property>
|
|
||||||
<property name="alignment">
|
|
||||||
<set>Qt::AlignCenter</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="icon_local">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string notr="true"/>
|
|
||||||
</property>
|
|
||||||
<property name="alignment">
|
|
||||||
<set>Qt::AlignCenter</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="upload_button">
|
|
||||||
<property name="text">
|
|
||||||
<string>Upload</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QGroupBox" name="cloud_gb">
|
|
||||||
<property name="title">
|
|
||||||
<string>Cloud</string>
|
|
||||||
</property>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_3">
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="date_info_remote">
|
|
||||||
<property name="text">
|
|
||||||
<string notr="true">TextLabel</string>
|
|
||||||
</property>
|
|
||||||
<property name="alignment">
|
|
||||||
<set>Qt::AlignCenter</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="icon_remote">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string notr="true"/>
|
|
||||||
</property>
|
|
||||||
<property name="alignment">
|
|
||||||
<set>Qt::AlignCenter</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="download_button">
|
|
||||||
<property name="text">
|
|
||||||
<string>Download</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||||
|
|
|
@ -15,9 +15,9 @@ class Ui_SyncWidget(object):
|
||||||
def setupUi(self, SyncWidget):
|
def setupUi(self, SyncWidget):
|
||||||
SyncWidget.setObjectName("SyncWidget")
|
SyncWidget.setObjectName("SyncWidget")
|
||||||
SyncWidget.resize(208, 109)
|
SyncWidget.resize(208, 109)
|
||||||
self.verticalLayout = QtWidgets.QVBoxLayout(SyncWidget)
|
self.main_layout = QtWidgets.QVBoxLayout(SyncWidget)
|
||||||
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
|
self.main_layout.setContentsMargins(0, 0, 0, 0)
|
||||||
self.verticalLayout.setObjectName("verticalLayout")
|
self.main_layout.setObjectName("main_layout")
|
||||||
self.horizontalLayout = QtWidgets.QHBoxLayout()
|
self.horizontalLayout = QtWidgets.QHBoxLayout()
|
||||||
self.horizontalLayout.setObjectName("horizontalLayout")
|
self.horizontalLayout.setObjectName("horizontalLayout")
|
||||||
self.local_gb = QtWidgets.QGroupBox(SyncWidget)
|
self.local_gb = QtWidgets.QGroupBox(SyncWidget)
|
||||||
|
@ -72,7 +72,7 @@ class Ui_SyncWidget(object):
|
||||||
self.download_button.setObjectName("download_button")
|
self.download_button.setObjectName("download_button")
|
||||||
self.cloud_layout.addWidget(self.download_button)
|
self.cloud_layout.addWidget(self.download_button)
|
||||||
self.horizontalLayout.addWidget(self.cloud_gb)
|
self.horizontalLayout.addWidget(self.cloud_gb)
|
||||||
self.verticalLayout.addLayout(self.horizontalLayout)
|
self.main_layout.addLayout(self.horizontalLayout)
|
||||||
|
|
||||||
self.retranslateUi(SyncWidget)
|
self.retranslateUi(SyncWidget)
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
<string>Form</string>
|
<string>Form</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout">
|
<layout class="QVBoxLayout" name="main_layout">
|
||||||
<property name="leftMargin">
|
<property name="leftMargin">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
|
|
Loading…
Reference in a new issue