104 lines
3.5 KiB
Python
104 lines
3.5 KiB
Python
|
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()
|