1
0
Fork 0
mirror of synced 2024-06-26 10:11:19 +12:00

Delete unused classes GameUtils and CloudSaveUtils and move cloud save dialog to dialogs

Signed-off-by: loathingKernel <142770+loathingKernel@users.noreply.github.com>
This commit is contained in:
lennard 2023-02-08 23:19:01 +02:00 committed by loathingKernel
parent 4ec1f39109
commit b4586c9272
No known key found for this signature in database
GPG key ID: CE0C72D0B53821FD
7 changed files with 92 additions and 600 deletions

View file

@ -0,0 +1,82 @@
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
def __init__(
self,
igame: InstalledGame,
dt_local: datetime.datetime,
dt_remote: datetime.datetime,
newer: str,
):
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(self.title_label.text() + igame.title)
self.sync_ui.date_info_local.setText(dt_local.strftime("%A, %d. %B %Y %X"))
self.sync_ui.date_info_remote.setText(dt_remote.strftime("%A, %d. %B %Y %X"))
new_text = self.tr(" (newer)")
if newer == "remote":
self.sync_ui.cloud_gb.setTitle(self.sync_ui.cloud_gb.title() + new_text)
elif newer == "local":
self.sync_ui.local_gb.setTitle(self.sync_ui.local_gb.title() + new_text)
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):
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"), "local")
print(dlg.get_action())
if __name__ == '__main__':
test_dialog()

View file

