1
0
Fork 0
mirror of synced 2024-06-26 18:20:50 +12:00

Launcher: Refactor cloud sync dialog to use ButtonDialog base class

This commit is contained in:
loathingKernel 2024-01-02 17:38:51 +02:00
parent 08f2d50d4f
commit 89c1a4eaf4
16 changed files with 294 additions and 362 deletions

View file

@ -1,94 +0,0 @@
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
SKIP = 3
def __init__(
self,
igame: InstalledGame,
dt_local: datetime.datetime,
dt_remote: datetime.datetime,
):
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(f"<h4>{self.title_label.text()} <b>{igame.title}</b></h4>")
newer = self.tr("Newer")
if dt_remote and dt_local:
self.sync_ui.age_label_local.setText(
f"<b>{newer}</b>" if dt_remote < dt_local else " "
)
self.sync_ui.age_label_remote.setText(
f"<b>{newer}</b>" if dt_remote > dt_local else " "
)
# Set status, if one of them is None
elif dt_remote and not dt_local:
self.status = self.DOWNLOAD
elif not dt_remote and dt_local:
self.status = self.UPLOAD
else:
self.status = self.SKIP
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")
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):
if self.status == self.SKIP:
return self.SKIP
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"))
print(dlg.get_action())
if __name__ == '__main__':
test_dialog()

View file

