From d0f4e3b7c32cf47c0307597d240787fd1c078a59 Mon Sep 17 00:00:00 2001 From: Dummerle Date: Tue, 6 Apr 2021 20:55:59 +0200 Subject: [PATCH] Cloud saves: use max width; Groupbox Style --- Rare/Components/Tabs/CloudSaves/CloudSaves.py | 6 +- Rare/Components/Tabs/CloudSaves/SyncWidget.py | 15 +- Rare/Components/Tabs/Games/ImportWidget.py | 5 +- Rare/Components/Tabs/Settings/Legendary.py | 5 +- Rare/Styles/RareStyle.qss | 10 +- Rare/languages/de.qm | Bin 16458 -> 17684 bytes Rare/languages/de.ts | 184 ++++++++++++------ 7 files changed, 146 insertions(+), 79 deletions(-) diff --git a/Rare/Components/Tabs/CloudSaves/CloudSaves.py b/Rare/Components/Tabs/CloudSaves/CloudSaves.py index 72b52b6f..9dc45abb 100644 --- a/Rare/Components/Tabs/CloudSaves/CloudSaves.py +++ b/Rare/Components/Tabs/CloudSaves/CloudSaves.py @@ -48,12 +48,9 @@ class SyncSaves(QScrollArea): def setup_ui(self, saves: list): self.start_thread.disconnect() - - self.main_layout = QVBoxLayout() self.title = QLabel( f"

" + self.tr("Cloud Saves") + "

\n" + self.tr("Found Saves for folowing Games")) - self.main_layout.addWidget(self.title) saves_games = [] @@ -78,7 +75,6 @@ class SyncSaves(QScrollArea): logger.info(f'Got {len(latest_save)} remote save game(s)') self.widgets = [] - for igame in self.igames: game = self.core.get_game(igame.app_name) if not game.supports_cloud_saves: @@ -92,7 +88,9 @@ class SyncSaves(QScrollArea): self.widgets.append(sync_widget) self.widget = QWidget() + self.main_layout.addStretch(1) self.widget.setLayout(self.main_layout) + self.setWidgetResizable(True) self.setWidget(self.widget) def reload(self): diff --git a/Rare/Components/Tabs/CloudSaves/SyncWidget.py b/Rare/Components/Tabs/CloudSaves/SyncWidget.py index 7b4f6956..1f24795c 100644 --- a/Rare/Components/Tabs/CloudSaves/SyncWidget.py +++ b/Rare/Components/Tabs/CloudSaves/SyncWidget.py @@ -2,7 +2,7 @@ import os from logging import getLogger from PyQt5.QtCore import QThread, pyqtSignal, Qt -from PyQt5.QtWidgets import QWidget, QVBoxLayout, QPushButton, QHBoxLayout, QLabel +from PyQt5.QtWidgets import QVBoxLayout, QPushButton, QHBoxLayout, QLabel, QGroupBox from Rare.Components.Dialogs.PathInputDialog import PathInputDialog from custom_legendary.core import LegendaryCore @@ -37,12 +37,14 @@ class _DownloadThread(QThread): self.core.download_saves(self.app_name, self.latest_save.manifest_name, self.save_path, clean_dir=True) -class SyncWidget(QWidget): +class SyncWidget(QGroupBox): reload = pyqtSignal() def __init__(self, igame: InstalledGame, save, core: LegendaryCore): - super(SyncWidget, self).__init__() + super(SyncWidget, self).__init__(igame.title) + self.setObjectName("group") self.layout = QVBoxLayout() + self.setContentsMargins(10, 20, 10, 20) self.thr = None self.core = core self.save = save @@ -70,7 +72,7 @@ class SyncWidget(QWidget): self.logger.info('No cloud or local savegame found.') return - game_title = QLabel(f"

{igame.title}

") + # game_title = QLabel(f"

{igame.title}

") if self.dt_local: local_save_date = QLabel( @@ -124,7 +126,7 @@ class SyncWidget(QWidget): self.upload_button.clicked.connect(self.upload) self.download_button.clicked.connect(self.download) self.info_text = QLabel(status) - self.layout.addWidget(game_title) + # self.layout.addWidget(game_title) self.layout.addWidget(local_save_date) self.layout.addWidget(cloud_save_date) @@ -133,6 +135,7 @@ class SyncWidget(QWidget): self.save_path_text.setTextInteractionFlags(Qt.TextSelectableByMouse) self.save_path_text.setWordWrap(True) self.change_save_path = QPushButton(self.tr("Change path")) + self.change_save_path.setFixedWidth(100) self.change_save_path.clicked.connect(self.change_path) save_path_layout.addWidget(self.save_path_text) save_path_layout.addWidget(self.change_save_path) @@ -142,7 +145,7 @@ class SyncWidget(QWidget): button_layout.addWidget(self.upload_button) button_layout.addWidget(self.download_button) self.layout.addLayout(button_layout) - + self.layout.addStretch(1) self.setLayout(self.layout) def change_path(self): diff --git a/Rare/Components/Tabs/Games/ImportWidget.py b/Rare/Components/Tabs/Games/ImportWidget.py index 454ce669..a4c149a6 100644 --- a/Rare/Components/Tabs/Games/ImportWidget.py +++ b/Rare/Components/Tabs/Games/ImportWidget.py @@ -111,6 +111,7 @@ class ImportWidget(QWidget): if not path: path = self.path_edit.text() if not app_name: + # try to find app name if a_n := self.find_app_name(path): app_name = a_n else: @@ -141,7 +142,7 @@ class ImportWidget(QWidget): continue app_name = self.find_app_name(json_path) if not app_name: - logger.warning("Could not find app name") + logger.warning("Could not find app name at " + game_path) continue if LegendaryApi.import_game(self.core, app_name, game_path + path): @@ -166,4 +167,4 @@ class ImportWidget(QWidget): QMessageBox.information(self, "Imported Games", self.tr("Successfully imported {} Games. Reloading Library").format(imported)) self.update_list.emit() else: - QMessageBox.information(self, "Imported Games", "No Games were found") + QMessageBox.information(self, "Imported Games", self.tr("No Games were found")) diff --git a/Rare/Components/Tabs/Settings/Legendary.py b/Rare/Components/Tabs/Settings/Legendary.py index fcc2c428..64cb402b 100644 --- a/Rare/Components/Tabs/Settings/Legendary.py +++ b/Rare/Components/Tabs/Settings/Legendary.py @@ -39,8 +39,7 @@ class LegendarySettings(QWidget): #cleanup self.clean_layout = QVBoxLayout() - self.cleanup_widget = QGroupBox() - self.cleanup_widget.setTitle(self.tr("Cleanup")) + self.cleanup_widget = QGroupBox(self.tr("Cleanup")) self.clean_button = QPushButton(self.tr("Remove everything")) self.clean_button.clicked.connect(lambda: self.cleanup(False)) self.clean_layout.addWidget(self.clean_button) @@ -92,7 +91,7 @@ class LegendarySettings(QWidget): after = self.core.lgd.get_dir_size() logger.info(f'Cleanup complete! Removed {(before - after) / 1024 / 1024:.02f} MiB.') - if cleaned := (before-after) != 0: + if cleaned := (before-after) > 0: QMessageBox.information(self, "Cleanup", self.tr("Cleanup complete! Successfully removed {} MB").format(round(cleaned / 1024 / 1024, 3))) else: QMessageBox.information(self, "Cleanup", "Nothing to clean") diff --git a/Rare/Styles/RareStyle.qss b/Rare/Styles/RareStyle.qss index addacfa3..672096d1 100644 --- a/Rare/Styles/RareStyle.qss +++ b/Rare/Styles/RareStyle.qss @@ -31,14 +31,22 @@ QTabBar::tab:hover#main_tab_bar { } QGroupBox{ + padding: 4px; + margin: 8px; +} + +QGroupBox#game_widget_icon{ border: none; + padding: 0; + margin: 0; } QGroupBox#group{ font-size: 15px; + font-weight: bold; border: 1px solid white; - padding: 8px; margin-top: 10px; + padding: 8px; } QTabBar::tab:disabled { diff --git a/Rare/languages/de.qm b/Rare/languages/de.qm index c3cc547d1d2a8bcd0a21d4c19f23bdf4d6fda13b..e7d7940be62c485dacb6b014900e6c17213d2924 100644 GIT binary patch delta 2060 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 bkv7hH%x91h BaseInstalledWidget - + Do you want to launch {} Möchtest du {} starten @@ -83,40 +83,45 @@ Die Größe des Downloads ist 0. Spiel existiert bereits - + Installation finished Installation abgeschlossen - + Installing Game: No active download Installierendes Spiel: Kein aktiver Download - + Download speed Geschwindigkeit - + Cache used Benutzter Cache - + Downloaded Runtergeladen - + Time left: Zeit übrig: - + Finished Download of game {} Downlaod von {} abgeschlossen + + + Download finished. Reload library + Download abgeschlossen. Spiele neu laden + DxvkWidget @@ -159,32 +164,32 @@ GameActions - + Uninstall game Spiel deinstallieren - + Uninstall Deinstallieren - + Verify Game Spieldateien überprüfen - + Verify Überprüfen - + Repair Game Spiel reparieren - + Repair Reparieren @@ -192,50 +197,50 @@ GameInfo - + Repair file does not exist or game does not need a repair. Please verify game first Reparationsdatei existiert nicht oder das Spiel braucht keine Reperatur. Bitte das spiel zuerst überprüfen - + Verification failed, {} file(s) corrupted, {} file(s) are missing. Do you want to repair them? Überprüfung fehlgeschlagen, {} Datei(en) fehlerhaft, {} Datei(en) fehlen. Willst du das Spiel reparieren? - + Developer: Entwickler: - + Install size: Größe: - + Install path: Installationsordner: Are you sure to uninstall {} - Möchtest du {} wirklich deinstallieren + Möchtest du {} wirklich deinstallieren GameList - + Launch Starten - + Game running Spiel läuft - + Installed Games: {} Available Games: {} Installierte Spiele: {} Verfügbare Spiele: {} @@ -360,22 +365,22 @@ Keine valide Session gefunden - + Back Zurück - + Select path to game Wähle den Pfad zum Spiel - + Import Game Spiel importieren - + Import all games from Epic Games Launcher Alle Spiele aus dem Epic Games Launcher importieren @@ -385,45 +390,55 @@ {} Spiele erfolgreich importiert - + Override app name (Only if imported game from legendary or the app could not find the app name) App Name überschreiben (Nur falls das Spiel von Legendary importiert wird oder der App Name nicht gefunden wird - + Could not find app name Konnte den Appnamen nicht finden - + Successfully imported {}. Reload library Erfolgreich {} importiert. Spiele neu laden - + Failed to import {} {} Konnte nicht importiert werden - + Successfully imported {} Games. Reloading Library Erfolgreich {} Spiele importiert. Spiele neu laden + + + Import existing game from Epic Games Launcher + Ein bereits existierendes Spiel aus dem Epic Games Launcher importieren + + + + No Games were found + Keine Spiele wurden gefunden + InfoTabs - + Back Zurück - + Game Info Spielinfo - + Settings Einstellungen @@ -431,27 +446,42 @@ InstallDialog - + Max workers (0: Default) Maximale Anzahl Downloadprozessen(Standard: 0) + + + <h3>Install {}</h3> + <h3>Installiere {}</h3> + + + + Force download + Download erzwingen + + + + Ignore free space (Warning!) + Freien Speicherplatz ignorieren (Achtung!) + InstallInfoDialog - + Download size: {}GB Install size: {}GB Downloadgröße: {}GB Installationsgröße: {} GB - + Install Installieren - + Cancel Abbruch @@ -518,22 +548,22 @@ Installationsgröße: {} GB Maximale Anzahl Downloadprozesse (Weniger: langsamer)(Standard: 0) - + Cleanup Aufräumen - + Remove everything Alles aufräumen - + Clean, but keep manifests Aufräumen, aber Manifests behalten - + Cleanup complete! Successfully removed {} MB Fertig! Es wurden {} MB entfernt @@ -695,97 +725,97 @@ Installationsgröße: {} GB SyncWidget - + Path not found Ordner nicht gefunden - + Local Save date: Lokales Speicherdatum: - + No Local Save files Keine Lokalen Dateien - + Cloud save date: Online Speicherdatum: - + No Cloud saves Keine Online Speicherstände - + Game is up to date Spiel ist aktuell - + Upload anyway Trotzdem hochladen - + Download anyway Trotzdem herunterladen - + Cloud save is newer Online Speicherstand ist aktueller - + Download Cloud saves Online Speicherstand herunterladen - + Upload Saves Spielstände hochladen - + Local save is newer Lokaler Speicher ist aktueller - + Upload saves Spielstände hochladen - + Download saves Spielstand herunterladen - + Change path Pfad ändern - + Uploading... Hochladen... - + Upload finished Hochladen abgeschlossen - + Downloading... Runterladen... - + Download finished Download abgeschlossen @@ -798,10 +828,38 @@ Installationsgröße: {} GB Spiele + + UninstallDialog + + + Do you really want to uninstall {} + Möchtest du wirklich {} deinstallieren + + + + Keep Files + Dateien behalten + + + + Do you want to keep files? + Willst du die Dateien behalten? + + + + Uninstall + Deinstallieren + + + + Cancel + Abbruch + + UpdateWidget - + Update Game Spiel updaten