@ -1,331 +0,0 @@
import datetime
import sys
from dataclasses import dataclass
from logging import getLogger
from typing import Union, List, Dict
from PyQt5.QtCore import QObject, pyqtSignal, QRunnable, QThreadPool, Qt, QSettings
from PyQt5.QtWidgets import QDialog, QMessageBox, QSizePolicy, QLayout, QApplication
from legendary.core import LegendaryCore
from legendary.models.game import SaveGameStatus, InstalledGame, SaveGameFile
from rare.models.game import RareGame
from rare.shared import LegendaryCoreSingleton, ArgumentsSingleton, ApiResultsSingleton
from rare.ui.components.dialogs.sync_save_dialog import Ui_SyncSaveDialog
from rare.utils.misc import icon
logger = getLogger("Cloud Saves")
@dataclass
class UploadModel:
rgame: RareGame
date_time: datetime.datetime
path: str
@dataclass
class DownloadModel:
rgame: RareGame
latest_save: SaveGameFile
path: str
class SaveWorker(QRunnable):
class Signals(QObject):
finished = pyqtSignal(RareGame, str)
def __init__(self, model: Union[UploadModel, DownloadModel]):
super(SaveWorker, self).__init__()
self.signals = SaveWorker.Signals()
self.setAutoDelete(True)
self.core = LegendaryCoreSingleton()
self.api_results = ApiResultsSingleton()
self.model = model
def run(self) -> None:
try:
if isinstance(self.model, DownloadModel):
self.core.download_saves(
self.model.rgame.app_name,
self.model.latest_save.manifest_name,
self.model.path,
)
else:
self.core.upload_save(
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))
logger.error(str(e))
return
try:
if isinstance(self.model, UploadModel):
logger.info("Updating cloud saves...")
result = self.core.get_save_games(self.model.rgame.app_name)
self.api_results.saves = result
except Exception as e:
self.signals.finished.emit(self.model.rgame, str(e))
logger.error(str(e))
return
self.signals.finished.emit(self.model.rgame, "")
class CloudSaveDialog(QDialog, Ui_SyncSaveDialog):
DOWNLOAD = 2
UPLOAD = 1
CANCEL = 0
def __init__(
self,
igame: InstalledGame,
dt_local: datetime.datetime,
dt_remote: datetime.datetime,
newer: str,
):
super(CloudSaveDialog, self).__init__()
self.setupUi(self)
self.setAttribute(Qt.WA_DeleteOnClose, True)
self.setWindowFlags(Qt.Dialog | Qt.CustomizeWindowHint | Qt.WindowTitleHint)
self.status = self.CANCEL
self.title_label.setText(self.title_label.text() + igame.title)
self.date_info_local.setText(dt_local.strftime("%A, %d. %B %Y %X"))
self.date_info_remote.setText(dt_remote.strftime("%A, %d. %B %Y %X"))
new_text = self.tr(" (newer)")
if newer == "remote":
self.cloud_gb.setTitle(self.cloud_gb.title() + new_text)
elif newer == "local":
self.local_gb.setTitle(self.local_gb.title() + new_text)
self.icon_local.setPixmap(icon("mdi.harddisk", "fa.desktop").pixmap(128, 128))
self.icon_remote.setPixmap(icon("mdi.cloud-outline", "ei.cloud").pixmap(128, 128))
self.upload_button.clicked.connect(lambda: self.btn_clicked(self.UPLOAD))
self.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):
self.exec_()
return self.status
def btn_clicked(self, status):
self.status = status
self.close()
class CloudSaveUtils(QObject):
sync_finished = pyqtSignal(RareGame)
def __init__(self):
super(CloudSaveUtils, self).__init__()
self.core = LegendaryCoreSingleton()
self.args = ArgumentsSingleton()
self.api_results = ApiResultsSingleton()
saves = self.api_results.saves
if not self.args.offline:
self.latest_saves = self.get_latest_saves(saves)
else:
self.latest_saves = dict()
self.settings = QSettings()
self.thread_pool = QThreadPool.globalInstance()
def get_latest_saves(self, saves: List[SaveGameFile]) -> Dict[str, SaveGameFile]:
save_games = set()
for igame in self.core.get_installed_list():
game = self.core.get_game(igame.app_name)
if self.core.is_installed(igame.app_name) and game.supports_cloud_saves:
save_games.add(igame.app_name)
latest_saves = dict()
for s in sorted(saves, key=lambda a: a.datetime):
if s.app_name in save_games:
latest_saves[s.app_name] = s
return latest_saves
def sync_before_launch_game(self, rgame: RareGame, ignore_settings=False) -> int:
if not ignore_settings:
default = self.settings.value("auto_sync_cloud", True, bool)
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)
except Exception as e:
logger.error(e)
savepath = ""
if savepath:
rgame.igame.save_path = savepath
self.core.lgd.set_installed_game(rgame.app_name, rgame.igame)
logger.info(f"Set save path of {rgame.title} to {savepath}")
elif not ignore_settings: # sync on startup
if (
QMessageBox.question(
None,
"Warning",
self.tr(
"Could not compute cloud save path. Please set it in Game settings manually. \nDo you want to launch {} anyway?"
).format(rgame.title),
QMessageBox.Yes | QMessageBox.No,
QMessageBox.No,
)
== QMessageBox.Yes
):
return False
else:
raise ValueError("No savepath detected")
else:
QMessageBox.warning(
None,
"Warning",
self.tr(
"No savepath found. Please set it in Game Settings manually"
),
)
return False
res, (dt_local, dt_remote) = self.core.check_savegame_state(
rgame.igame.save_path, self.latest_saves.get(rgame.app_name)
)
if res == SaveGameStatus.NO_SAVE:
return False
if res != SaveGameStatus.SAME_AGE:
newer = ""
if res == SaveGameStatus.REMOTE_NEWER:
newer = "remote"
elif res == SaveGameStatus.LOCAL_NEWER:
newer = "local"
if res == SaveGameStatus.REMOTE_NEWER and not dt_local:
self.download_saves(rgame)
return True
elif res == SaveGameStatus.LOCAL_NEWER and not dt_remote:
self.upload_saves(rgame, dt_local)
return True
result = CloudSaveDialog(rgame.igame, dt_local, dt_remote, newer).get_action()
if result == CloudSaveDialog.UPLOAD:
self.upload_saves(rgame, dt_local)
elif result == CloudSaveDialog.DOWNLOAD:
self.download_saves(rgame)
elif result == CloudSaveDialog.CANCEL:
raise AssertionError()
return True
return False
def game_finished(self, rgame: RareGame, ignore_settings=False, always_ask: bool = False):
if not ignore_settings:
default = self.settings.value("auto_sync_cloud", True, bool)
if not self.settings.value(f"{rgame.app_name}/auto_sync_cloud", default, bool):
self.sync_finished.emit(rgame)
return
if not rgame.igame.save_path:
try:
savepath = self.core.get_save_path(rgame.app_name)
except Exception as e:
logger.error(e)
savepath = ""
if savepath:
rgame.igame.save_path = savepath
self.core.lgd.set_installed_game(rgame.app_name, rgame.igame)
logger.info(f"Set save path of {rgame.title} to {savepath}")
else:
QMessageBox.warning(
None, "Warning", self.tr("No savepath set. Skip syncing with cloud")
)
return False
res, (dt_local, dt_remote) = self.core.check_savegame_state(
rgame.igame.save_path, self.latest_saves.get(rgame.app_name)
)
if res == SaveGameStatus.LOCAL_NEWER and not always_ask:
self.upload_saves(rgame, dt_local)
return
elif res == SaveGameStatus.NO_SAVE and not always_ask:
QMessageBox.warning(
None,
"No saves",
self.tr(
"There are no saves local and online. Maybe you have to change save path of {}"
).format(rgame.title),
)
self.sync_finished.emit(rgame)
return
elif res == SaveGameStatus.SAME_AGE and not always_ask:
self.sync_finished.emit(rgame)
return
# Remote newer
newer = ""
if res == SaveGameStatus.REMOTE_NEWER:
newer = "remote"
elif res == SaveGameStatus.LOCAL_NEWER:
newer = "local"
result = CloudSaveDialog(rgame.igame, dt_local, dt_remote, newer).get_action()
if result == CloudSaveDialog.UPLOAD:
self.upload_saves(rgame, dt_local)
elif result == CloudSaveDialog.DOWNLOAD:
self.download_saves(rgame)
def upload_saves(self, rgame: RareGame, dt_local):
logger.info(f"Uploading saves for {rgame.title}")
w = SaveWorker(UploadModel(rgame, dt_local, rgame.igame.save_path))
w.signals.finished.connect(self.worker_finished)
self.thread_pool.start(w)
def download_saves(self, rgame: RareGame):
logger.info(f"Downloading saves for {rgame.title}")
w = SaveWorker(
DownloadModel(
rgame, self.latest_saves.get(rgame.app_name), rgame.igame.save_path
)
)
w.signals.finished.connect(self.worker_finished)
self.thread_pool.start(w)
def worker_finished(self, rgame: RareGame, error_message: str,):
if not error_message:
self.sync_finished.emit(rgame)
self.latest_saves = self.get_latest_saves(self.api_results.saves)
else:
QMessageBox.warning(
None,
"Warning",
self.tr("Syncing with cloud failed: \n {}").format(error_message)
)
self.sync_finished.emit(rgame)
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"), "local")
dlg.show()
app.exec_()
if __name__ == '__main__':
test_dialog()

