Auto sync-saves on finished game
This commit is contained in:
parent
f859afe43e
commit
ca8bafacd3
|
@ -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("")
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
Loading…
Reference in a new issue