1
0
Fork 0
mirror of synced 2024-05-19 12:02:54 +12:00
Rare/rare/models/install.py
loathingKernel a246f4ee16 EosGroup: Remake the UI and integrate with Rare's facilities
* Uninstalling the Overlay now goes through the same procedure as
uninstalling any other game.

* The available prefixes are now listed instead of hiding them inside
a combo box.

* Each listing works indepedently to enable/disable the Overlay for the prefix
2024-01-19 00:57:16 +02:00

151 lines
4 KiB
Python

import os
from dataclasses import dataclass
from datetime import datetime, timedelta
from typing import List, Optional, Dict, Tuple
from legendary.models.downloading import AnalysisResult, ConditionCheckResult
from legendary.models.game import Game, InstalledGame
from rare.lgndr.downloader.mp.manager import DLManager
@dataclass
class InstallOptionsModel:
app_name: str
base_path: str = ""
shared_memory: int = 1024
max_workers: int = os.cpu_count() * 2
force: bool = False
platform: str = "Windows"
install_tag: Optional[List[str]] = None
order_opt: bool = False
repair_mode: bool = False
repair_and_update: bool = False
no_install: bool = False
ignore_space: bool = False
reset_sdl: bool = False
skip_dlcs: bool = False
with_dlcs: bool = False
# Rare's internal arguments
# FIXME: Do we really need all of these?
create_shortcut: bool = True
overlay: bool = False
update: bool = False
silent: bool = False
install_prereqs: bool = False
def as_install_kwargs(self) -> Dict:
return {
k: getattr(self, k)
for k in vars(self)
if k not in ["update", "silent", "create_shortcut", "overlay", "install_prereqs"]
}
@dataclass
class InstallDownloadModel:
dlm: DLManager
analysis: AnalysisResult
igame: InstalledGame
game: Game
repair: bool
repair_file: str
res: ConditionCheckResult
class InstallQueueItemModel:
def __init__(self, options: InstallOptionsModel, download: InstallDownloadModel = None):
self.options: Optional[InstallOptionsModel] = options
# lk: internal attribute holders
self.__download: Optional[InstallDownloadModel] = None
self.__date: Optional[datetime] = None
self.download = download
@property
def download(self) -> Optional[InstallDownloadModel]:
return self.__download
@download.setter
def download(self, download: Optional[InstallDownloadModel]):
self.__download = download
if download is not None:
self.__date = datetime.now()
@property
def expired(self) -> bool:
return datetime.now() > (self.__date + timedelta(minutes=30))
def __bool__(self):
return (self.download is not None) and (self.options is not None) and (not self.expired)
@dataclass
class UninstallOptionsModel:
app_name: str
accepted: bool = None
keep_files: bool = None
keep_config: bool = None
keep_overlay_keys: bool = None
def __bool__(self):
return (
bool(self.app_name)
and (self.accepted is not None)
and (self.keep_files is not None)
and (self.keep_config is not None)
and (self.keep_overlay_keys is not None)
)
@property
def values(self) -> Tuple[bool, bool, bool, bool]:
"""
This model's options
:return:
Tuple of `accepted` `keep_files` `keep_config` `keep_overlay_keys`
"""
return self.accepted, self.keep_config, self.keep_files, self.keep_overlay_keys
@values.setter
def values(self, values: Tuple[bool, bool, bool, bool]):
"""
Set this model's options
:param values:
Tuple of `accepted` `keep_files` `keep_config` `keep_overlay_keys`
:return:
"""
self.accepted = values[0]
self.keep_files = values[1]
self.keep_config = values[2]
self.keep_overlay_keys = values[3]
@dataclass
class SelectiveDownloadsModel:
app_name: str
accepted: bool = None
install_tag: Optional[List[str]] = None
def __bool__(self):
return (
bool(self.app_name)
and (self.accepted is not None)
and (self.install_tag is not None)
)
@dataclass
class MoveGameModel:
app_name: str
accepted: bool = None
target_path: Optional[str] = None
def __bool__(self):
return (
bool(self.app_name)
and (self.accepted is not None)
and (self.target_path is not None)
)