1
0
Fork 0
mirror of synced 2024-06-02 18:54:41 +12:00

Add upload and download function to RareGame

Signed-off-by: loathingKernel <142770+loathingKernel@users.noreply.github.com>
This commit is contained in:
lennard 2023-02-05 18:28:02 +02:00 committed by loathingKernel
parent a66600efa3
commit 189167f4f7
No known key found for this signature in database
GPG key ID: CE0C72D0B53821FD
7 changed files with 66 additions and 26 deletions

View file

@ -52,8 +52,6 @@ class CloudSaves(QWidget, SideTabContents):
self.cloud_ui = Ui_CloudWidget()
self.cloud_ui.setupUi(self.cloud_widget)
self.sync_widget.layout().addWidget(self.cloud_widget)
self.cloud_save_path_edit = PathEdit(
"",
file_type=QFileDialog.DirectoryOnly,
@ -83,10 +81,14 @@ class CloudSaves(QWidget, SideTabContents):
layout.addSpacerItem(QSpacerItem(0, 0, QSizePolicy.Fixed, QSizePolicy.Expanding))
def upload(self):
pass
self.sync_ui.upload_button.setDisabled(True)
self.sync_ui.download_button.setDisabled(True)
self.rgame.upload_saves()
def download(self):
pass
self.sync_ui.upload_button.setDisabled(True)
self.sync_ui.download_button.setDisabled(True)
self.rgame.download_saves()
def compute_save_path(self):
if self.rgame.is_installed and self.rgame.game.supports_cloud_saves:
@ -145,6 +147,7 @@ class CloudSaves(QWidget, SideTabContents):
self.core.lgd.set_installed_game(self.rgame.app_name, self.rgame.igame)
def update_game(self, rgame: RareGame):
# TODO connect update widget signal to connect to sync state
self.rgame = rgame
self.set_title.emit(rgame.title)
supports_saves = rgame.game.supports_cloud_saves or rgame.game.supports_mac_cloud_saves
@ -155,6 +158,10 @@ class CloudSaves(QWidget, SideTabContents):
return
self.change = False
button_disabled = self.rgame.state == RareGame.State.SYNCING
self.sync_ui.download_button.setDisabled(button_disabled)
self.sync_ui.upload_button.setDisabled(button_disabled)
newer = "remote"
new_text = self.tr(" (newer)")
if newer == "remote":
@ -166,9 +173,7 @@ class CloudSaves(QWidget, SideTabContents):
self.cloud_ui.cloud_sync.setChecked(sync_cloud)
if hasattr(self.rgame.igame, "save_path") and self.rgame.igame.save_path:
self.cloud_save_path_edit.setText(self.rgame.igame.save_path)
res, (dt_local, dt_remote) = self.core.check_savegame_state(
rgame.igame.save_path, self.rgame.latest_save
)
status, (dt_local, dt_remote) = rgame.save_state
self.sync_ui.date_info_local.setText(dt_local.strftime("%A, %d. %B %Y %X") if dt_local else "None")
self.sync_ui.date_info_remote.setText(dt_remote.strftime("%A, %d. %B %Y %X") if dt_remote else "None")
else:

View file

@ -86,6 +86,7 @@ class GameWidget(LibraryWidget):
RareGame.State.VERIFYING: self.tr("Verifying..."),
RareGame.State.MOVING: self.tr("Moving..."),
RareGame.State.UNINSTALLING: self.tr("Uninstalling..."),
RareGame.State.SYNCING: self.tr("Syncing saves..."),
"has_update": self.tr("Update available"),
"needs_verification": self.tr("Needs verification"),
"not_can_launch": self.tr("Can't launch"),

View file

@ -10,7 +10,7 @@ from typing import List, Optional, Dict
from PyQt5.QtCore import QObject, pyqtSignal, QRunnable, pyqtSlot, QProcess, QThreadPool
from PyQt5.QtGui import QPixmap
from legendary.models.game import Game, InstalledGame, SaveGameFile
from legendary.models.game import Game, InstalledGame, SaveGameFile, SaveGameStatus
from rare.lgndr.core import LegendaryCore
from rare.models.install import InstallOptionsModel, UninstallOptionsModel
@ -199,7 +199,6 @@ class RareGame(RareGameSlim):
self.__origin_install_path: Optional[str] = None
self.__origin_install_size: Optional[int] = None
self.__steam_grade: Optional[str] = None
self.__latest_save: Optional[SaveGameFile] = None
self.image_manager = image_manager
@ -245,13 +244,53 @@ class RareGame(RareGameSlim):
return self.saves[0]
return None
@latest_save.setter
def latest_save(self, save: SaveGameFile):
self.__latest_save = save
@property
def save_state(self) -> (SaveGameStatus, (datetime, datetime)):
if self.saves and self.save_path:
return self.core.check_savegame_state(self.save_path, self.latest_save)
return SaveGameStatus.NO_SAVE, (None, None)
def upload_saves(self):
if not self.game.supports_cloud_saves:
status, (dt_local, dt_remote) = self.save_state
def _upload():
logger.info(f"Uploading save for {self.title}")
self.state = RareGame.State.SYNCING
self.core.upload_save(self.app_name, self.igame.save_path, dt_local)
self.saves = self.core.get_save_games(self.app_name)
self.state = RareGame.State.IDLE
if not self.game.supports_cloud_saves and not self.game.supports_mac_cloud_saves:
return
if status == SaveGameStatus.NO_SAVE or not dt_local:
logger.warning("Can't upload non existing save")
return
if self.state == RareGame.State.SYNCING:
logger.error(f"{self.title} is already syncing")
return
worker = QRunnable.create(lambda: _upload())
QThreadPool.globalInstance().start(worker)
def download_saves(self):
status, (dt_local, dt_remote) = self.save_state
def _download():
logger.info(f"Downloading save for {self.title}")
self.state = RareGame.State.SYNCING
self.core.download_saves(self.app_name, self.latest_save.manifest_name, self.save_path)
self.saves = self.core.get_save_games(self.app_name)
self.state = RareGame.State.IDLE
if not self.game.supports_cloud_saves and not self.game.supports_mac_cloud_saves:
return
if status == SaveGameStatus.NO_SAVE or not dt_remote:
logger.error("Can't download non existing save")
return
if self.state == RareGame.State.SYNCING:
logger.error(f"{self.title} is already syncing")
return
worker = QRunnable.create(lambda: _download())
QThreadPool.globalInstance().start(worker)
@pyqtSlot(int)
def __game_launched(self, code: int):

View file

@ -54,7 +54,9 @@ class SaveWorker(QRunnable):
)
else:
self.core.upload_save(
self.model.rgame.app_name, self.model.path, self.model.date_time
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))
@ -159,7 +161,6 @@ class CloudSaveUtils(QObject):
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)