@ -13,15 +13,15 @@ from PyQt5.QtWidgets import (
QMessageBox, QMessageBox,
QGroupBox, QGroupBox,
QVBoxLayout, QVBoxLayout,
QSpacerItem, QSpacerItem, QFormLayout,
) )
from legendary.models.game import SaveGameStatus from legendary.models.game import SaveGameStatus
from rare.models.game import RareGame from rare.models.game import RareGame
from rare.shared import RareCore from rare.shared import RareCore
from rare.shared.workers.wine_resolver import WineResolver from rare.shared.workers.wine_resolver import WineResolver
from rare.ui.components.tabs.games.game_info.cloud_widget import Ui_CloudWidget from rare.ui.components.tabs.games.game_info.cloud_settings_widget import Ui_CloudSettingsWidget
from rare.ui.components.tabs.games.game_info.sync_widget import Ui_SyncWidget from rare.ui.components.tabs.games.game_info.cloud_sync_widget import Ui_CloudSyncWidget
from rare.utils.misc import icon from rare.utils.misc import icon
from rare.widgets.indicator_edit import PathEdit, IndicatorReasonsCommon from rare.widgets.indicator_edit import PathEdit, IndicatorReasonsCommon
from rare.widgets.loading_widget import LoadingWidget from rare.widgets.loading_widget import LoadingWidget
@ -35,7 +35,7 @@ class CloudSaves(QWidget, SideTabContents):
super(CloudSaves, self).__init__(parent=parent) super(CloudSaves, self).__init__(parent=parent)
self.sync_widget = QWidget(self) self.sync_widget = QWidget(self)
self.sync_ui = Ui_SyncWidget() self.sync_ui = Ui_CloudSyncWidget()
self.sync_ui.setupUi(self.sync_widget) self.sync_ui.setupUi(self.sync_widget)
self.info_label = QLabel(self.tr("<b>This game doesn't support cloud saves</b>")) self.info_label = QLabel(self.tr("<b>This game doesn't support cloud saves</b>"))
@ -56,7 +56,7 @@ class CloudSaves(QWidget, SideTabContents):
self.rgame: RareGame = None self.rgame: RareGame = None
self.cloud_widget = QGroupBox(self) self.cloud_widget = QGroupBox(self)
self.cloud_ui = Ui_CloudWidget() self.cloud_ui = Ui_CloudSettingsWidget()
self.cloud_ui.setupUi(self.cloud_widget) self.cloud_ui.setupUi(self.cloud_widget)
self.cloud_save_path_edit = PathEdit( self.cloud_save_path_edit = PathEdit(
@ -66,16 +66,20 @@ class CloudSaves(QWidget, SideTabContents):
edit_func=self.edit_save_path, edit_func=self.edit_save_path,
save_func=self.save_save_path, save_func=self.save_save_path,
) )
self.cloud_ui.cloud_layout.addRow(QLabel(self.tr("Save path")), self.cloud_save_path_edit) self.cloud_ui.main_layout.setWidget(
self.cloud_ui.main_layout.getWidgetPosition(self.cloud_ui.path_label)[0],
QFormLayout.FieldRole,
self.cloud_save_path_edit
)
self.compute_save_path_button = QPushButton(icon("fa.magic"), self.tr("Calculate path")) self.compute_save_path_button = QPushButton(icon("fa.magic"), self.tr("Calculate path"))
self.compute_save_path_button.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Fixed) self.compute_save_path_button.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Fixed)
self.compute_save_path_button.clicked.connect(self.compute_save_path) self.compute_save_path_button.clicked.connect(self.compute_save_path)
self.cloud_ui.cloud_layout.addRow(None, self.compute_save_path_button) self.cloud_ui.main_layout.addRow(None, self.compute_save_path_button)
self.cloud_ui.cloud_sync.stateChanged.connect( self.cloud_ui.sync_check.stateChanged.connect(
lambda: self.settings.setValue( lambda: self.settings.setValue(
f"{self.rgame.app_name}/auto_sync_cloud", self.cloud_ui.cloud_sync.isChecked() f"{self.rgame.app_name}/auto_sync_cloud", self.cloud_ui.sync_check.isChecked()
) )
) )
@ -172,7 +176,7 @@ class CloudSaves(QWidget, SideTabContents):
self.sync_ui.age_label_local.setText("None") self.sync_ui.age_label_local.setText("None")
self.sync_ui.date_info_remote.setText("None") self.sync_ui.date_info_remote.setText("None")
self.sync_ui.age_label_remote.setText("None") self.sync_ui.age_label_remote.setText("None")
self.cloud_ui.cloud_sync.setChecked(False) self.cloud_ui.sync_check.setChecked(False)
self.cloud_save_path_edit.setText("") self.cloud_save_path_edit.setText("")
return return
@ -203,9 +207,9 @@ class CloudSaves(QWidget, SideTabContents):
self.sync_ui.upload_button.setDisabled(not dt_local) self.sync_ui.upload_button.setDisabled(not dt_local)
self.sync_ui.download_button.setDisabled(not dt_remote) self.sync_ui.download_button.setDisabled(not dt_remote)
self.cloud_ui.cloud_sync.blockSignals(True) self.cloud_ui.sync_check.blockSignals(True)
self.cloud_ui.cloud_sync.setChecked(self.rgame.auto_sync_saves) self.cloud_ui.sync_check.setChecked(self.rgame.auto_sync_saves)
self.cloud_ui.cloud_sync.blockSignals(False) self.cloud_ui.sync_check.blockSignals(False)
self.cloud_save_path_edit.setText(self.rgame.save_path if self.rgame.save_path else "") self.cloud_save_path_edit.setText(self.rgame.save_path if self.rgame.save_path else "")
if platform.system() == "Windows" and not self.rgame.save_path: if platform.system() == "Windows" and not self.rgame.save_path:

View file

