1
0
Fork 0
mirror of synced 2024-06-02 02:34:40 +12:00

Auto sync-saves on finished game

This commit is contained in:
Dummerle 2021-04-10 11:27:40 +02:00
parent f859afe43e
commit ca8bafacd3
10 changed files with 273 additions and 183 deletions

View file

@ -37,6 +37,11 @@ class TabWidget(QTabWidget):
self.cloud_saves = SyncSaves(core)
self.addTab(self.cloud_saves, "Cloud Saves")
self.cloud_saves.finished.connect(self.finished_sync)
self.game_list.default_widget.game_list.sync_cloud.connect(
lambda app_name: self.cloud_saves.sync_game(app_name, True))
# Space Tab
self.addTab(QWidget(), "")
self.setTabEnabled(disabled_tab, False)
@ -67,3 +72,8 @@ class TabWidget(QTabWidget):
def resizeEvent(self, event):
self.tabBar().setMinimumWidth(self.width())
super(TabWidget, self).resizeEvent(event)
def finished_sync(self, app_name):
self.game_list.default_widget.game_list.widgets[app_name][0].info_text = ""
self.game_list.default_widget.game_list.widgets[app_name][0].info_label.setText("")
self.game_list.default_widget.game_list.widgets[app_name][1].info_label.setText("")

View file

@ -3,11 +3,11 @@ from logging import getLogger
from PyQt5.QtCore import QThread, pyqtSignal, Qt
from PyQt5.QtWidgets import *
from custom_legendary.core import LegendaryCore
from custom_legendary.models.game import SaveGameStatus
from rare.components.dialogs.path_input_dialog import PathInputDialog
from rare.components.tabs.cloud_saves.sync_widget import SyncWidget
from rare.utils.extra_widgets import WaitingSpinner
from custom_legendary.core import LegendaryCore
from custom_legendary.models.game import SaveGameStatus
logger = getLogger("Sync Saves")
@ -25,6 +25,7 @@ class LoadThread(QThread):
class SyncSaves(QScrollArea):
finished = pyqtSignal(str)
def __init__(self, core: LegendaryCore):
super(SyncSaves, self).__init__()
@ -93,11 +94,37 @@ class SyncSaves(QScrollArea):
self.setWidgetResizable(True)
self.setWidget(self.widget)
def reload(self):
def reload(self, app_name):
self.finished.emit(app_name)
self.setWidget(QWidget())
self.load_saves()
self.update()
def sync_game(self, app_name, from_game_finish_auto=True):
for w in self.widgets:
if w.igame.app_name == app_name:
widget = w
break
else:
logger.warning("An Error occurred. Game does not support cloud saves")
return
if widget.res == SaveGameStatus.SAME_AGE:
logger.info("Game is up to date")
elif widget.res == SaveGameStatus.LOCAL_NEWER:
widget.upload()
elif widget.res == SaveGameStatus.REMOTE_NEWER:
if from_game_finish_auto:
if QMessageBox.question(self, "Really", self.tr("You finished playing game, but Remote game is newer. "
"Do you want to download anyway? This could remove "
"your game progress. Please check your save path or "
"make a backup"),
QMessageBox.Yes | QMessageBox.No, QMessageBox.No) == QMessageBox.Yes:
widget.download()
else:
logger.info("Cancel Download")
def sync_all(self):
logger.info("Sync all Games")
for w in self.widgets:

View file

@ -38,7 +38,7 @@ class _DownloadThread(QThread):
class SyncWidget(QGroupBox):
reload = pyqtSignal()
reload = pyqtSignal(str)
def __init__(self, igame: InstalledGame, save, core: LegendaryCore):
super(SyncWidget, self).__init__(igame.title)
@ -155,7 +155,7 @@ class SyncWidget(QGroupBox):
self.igame.save_path = path
self.core.lgd.set_installed_game(self.igame.app_name, self.igame)
self.save_path_text.setText(self.igame.save_path)
self.reload.emit()
self.reload.emit(self.game.app_name)
def upload(self):
self.logger.info("Uploading Saves for game " + self.igame.title)
@ -169,7 +169,7 @@ class SyncWidget(QGroupBox):
def uploaded(self):
self.info_text.setText(self.tr("Upload finished"))
self.upload_button.setDisabled(False)
self.reload.emit()
self.reload.emit(self.game.app_name)
def download(self):
if not os.path.exists(self.igame.save_path):
@ -187,4 +187,4 @@ class SyncWidget(QGroupBox):
self.upload_button.setDisabled(True)
self.download_button.setDisabled(True)
self.download_button.setStyleSheet("QPushButton{background-color: black}")
self.reload.emit()
self.reload.emit(self.game.app_name)

View file

