93 lines
2.6 KiB
Python
93 lines
2.6 KiB
Python
from pathlib import Path
|
|
from urllib.parse import urlparse
|
|
|
|
from PySide6.QtCore import Property, QObject, QRunnable, QThreadPool, Signal, Slot
|
|
from PySide6.QtQml import QmlElement, QmlSingleton
|
|
|
|
from leek.mod_installer import (
|
|
ModInstaller,
|
|
NoModExceptionError,
|
|
UnsupportedArchiveTypeError,
|
|
)
|
|
|
|
QML_IMPORT_NAME = "Leek.QModInstaller"
|
|
QML_IMPORT_MAJOR_VERSION = 1
|
|
|
|
|
|
# Qt follows C++ naming conventions
|
|
# ruff: noqa: N802
|
|
@QmlElement
|
|
@QmlSingleton
|
|
class QModInstaller(QObject):
|
|
"""
|
|
Qt Wrapper around the ModInstaller() class
|
|
"""
|
|
|
|
__mod_installer: ModInstaller
|
|
__status: str
|
|
|
|
def __init__(self, parent=None):
|
|
super().__init__(parent=parent)
|
|
self.__status = "uninitialized"
|
|
|
|
mod_path_changed = Signal(name="modPathChanged")
|
|
|
|
@Property(str, notify=mod_path_changed)
|
|
def modPath(self) -> str:
|
|
return self.test
|
|
|
|
@modPath.setter # type: ignore[no-redef]
|
|
def modPath(self, value: str) -> None:
|
|
try:
|
|
# In python 3.13 pathlib gained a from_uri() method which would be very useful
|
|
parsed_path: str = urlparse(value, "file").path
|
|
self.__mod_installer = ModInstaller(Path(parsed_path))
|
|
self.__status = "initialized"
|
|
self.status_changed.emit()
|
|
except UnsupportedArchiveTypeError:
|
|
self.__status = "UnsupportedArchiveTypeError"
|
|
self.status_changed.emit()
|
|
except NoModExceptionError:
|
|
self.__status = "NoModExceptionError"
|
|
self.status_changed.emit()
|
|
|
|
install_status_changed = Signal(name="installStatusChanged")
|
|
|
|
@Property(bool, notify=install_status_changed)
|
|
def installed(self) -> bool:
|
|
return self.__mod_installer.is_installed
|
|
|
|
status_changed = Signal(name="statusChanged")
|
|
|
|
@Property(str, notify=status_changed)
|
|
def status(self) -> str:
|
|
return self.__status
|
|
|
|
finished_install = Signal(name="finishedInstall")
|
|
|
|
@Slot()
|
|
def install(self) -> None:
|
|
worker = InstallWorker(InstallWorkerSignals(), self.__mod_installer)
|
|
worker.signals.installed.connect(self.finished_install)
|
|
QThreadPool.globalInstance().start(worker)
|
|
|
|
|
|
class InstallWorker(QRunnable):
|
|
__installer: ModInstaller
|
|
|
|
def __init__(self, signals, installer: ModInstaller) -> None:
|
|
super().__init__()
|
|
self.signals = signals
|
|
self.__installer = installer
|
|
|
|
# @Slot()
|
|
def run(self) -> None:
|
|
self.__installer.install()
|
|
self.signals.installed.emit()
|
|
|
|
|
|
class InstallWorkerSignals(QObject):
|
|
def __init__(self):
|
|
super().__init__()
|
|
|
|
installed = Signal()
|