@ -14,11 +14,11 @@ from PyQt5.QtNetwork import QLocalServer, QLocalSocket
from PyQt5.QtWidgets import QApplication from PyQt5.QtWidgets import QApplication
from legendary.models.game import SaveGameStatus from legendary.models.game import SaveGameStatus
from rare.components.dialogs.cloud_save_dialog import CloudSaveDialog
from rare.lgndr.core import LegendaryCore from rare.lgndr.core import LegendaryCore
from rare.models.base_game import RareGameSlim from rare.models.base_game import RareGameSlim
from rare.models.launcher import ErrorModel, Actions, FinishedModel, BaseModel, StateChangedModel from rare.models.launcher import ErrorModel, Actions, FinishedModel, BaseModel, StateChangedModel
from rare.widgets.rare_app import RareApp, RareAppException from rare.widgets.rare_app import RareApp, RareAppException
from .cloud_sync_dialog import CloudSyncDialog, CloudSyncDialogResult
from .console import Console from .console import Console
from .lgd_helper import get_launch_args, InitArgs, get_configured_process, LaunchArgs, GameArgsError from .lgd_helper import get_launch_args, InitArgs, get_configured_process, LaunchArgs, GameArgsError
@ -45,9 +45,9 @@ class PreLaunchThread(QRunnable):
def run(self) -> None: def run(self) -> None:
self.logger.info(f"Sync action: {self.sync_action}") self.logger.info(f"Sync action: {self.sync_action}")
if self.sync_action == CloudSaveDialog.UPLOAD: if self.sync_action == CloudSyncDialogResult.UPLOAD:
self.rgame.upload_saves(False) self.rgame.upload_saves(False)
elif self.sync_action == CloudSaveDialog.DOWNLOAD: elif self.sync_action == CloudSyncDialogResult.DOWNLOAD:
self.rgame.download_saves(False) self.rgame.download_saves(False)
else: else:
self.logger.info("No sync action") self.logger.info("No sync action")
@ -212,15 +212,22 @@ class RareLauncher(RareApp):
state, (dt_local, dt_remote) = self.rgame.save_game_state state, (dt_local, dt_remote) = self.rgame.save_game_state
if state == SaveGameStatus.LOCAL_NEWER and not self.no_sync_on_exit: if state == SaveGameStatus.LOCAL_NEWER and not self.no_sync_on_exit:
action = CloudSaveDialog.UPLOAD action = CloudSyncDialogResult.UPLOAD
self.__check_saved_finished(exit_code, action)
else: else:
action = CloudSaveDialog(self.rgame.igame, dt_local, dt_remote).get_action() sync_dialog = CloudSyncDialog(self.rgame.igame, dt_local, dt_remote)
sync_dialog.result_ready.connect(lambda a: self.__check_saved_finished(exit_code, a))
sync_dialog.open()
if action == CloudSaveDialog.UPLOAD: @pyqtSlot(int, int)
@pyqtSlot(int, CloudSyncDialogResult)
def __check_saved_finished(self, exit_code, action):
action = CloudSyncDialogResult(action)
if action == CloudSyncDialogResult.UPLOAD:
if self.console: if self.console:
self.console.log("Uploading saves...") self.console.log("Uploading saves...")
self.rgame.upload_saves() self.rgame.upload_saves()
elif action == CloudSaveDialog.DOWNLOAD: elif action == CloudSyncDialogResult.DOWNLOAD:
if self.console: if self.console:
self.console.log("Downloading saves...") self.console.log("Downloading saves...")
self.rgame.download_saves() self.rgame.download_saves()
@ -325,14 +332,20 @@ class RareLauncher(RareApp):
return return
_, (dt_local, dt_remote) = self.rgame.save_game_state _, (dt_local, dt_remote) = self.rgame.save_game_state
dlg = CloudSaveDialog(self.rgame.igame, dt_local, dt_remote) sync_dialog = CloudSyncDialog(self.rgame.igame, dt_local, dt_remote)
action = dlg.get_action() sync_dialog.result_ready.connect(self.__sync_ready)
if action == CloudSaveDialog.CANCEL: sync_dialog.open()
@pyqtSlot(int)
@pyqtSlot(CloudSyncDialogResult)
def __sync_ready(self, action: CloudSyncDialogResult):
action = CloudSyncDialogResult(action)
if action == CloudSyncDialogResult.CANCEL:
self.no_sync_on_exit = True self.no_sync_on_exit = True
if self.console: if self.console:
if action == CloudSaveDialog.DOWNLOAD: if action == CloudSyncDialogResult.DOWNLOAD:
self.console.log("Downloading saves...") self.console.log("Downloading saves...")
elif action == CloudSaveDialog.UPLOAD: elif action == CloudSyncDialogResult.UPLOAD:
self.console.log("Uploading saves...") self.console.log("Uploading saves...")
self.start_prepare(action) self.start_prepare(action)

View file