@ -1,18 +1,20 @@
import os
from PyQt5.QtCore import QSettings
from PyQt5.QtWidgets import QWidget, QLabel, QVBoxLayout, QComboBox, QFileDialog, QPushButton, QMessageBox, QLineEdit, \
QScrollArea
QScrollArea, QCheckBox
from custom_legendary.core import LegendaryCore
from custom_legendary.models.game import InstalledGame, Game
from rare.components.tabs.settings.linux import LinuxSettings
from rare.components.tabs.settings.settings_widget import SettingsWidget
from rare.utils.extra_widgets import PathEdit
from custom_legendary.core import LegendaryCore
from custom_legendary.models.game import InstalledGame, Game
class GameSettings(QScrollArea):
game: Game
igame: InstalledGame
# variable to no update when changing game
change = False
@ -20,6 +22,7 @@ class GameSettings(QScrollArea):
super(GameSettings, self).__init__()
self.core = core
self.widget = QWidget()
self.settings = QSettings()
self.setWidgetResizable(True)
self.layout = QVBoxLayout()
self.title = QLabel("Error")
@ -36,6 +39,12 @@ class GameSettings(QScrollArea):
self.layout.addWidget(self.skip_update_widget)
self.skip_update.currentIndexChanged.connect(lambda x: self.update_combobox(x, "skip_update_check"))
self.cloud_sync = QCheckBox("Sync with cloud")
self.cloud_sync_widget = SettingsWidget(self.tr("Auto sync with cloud"), self.cloud_sync)
self.layout.addWidget(self.cloud_sync_widget)
self.cloud_sync.stateChanged.connect(lambda: self.settings.setValue(f"{self.game.app_name}/auto_sync_cloud",
self.cloud_sync.isChecked()))
self.layout.addWidget(self.offline_widget)
self.wrapper = QLineEdit("")
@ -84,7 +93,8 @@ class GameSettings(QScrollArea):
self.core.lgd.config[self.game.app_name] = {}
self.core.lgd.config.set(self.game.app_name, "wrapper", wrapper)
else:
if self.game.app_name in self.core.lgd.config.sections() and self.core.lgd.config.get(f"{self.game.app_name}", "wrapper", fallback="") != "":
if self.game.app_name in self.core.lgd.config.sections() and self.core.lgd.config.get(
f"{self.game.app_name}", "wrapper", fallback="") != "":
self.core.lgd.config.remove_option(self.game.app_name, "wrapper")
if self.core.lgd.config[self.game.app_name] == {}:
self.core.lgd.config.remove_section(self.game.app_name)
@ -193,7 +203,6 @@ class GameSettings(QScrollArea):
wrapper = self.core.lgd.config.get(self.game.app_name, "wrapper", fallback="")
self.wrapper.setText(wrapper)
self.title.setText(f"<h2>{self.game.app_title}</h2>")
if os.name != "nt":
self.linux_settings.update_game(app_name)
@ -211,6 +220,13 @@ class GameSettings(QScrollArea):
self.select_proton.setCurrentIndex(0)
self.proton_prefix_widget.setVisible(False)
self.wrapper_widget.setVisible(True)
if not self.game.supports_cloud_saves:
self.cloud_sync_widget.setVisible(False)
else:
self.cloud_sync_widget.setVisible(True)
sync_cloud = self.settings.value(f"{self.game.app_name}/auto_sync_cloud", True, bool)
self.cloud_sync.setChecked(sync_cloud)
self.change = True

View file

@ -21,6 +21,7 @@ class GameList(QStackedWidget):
install_game = pyqtSignal(InstallOptions)
show_game_info = pyqtSignal(str)
update_game = pyqtSignal()
sync_cloud = pyqtSignal(str)
def __init__(self, core: LegendaryCore):
super(GameList, self).__init__()
@ -158,6 +159,16 @@ class GameList(QStackedWidget):
self.widgets[app_name][0].info_label.setText("")
self.widgets[app_name][1].launch_button.setDisabled(False)
self.widgets[app_name][1].launch_button.setText(self.tr("Launch"))
if self.widgets[app_name][0].game.supports_cloud_saves:
if not self.settings.value(f"{app_name}/auto_sync_cloud", True, bool) \
and not self.settings.value("auto_sync_cloud", True, bool):
logger.info("Auto saves disabled")
return
self.sync_cloud.emit(app_name)
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"))
def launch(self, app_name):
self.widgets[app_name][0].info_text = self.tr("Game running")

View file

@ -3,9 +3,9 @@ from logging import getLogger
from PyQt5.QtCore import pyqtSignal, QProcess, QSettings
from PyQt5.QtWidgets import QGroupBox, QMessageBox
from rare.utils import legendary_utils
from custom_legendary.core import LegendaryCore
from custom_legendary.models.game import InstalledGame
from rare.utils import legendary_utils
logger = getLogger("Game")
@ -25,12 +25,8 @@ class BaseInstalledWidget(QGroupBox):
self.game_running = False
self.update_available = self.core.get_asset(self.game.app_name, True).build_version != igame.version
self.setContentsMargins(0, 0, 0, 0)
# self.setStyleSheet("border-radius: 5px")
def launch(self, offline=False, skip_version_check=False):
if QSettings().value("confirm_start", False, bool):
if not QMessageBox.question(self, "Launch", self.tr("Do you want to launch {}").format(self.game.app_title),

View file

@ -62,6 +62,9 @@ class InstalledListWidget(BaseInstalledWidget):
self.childLayout.addWidget(self.version_label)
self.childLayout.addWidget(self.size_label)
self.info_label = QLabel("")
self.childLayout.addWidget(self.info_label)
self.childLayout.addStretch(1)
self.layout.addLayout(self.childLayout)
self.layout.addStretch(1)

View file

@ -60,6 +60,13 @@ class RareSettings(QScrollArea):
self.game_start_accept_widget = SettingsWidget(self.tr("Confirm launch of game"), self.game_start_accept)
self.layout.addWidget(self.game_start_accept_widget)
self.cloud_sync = QCheckBox("Sync with cloud")
self.cloud_sync.setChecked(settings.value("auto_sync_cloud", True, bool))
self.cloud_sync_widget = SettingsWidget(self.tr("Auto sync with cloud"), self.cloud_sync)
self.layout.addWidget(self.cloud_sync_widget)
self.cloud_sync.stateChanged.connect(lambda: self.settings.setValue(f"auto_sync_cloud",
self.cloud_sync.isChecked()))
self.layout.addStretch()
self.widget.setLayout(self.layout)
self.setWidget(self.widget)

Binary file not shown.

File diff suppressed because it is too large Load diff