2021-02-10 23:48:25 +13:00
|
|
|
import os
|
2021-12-04 13:11:20 +13:00
|
|
|
import platform
|
2022-05-27 22:23:08 +12:00
|
|
|
import sys
|
2021-05-24 00:15:36 +12:00
|
|
|
from multiprocessing import Queue as MPQueue
|
2022-01-14 07:49:39 +13:00
|
|
|
from typing import Tuple
|
2021-02-10 23:48:25 +13:00
|
|
|
|
2021-05-23 05:52:58 +12:00
|
|
|
from PyQt5.QtCore import Qt, QObject, QRunnable, QThreadPool, pyqtSignal, pyqtSlot
|
2022-01-13 11:46:46 +13:00
|
|
|
from PyQt5.QtGui import QCloseEvent, QKeyEvent
|
2022-05-27 22:23:08 +12:00
|
|
|
from PyQt5.QtWidgets import QDialog, QFileDialog, QCheckBox
|
2022-07-08 05:19:52 +12:00
|
|
|
|
2022-07-11 04:32:42 +12:00
|
|
|
from rare.lgndr.api_arguments import LgndrInstallGameArgs
|
2022-07-11 22:22:17 +12:00
|
|
|
from rare.lgndr.api_exception import LgndrException
|
2022-04-19 02:51:51 +12:00
|
|
|
from rare.lgndr.core import LegendaryCore
|
2022-01-13 11:46:46 +13:00
|
|
|
from legendary.models.downloading import ConditionCheckResult
|
|
|
|
from legendary.models.game import Game
|
2021-09-07 07:10:18 +12:00
|
|
|
from legendary.utils.selective_dl import games
|
2022-04-13 10:56:45 +12:00
|
|
|
|
2022-07-08 05:19:52 +12:00
|
|
|
from rare.shared import LegendaryCLISingleton, LegendaryCoreSingleton, ApiResultsSingleton, ArgumentsSingleton
|
2021-05-21 11:47:03 +12:00
|
|
|
from rare.ui.components.dialogs.install_dialog import Ui_InstallDialog
|
2021-04-23 00:34:06 +12:00
|
|
|
from rare.utils.extra_widgets import PathEdit
|
2021-05-24 00:15:36 +12:00
|
|
|
from rare.utils.models import InstallDownloadModel, InstallQueueItemModel
|
2021-05-21 09:00:38 +12:00
|
|
|
from rare.utils.utils import get_size
|
2021-02-10 23:48:25 +13:00
|
|
|
|
|
|
|
|
2021-05-21 11:47:03 +12:00
|
|
|
class InstallDialog(QDialog, Ui_InstallDialog):
|
2021-05-26 08:37:50 +12:00
|
|
|
result_ready = pyqtSignal(InstallQueueItemModel)
|
2021-02-18 05:46:03 +13:00
|
|
|
|
2022-05-27 22:23:08 +12:00
|
|
|
def __init__(self, dl_item: InstallQueueItemModel, update=False, silent=False, parent=None):
|
2021-05-23 05:52:58 +12:00
|
|
|
super(InstallDialog, self).__init__(parent)
|
2021-05-26 08:37:50 +12:00
|
|
|
self.setupUi(self)
|
2021-05-23 05:52:58 +12:00
|
|
|
self.setAttribute(Qt.WA_DeleteOnClose, True)
|
2021-05-24 07:50:31 +12:00
|
|
|
self.setWindowFlags(Qt.Dialog | Qt.CustomizeWindowHint | Qt.WindowTitleHint)
|
2021-05-21 11:47:03 +12:00
|
|
|
|
2022-02-26 06:43:27 +13:00
|
|
|
self.core = LegendaryCoreSingleton()
|
|
|
|
self.api_results = ApiResultsSingleton()
|
2021-05-24 00:15:36 +12:00
|
|
|
self.dl_item = dl_item
|
|
|
|
self.dl_item.status_q = MPQueue()
|
|
|
|
self.app_name = self.dl_item.options.app_name
|
2022-05-27 22:23:08 +12:00
|
|
|
self.game = (
|
|
|
|
self.core.get_game(self.app_name)
|
|
|
|
if not self.dl_item.options.overlay
|
2022-01-13 11:46:46 +13:00
|
|
|
else Game(app_name=self.app_name, app_title="Epic Overlay")
|
2022-05-27 22:23:08 +12:00
|
|
|
)
|
2022-01-16 04:44:22 +13:00
|
|
|
|
2022-05-27 22:23:08 +12:00
|
|
|
self.game_path = self.game.metadata.get("customAttributes", {}).get("FolderName", {}).get("value", "")
|
2022-01-14 07:49:39 +13:00
|
|
|
|
2021-05-26 08:37:50 +12:00
|
|
|
self.update = update
|
|
|
|
self.silent = silent
|
2021-05-21 11:47:03 +12:00
|
|
|
|
2021-10-13 08:11:52 +13:00
|
|
|
self.options_changed = False
|
|
|
|
self.worker_running = False
|
|
|
|
self.reject_close = True
|
|
|
|
|
2021-05-23 09:07:47 +12:00
|
|
|
self.threadpool = QThreadPool(self)
|
|
|
|
self.threadpool.setMaxThreadCount(1)
|
2021-05-21 11:47:03 +12:00
|
|
|
|
2021-05-22 02:48:15 +12:00
|
|
|
header = self.tr("Update") if update else self.tr("Install")
|
2021-12-24 22:09:50 +13:00
|
|
|
self.install_dialog_label.setText(f'<h3>{header} "{self.game.app_title}"</h3>')
|
|
|
|
self.setWindowTitle(f'{self.windowTitle()} - {header} "{self.game.app_title}"')
|
2021-04-05 21:53:33 +12:00
|
|
|
|
2022-01-14 07:01:52 +13:00
|
|
|
if not self.dl_item.options.base_path:
|
2022-05-27 22:23:08 +12:00
|
|
|
self.dl_item.options.base_path = self.core.lgd.config.get(
|
|
|
|
"Legendary", "install_dir", fallback=os.path.expanduser("~/legendary")
|
|
|
|
)
|
2021-05-21 11:47:03 +12:00
|
|
|
|
2021-12-24 22:09:50 +13:00
|
|
|
self.install_dir_edit = PathEdit(
|
2022-01-14 07:01:52 +13:00
|
|
|
path=self.dl_item.options.base_path,
|
2021-12-24 22:09:50 +13:00
|
|
|
file_type=QFileDialog.DirectoryOnly,
|
|
|
|
edit_func=self.option_changed,
|
|
|
|
parent=self,
|
|
|
|
)
|
2021-05-22 02:48:15 +12:00
|
|
|
self.install_dir_layout.addWidget(self.install_dir_edit)
|
2021-05-21 11:47:03 +12:00
|
|
|
|
2021-05-26 08:37:50 +12:00
|
|
|
if self.update:
|
2021-05-21 11:47:03 +12:00
|
|
|
self.install_dir_label.setVisible(False)
|
2021-05-22 02:48:15 +12:00
|
|
|
self.install_dir_edit.setVisible(False)
|
2022-02-05 10:12:00 +13:00
|
|
|
self.shortcut_lbl.setVisible(False)
|
|
|
|
self.shortcut_cb.setVisible(False)
|
|
|
|
self.shortcut_cb.setChecked(False)
|
2021-02-10 23:48:25 +13:00
|
|
|
|
2022-05-27 22:23:08 +12:00
|
|
|
self.error_box()
|
2021-06-08 01:42:49 +12:00
|
|
|
|
2021-12-04 13:11:20 +13:00
|
|
|
platforms = ["Windows"]
|
2022-02-26 06:43:27 +13:00
|
|
|
if dl_item.options.app_name in self.api_results.bit32_games:
|
2021-12-04 13:11:20 +13:00
|
|
|
platforms.append("Win32")
|
2022-02-26 06:43:27 +13:00
|
|
|
if dl_item.options.app_name in self.api_results.mac_games:
|
2021-12-04 13:11:20 +13:00
|
|
|
platforms.append("Mac")
|
|
|
|
self.platform_combo_box.addItems(platforms)
|
2022-05-27 22:23:08 +12:00
|
|
|
self.platform_combo_box.currentIndexChanged.connect(lambda: self.option_changed(None))
|
2021-12-24 22:09:50 +13:00
|
|
|
self.platform_combo_box.currentIndexChanged.connect(
|
2022-05-27 22:23:08 +12:00
|
|
|
lambda i: self.error_box(
|
|
|
|
self.tr("Warning"),
|
2021-12-24 22:09:50 +13:00
|
|
|
self.tr("You will not be able to run the Game if you choose {}").format(
|
|
|
|
self.platform_combo_box.itemText(i)
|
|
|
|
),
|
|
|
|
)
|
2022-05-27 22:23:08 +12:00
|
|
|
if (self.platform_combo_box.currentText() == "Mac" and platform.system() != "Darwin")
|
2021-12-24 22:09:50 +13:00
|
|
|
else None
|
|
|
|
)
|
2021-12-06 08:11:11 +13:00
|
|
|
|
|
|
|
if platform.system() == "Darwin" and "Mac" in platforms:
|
|
|
|
self.platform_combo_box.setCurrentIndex(platforms.index("Mac"))
|
2021-12-04 13:11:20 +13:00
|
|
|
|
2022-05-27 22:23:08 +12:00
|
|
|
self.max_workers_spin.setValue(self.core.lgd.config.getint("Legendary", "max_workers", fallback=0))
|
2021-05-26 08:37:50 +12:00
|
|
|
self.max_workers_spin.valueChanged.connect(self.option_changed)
|
2021-05-24 00:52:39 +12:00
|
|
|
|
2022-05-27 22:23:08 +12:00
|
|
|
self.max_memory_spin.setValue(self.core.lgd.config.getint("Legendary", "max_memory", fallback=0))
|
2022-05-27 08:03:17 +12:00
|
|
|
self.max_memory_spin.valueChanged.connect(self.option_changed)
|
|
|
|
|
|
|
|
self.dl_optimizations_check.stateChanged.connect(self.option_changed)
|
2021-05-26 08:37:50 +12:00
|
|
|
self.force_download_check.stateChanged.connect(self.option_changed)
|
|
|
|
self.ignore_space_check.stateChanged.connect(self.option_changed)
|
2022-05-27 22:23:08 +12:00
|
|
|
self.download_only_check.stateChanged.connect(lambda: self.non_reload_option_changed("download_only"))
|
|
|
|
self.shortcut_cb.stateChanged.connect(lambda: self.non_reload_option_changed("shortcut"))
|
2021-05-22 02:48:15 +12:00
|
|
|
self.sdl_list_checks = list()
|
|
|
|
try:
|
2021-05-24 00:15:36 +12:00
|
|
|
for key, info in games[self.app_name].items():
|
2021-12-24 22:09:50 +13:00
|
|
|
cb = QDataCheckBox(info["name"], info["tags"])
|
|
|
|
if key == "__required":
|
|
|
|
self.dl_item.options.sdl_list.extend(info["tags"])
|
2021-05-22 02:48:15 +12:00
|
|
|
cb.setChecked(True)
|
|
|
|
cb.setDisabled(True)
|
|
|
|
self.sdl_list_layout.addWidget(cb)
|
|
|
|
self.sdl_list_checks.append(cb)
|
|
|
|
self.sdl_list_frame.resize(self.sdl_list_frame.minimumSize())
|
2021-05-23 05:52:58 +12:00
|
|
|
for cb in self.sdl_list_checks:
|
2021-05-26 08:37:50 +12:00
|
|
|
cb.stateChanged.connect(self.option_changed)
|
2022-04-13 10:56:45 +12:00
|
|
|
except (KeyError, AttributeError):
|
2022-01-07 12:29:29 +13:00
|
|
|
self.sdl_list_frame.setVisible(False)
|
|
|
|
self.sdl_list_label.setVisible(False)
|
2021-05-22 02:48:15 +12:00
|
|
|
|
2021-05-26 08:37:50 +12:00
|
|
|
self.install_button.setEnabled(False)
|
2021-02-10 23:48:25 +13:00
|
|
|
|
2022-01-13 11:46:46 +13:00
|
|
|
if self.dl_item.options.overlay:
|
|
|
|
self.platform_label.setVisible(False)
|
|
|
|
self.platform_combo_box.setVisible(False)
|
|
|
|
self.ignore_space_check.setVisible(False)
|
|
|
|
self.ignore_space_label.setVisible(False)
|
2022-01-20 08:29:12 +13:00
|
|
|
self.download_only_check.setVisible(False)
|
|
|
|
self.download_only_label.setVisible(False)
|
2022-02-05 10:12:00 +13:00
|
|
|
self.shortcut_cb.setVisible(False)
|
|
|
|
self.shortcut_lbl.setVisible(False)
|
|
|
|
|
|
|
|
if platform.system() == "Darwin":
|
|
|
|
self.shortcut_cb.setDisabled(True)
|
|
|
|
self.shortcut_cb.setChecked(False)
|
|
|
|
self.shortcut_cb.setToolTip(self.tr("Creating a shortcut is not supported on MacOS"))
|
|
|
|
|
2022-04-13 10:56:45 +12:00
|
|
|
self.install_preqs_lbl.setVisible(False)
|
|
|
|
self.install_preqs_check.setVisible(False)
|
|
|
|
self.install_preqs_check.stateChanged.connect(lambda: self.non_reload_option_changed("install_preqs"))
|
|
|
|
|
2022-02-05 10:12:00 +13:00
|
|
|
self.non_reload_option_changed("shortcut")
|
2022-01-13 11:46:46 +13:00
|
|
|
|
2021-05-26 08:37:50 +12:00
|
|
|
self.cancel_button.clicked.connect(self.cancel_clicked)
|
|
|
|
self.verify_button.clicked.connect(self.verify_clicked)
|
|
|
|
self.install_button.clicked.connect(self.install_clicked)
|
2021-05-24 04:38:33 +12:00
|
|
|
|
2021-05-22 02:48:15 +12:00
|
|
|
self.resize(self.minimumSize())
|
2021-08-17 06:41:33 +12:00
|
|
|
|
2021-05-26 18:37:55 +12:00
|
|
|
def execute(self):
|
2021-05-26 08:37:50 +12:00
|
|
|
if self.silent:
|
|
|
|
self.reject_close = False
|
|
|
|
self.get_download_info()
|
|
|
|
else:
|
2021-09-11 09:30:59 +12:00
|
|
|
self.verify_clicked()
|
2021-05-26 08:37:50 +12:00
|
|
|
self.show()
|
|
|
|
|
2021-05-24 00:15:36 +12:00
|
|
|
def get_options(self):
|
2022-05-27 22:23:08 +12:00
|
|
|
self.dl_item.options.base_path = self.install_dir_edit.text() if not self.update else None
|
2022-01-13 11:46:46 +13:00
|
|
|
|
2021-05-24 00:15:36 +12:00
|
|
|
self.dl_item.options.max_workers = self.max_workers_spin.value()
|
2022-07-10 11:34:53 +12:00
|
|
|
self.dl_item.options.shared_memory = self.max_memory_spin.value()
|
|
|
|
self.dl_item.options.order_opt = self.dl_optimizations_check.isChecked()
|
2021-05-24 00:15:36 +12:00
|
|
|
self.dl_item.options.force = self.force_download_check.isChecked()
|
2022-07-10 11:34:53 +12:00
|
|
|
self.dl_item.options.ignore_space = self.ignore_space_check.isChecked()
|
2021-05-24 00:52:39 +12:00
|
|
|
self.dl_item.options.no_install = self.download_only_check.isChecked()
|
2022-05-27 08:03:17 +12:00
|
|
|
self.dl_item.options.platform = self.platform_combo_box.currentText()
|
2021-12-24 22:09:50 +13:00
|
|
|
self.dl_item.options.sdl_list = [""]
|
2021-05-24 00:15:36 +12:00
|
|
|
for cb in self.sdl_list_checks:
|
|
|
|
if data := cb.isChecked():
|
2021-09-12 23:23:40 +12:00
|
|
|
# noinspection PyTypeChecker
|
2021-05-24 00:15:36 +12:00
|
|
|
self.dl_item.options.sdl_list.extend(data)
|
|
|
|
|
|
|
|
def get_download_info(self):
|
2021-05-26 08:37:50 +12:00
|
|
|
self.dl_item.download = None
|
2022-01-13 11:46:46 +13:00
|
|
|
info_worker = InstallInfoWorker(self.core, self.dl_item, self.game)
|
2021-05-26 08:37:50 +12:00
|
|
|
info_worker.setAutoDelete(True)
|
|
|
|
info_worker.signals.result.connect(self.on_worker_result)
|
|
|
|
info_worker.signals.failed.connect(self.on_worker_failed)
|
|
|
|
info_worker.signals.finished.connect(self.on_worker_finished)
|
|
|
|
self.worker_running = True
|
|
|
|
self.threadpool.start(info_worker)
|
|
|
|
|
|
|
|
def verify_clicked(self):
|
2022-05-27 22:23:08 +12:00
|
|
|
self.error_box()
|
2021-05-22 02:48:15 +12:00
|
|
|
message = self.tr("Updating...")
|
|
|
|
self.download_size_info_label.setText(message)
|
2022-05-27 22:23:08 +12:00
|
|
|
self.download_size_info_label.setStyleSheet("font-style: italic; font-weight: normal")
|
2021-05-22 02:48:15 +12:00
|
|
|
self.install_size_info_label.setText(message)
|
2022-05-27 22:23:08 +12:00
|
|
|
self.install_size_info_label.setStyleSheet("font-style: italic; font-weight: normal")
|
2021-05-24 07:50:31 +12:00
|
|
|
self.cancel_button.setEnabled(False)
|
2021-05-24 04:38:33 +12:00
|
|
|
self.verify_button.setEnabled(False)
|
2021-05-21 11:47:03 +12:00
|
|
|
self.install_button.setEnabled(False)
|
2021-05-24 04:38:33 +12:00
|
|
|
self.options_changed = False
|
2021-05-26 08:37:50 +12:00
|
|
|
self.get_options()
|
|
|
|
self.get_download_info()
|
2021-05-21 11:47:03 +12:00
|
|
|
|
2022-01-14 07:49:39 +13:00
|
|
|
def option_changed(self, path) -> Tuple[bool, str, str]:
|
2021-05-24 04:38:33 +12:00
|
|
|
self.options_changed = True
|
|
|
|
self.install_button.setEnabled(False)
|
|
|
|
self.verify_button.setEnabled(not self.worker_running)
|
2022-01-14 07:49:39 +13:00
|
|
|
return True, path, ""
|
2021-05-24 04:38:33 +12:00
|
|
|
|
2021-10-15 10:57:57 +13:00
|
|
|
def non_reload_option_changed(self, option: str):
|
|
|
|
if option == "download_only":
|
|
|
|
self.dl_item.options.no_install = self.download_only_check.isChecked()
|
2022-02-05 10:12:00 +13:00
|
|
|
elif option == "shortcut":
|
|
|
|
self.dl_item.options.create_shortcut = self.shortcut_cb.isChecked()
|
2022-04-13 10:56:45 +12:00
|
|
|
elif option == "install_preqs":
|
|
|
|
self.dl_item.options.install_preqs = self.install_preqs_check.isChecked()
|
2021-10-15 10:57:57 +13:00
|
|
|
|
2021-05-26 08:37:50 +12:00
|
|
|
def cancel_clicked(self):
|
2021-05-24 04:38:33 +12:00
|
|
|
self.dl_item.download = None
|
2021-05-26 08:37:50 +12:00
|
|
|
self.reject_close = False
|
2021-02-18 05:46:03 +13:00
|
|
|
self.close()
|
|
|
|
|
2021-05-26 08:37:50 +12:00
|
|
|
def install_clicked(self):
|
|
|
|
self.reject_close = False
|
2021-05-21 11:47:03 +12:00
|
|
|
self.close()
|
2021-02-18 05:46:03 +13:00
|
|
|
|
2021-05-26 08:37:50 +12:00
|
|
|
def on_worker_result(self, dl_item: InstallDownloadModel):
|
|
|
|
self.dl_item.download = dl_item
|
|
|
|
download_size = self.dl_item.download.analysis.dl_size
|
|
|
|
install_size = self.dl_item.download.analysis.install_size
|
|
|
|
if download_size:
|
|
|
|
self.download_size_info_label.setText("{}".format(get_size(download_size)))
|
2022-05-27 22:23:08 +12:00
|
|
|
self.download_size_info_label.setStyleSheet("font-style: normal; font-weight: bold")
|
2021-05-26 08:37:50 +12:00
|
|
|
self.install_button.setEnabled(not self.options_changed)
|
2021-05-21 11:47:03 +12:00
|
|
|
else:
|
2021-05-26 08:37:50 +12:00
|
|
|
self.install_size_info_label.setText(self.tr("Game already installed"))
|
2022-05-27 22:23:08 +12:00
|
|
|
self.install_size_info_label.setStyleSheet("font-style: italics; font-weight: normal")
|
2021-05-26 08:37:50 +12:00
|
|
|
self.install_size_info_label.setText("{}".format(get_size(install_size)))
|
2022-05-27 22:23:08 +12:00
|
|
|
self.install_size_info_label.setStyleSheet("font-style: normal; font-weight: bold")
|
2021-05-26 08:37:50 +12:00
|
|
|
self.verify_button.setEnabled(self.options_changed)
|
|
|
|
self.cancel_button.setEnabled(True)
|
2021-05-26 08:49:53 +12:00
|
|
|
if self.silent:
|
|
|
|
self.close()
|
2022-04-13 10:56:45 +12:00
|
|
|
if platform.system() == "Windows" or ArgumentsSingleton().debug:
|
|
|
|
if dl_item.igame.prereq_info and not dl_item.igame.prereq_info.get("installed", False):
|
|
|
|
self.install_preqs_check.setVisible(True)
|
|
|
|
self.install_preqs_lbl.setVisible(True)
|
|
|
|
self.install_preqs_check.setText(
|
2022-05-27 22:23:08 +12:00
|
|
|
self.tr("Also install: {}").format(dl_item.igame.prereq_info.get("name", ""))
|
|
|
|
)
|
2021-05-26 08:37:50 +12:00
|
|
|
|
|
|
|
def on_worker_failed(self, message: str):
|
|
|
|
error_text = self.tr("Error")
|
|
|
|
self.download_size_info_label.setText(error_text)
|
|
|
|
self.install_size_info_label.setText(error_text)
|
2022-05-27 22:23:08 +12:00
|
|
|
self.error_box(error_text, message)
|
2021-05-24 04:38:33 +12:00
|
|
|
self.verify_button.setEnabled(self.options_changed)
|
2021-05-24 07:50:31 +12:00
|
|
|
self.cancel_button.setEnabled(True)
|
2021-05-26 08:49:53 +12:00
|
|
|
if self.silent:
|
|
|
|
self.close()
|
2021-02-18 05:46:03 +13:00
|
|
|
|
2022-05-27 22:23:08 +12:00
|
|
|
def error_box(self, label: str = "", message: str = ""):
|
|
|
|
self.warn_label.setVisible(bool(label))
|
|
|
|
self.warn_label.setText(label)
|
|
|
|
self.warn_message.setVisible(bool(message))
|
|
|
|
self.warn_message.setText(message)
|
|
|
|
|
2021-05-26 08:37:50 +12:00
|
|
|
def on_worker_finished(self):
|
|
|
|
self.worker_running = False
|
|
|
|
|
|
|
|
# lk: happens when close() is called, also when top right 'X' is pressed.
|
2021-05-26 08:49:53 +12:00
|
|
|
# lk: reject any events not coming from the buttons in case the WM
|
2021-05-26 08:37:50 +12:00
|
|
|
# lk: doesn't honor the window hints
|
2021-05-24 04:38:33 +12:00
|
|
|
def closeEvent(self, a0: QCloseEvent) -> None:
|
2021-05-26 08:37:50 +12:00
|
|
|
if self.reject_close:
|
|
|
|
a0.ignore()
|
|
|
|
else:
|
|
|
|
self.threadpool.clear()
|
|
|
|
self.threadpool.waitForDone()
|
|
|
|
self.result_ready.emit(self.dl_item)
|
|
|
|
a0.accept()
|
2021-05-24 04:38:33 +12:00
|
|
|
|
2022-01-13 11:46:46 +13:00
|
|
|
def keyPressEvent(self, e: QKeyEvent) -> None:
|
|
|
|
if e.key() == Qt.Key_Escape:
|
|
|
|
self.cancel_clicked()
|
|
|
|
|
2021-02-18 05:46:03 +13:00
|
|
|
|
2022-05-06 00:25:28 +12:00
|
|
|
class InstallInfoWorker(QRunnable):
|
|
|
|
class Signals(QObject):
|
|
|
|
result = pyqtSignal(InstallDownloadModel)
|
|
|
|
failed = pyqtSignal(str)
|
|
|
|
finished = pyqtSignal()
|
2021-02-18 05:46:03 +13:00
|
|
|
|
2022-01-13 11:46:46 +13:00
|
|
|
def __init__(self, core: LegendaryCore, dl_item: InstallQueueItemModel, game: Game = None):
|
2022-05-27 22:23:08 +12:00
|
|
|
sys.excepthook = sys.__excepthook__
|
2021-05-21 11:47:03 +12:00
|
|
|
super(InstallInfoWorker, self).__init__()
|
2022-05-06 00:25:28 +12:00
|
|
|
self.signals = InstallInfoWorker.Signals()
|
2021-05-21 11:47:03 +12:00
|
|
|
self.core = core
|
2021-05-24 00:15:36 +12:00
|
|
|
self.dl_item = dl_item
|
2022-01-13 11:46:46 +13:00
|
|
|
self.is_overlay_install = self.dl_item.options.overlay
|
|
|
|
self.game = game
|
2021-05-21 11:47:03 +12:00
|
|
|
|
|
|
|
@pyqtSlot()
|
|
|
|
def run(self):
|
|
|
|
try:
|
2022-01-13 11:46:46 +13:00
|
|
|
if not self.is_overlay_install:
|
2022-07-08 05:19:52 +12:00
|
|
|
cli = LegendaryCLISingleton()
|
2022-01-13 11:46:46 +13:00
|
|
|
download = InstallDownloadModel(
|
2022-07-08 05:19:52 +12:00
|
|
|
# *self.core.prepare_download(
|
2022-07-11 22:22:17 +12:00
|
|
|
*cli.install_game(LgndrInstallGameArgs(
|
2022-01-13 11:46:46 +13:00
|
|
|
app_name=self.dl_item.options.app_name,
|
|
|
|
base_path=self.dl_item.options.base_path,
|
|
|
|
force=self.dl_item.options.force,
|
|
|
|
no_install=self.dl_item.options.no_install,
|
|
|
|
status_q=self.dl_item.status_q,
|
2022-07-10 11:34:53 +12:00
|
|
|
shared_memory=self.dl_item.options.shared_memory,
|
2022-01-13 11:46:46 +13:00
|
|
|
max_workers=self.dl_item.options.max_workers,
|
|
|
|
# game_folder=,
|
|
|
|
# disable_patching=,
|
|
|
|
# override_manifest=,
|
|
|
|
# override_old_manifest=,
|
|
|
|
# override_base_url=,
|
2022-05-27 08:03:17 +12:00
|
|
|
platform=self.dl_item.options.platform,
|
2022-01-13 11:46:46 +13:00
|
|
|
# file_prefix_filter=,
|
|
|
|
# file_exclude_filter=,
|
|
|
|
# file_install_tag=,
|
2022-07-10 11:34:53 +12:00
|
|
|
order_opt=self.dl_item.options.order_opt,
|
2022-01-13 11:46:46 +13:00
|
|
|
# dl_timeout=,
|
2022-07-10 11:34:53 +12:00
|
|
|
repair_mode=self.dl_item.options.repair_mode,
|
2022-07-12 05:11:34 +12:00
|
|
|
repair_and_update=self.dl_item.options.repair_and_update,
|
2022-07-10 11:34:53 +12:00
|
|
|
ignore_space=self.dl_item.options.ignore_space,
|
2022-01-13 11:46:46 +13:00
|
|
|
# disable_delta=,
|
|
|
|
# override_delta_manifest=,
|
|
|
|
# reset_sdl=,
|
2022-07-11 04:32:42 +12:00
|
|
|
sdl_prompt=lambda app_name, title: self.dl_item.options.sdl_list,)
|
2022-01-13 11:46:46 +13:00
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
else:
|
|
|
|
if not os.path.exists(path := self.dl_item.options.base_path):
|
|
|
|
os.makedirs(path)
|
|
|
|
|
|
|
|
dlm, analysis, igame = self.core.prepare_overlay_install(
|
|
|
|
path=self.dl_item.options.base_path,
|
2022-07-11 22:22:17 +12:00
|
|
|
status_q=self.dl_item.status_q,
|
2021-12-24 22:09:50 +13:00
|
|
|
)
|
2022-01-13 11:46:46 +13:00
|
|
|
|
|
|
|
download = InstallDownloadModel(
|
|
|
|
dlmanager=dlm,
|
|
|
|
analysis=analysis,
|
|
|
|
igame=igame,
|
2022-06-27 04:07:16 +12:00
|
|
|
game=self.game,
|
2022-01-13 11:46:46 +13:00
|
|
|
repair=False,
|
|
|
|
repair_file="",
|
2022-05-27 22:23:08 +12:00
|
|
|
res=ConditionCheckResult(), # empty
|
2022-01-13 11:46:46 +13:00
|
|
|
)
|
|
|
|
|
|
|
|
if not download.res or not download.res.failures:
|
2021-06-08 01:42:49 +12:00
|
|
|
self.signals.result.emit(download)
|
|
|
|
else:
|
2022-05-27 22:23:08 +12:00
|
|
|
self.signals.failed.emit("\n".join(str(i) for i in download.res.failures))
|
2022-07-11 22:22:17 +12:00
|
|
|
except LgndrException as ret:
|
|
|
|
self.signals.failed.emit(ret.message)
|
2021-05-30 03:24:33 +12:00
|
|
|
except Exception as e:
|
2021-05-26 08:37:50 +12:00
|
|
|
self.signals.failed.emit(str(e))
|
|
|
|
self.signals.finished.emit()
|
2021-05-22 02:48:15 +12:00
|
|
|
|
|
|
|
|
|
|
|
class QDataCheckBox(QCheckBox):
|
2021-05-24 00:15:36 +12:00
|
|
|
def __init__(self, text, data=None, parent=None):
|
|
|
|
super(QDataCheckBox, self).__init__(parent)
|
2021-05-22 02:48:15 +12:00
|
|
|
self.setText(text)
|
|
|
|
self.data = data
|
|
|
|
|
|
|
|
def isChecked(self):
|
|
|
|
if super(QDataCheckBox, self).isChecked():
|
|
|
|
return self.data
|
|
|
|
else:
|
|
|
|
return False
|