Add upload and download function to RareGame
Signed-off-by: loathingKernel <142770+loathingKernel@users.noreply.github.com>
This commit is contained in:
parent
a66600efa3
commit
189167f4f7
|
@ -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:
|
||||
|
|
|
@ -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"),
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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))
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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/>
|
||||
|
|
Loading…
Reference in a new issue