Skip to content

Commit

Permalink
WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
loathingKernel committed Feb 12, 2024
1 parent 55b395e commit 07e2b0d
Show file tree
Hide file tree
Showing 20 changed files with 338 additions and 236 deletions.
15 changes: 8 additions & 7 deletions rare/components/tabs/games/game_info/cloud_saves.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
from rare.widgets.loading_widget import LoadingWidget
from rare.widgets.side_tab import SideTabContents

logger = getLogger("CloudWidget")
logger = getLogger("CloudSaves")


class CloudSaves(QWidget, SideTabContents):
Expand Down Expand Up @@ -122,11 +122,11 @@ def compute_save_path(self):
except Exception as e:
logger.warning(str(e))
resolver = WineSavePathResolver(self.core, self.rgame)
if not resolver.environ.get("WINEPREFIX"):
del resolver
self.cloud_save_path_edit.setText("")
QMessageBox.warning(self, "Warning", "No wine prefix selected. Please set it in settings")
return
# if not resolver.environ.get("WINEPREFIX"):
# del resolver
# self.cloud_save_path_edit.setText("")
# QMessageBox.warning(self, "Warning", "No wine prefix selected. Please set it in settings")
# return
self.cloud_save_path_edit.setText(self.tr("Loading..."))
self.cloud_save_path_edit.setDisabled(True)
self.compute_save_path_button.setDisabled(True)
Expand All @@ -139,7 +139,8 @@ def compute_save_path(self):

@pyqtSlot(str, str)
def __on_wine_resolver_result(self, path, app_name):
logger.info(f"Wine resolver finished for {app_name}. Computed save path: {path}")
logger.info("Wine resolver finished for %s", app_name)
logger.info("Computed save path: %s", path)
if app_name == self.rgame.app_name:
self.cloud_save_path_edit.setDisabled(False)
self.compute_save_path_button.setDisabled(False)
Expand Down
11 changes: 4 additions & 7 deletions rare/components/tabs/games/integrations/egl_sync_group.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
from rare.shared.workers.wine_resolver import WinePathResolver
from rare.ui.components.tabs.games.integrations.egl_sync_group import Ui_EGLSyncGroup
from rare.ui.components.tabs.games.integrations.egl_sync_list_group import Ui_EGLSyncListGroup
from rare.utils import runners
from rare.utils.compat import utils as compat_utils
from rare.widgets.elide_label import ElideLabel
from rare.widgets.indicator_edit import PathEdit, IndicatorReasonsCommon

Expand Down Expand Up @@ -88,11 +88,7 @@ def showEvent(self, a0: QShowEvent) -> None:

def __run_wine_resolver(self):
self.egl_path_info.setText(self.tr("Updating..."))
wine_resolver = WinePathResolver(
self.core.get_app_launch_command("default"),
runners.get_environment(self.core.get_app_environment("default")),
PathSpec.egl_programdata()
)
wine_resolver = WinePathResolver(self.core, "default", str(PathSpec.egl_programdata()))
wine_resolver.signals.result_ready.connect(self.__on_wine_resolver_result)
QThreadPool.globalInstance().start(wine_resolver)

Expand Down Expand Up @@ -306,7 +302,8 @@ def show_errors(self, errors: List):
def items(self) -> Iterable[EGLSyncListItem]:
# for i in range(self.list.count()):
# yield self.list.item(i)
return [self.ui.list.item(i) for i in range(self.ui.list.count())]
return map(self.ui.list.item, range(self.ui.list.count()))
# return [self.ui.list.item(i) for i in range(self.ui.list.count())]


class EGLSyncExportGroup(EGLSyncListGroup):
Expand Down
2 changes: 1 addition & 1 deletion rare/components/tabs/games/integrations/eos_group.py
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ def update_prefixes(self):

if platform.system() != "Windows":
prefixes = config.get_prefixes()
prefixes = {prefix for prefix in prefixes if config.prefix_exists(prefix)}
prefixes = {prefix for prefix, _ in prefixes if config.prefix_exists(prefix)}
if platform.system() == "Darwin":
# TODO: add crossover support
pass
Expand Down
4 changes: 2 additions & 2 deletions rare/components/tabs/settings/widgets/env_vars_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@
from rare.utils.misc import icon

if platform.system() != "Windows":
from rare.utils.runners.wine import get_wine_environment
from rare.utils.compat.wine import get_wine_environment

if platform.system() in {"Linux", "FreeBSD"}:
from rare.utils.runners.proton import get_steam_environment
from rare.utils.compat.proton import get_steam_environment