View file

@ -1,124 +0,0 @@
from logging import getLogger
from PyQt5.QtCore import QObject, pyqtSignal, QUrl, pyqtSlot
from PyQt5.QtGui import QDesktopServices
from PyQt5.QtWidgets import QMessageBox, QPushButton
from rare.models.game import RareGame
from rare.shared import LegendaryCoreSingleton, GlobalSignalsSingleton, ArgumentsSingleton
from .cloud_save_utils import CloudSaveUtils
logger = getLogger("GameUtils")
class GameUtils(QObject):
finished = pyqtSignal(str, str) # app_name, error
cloud_save_finished = pyqtSignal(str)
update_list = pyqtSignal(str)
def __init__(self, parent=None):
super(GameUtils, self).__init__(parent=parent)
self.core = LegendaryCoreSingleton()
self.signals = GlobalSignalsSingleton()
self.args = ArgumentsSingleton()
self.running_games = {}
self.launch_queue = {}
self.cloud_save_utils = CloudSaveUtils()
self.cloud_save_utils.sync_finished.connect(self.sync_finished)
def prepare_launch(
self, rgame: RareGame, offline: bool = False, skip_update_check: bool = False
):
dont_sync_after_finish = False
# TODO move this to helper
if rgame.game.supports_cloud_saves and not offline:
try:
sync = self.cloud_save_utils.sync_before_launch_game(rgame)
except ValueError:
logger.info("Cancel startup")
self.sync_finished(rgame)
return
except AssertionError:
dont_sync_after_finish = True
else:
if sync:
self.launch_queue[rgame.app_name] = (rgame, skip_update_check, offline)
return
self.sync_finished(rgame)
self.launch_game(
rgame, offline, skip_update_check, ask_sync_saves=dont_sync_after_finish
)
@pyqtSlot(RareGame, int)
def game_finished(self, rgame: RareGame, exit_code):
if self.running_games.get(rgame.app_name):
self.running_games.pop(rgame.app_name)
if exit_code == -1234:
return
self.finished.emit(rgame.app_name, "")
rgame.signals.game.finished.emit()
logger.info(f"Game exited with exit code: {exit_code}")
self.signals.discord_rpc.set_title.emit("")
if exit_code == 1 and rgame.is_origin:
msg_box = QMessageBox()
msg_box.setText(
self.tr(
"Origin is not installed. Do you want to download installer file? "
)
)
msg_box.addButton(QPushButton("Download"), QMessageBox.YesRole)
msg_box.addButton(QPushButton("Cancel"), QMessageBox.RejectRole)
resp = msg_box.exec()
# click install button
if resp == 0:
QDesktopServices.openUrl(QUrl("https://www.dm.origin.com/download"))
return
if exit_code != 0:
pass
"""
QMessageBox.warning(
None,
"Warning",
self.tr("Failed to launch {}. Check logs to find error").format(
self.core.get_game(app_name).app_title
),
)
"""
if rgame.app_name in self.running_games.keys():
self.running_games.pop(rgame.app_name)
if rgame.game.supports_cloud_saves:
if exit_code != 0:
r = QMessageBox.question(
None,
"Question",
self.tr(
"Game exited with code {}, which is not a normal code. "
"It could be caused by a crash. Do you want to sync cloud saves"
).format(exit_code),
buttons=QMessageBox.Yes | QMessageBox.No,
defaultButton=QMessageBox.Yes,
)
if r != QMessageBox.Yes:
return
# TODO move this to helper
self.cloud_save_utils.game_finished(rgame, always_ask=False)
@pyqtSlot(RareGame)
def sync_finished(self, rgame: RareGame):
if rgame.app_name in self.launch_queue.keys():
self.cloud_save_finished.emit(rgame.app_name)
params = self.launch_queue[rgame.app_name]
self.launch_queue.pop(rgame.app_name)
self.launch_game(*params)
else:
self.cloud_save_finished.emit(rgame.app_name)