@ -0,0 +1,103 @@
import sys
from datetime import datetime
from enum import IntEnum
from logging import getLogger
from PyQt5.QtCore import pyqtSignal, pyqtSlot
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QDialog
from legendary.core import LegendaryCore
from legendary.models.game import InstalledGame
from rare.ui.components.tabs.games.game_info.cloud_sync_widget import Ui_CloudSyncWidget
from rare.utils.misc import icon
from rare.widgets.dialogs import ButtonDialog, dialog_title_game
logger = getLogger("CloudSyncDialog")
class CloudSyncDialogResult(IntEnum):
DOWNLOAD = 2
UPLOAD = 1
CANCEL = 0
SKIP = 3
class CloudSyncDialog(ButtonDialog):
result_ready: pyqtSignal = pyqtSignal(CloudSyncDialogResult)
def __init__(self, igame: InstalledGame, dt_local: datetime, dt_remote: datetime, parent=None):
super(CloudSyncDialog, self).__init__(parent=parent)
header = self.tr("Cloud saves for")
self.setWindowTitle(dialog_title_game(header, igame.title))
title_label = QLabel(f"<h4>{dialog_title_game(header, igame.title)}</h4>", self)
sync_widget = QWidget(self)
self.sync_ui = Ui_CloudSyncWidget()
self.sync_ui.setupUi(sync_widget)
layout = QVBoxLayout()
layout.addWidget(title_label)
layout.addWidget(sync_widget)
self.accept_button.setText(self.tr("Skip"))
self.accept_button.setIcon(icon("fa.chevron-right"))
self.setCentralLayout(layout)
self.status = CloudSyncDialogResult.CANCEL
newer = self.tr("Newer")
if dt_remote and dt_local:
self.sync_ui.age_label_local.setText(f"<b>{newer}</b>" if dt_remote < dt_local else " ")
self.sync_ui.age_label_remote.setText(f"<b>{newer}</b>" if dt_remote > dt_local else " ")
# Set status, if one of them is None
elif dt_remote and not dt_local:
self.status = CloudSyncDialogResult.DOWNLOAD
elif not dt_remote and dt_local:
self.status = CloudSyncDialogResult.UPLOAD
else:
self.status = CloudSyncDialogResult.SKIP
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")
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(self.__on_upload)
self.sync_ui.download_button.clicked.connect(self.__on_download)
if self.status == CloudSyncDialogResult.SKIP:
self.accept()
def __on_upload(self):
self.status = CloudSyncDialogResult.UPLOAD
self.done(QDialog.Accepted)
def __on_download(self):
self.status = CloudSyncDialogResult.DOWNLOAD
self.done(QDialog.Accepted)
def done_handler(self):
self.result_ready.emit(self.status)
def accept_handler(self):
self.status = CloudSyncDialogResult.SKIP
def reject_handler(self):
self.status = CloudSyncDialogResult.CANCEL
if __name__ == "__main__":
app = QApplication(sys.argv)
core = LegendaryCore()
@pyqtSlot(int)
def __callback(status: int):
print(repr(CloudSyncDialogResult(status)))
dlg = CloudSyncDialog(core.get_installed_list()[0], datetime.now(), datetime.strptime("2021,1", "%Y,%M"))
dlg.result_ready.connect(__callback)
dlg.open()
app.exec()

View file

@ -14,7 +14,7 @@ from PyQt5.QtWidgets import (
QSizePolicy, QTableWidgetItem, QHeaderView, QApplication, QSizePolicy, QTableWidgetItem, QHeaderView, QApplication,
) )
from rare.ui.components.extra.console_env import Ui_ConsoleEnv from rare.ui.launcher.console_env import Ui_ConsoleEnv
class Console(QDialog): class Console(QDialog):

View file