View file

@ -432,12 +432,12 @@ class RareCore(QObject):
"""!
SaveGameFiles across games
"""
return chain.from_iterable([game.latest_save for game in self.has_saves])
return chain.from_iterable([game.save.latest_save for game in self.has_saves])
@property
def has_saves(self) -> Iterator[RareGame]:
"""!
RareGames that have SaveGameFiles associated with them
"""
return self.__filter_games(lambda game: bool(game.latest_save))
return self.__filter_games(lambda game: bool(game.save))

View file

@ -14,7 +14,7 @@ from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_SyncWidget(object):
def setupUi(self, SyncWidget):
SyncWidget.setObjectName("SyncWidget")
SyncWidget.resize(400, 300)
SyncWidget.resize(208, 109)
self.verticalLayout = QtWidgets.QVBoxLayout(SyncWidget)
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
self.verticalLayout.setObjectName("verticalLayout")
@ -67,9 +67,6 @@ class Ui_SyncWidget(object):
self.cloud_layout.addWidget(self.download_button)
self.horizontalLayout.addWidget(self.cloud_gb)
self.verticalLayout.addLayout(self.horizontalLayout)
self.path_layout = QtWidgets.QFormLayout()
self.path_layout.setObjectName("path_layout")
self.verticalLayout.addLayout(self.path_layout)
self.retranslateUi(SyncWidget)

View file

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
<width>208</width>
<height>109</height>
</rect>
</property>
<property name="windowTitle">
@ -114,9 +114,6 @@
</item>
</layout>
</item>
<item>
<layout class="QFormLayout" name="path_layout"/>
</item>
</layout>
</widget>
<resources/>