View file

@ -2,7 +2,7 @@
# Form implementation generated from reading ui file 'rare/ui/components/dialogs/sync_save_dialog.ui'
#
# Created by: PyQt5 UI code generator 5.15.5
# 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.
@ -25,55 +25,9 @@ class Ui_SyncSaveDialog(object):
self.title_label.setSizePolicy(sizePolicy)
self.title_label.setObjectName("title_label")
self.verticalLayout.addWidget(self.title_label)
self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setObjectName("horizontalLayout")
self.local_gb = QtWidgets.QGroupBox(SyncSaveDialog)
self.local_gb.setObjectName("local_gb")
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.local_gb)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.date_info_local = QtWidgets.QLabel(self.local_gb)
self.date_info_local.setText("TextLabel")
self.date_info_local.setAlignment(QtCore.Qt.AlignCenter)
self.date_info_local.setObjectName("date_info_local")
self.verticalLayout_2.addWidget(self.date_info_local)
self.icon_local = QtWidgets.QLabel(self.local_gb)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.icon_local.sizePolicy().hasHeightForWidth())
self.icon_local.setSizePolicy(sizePolicy)
self.icon_local.setText("")
self.icon_local.setAlignment(QtCore.Qt.AlignCenter)
self.icon_local.setObjectName("icon_local")
self.verticalLayout_2.addWidget(self.icon_local)
self.upload_button = QtWidgets.QPushButton(self.local_gb)
self.upload_button.setObjectName("upload_button")
self.verticalLayout_2.addWidget(self.upload_button)
self.horizontalLayout.addWidget(self.local_gb)
self.cloud_gb = QtWidgets.QGroupBox(SyncSaveDialog)
self.cloud_gb.setObjectName("cloud_gb")
self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.cloud_gb)
self.verticalLayout_3.setObjectName("verticalLayout_3")
self.date_info_remote = QtWidgets.QLabel(self.cloud_gb)
self.date_info_remote.setText("TextLabel")
self.date_info_remote.setAlignment(QtCore.Qt.AlignCenter)
self.date_info_remote.setObjectName("date_info_remote")
self.verticalLayout_3.addWidget(self.date_info_remote)
self.icon_remote = QtWidgets.QLabel(self.cloud_gb)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.icon_remote.sizePolicy().hasHeightForWidth())
self.icon_remote.setSizePolicy(sizePolicy)
self.icon_remote.setText("")
self.icon_remote.setAlignment(QtCore.Qt.AlignCenter)
self.icon_remote.setObjectName("icon_remote")
self.verticalLayout_3.addWidget(self.icon_remote)
self.download_button = QtWidgets.QPushButton(self.cloud_gb)
self.download_button.setObjectName("download_button")
self.verticalLayout_3.addWidget(self.download_button)
self.horizontalLayout.addWidget(self.cloud_gb)
self.verticalLayout.addLayout(self.horizontalLayout)
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)
@ -89,10 +43,6 @@ class Ui_SyncSaveDialog(object):
_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.local_gb.setTitle(_translate("SyncSaveDialog", "Local"))
self.upload_button.setText(_translate("SyncSaveDialog", "Upload"))
self.cloud_gb.setTitle(_translate("SyncSaveDialog", "Cloud"))
self.download_button.setText(_translate("SyncSaveDialog", "Download"))
self.cancel_button.setText(_translate("SyncSaveDialog", "Cancel"))