@ -1,56 +0,0 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'rare/ui/components/dialogs/sync_save_dialog.ui'
#
# Created by: PyQt5 UI code generator 5.15.7
#
# 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.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_SyncSaveDialog(object):
def setupUi(self, SyncSaveDialog):
SyncSaveDialog.setObjectName("SyncSaveDialog")
SyncSaveDialog.resize(648, 394)
self.verticalLayout = QtWidgets.QVBoxLayout(SyncSaveDialog)
self.verticalLayout.setObjectName("verticalLayout")
self.title_label = QtWidgets.QLabel(SyncSaveDialog)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Maximum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.title_label.sizePolicy().hasHeightForWidth())
self.title_label.setSizePolicy(sizePolicy)
self.title_label.setObjectName("title_label")
self.verticalLayout.addWidget(self.title_label)
self.sync_widget_layout = QtWidgets.QHBoxLayout()
self.sync_widget_layout.setObjectName("sync_widget_layout")
self.verticalLayout.addLayout(self.sync_widget_layout)
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout_2.addItem(spacerItem)
self.cancel_button = QtWidgets.QPushButton(SyncSaveDialog)
self.cancel_button.setObjectName("cancel_button")
self.horizontalLayout_2.addWidget(self.cancel_button)
self.verticalLayout.addLayout(self.horizontalLayout_2)
self.retranslateUi(SyncSaveDialog)
def retranslateUi(self, SyncSaveDialog):
_translate = QtCore.QCoreApplication.translate
SyncSaveDialog.setWindowTitle(_translate("SyncSaveDialog", "Sync saves with cloud"))
self.title_label.setText(_translate("SyncSaveDialog", "Select save, you want to use for "))
self.cancel_button.setText(_translate("SyncSaveDialog", "Cancel"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
SyncSaveDialog = QtWidgets.QDialog()
ui = Ui_SyncSaveDialog()
ui.setupUi(SyncSaveDialog)
SyncSaveDialog.show()
sys.exit(app.exec_())

View file

@ -1,61 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>SyncSaveDialog</class>
<widget class="QDialog" name="SyncSaveDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>648</width>
<height>394</height>
</rect>
</property>
<property name="windowTitle">
<string>Sync saves with cloud</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="title_label">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Select save, you want to use for </string>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="sync_widget_layout"/>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="cancel_button">
<property name="text">
<string>Cancel</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View file

@ -0,0 +1,52 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'rare/ui/components/tabs/games/game_info/cloud_settings_widget.ui'
#
# Created by: PyQt5 UI code generator 5.15.10
#
# 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.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_CloudSettingsWidget(object):
def setupUi(self, CloudSettingsWidget):
CloudSettingsWidget.setObjectName("CloudSettingsWidget")
CloudSettingsWidget.resize(388, 78)
CloudSettingsWidget.setWindowTitle("CloudSettingsWidget")
self.main_layout = QtWidgets.QFormLayout(CloudSettingsWidget)
self.main_layout.setLabelAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
self.main_layout.setObjectName("main_layout")
self.sync_label = QtWidgets.QLabel(CloudSettingsWidget)
self.sync_label.setObjectName("sync_label")
self.main_layout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.sync_label)
self.sync_check = QtWidgets.QCheckBox(CloudSettingsWidget)
font = QtGui.QFont()
font.setItalic(True)
self.sync_check.setFont(font)
self.sync_check.setText("Automatically synchronize saves with the cloud")
self.sync_check.setObjectName("sync_check")
self.main_layout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.sync_check)
self.path_label = QtWidgets.QLabel(CloudSettingsWidget)
self.path_label.setObjectName("path_label")
self.main_layout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.path_label)
self.retranslateUi(CloudSettingsWidget)
def retranslateUi(self, CloudSettingsWidget):
_translate = QtCore.QCoreApplication.translate
CloudSettingsWidget.setTitle(_translate("CloudSettingsWidget", "Settings"))
self.sync_label.setText(_translate("CloudSettingsWidget", "Enable sync"))
self.path_label.setText(_translate("CloudSettingsWidget", "Saves path"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
CloudSettingsWidget = QtWidgets.QGroupBox()
ui = Ui_CloudSettingsWidget()
ui.setupUi(CloudSettingsWidget)
CloudSettingsWidget.show()
sys.exit(app.exec_())

View file

@ -0,0 +1,53 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>CloudSettingsWidget</class>
<widget class="QGroupBox" name="CloudSettingsWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>388</width>
<height>78</height>
</rect>
</property>
<property name="windowTitle">
<string notr="true">CloudSettingsWidget</string>
</property>
<property name="title">
<string>Settings</string>
</property>
<layout class="QFormLayout" name="main_layout">
<property name="labelAlignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<item row="0" column="0">
<widget class="QLabel" name="sync_label">
<property name="text">
<string>Enable sync</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QCheckBox" name="sync_check">
<property name="font">
<font>
<italic>true</italic>
</font>
</property>
<property name="text">
<string notr="true">Automatically synchronize saves with the cloud</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="path_label">
<property name="text">
<string>Saves path</string>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View file

@ -1,8 +1,8 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'rare/ui/components/tabs/games/game_info/sync_widget.ui' # Form implementation generated from reading ui file 'rare/ui/components/tabs/games/game_info/cloud_sync_widget.ui'
# #
# Created by: PyQt5 UI code generator 5.15.9 # Created by: PyQt5 UI code generator 5.15.10
# #
# 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.
@ -11,29 +11,29 @@
from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_SyncWidget(object): class Ui_CloudSyncWidget(object):
def setupUi(self, SyncWidget): def setupUi(self, CloudSyncWidget):
SyncWidget.setObjectName("SyncWidget") CloudSyncWidget.setObjectName("CloudSyncWidget")
SyncWidget.resize(438, 137) CloudSyncWidget.resize(438, 137)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0) sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0) sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(SyncWidget.sizePolicy().hasHeightForWidth()) sizePolicy.setHeightForWidth(CloudSyncWidget.sizePolicy().hasHeightForWidth())
SyncWidget.setSizePolicy(sizePolicy) CloudSyncWidget.setSizePolicy(sizePolicy)
SyncWidget.setWindowTitle("SyncWidget") CloudSyncWidget.setWindowTitle("SyncWidget")
self.sync_layout = QtWidgets.QHBoxLayout(SyncWidget) self.main_layout = QtWidgets.QHBoxLayout(CloudSyncWidget)
self.sync_layout.setContentsMargins(0, 0, 0, 0) self.main_layout.setContentsMargins(0, 0, 0, 0)
self.sync_layout.setObjectName("sync_layout") self.main_layout.setObjectName("main_layout")
self.local_gb = QtWidgets.QGroupBox(SyncWidget) self.local_group = QtWidgets.QGroupBox(CloudSyncWidget)
self.local_gb.setObjectName("local_gb") self.local_group.setObjectName("local_group")
self.local_layout = QtWidgets.QVBoxLayout(self.local_gb) self.local_layout = QtWidgets.QVBoxLayout(self.local_group)
self.local_layout.setObjectName("local_layout") self.local_layout.setObjectName("local_layout")
self.date_info_local = QtWidgets.QLabel(self.local_gb) self.date_info_local = QtWidgets.QLabel(self.local_group)
self.date_info_local.setText("") self.date_info_local.setText("")
self.date_info_local.setAlignment(QtCore.Qt.AlignCenter) self.date_info_local.setAlignment(QtCore.Qt.AlignCenter)
self.date_info_local.setObjectName("date_info_local") self.date_info_local.setObjectName("date_info_local")
self.local_layout.addWidget(self.date_info_local) self.local_layout.addWidget(self.date_info_local)
self.icon_local = QtWidgets.QLabel(self.local_gb) self.icon_local = QtWidgets.QLabel(self.local_group)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0) sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0) sizePolicy.setVerticalStretch(0)
@ -43,26 +43,26 @@ class Ui_SyncWidget(object):
self.icon_local.setAlignment(QtCore.Qt.AlignCenter) self.icon_local.setAlignment(QtCore.Qt.AlignCenter)
self.icon_local.setObjectName("icon_local") self.icon_local.setObjectName("icon_local")
self.local_layout.addWidget(self.icon_local) self.local_layout.addWidget(self.icon_local)
self.age_label_local = QtWidgets.QLabel(self.local_gb) self.age_label_local = QtWidgets.QLabel(self.local_group)
self.age_label_local.setText("") self.age_label_local.setText("")
self.age_label_local.setAlignment(QtCore.Qt.AlignCenter) self.age_label_local.setAlignment(QtCore.Qt.AlignCenter)
self.age_label_local.setObjectName("age_label_local") self.age_label_local.setObjectName("age_label_local")
self.local_layout.addWidget(self.age_label_local) self.local_layout.addWidget(self.age_label_local)
self.upload_button = QtWidgets.QPushButton(self.local_gb) self.upload_button = QtWidgets.QPushButton(self.local_group)
self.upload_button.setMinimumSize(QtCore.QSize(192, 0)) self.upload_button.setMinimumSize(QtCore.QSize(192, 0))
self.upload_button.setObjectName("upload_button") self.upload_button.setObjectName("upload_button")
self.local_layout.addWidget(self.upload_button) self.local_layout.addWidget(self.upload_button)
self.sync_layout.addWidget(self.local_gb) self.main_layout.addWidget(self.local_group)
self.cloud_gb = QtWidgets.QGroupBox(SyncWidget) self.cloud_group = QtWidgets.QGroupBox(CloudSyncWidget)
self.cloud_gb.setObjectName("cloud_gb") self.cloud_group.setObjectName("cloud_group")
self.cloud_layout = QtWidgets.QVBoxLayout(self.cloud_gb) self.cloud_layout = QtWidgets.QVBoxLayout(self.cloud_group)
self.cloud_layout.setObjectName("cloud_layout") self.cloud_layout.setObjectName("cloud_layout")
self.date_info_remote = QtWidgets.QLabel(self.cloud_gb) self.date_info_remote = QtWidgets.QLabel(self.cloud_group)
self.date_info_remote.setText("") self.date_info_remote.setText("")
self.date_info_remote.setAlignment(QtCore.Qt.AlignCenter) self.date_info_remote.setAlignment(QtCore.Qt.AlignCenter)
self.date_info_remote.setObjectName("date_info_remote") self.date_info_remote.setObjectName("date_info_remote")
self.cloud_layout.addWidget(self.date_info_remote) self.cloud_layout.addWidget(self.date_info_remote)
self.icon_remote = QtWidgets.QLabel(self.cloud_gb) self.icon_remote = QtWidgets.QLabel(self.cloud_group)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0) sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0) sizePolicy.setVerticalStretch(0)
@ -72,32 +72,32 @@ class Ui_SyncWidget(object):
self.icon_remote.setAlignment(QtCore.Qt.AlignCenter) self.icon_remote.setAlignment(QtCore.Qt.AlignCenter)
self.icon_remote.setObjectName("icon_remote") self.icon_remote.setObjectName("icon_remote")
self.cloud_layout.addWidget(self.icon_remote) self.cloud_layout.addWidget(self.icon_remote)
self.age_label_remote = QtWidgets.QLabel(self.cloud_gb) self.age_label_remote = QtWidgets.QLabel(self.cloud_group)
self.age_label_remote.setText("") self.age_label_remote.setText("")
self.age_label_remote.setAlignment(QtCore.Qt.AlignCenter) self.age_label_remote.setAlignment(QtCore.Qt.AlignCenter)
self.age_label_remote.setObjectName("age_label_remote") self.age_label_remote.setObjectName("age_label_remote")
self.cloud_layout.addWidget(self.age_label_remote) self.cloud_layout.addWidget(self.age_label_remote)
self.download_button = QtWidgets.QPushButton(self.cloud_gb) self.download_button = QtWidgets.QPushButton(self.cloud_group)
self.download_button.setMinimumSize(QtCore.QSize(192, 0)) self.download_button.setMinimumSize(QtCore.QSize(192, 0))
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.sync_layout.addWidget(self.cloud_gb) self.main_layout.addWidget(self.cloud_group)
self.retranslateUi(SyncWidget) self.retranslateUi(CloudSyncWidget)
def retranslateUi(self, SyncWidget): def retranslateUi(self, CloudSyncWidget):
_translate = QtCore.QCoreApplication.translate _translate = QtCore.QCoreApplication.translate
self.local_gb.setTitle(_translate("SyncWidget", "Local")) self.local_group.setTitle(_translate("CloudSyncWidget", "Local"))
self.upload_button.setText(_translate("SyncWidget", "Upload")) self.upload_button.setText(_translate("CloudSyncWidget", "Upload"))
self.cloud_gb.setTitle(_translate("SyncWidget", "Cloud")) self.cloud_group.setTitle(_translate("CloudSyncWidget", "Cloud"))
self.download_button.setText(_translate("SyncWidget", "Download")) self.download_button.setText(_translate("CloudSyncWidget", "Download"))
if __name__ == "__main__": if __name__ == "__main__":
import sys import sys
app = QtWidgets.QApplication(sys.argv) app = QtWidgets.QApplication(sys.argv)
SyncWidget = QtWidgets.QWidget() CloudSyncWidget = QtWidgets.QWidget()
ui = Ui_SyncWidget() ui = Ui_CloudSyncWidget()
ui.setupUi(SyncWidget) ui.setupUi(CloudSyncWidget)
SyncWidget.show() CloudSyncWidget.show()
sys.exit(app.exec_()) sys.exit(app.exec_())

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>SyncWidget</class> <class>CloudSyncWidget</class>
<widget class="QWidget" name="SyncWidget"> <widget class="QWidget" name="CloudSyncWidget">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
@ -19,7 +19,7 @@
<property name="windowTitle"> <property name="windowTitle">
<string notr="true">SyncWidget</string> <string notr="true">SyncWidget</string>
</property> </property>
<layout class="QHBoxLayout" name="sync_layout"> <layout class="QHBoxLayout" name="main_layout">
<property name="leftMargin"> <property name="leftMargin">
<number>0</number> <number>0</number>
</property> </property>
@ -33,7 +33,7 @@
<number>0</number> <number>0</number>
</property> </property>
<item> <item>
<widget class="QGroupBox" name="local_gb"> <widget class="QGroupBox" name="local_group">
<property name="title"> <property name="title">
<string>Local</string> <string>Local</string>
</property> </property>
@ -91,7 +91,7 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QGroupBox" name="cloud_gb"> <widget class="QGroupBox" name="cloud_group">
<property name="title"> <property name="title">
<string>Cloud</string> <string>Cloud</string>
</property> </property>