class EnvVarsTableModel(QAbstractTableModel):
Expand Down
17 changes: 13 additions & 4 deletions rare/components/tabs/settings/widgets/proton.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@
from rare.shared import RareCore
from rare.shared.wrappers import Wrappers
from rare.utils import config_helper as config
from rare.utils.runners import proton
from rare.utils.compat import proton
from rare.utils.paths import proton_compat_dir
from rare.widgets.indicator_edit import PathEdit, IndicatorReasonsCommon

logger = getLogger("ProtonSettings")
Expand Down Expand Up @@ -82,7 +83,7 @@ def showEvent(self, a0: QShowEvent) -> None:
def __on_proton_changed(self, index):
steam_tool: Union[proton.ProtonTool, proton.CompatibilityTool] = self.tool_combo.itemData(index)

steam_environ = proton.get_steam_environment(steam_tool)
steam_environ = proton.get_steam_environment(steam_tool, self.tool_prefix.text())
for key, value in steam_environ.items():
config.save_envvar(self.app_name, key, value)
self.environ_changed.emit(key)
Expand All @@ -101,8 +102,16 @@ def __on_proton_changed(self, index):
self.wrappers.set_game_wrapper_list(self.app_name, wrappers)

self.tool_prefix.setEnabled(steam_tool is not None)
if steam_tool and not config.get_proton_compatdata(self.app_name, fallback=""):
self.tool_prefix.setText(os.path.expanduser("~/.proton"))
if steam_tool:
if not (compatdata_path := config.get_proton_compatdata(self.app_name, fallback="")):
compatdata_path = proton_compat_dir(self.app_name)
config.save_proton_compatdata(self.app_name, str(compatdata_path))
target = compatdata_path.joinpath("pfx")
if not target.is_dir():
os.makedirs(target, exist_ok=True)
self.tool_prefix.setText(str(compatdata_path))
else:
self.tool_prefix.setText("")

self.tool_enabled.emit(steam_tool is not None)

Expand Down
12 changes: 6 additions & 6 deletions rare/components/tabs/settings/widgets/wrappers.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
from rare.widgets.dialogs import ButtonDialog, game_title

if pf.system() in {"Linux", "FreeBSD"}:
from rare.utils.runners import proton
from rare.utils.compat import proton

logger = getLogger("WrapperSettings")

Expand Down Expand Up @@ -54,7 +54,7 @@ def setup(self, wrapper: Wrapper):
header = self.tr("Edit wrapper")
self.setWindowTitle(header)
self.setSubtitle(game_title(header, wrapper.name))
self.line_edit.setText(wrapper.command)
self.line_edit.setText(wrapper.as_str)

@pyqtSlot(str)
def __on_text_changed(self, text: str):
Expand Down Expand Up @@ -83,7 +83,7 @@ def setup(self, wrappers: Iterable[Wrapper]):
self.setWindowTitle(header)
self.setSubtitle(header)
for wrapper in wrappers:
self.combo_box.addItem(f"{wrapper.name} ({wrapper.command})", wrapper.command)
self.combo_box.addItem(f"{wrapper.name} ({wrapper.as_str})", wrapper.as_str)

@pyqtSlot(int)
def __on_index_changed(self, index: int):
Expand All @@ -101,7 +101,7 @@ def __init__(self, wrapper: Wrapper, parent=None):
super(WrapperWidget, self).__init__(parent=parent)
self.setFrameShape(QFrame.StyledPanel)
self.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Fixed)
self.setToolTip(wrapper.command)
self.setToolTip(wrapper.as_str)

text_lbl = QLabel(wrapper.name, parent=self)
text_lbl.setFont(QFont("monospace"))
Expand Down Expand Up @@ -296,7 +296,7 @@ def add_user_wrapper(self, wrapper: Wrapper, position: int = -1):