View file

@ -28,92 +28,7 @@
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QGroupBox" name="local_gb">
<property name="title">
<string>Local</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QLabel" name="date_info_local">
<property name="text">
<string notr="true">TextLabel</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="icon_local">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string notr="true"/>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="upload_button">
<property name="text">
<string>Upload</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="cloud_gb">
<property name="title">
<string>Cloud</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QLabel" name="date_info_remote">
<property name="text">
<string notr="true">TextLabel</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="icon_remote">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string notr="true"/>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="download_button">
<property name="text">
<string>Download</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
<layout class="QHBoxLayout" name="sync_widget_layout"/>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">

View file

@ -15,9 +15,9 @@ class Ui_SyncWidget(object):
def setupUi(self, SyncWidget):
SyncWidget.setObjectName("SyncWidget")
SyncWidget.resize(208, 109)
self.verticalLayout = QtWidgets.QVBoxLayout(SyncWidget)
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
self.verticalLayout.setObjectName("verticalLayout")
self.main_layout = QtWidgets.QVBoxLayout(SyncWidget)
self.main_layout.setContentsMargins(0, 0, 0, 0)
self.main_layout.setObjectName("main_layout")
self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setObjectName("horizontalLayout")
self.local_gb = QtWidgets.QGroupBox(SyncWidget)
@ -72,7 +72,7 @@ class Ui_SyncWidget(object):
self.download_button.setObjectName("download_button")
self.cloud_layout.addWidget(self.download_button)
self.horizontalLayout.addWidget(self.cloud_gb)
self.verticalLayout.addLayout(self.horizontalLayout)
self.main_layout.addLayout(self.horizontalLayout)
self.retranslateUi(SyncWidget)

View file

@ -13,7 +13,7 @@
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<layout class="QVBoxLayout" name="main_layout">
<property name="leftMargin">
<number>0</number>
</property>