View file

@ -1,44 +0,0 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'rare/ui/components/tabs/games/game_info/cloud_widget.ui'
#
# Created by: PyQt5 UI code generator 5.15.7
#
# 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.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_CloudWidget(object):
def setupUi(self, CloudWidget):
CloudWidget.setObjectName("CloudWidget")
CloudWidget.resize(251, 93)
CloudWidget.setWindowTitle("GroupBox")
self.cloud_layout = QtWidgets.QFormLayout(CloudWidget)
self.cloud_layout.setObjectName("cloud_layout")
self.cloud_sync_label = QtWidgets.QLabel(CloudWidget)
self.cloud_sync_label.setObjectName("cloud_sync_label")
self.cloud_layout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.cloud_sync_label)
self.cloud_sync = QtWidgets.QCheckBox(CloudWidget)
self.cloud_sync.setText("")
self.cloud_sync.setObjectName("cloud_sync")
self.cloud_layout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.cloud_sync)
self.retranslateUi(CloudWidget)
def retranslateUi(self, CloudWidget):
_translate = QtCore.QCoreApplication.translate
CloudWidget.setTitle(_translate("CloudWidget", "Options"))
self.cloud_sync_label.setText(_translate("CloudWidget", "Sync with cloud"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
CloudWidget = QtWidgets.QGroupBox()
ui = Ui_CloudWidget()
ui.setupUi(CloudWidget)
CloudWidget.show()
sys.exit(app.exec_())

View file

@ -1,38 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>CloudWidget</class>
<widget class="QGroupBox" name="CloudWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>251</width>
<height>93</height>
</rect>
</property>
<property name="windowTitle">
<string notr="true">GroupBox</string>
</property>
<property name="title">
<string>Options</string>
</property>
<layout class="QFormLayout" name="cloud_layout">
<item row="0" column="0">
<widget class="QLabel" name="cloud_sync_label">
<property name="text">
<string>Sync with cloud</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QCheckBox" name="cloud_sync">
<property name="text">
<string notr="true"/>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>