EosOverlay: Fix a few remaining issues
* Don't create path when preparing overlay download, it fails on updates. * Concatenate the overlay install path in InstallDialog instead of passing it as `base_path` * Respect RareGame state in in the EOS overlay form
This commit is contained in:
parent
99d0bca5fc
commit
3c01cfc0a8
|
@ -1,7 +1,7 @@
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
from PyQt5.QtCore import Qt
|
from PyQt5.QtCore import Qt
|
||||||
from PyQt5.QtWidgets import QVBoxLayout, QWidget, QLabel, QSpacerItem, QSizePolicy
|
from PyQt5.QtWidgets import QVBoxLayout, QWidget, QLabel, QSizePolicy
|
||||||
|
|
||||||
from rare.widgets.side_tab import SideTabWidget
|
from rare.widgets.side_tab import SideTabWidget
|
||||||
from .egl_sync_group import EGLSyncGroup
|
from .egl_sync_group import EGLSyncGroup
|
||||||
|
@ -34,8 +34,8 @@ class IntegrationsTabs(SideTabWidget):
|
||||||
self.tr(""),
|
self.tr(""),
|
||||||
self,
|
self,
|
||||||
)
|
)
|
||||||
self.ubisoft_group = UbisoftGroup(self.eos_ubisoft)
|
|
||||||
self.eos_group = EosGroup(self.eos_ubisoft)
|
self.eos_group = EosGroup(self.eos_ubisoft)
|
||||||
|
self.ubisoft_group = UbisoftGroup(self.eos_ubisoft)
|
||||||
self.eos_ubisoft.addWidget(self.eos_group)
|
self.eos_ubisoft.addWidget(self.eos_group)
|
||||||
self.eos_ubisoft.addWidget(self.ubisoft_group)
|
self.eos_ubisoft.addWidget(self.ubisoft_group)
|
||||||
self.eos_ubisoft_index = self.addTab(self.eos_ubisoft, self.tr("Epic Overlay and Ubisoft"))
|
self.eos_ubisoft_index = self.addTab(self.eos_ubisoft, self.tr("Epic Overlay and Ubisoft"))
|
||||||
|
|
|
@ -4,6 +4,7 @@ from logging import getLogger
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
from PyQt5.QtCore import QRunnable, QObject, pyqtSignal, QThreadPool, Qt, pyqtSlot, QSize
|
from PyQt5.QtCore import QRunnable, QObject, pyqtSignal, QThreadPool, Qt, pyqtSlot, QSize
|
||||||
|
from PyQt5.QtGui import QShowEvent
|
||||||
from PyQt5.QtWidgets import (
|
from PyQt5.QtWidgets import (
|
||||||
QGroupBox,
|
QGroupBox,
|
||||||
QMessageBox,
|
QMessageBox,
|
||||||
|
@ -20,7 +21,7 @@ from rare.lgndr.core import LegendaryCore
|
||||||
from rare.models.game import RareEosOverlay
|
from rare.models.game import RareEosOverlay
|
||||||
from rare.shared import RareCore
|
from rare.shared import RareCore
|
||||||
from rare.ui.components.tabs.games.integrations.eos_widget import Ui_EosWidget
|
from rare.ui.components.tabs.games.integrations.eos_widget import Ui_EosWidget
|
||||||
from rare.utils import config_helper
|
from rare.utils import config_helper as config
|
||||||
from rare.utils.misc import icon
|
from rare.utils.misc import icon
|
||||||
from rare.widgets.elide_label import ElideLabel
|
from rare.widgets.elide_label import ElideLabel
|
||||||
|
|
||||||
|
@ -51,7 +52,10 @@ class EosPrefixWidget(QFrame):
|
||||||
self.indicator = QLabel(parent=self)
|
self.indicator = QLabel(parent=self)
|
||||||
self.indicator.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Preferred)
|
self.indicator.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Preferred)
|
||||||
|
|
||||||
self.prefix_label = ElideLabel(prefix if prefix is not None else overlay.app_title, parent=self)
|
self.prefix_label = ElideLabel(
|
||||||
|
prefix.replace(os.path.expanduser("~"), "~") if prefix is not None else overlay.app_title,
|
||||||
|
parent=self,
|
||||||
|
)
|
||||||
self.overlay_label = ElideLabel(parent=self)
|
self.overlay_label = ElideLabel(parent=self)
|
||||||
self.overlay_label.setDisabled(True)
|
self.overlay_label.setDisabled(True)
|
||||||
|
|
||||||
|
@ -93,7 +97,7 @@ class EosPrefixWidget(QFrame):
|
||||||
def update_state(self) -> None:
|
def update_state(self) -> None:
|
||||||
active_path = os.path.normpath(p) if (p := self.overlay.active_path(self.prefix)) else ""
|
active_path = os.path.normpath(p) if (p := self.overlay.active_path(self.prefix)) else ""
|
||||||
|
|
||||||
self.overlay_label.setText(f"<i>{active_path}<\i>")
|
self.overlay_label.setText(f"<i>{active_path}</i>")
|
||||||
self.path_select.clear()
|
self.path_select.clear()
|
||||||
|
|
||||||
if not self.overlay.is_installed and not self.overlay.available_paths(self.prefix):
|
if not self.overlay.is_installed and not self.overlay.available_paths(self.prefix):
|
||||||
|
@ -103,8 +107,6 @@ class EosPrefixWidget(QFrame):
|
||||||
self.button.setText(self.tr("Unavailable"))
|
self.button.setText(self.tr("Unavailable"))
|
||||||
return
|
return
|
||||||
|
|
||||||
self.setDisabled(False)
|
|
||||||
|
|
||||||
if self.overlay.is_enabled(self.prefix):
|
if self.overlay.is_enabled(self.prefix):
|
||||||
self.indicator.setPixmap(icon("fa.check-circle-o", color="green").pixmap(QSize(20, 20)))
|
self.indicator.setPixmap(icon("fa.check-circle-o", color="green").pixmap(QSize(20, 20)))
|
||||||
else:
|
else:
|
||||||
|
@ -120,6 +122,8 @@ class EosPrefixWidget(QFrame):
|
||||||
self.path_select.setItemData(self.path_select.findData(path), path, Qt.ToolTipRole)
|
self.path_select.setItemData(self.path_select.findData(path), path, Qt.ToolTipRole)
|
||||||
self.path_select.setCurrentIndex(self.path_select.findData(active_path))
|
self.path_select.setCurrentIndex(self.path_select.findData(active_path))
|
||||||
|
|
||||||
|
self.setEnabled(self.overlay.state == RareEosOverlay.State.IDLE)
|
||||||
|
|
||||||
@pyqtSlot()
|
@pyqtSlot()
|
||||||
def action(self) -> None:
|
def action(self) -> None:
|
||||||
path = self.path_select.currentData(Qt.UserRole)
|
path = self.path_select.currentData(Qt.UserRole)
|
||||||
|
@ -128,10 +132,14 @@ class EosPrefixWidget(QFrame):
|
||||||
if self.overlay.is_enabled(self.prefix) and (path == active_path):
|
if self.overlay.is_enabled(self.prefix) and (path == active_path):
|
||||||
if not self.overlay.disable(prefix=self.prefix):
|
if not self.overlay.disable(prefix=self.prefix):
|
||||||
QMessageBox.warning(
|
QMessageBox.warning(
|
||||||
self, "Warning",
|
self,
|
||||||
|
"Warning",
|
||||||
self.tr("Failed to completely disable the active EOS Overlay.{}").format(
|
self.tr("Failed to completely disable the active EOS Overlay.{}").format(
|
||||||
self.tr(" Since the previous overlay was managed by EGL you can safely ignore this is.")
|
self.tr(
|
||||||
if active_path != install_path else ""
|
" Since the previous overlay was managed by EGL you can safely ignore this is."
|
||||||
|
)
|
||||||
|
if active_path != install_path
|
||||||
|
else ""
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
|
@ -141,7 +149,9 @@ class EosPrefixWidget(QFrame):
|
||||||
self,
|
self,
|
||||||
"Warning",
|
"Warning",
|
||||||
self.tr("Failed to completely enable EOS overlay.{}").format(
|
self.tr("Failed to completely enable EOS overlay.{}").format(
|
||||||
self.tr(" Since the previous overlay was managed by EGL you can safely ignore this is.")
|
self.tr(
|
||||||
|
" Since the previous overlay was managed by EGL you can safely ignore this is."
|
||||||
|
)
|
||||||
if active_path != install_path
|
if active_path != install_path
|
||||||
else ""
|
else ""
|
||||||
),
|
),
|
||||||
|
@ -175,6 +185,7 @@ class EosGroup(QGroupBox):
|
||||||
self.signals = self.rcore.signals()
|
self.signals = self.rcore.signals()
|
||||||
self.overlay = self.rcore.get_overlay()
|
self.overlay = self.rcore.get_overlay()
|
||||||
|
|
||||||
|
self.overlay.signals.widget.update.connect(self.update_state)
|
||||||
self.overlay.signals.game.installed.connect(self.install_finished)
|
self.overlay.signals.game.installed.connect(self.install_finished)
|
||||||
self.overlay.signals.game.uninstalled.connect(self.uninstall_finished)
|
self.overlay.signals.game.uninstalled.connect(self.uninstall_finished)
|
||||||
|
|
||||||
|
@ -191,18 +202,29 @@ class EosGroup(QGroupBox):
|
||||||
self.ui.update_button.setEnabled(False)
|
self.ui.update_button.setEnabled(False)
|
||||||
|
|
||||||
self.threadpool = QThreadPool.globalInstance()
|
self.threadpool = QThreadPool.globalInstance()
|
||||||
|
self.worker: Optional[CheckForUpdateWorker] = None
|
||||||
|
|
||||||
def showEvent(self, a0) -> None:
|
def showEvent(self, a0: QShowEvent) -> None:
|
||||||
|
if a0.spontaneous():
|
||||||
|
return super().showEvent(a0)
|
||||||
self.check_for_update()
|
self.check_for_update()
|
||||||
self.update_prefixes()
|
self.update_prefixes()
|
||||||
|
self.update_state()
|
||||||
super().showEvent(a0)
|
super().showEvent(a0)
|
||||||
|
|
||||||
|
@pyqtSlot()
|
||||||
|
def update_state(self):
|
||||||
|
self.ui.install_button.setEnabled(self.overlay.state == RareEosOverlay.State.IDLE)
|
||||||
|
self.ui.update_button.setEnabled(self.overlay.state == RareEosOverlay.State.IDLE and self.overlay.has_update)
|
||||||
|
self.ui.uninstall_button.setEnabled(self.overlay.state == RareEosOverlay.State.IDLE)
|
||||||
|
|
||||||
def update_prefixes(self):
|
def update_prefixes(self):
|
||||||
for widget in self.findChildren(EosPrefixWidget, options=Qt.FindDirectChildrenOnly):
|
for widget in self.findChildren(EosPrefixWidget, options=Qt.FindDirectChildrenOnly):
|
||||||
widget.deleteLater()
|
widget.deleteLater()
|
||||||
|
|
||||||
if platform.system() != "Windows":
|
if platform.system() != "Windows":
|
||||||
prefixes = config_helper.get_wine_prefixes()
|
prefixes = config.get_prefixes()
|
||||||
|
prefixes = {prefix for prefix in prefixes if config.prefix_exists(prefix)}
|
||||||
if platform.system() == "Darwin":
|
if platform.system() == "Darwin":
|
||||||
# TODO: add crossover support
|
# TODO: add crossover support
|
||||||
pass
|
pass
|
||||||
|
@ -214,16 +236,22 @@ class EosGroup(QGroupBox):
|
||||||
widget = EosPrefixWidget(self.overlay, None)
|
widget = EosPrefixWidget(self.overlay, None)
|
||||||
self.ui.eos_layout.addWidget(widget)
|
self.ui.eos_layout.addWidget(widget)
|
||||||
|
|
||||||
|
@pyqtSlot(bool)
|
||||||
|
def check_for_update_finished(self, update_available: bool):
|
||||||
|
self.worker = None
|
||||||
|
self.ui.update_button.setEnabled(update_available)
|
||||||
|
|
||||||
def check_for_update(self):
|
def check_for_update(self):
|
||||||
|
self.ui.update_button.setEnabled(False)
|
||||||
if not self.overlay.is_installed:
|
if not self.overlay.is_installed:
|
||||||
return
|
return
|
||||||
|
|
||||||
def worker_finished(update_available):
|
if self.worker is not None:
|
||||||
self.ui.update_button.setEnabled(update_available)
|
return
|
||||||
|
|
||||||
worker = CheckForUpdateWorker(self.core)
|
self.worker = CheckForUpdateWorker(self.core)
|
||||||
worker.signals.update_available.connect(worker_finished)
|
self.worker.signals.update_available.connect(self.check_for_update_finished)
|
||||||
QThreadPool.globalInstance().start(worker)
|
QThreadPool.globalInstance().start(self.worker)
|
||||||
|
|
||||||
@pyqtSlot()
|
@pyqtSlot()
|
||||||
def install_finished(self):
|
def install_finished(self):
|
||||||
|
|
|
@ -575,7 +575,9 @@ class RareEosOverlay(RareGameBase):
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def has_update(self) -> bool:
|
def has_update(self) -> bool:
|
||||||
self.core.check_for_overlay_updates()
|
# lk: Don't check for updates here to ensure fast return
|
||||||
|
# There is already a thread in the EosGroup form to update it for us asynchronously
|
||||||
|
# and legendary does it too during login
|
||||||
return self.core.overlay_update_available
|
return self.core.overlay_update_available
|
||||||
|
|
||||||
def is_enabled(self, prefix: Optional[str] = None) -> bool:
|
def is_enabled(self, prefix: Optional[str] = None) -> bool:
|
||||||
|
@ -644,13 +646,11 @@ class RareEosOverlay(RareGameBase):
|
||||||
def install(self) -> bool:
|
def install(self) -> bool:
|
||||||
if not self.is_idle:
|
if not self.is_idle:
|
||||||
return False
|
return False
|
||||||
if self.is_installed:
|
|
||||||
base_path = self.igame.install_path
|
|
||||||
else:
|
|
||||||
base_path = self.core.get_default_install_dir()
|
|
||||||
self.signals.game.install.emit(
|
self.signals.game.install.emit(
|
||||||
InstallOptionsModel(
|
InstallOptionsModel(
|
||||||
app_name=self.app_name, base_path=base_path, platform="Windows", overlay=True
|
app_name=self.app_name,
|
||||||
|
base_path=self.core.get_default_install_dir(),
|
||||||
|
platform="Windows", update=self.is_installed, overlay=True
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
return True
|
return True
|
||||||
|
|
|
@ -41,9 +41,6 @@ class InstallInfoWorker(Worker):
|
||||||
else:
|
else:
|
||||||
raise LgndrException(status.message)
|
raise LgndrException(status.message)
|
||||||
else:
|
else:
|
||||||
if not os.path.exists(path := self.options.base_path):
|
|
||||||
os.makedirs(path)
|
|
||||||
|
|
||||||
dlm, analysis, igame = self.core.prepare_overlay_install(
|
dlm, analysis, igame = self.core.prepare_overlay_install(
|
||||||
path=self.options.base_path
|
path=self.options.base_path
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in a new issue