2021-02-10 23:48:25 +13:00
|
|
|
import os
|
|
|
|
|
2021-05-21 11:47:03 +12:00
|
|
|
from PyQt5.QtCore import QObject, QRunnable, QThreadPool, pyqtSignal, pyqtSlot
|
|
|
|
from PyQt5.QtWidgets import QDialog, QFileDialog
|
2021-02-10 23:48:25 +13:00
|
|
|
|
2021-04-05 21:53:33 +12:00
|
|
|
from custom_legendary.core import LegendaryCore
|
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-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):
|
|
|
|
infos = False
|
2021-02-18 05:46:03 +13:00
|
|
|
|
2021-04-05 21:53:33 +12:00
|
|
|
def __init__(self, app_name, core: LegendaryCore, update=False):
|
2021-02-10 23:48:25 +13:00
|
|
|
super(InstallDialog, self).__init__()
|
2021-05-21 11:47:03 +12:00
|
|
|
self.setupUi(self)
|
|
|
|
|
2021-04-05 21:53:33 +12:00
|
|
|
self.core = core
|
2021-05-21 11:47:03 +12:00
|
|
|
self.app_name = app_name
|
2021-04-05 21:53:33 +12:00
|
|
|
self.game = self.core.get_game(app_name)
|
|
|
|
self.update_game = update
|
2021-05-21 11:47:03 +12:00
|
|
|
|
|
|
|
self.threadpool = QThreadPool.globalInstance()
|
|
|
|
|
|
|
|
header_text = self.tr("Update") if update else self.tr("Install")
|
|
|
|
self.install_dialog_label.setText("<h3>{} \"{}\"</h3>".format(header_text, self.game.app_title))
|
|
|
|
# TODO: Get application name from QApplication instance
|
|
|
|
self.setWindowTitle("{} - {} \"{}\"".format("Rare", header_text, self.game.app_title))
|
2021-04-05 21:53:33 +12:00
|
|
|
|
2021-04-16 02:09:17 +12:00
|
|
|
if self.core.lgd.config.has_option("Legendary", "install_dir"):
|
|
|
|
default_path = self.core.lgd.config.get("Legendary", "install_dir")
|
|
|
|
else:
|
|
|
|
default_path = os.path.expanduser("~/legendary")
|
|
|
|
if not default_path:
|
|
|
|
default_path = os.path.expanduser("~/legendary")
|
2021-05-21 11:47:03 +12:00
|
|
|
|
|
|
|
self.install_dir_path = PathEdit(text=default_path,
|
|
|
|
file_type=QFileDialog.DirectoryOnly,
|
|
|
|
edit_func=self.on_install_dir_text_changed)
|
|
|
|
self.install_dir_layout.addWidget(self.install_dir_path)
|
|
|
|
|
|
|
|
if update:
|
|
|
|
self.install_dir_label.setVisible(False)
|
|
|
|
self.install_dir_path.setVisible(False)
|
2021-02-10 23:48:25 +13:00
|
|
|
|
2021-04-16 02:09:17 +12:00
|
|
|
if self.core.lgd.config.has_option("Legendary", "max_workers"):
|
|
|
|
max_workers = self.core.lgd.config.get("Legendary", "max_workers")
|
|
|
|
else:
|
|
|
|
max_workers = 0
|
2021-05-21 11:47:03 +12:00
|
|
|
self.max_workers_spin.setValue(int(max_workers))
|
2021-04-16 02:09:17 +12:00
|
|
|
|
2021-05-21 11:47:03 +12:00
|
|
|
self.get_install_info(app_name, default_path)
|
2021-02-10 23:48:25 +13:00
|
|
|
|
2021-05-21 11:47:03 +12:00
|
|
|
self.install_button.clicked.connect(self.on_install_button_clicked)
|
|
|
|
self.cancel_button.clicked.connect(self.on_cancel_button_clicked)
|
2021-02-10 23:48:25 +13:00
|
|
|
|
2021-05-21 11:47:03 +12:00
|
|
|
self.resize(self.minimumSizeHint())
|
|
|
|
self.setFixedSize(self.size())
|
2021-02-10 23:48:25 +13:00
|
|
|
|
2021-04-17 09:41:59 +12:00
|
|
|
def get_information(self, path=None):
|
|
|
|
if path:
|
2021-05-21 11:47:03 +12:00
|
|
|
self.install_dir_path.setText(path)
|
2021-02-10 23:48:25 +13:00
|
|
|
self.exec_()
|
2021-02-18 05:46:03 +13:00
|
|
|
return self.infos
|
|
|
|
|
2021-05-21 11:47:03 +12:00
|
|
|
def get_install_info(self, app_name, default_path):
|
|
|
|
updating_text = self.tr("Updating...")
|
|
|
|
self.download_size_info_label.setText(updating_text)
|
|
|
|
self.download_size_info_label.setStyleSheet("font-style: italic; font-weight: normal")
|
|
|
|
self.install_size_info_label.setText(updating_text)
|
|
|
|
self.install_size_info_label.setStyleSheet("font-style: italic; font-weight: normal")
|
|
|
|
self.install_button.setEnabled(False)
|
|
|
|
info_worker = InstallInfoWorker(app_name, default_path, self.core)
|
|
|
|
info_worker.setAutoDelete(True)
|
|
|
|
info_worker.signals.finished.connect(self.on_worker_finished)
|
|
|
|
self.threadpool.start(info_worker)
|
|
|
|
|
|
|
|
def on_install_dir_text_changed(self, path: str):
|
|
|
|
self.get_install_info(self.app_name, path)
|
|
|
|
|
|
|
|
def on_install_button_clicked(self):
|
|
|
|
self.infos = self.install_dir_path.text() if not self.update_game else None, \
|
|
|
|
self.max_workers_spin.value(), \
|
|
|
|
self.force_download_check.isChecked(), \
|
|
|
|
self.ignore_space_check.isChecked(), \
|
|
|
|
self.download_only_check.isChecked()
|
|
|
|
self.threadpool.clear()
|
2021-02-18 05:46:03 +13:00
|
|
|
self.close()
|
|
|
|
|
2021-05-21 11:47:03 +12:00
|
|
|
def on_cancel_button_clicked(self):
|
|
|
|
self.threadpool.clear()
|
|
|
|
self.close()
|
2021-02-18 05:46:03 +13:00
|
|
|
|
2021-05-21 11:47:03 +12:00
|
|
|
def on_worker_finished(self, info: tuple):
|
|
|
|
download_size, install_size = info
|
|
|
|
|
|
|
|
# TODO: Check available size and act accordingly
|
|
|
|
# TODO: (show message in label | color it | disable install unless ignore)
|
|
|
|
# TODO: Find a way to get the installation size delta and show it
|
|
|
|
|
|
|
|
if download_size is not None and install_size is not None:
|
|
|
|
if download_size:
|
|
|
|
self.download_size_info_label.setText("{}".format(get_size(download_size)))
|
|
|
|
self.download_size_info_label.setStyleSheet("font-style: normal; font-weight: bold")
|
|
|
|
self.install_button.setEnabled(True)
|
|
|
|
else:
|
|
|
|
self.install_size_info_label.setText(self.tr("Game already installed"))
|
|
|
|
self.install_size_info_label.setStyleSheet("font-style: italics; font-weight: normal")
|
|
|
|
self.install_size_info_label.setText("{}".format(get_size(install_size)))
|
|
|
|
self.install_size_info_label.setStyleSheet("font-style: normal; font-weight: bold")
|
|
|
|
else:
|
|
|
|
self.download_size_info_label.setText("Error")
|
|
|
|
self.install_size_info_label.setText("Error")
|
2021-02-18 05:46:03 +13:00
|
|
|
|
|
|
|
|
2021-05-21 11:47:03 +12:00
|
|
|
class InstallInfoWorkerSignals(QObject):
|
|
|
|
finished = pyqtSignal(tuple)
|
2021-02-18 05:46:03 +13:00
|
|
|
|
|
|
|
|
2021-05-21 11:47:03 +12:00
|
|
|
class InstallInfoWorker(QRunnable):
|
2021-02-18 05:46:03 +13:00
|
|
|
|
2021-05-21 11:47:03 +12:00
|
|
|
def __init__(self, app_name, path, core: LegendaryCore):
|
|
|
|
super(InstallInfoWorker, self).__init__()
|
|
|
|
self.signals = InstallInfoWorkerSignals()
|
|
|
|
self.core = core
|
|
|
|
self.app_name = app_name
|
|
|
|
self.path = path
|
|
|
|
|
|
|
|
@pyqtSlot()
|
|
|
|
def run(self):
|
|
|
|
try:
|
|
|
|
dlm, analysis, game, igame, repair, repair_file = self.core.prepare_download(
|
|
|
|
app_name=self.app_name,
|
|
|
|
base_path=self.path,
|
|
|
|
)
|
|
|
|
self.signals.finished.emit((analysis.dl_size, analysis.install_size))
|
|
|
|
except:
|
|
|
|
self.signals.finished.emit((None, None))
|
|
|
|
return
|