if pf.system() in {"Linux", "FreeBSD"}:
compat_cmds = [tool.command() for tool in proton.find_tools()]
if wrapper.command in compat_cmds:
if wrapper.as_str in compat_cmds:
QMessageBox.warning(
self,
self.tr("Warning"),
Expand All @@ -306,7 +306,7 @@ def add_user_wrapper(self, wrapper: Wrapper, position: int = -1):

if wrapper.checksum in self.wrappers.get_game_md5sum_list(self.app_name):
QMessageBox.warning(
self, self.tr("Warning"), self.tr("Wrapper <b>{0}</b> is already in the list").format(wrapper.command)
self, self.tr("Warning"), self.tr("Wrapper <b>{0}</b> is already in the list").format(wrapper.as_str)
)
return

Expand Down
4 changes: 2 additions & 2 deletions rare/models/pathspec.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ def wine_egl_prefixes(results: int = 0) -> Union[List[str], str]:
possible_prefixes = get_prefixes()
prefixes = [
prefix
for prefix in possible_prefixes
for prefix, _ in possible_prefixes
if os.path.exists(os.path.join(prefix, PathSpec.wine_egl_programdata()))
]
if not prefixes:
Expand All @@ -66,5 +66,5 @@ def __init__(self, core: LegendaryCore = None, igame: InstalledGame = None):
self.__egl_path_vars["{installdir}"] = igame.install_path

def resolve_egl_path_vars(self, path: str) -> Union[LiteralString, str, bytes]:
cooked_path = [self.__egl_path_vars.get(p.lower(), p) for p in path.split("/")]
cooked_path = (self.__egl_path_vars.get(p.lower(), p) for p in path.split("/"))
return os.path.join(*cooked_path)
15 changes: 10 additions & 5 deletions rare/models/wrapper.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,15 +28,20 @@ def is_editable(self) -> bool:

@property
def checksum(self) -> str:
return md5(self.command.encode("utf-8")).hexdigest()
return md5(self.as_str.encode("utf-8")).hexdigest()

@property
def executable(self) -> str:
return shlex.quote(self.__command[0])

@property
def command(self) -> str:
return " ".join(shlex.quote(part) for part in self.__command)
def command(self) -> List[str]:
return self.__command

@property
def as_str(self) -> str:
# return " ".join(shlex.quote(part) for part in self.__command)
return " ".join(map(shlex.quote, self.__command))

@property
def name(self) -> str:
Expand All @@ -47,13 +52,13 @@ def type(self) -> WrapperType:
return self.__wtype

def __eq__(self, other) -> bool:
return self.command == other.command
return self.as_str == other.as_str

def __hash__(self):
return hash(self.__command)

def __bool__(self) -> bool:
return True if not self.is_editable else bool(self.command.strip())
return True if not self.is_editable else bool(self.as_str.strip())

@classmethod
def from_dict(cls, data: Dict):
Expand Down
12 changes: 8 additions & 4 deletions rare/shared/rare_core.py
Original file line number Diff line number Diff line change
Expand Up @@ -102,13 +102,17 @@ def dequeue_worker(self, worker: QueueWorker):
self.__signals.application.update_statusbar.emit()

def active_workers(self) -> Iterable[QueueWorker]:
return list(filter(lambda w: w.state == QueueWorkerState.ACTIVE, self.queue_workers))
# return list(filter(lambda w: w.state == QueueWorkerState.ACTIVE, self.queue_workers))
yield from filter(lambda w: w.state == QueueWorkerState.ACTIVE, self.queue_workers)

def queued_workers(self) -> Iterable[QueueWorker]:
return list(filter(lambda w: w.state == QueueWorkerState.QUEUED, self.queue_workers))
# return list(filter(lambda w: w.state == QueueWorkerState.QUEUED, self.queue_workers))
yield from filter(lambda w: w.state == QueueWorkerState.QUEUED, self.queue_workers)

def queue_info(self) -> List[QueueWorkerInfo]:
return [w.worker_info() for w in self.queue_workers]
def queue_info(self) -> Iterable[QueueWorkerInfo]:
# return (w.worker_info() for w in self.queue_workers)
for w in self.queue_workers:
yield w.worker_info()

@staticmethod
def instance() -> 'RareCore':
Expand Down
3 changes: 2 additions & 1 deletion rare/shared/workers/install_info.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,8 @@ def run_real(self):
if not download.res or not download.res.failures:
self.signals.result.emit(download)
else:
self.signals.failed.emit("\n".join(str(i) for i in download.res.failures))
# self.signals.failed.emit("\n".join(str(i) for i in download.res.failures))
self.signals.failed.emit("\n".join(map(str, download.res.failures)))
except LgndrException as ret:
self.signals.failed.emit(ret.message)
except Exception as e:
Expand Down
4 changes: 2 additions & 2 deletions rare/shared/workers/uninstall.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,8 @@ def uninstall_game(
if platform.system() == "Darwin":
# TODO: add crossover support
pass
if prefixes is not None:
for prefix in prefixes:
if len(prefixes):
for prefix, _ in prefixes:
remove_registry_entries(prefix)
logger.debug("Removed registry entries for prefix %s", prefix)
else:
Expand Down
Loading

0 comments on commit 07e2b0d

Please sign in to comment.