1
0
Fork 0
mirror of synced 2024-06-02 10:44:40 +12:00
Rare/rare/components/tabs/settings/legendary.py

195 lines
7.5 KiB
Python
Raw Normal View History

import platform
2021-09-14 05:46:50 +12:00
import re
2021-02-20 06:09:00 +13:00
from logging import getLogger
2021-10-11 09:08:31 +13:00
from typing import Tuple
2021-02-20 06:09:00 +13:00
from PyQt5.QtCore import Qt, QRunnable, QObject, pyqtSignal, QThreadPool, QSettings
2021-12-14 08:53:21 +13:00
from PyQt5.QtWidgets import QSizePolicy, QWidget, QFileDialog, QMessageBox
2021-02-20 06:09:00 +13:00
from rare.shared import LegendaryCoreSingleton
from rare.ui.components.tabs.settings.legendary import Ui_LegendarySettings
from rare.utils.extra_widgets import PathEdit, IndicatorLineEdit
from rare.utils.misc import get_size
2021-02-20 06:09:00 +13:00
logger = getLogger("LegendarySettings")
2021-02-20 00:57:55 +13:00
class RefreshGameMetaSignals(QObject):
2021-12-28 04:33:56 +13:00
finished = pyqtSignal()
def __init__(self):
super(RefreshGameMetaSignals, self).__init__()
2021-12-28 04:33:56 +13:00
class RefreshGameMetaWorker(QRunnable):
def __init__(self):
super(RefreshGameMetaWorker, self).__init__()
self.signals = RefreshGameMetaSignals()
2021-12-28 04:33:56 +13:00
self.setAutoDelete(True)
self.core = LegendaryCoreSingleton()
2021-12-28 04:33:56 +13:00
def run(self) -> None:
self.core.get_game_and_dlc_list(True, force_refresh=True)
2021-12-28 04:33:56 +13:00
self.signals.finished.emit()
class LegendarySettings(QWidget, Ui_LegendarySettings):
def __init__(self, parent=None):
super(LegendarySettings, self).__init__(parent=parent)
self.setupUi(self)
self.settings = QSettings()
self.core = LegendaryCoreSingleton()
2021-04-08 21:09:17 +12:00
2021-02-20 06:09:00 +13:00
# Default installation directory
2021-12-24 22:09:50 +13:00
self.install_dir = PathEdit(
self.core.get_default_install_dir(),
file_type=QFileDialog.DirectoryOnly,
save_func=self.path_save,
)
self.install_dir_layout.addWidget(self.install_dir)
2021-02-20 06:09:00 +13:00
# Max Workers
2021-12-24 22:09:50 +13:00
max_workers = self.core.lgd.config["Legendary"].getint(
"max_workers", fallback=0
)
self.max_worker_spin.setValue(max_workers)
self.max_worker_spin.valueChanged.connect(self.max_worker_save)
# Max memory
2021-12-24 22:09:50 +13:00
max_memory = self.core.lgd.config["Legendary"].getint("max_memory", fallback=0)
self.max_memory_spin.setValue(max_memory)
self.max_memory_spin.valueChanged.connect(self.max_memory_save)
# Preferred CDN
2021-12-24 22:09:50 +13:00
preferred_cdn = self.core.lgd.config["Legendary"].get(
"preferred_cdn", fallback=""
)
self.preferred_cdn_line.setText(preferred_cdn)
self.preferred_cdn_line.textChanged.connect(self.preferred_cdn_save)
# Disable HTTPS
2021-12-24 22:09:50 +13:00
disable_https = self.core.lgd.config["Legendary"].getboolean(
"disable_https", fallback=False
)
self.disable_https_check.setChecked(disable_https)
self.disable_https_check.stateChanged.connect(self.disable_https_save)
2021-04-06 02:13:27 +12:00
# Cleanup
2021-12-24 22:09:50 +13:00
self.clean_button.clicked.connect(lambda: self.cleanup(False))
self.clean_keep_manifests_button.clicked.connect(lambda: self.cleanup(True))
2021-05-19 23:33:16 +12:00
self.locale_edit = IndicatorLineEdit(
f"{self.core.language_code}-{self.core.country_code}",
edit_func=self.locale_edit_cb,
save_func=self.locale_save_cb,
horiz_policy=QSizePolicy.Minimum,
2021-12-24 22:09:50 +13:00
parent=self,
)
self.locale_layout.addWidget(self.locale_edit)
self.win32_cb.setChecked(self.settings.value("win32_meta", False, bool))
self.win32_cb.stateChanged.connect(lambda: self.settings.setValue("win32_meta", self.win32_cb.isChecked()))
self.mac_cb.setChecked(self.settings.value("mac_meta", platform.system() == "Darwin", bool))
self.mac_cb.stateChanged.connect(lambda: self.settings.setValue("mac_meta", self.mac_cb.isChecked()))
2021-12-28 04:33:56 +13:00
self.refresh_game_meta_btn.clicked.connect(self.refresh_game_meta)
def refresh_game_meta(self):
self.refresh_game_meta_btn.setDisabled(True)
self.refresh_game_meta_btn.setText(self.tr("Loading"))
worker = RefreshGameMetaWorker()
worker.signals.finished.connect(lambda: self.refresh_game_meta_btn.setDisabled(False))
worker.signals.finished.connect(lambda: self.refresh_game_meta_btn.setText(self.tr("Refresh game meta")))
QThreadPool.globalInstance().start(worker)
@staticmethod
def locale_edit_cb(text: str) -> Tuple[bool, str, str]:
if text:
2021-10-11 21:41:01 +13:00
if re.match("^[a-zA-Z]{2,3}[-_][a-zA-Z]{2,3}$", text):
language, country = text.replace("_", "-").split("-")
text = "-".join([language.lower(), country.upper()])
if bool(re.match("^[a-z]{2,3}-[A-Z]{2,3}$", text)):
return True, text, ""
else:
return False, text, IndicatorLineEdit.reasons.wrong_format
2021-05-19 23:33:16 +12:00
else:
return True, text, ""
2021-05-19 23:33:16 +12:00
def locale_save_cb(self, text: str):
if text:
self.core.egs.language_code, self.core.egs.country_code = text.split("-")
2021-09-14 05:46:50 +12:00
self.core.lgd.config.set("Legendary", "locale", text)
else:
2021-09-15 03:56:55 +12:00
if self.core.lgd.config.has_option("Legendary", "locale"):
self.core.lgd.config.remove_option("Legendary", "locale")
2021-05-20 07:09:14 +12:00
self.core.lgd.save_config()
def path_save(self, text: str):
self.core.lgd.config["Legendary"]["install_dir"] = text
if not text and "install_dir" in self.core.lgd.config["Legendary"].keys():
2021-02-20 06:09:00 +13:00
self.core.lgd.config["Legendary"].pop("install_dir")
else:
logger.debug(f"Set config install_dir to {text}")
2021-02-20 06:09:00 +13:00
self.core.lgd.save_config()
def max_worker_save(self, workers: str):
if workers := int(workers):
self.core.lgd.config.set("Legendary", "max_workers", str(workers))
else:
self.core.lgd.config.remove_option("Legendary", "max_workers")
self.core.lgd.save_config()
def max_memory_save(self, memory: str):
if memory := int(memory):
self.core.lgd.config.set("Legendary", "max_memory", str(memory))
else:
self.core.lgd.config.remove_option("Legendary", "max_memory")
self.core.lgd.save_config()
def preferred_cdn_save(self, cdn: str):
if cdn:
self.core.lgd.config.set("Legendary", "preferred_cdn", cdn.strip())
else:
self.core.lgd.config.remove_option("Legendary", "preferred_cdn")
self.core.lgd.save_config()
def disable_https_save(self, checked: int):
2021-12-24 22:09:50 +13:00
self.core.lgd.config.set(
"Legendary", "disable_https", str(bool(checked)).lower()
)
2021-02-20 06:09:00 +13:00
self.core.lgd.save_config()
2021-04-06 02:13:27 +12:00
2021-12-14 08:53:21 +13:00
def cleanup(self, keep_manifests: bool):
2021-04-06 02:13:27 +12:00
before = self.core.lgd.get_dir_size()
2021-12-24 22:09:50 +13:00
logger.debug("Removing app metadata...")
2021-04-06 02:13:27 +12:00
app_names = set(g.app_name for g in self.core.get_assets(update_assets=False))
self.core.lgd.clean_metadata(app_names)
if not keep_manifests:
2021-12-24 22:09:50 +13:00
logger.debug("Removing manifests...")
installed = [
(ig.app_name, ig.version, ig.platform) for ig in self.core.get_installed_list()
2021-12-24 22:09:50 +13:00
]
installed.extend(
(ig.app_name, ig.version, ig.platform) for ig in self.core.get_installed_dlc_list()
2021-12-24 22:09:50 +13:00
)
2021-04-06 02:13:27 +12:00
self.core.lgd.clean_manifests(installed)
2021-12-24 22:09:50 +13:00
logger.debug("Removing tmp data")
2021-04-06 02:13:27 +12:00
self.core.lgd.clean_tmp_data()
after = self.core.lgd.get_dir_size()
2021-12-24 22:09:50 +13:00
logger.info(
f"Cleanup complete! Removed {(before - after) / 1024 / 1024:.02f} MiB."
)
2021-04-23 00:34:06 +12:00
if (before - after) > 0:
2021-12-24 22:09:50 +13:00
QMessageBox.information(
self,
"Cleanup",
self.tr("Cleanup complete! Successfully removed {}").format(
get_size(before - after)
),
)
2021-04-06 02:13:27 +12:00
else:
QMessageBox.information(self, "Cleanup", "Nothing to clean")