1
0
Fork 0
mirror of synced 2024-06-23 08:40:45 +12:00
Rare/rare/components/dialogs/install_dialog.py

141 lines
5.6 KiB
Python
Raw Normal View History

2021-02-10 23:48:25 +13:00
import os
from PyQt5.QtCore import QObject, QRunnable, QThreadPool, pyqtSignal, pyqtSlot
from PyQt5.QtWidgets import QDialog, QFileDialog
2021-02-10 23:48:25 +13:00
from custom_legendary.core import LegendaryCore
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
class InstallDialog(QDialog, Ui_InstallDialog):
infos = False
2021-02-18 05:46:03 +13:00
def __init__(self, app_name, core: LegendaryCore, update=False):
2021-02-10 23:48:25 +13:00
super(InstallDialog, self).__init__()
self.setupUi(self)
self.core = core
self.app_name = app_name
self.game = self.core.get_game(app_name)
self.update_game = update
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))
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")
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
if self.core.lgd.config.has_option("Legendary", "max_workers"):
max_workers = self.core.lgd.config.get("Legendary", "max_workers")
else:
max_workers = 0
self.max_workers_spin.setValue(int(max_workers))
self.get_install_info(app_name, default_path)
2021-02-10 23:48:25 +13: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
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:
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
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()
def on_cancel_button_clicked(self):
self.threadpool.clear()
self.close()
2021-02-18 05:46:03 +13: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
class InstallInfoWorkerSignals(QObject):
finished = pyqtSignal(tuple)
2021-02-18 05:46:03 +13:00
class InstallInfoWorker(QRunnable):
2021-02-18 05:46:03 +13: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