commit
44926869bb
|
@ -1,24 +1,21 @@
|
||||||
|
import datetime
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
import platform
|
|
||||||
import shutil
|
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
import datetime
|
|
||||||
from logging import getLogger
|
from logging import getLogger
|
||||||
|
|
||||||
from PyQt5.QtCore import QObject, QSettings, QProcess, QProcessEnvironment, pyqtSignal, QUrl, QTimer
|
from PyQt5.QtCore import QObject, QProcess, pyqtSignal, QUrl, QTimer
|
||||||
from PyQt5.QtGui import QDesktopServices
|
from PyQt5.QtGui import QDesktopServices
|
||||||
from PyQt5.QtNetwork import QLocalSocket
|
from PyQt5.QtNetwork import QLocalSocket
|
||||||
from PyQt5.QtWidgets import QMessageBox, QPushButton
|
from PyQt5.QtWidgets import QMessageBox, QPushButton
|
||||||
|
|
||||||
from rare.components.dialogs.uninstall_dialog import UninstallDialog
|
from rare.components.dialogs.uninstall_dialog import UninstallDialog
|
||||||
from rare.components.extra.console import Console
|
|
||||||
from rare.components.tabs.games import CloudSaveUtils
|
from rare.components.tabs.games import CloudSaveUtils
|
||||||
|
from rare.game_launch_helper import message_models
|
||||||
from rare.shared import LegendaryCoreSingleton, GlobalSignalsSingleton, ArgumentsSingleton
|
from rare.shared import LegendaryCoreSingleton, GlobalSignalsSingleton, ArgumentsSingleton
|
||||||
from rare.utils import legendary_utils
|
from rare.utils import legendary_utils
|
||||||
from rare.utils import utils
|
from rare.utils import utils
|
||||||
from rare.utils.meta import RareGameMeta
|
from rare.utils.meta import RareGameMeta
|
||||||
from rare.game_launch_helper import message_models
|
|
||||||
|
|
||||||
logger = getLogger("GameUtils")
|
logger = getLogger("GameUtils")
|
||||||
|
|
||||||
|
@ -146,7 +143,6 @@ class GameUtils(QObject):
|
||||||
self.signals = GlobalSignalsSingleton()
|
self.signals = GlobalSignalsSingleton()
|
||||||
self.args = ArgumentsSingleton()
|
self.args = ArgumentsSingleton()
|
||||||
|
|
||||||
self.console = Console()
|
|
||||||
self.cloud_save_utils = CloudSaveUtils()
|
self.cloud_save_utils = CloudSaveUtils()
|
||||||
self.cloud_save_utils.sync_finished.connect(self.sync_finished)
|
self.cloud_save_utils.sync_finished.connect(self.sync_finished)
|
||||||
self.game_meta = RareGameMeta()
|
self.game_meta = RareGameMeta()
|
||||||
|
@ -251,7 +247,6 @@ class GameUtils(QObject):
|
||||||
self.finished.emit(app_name, "")
|
self.finished.emit(app_name, "")
|
||||||
|
|
||||||
logger.info(f"Game exited with exit code: {exit_code}")
|
logger.info(f"Game exited with exit code: {exit_code}")
|
||||||
self.console.log(f"Game exited with code: {exit_code}")
|
|
||||||
self.signals.set_discord_rpc.emit("")
|
self.signals.set_discord_rpc.emit("")
|
||||||
is_origin = self.core.get_game(app_name).third_party_store == "Origin"
|
is_origin = self.core.get_game(app_name).third_party_store == "Origin"
|
||||||
if exit_code == 1 and is_origin:
|
if exit_code == 1 and is_origin:
|
||||||
|
@ -277,8 +272,6 @@ class GameUtils(QObject):
|
||||||
self.core.get_game(app_name).app_title
|
self.core.get_game(app_name).app_title
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
# show console on error, even if disabled
|
|
||||||
self.console.show()
|
|
||||||
|
|
||||||
game: RunningGameModel = self.running_games.get(app_name, None)
|
game: RunningGameModel = self.running_games.get(app_name, None)
|
||||||
if app_name in self.running_games.keys():
|
if app_name in self.running_games.keys():
|
||||||
|
@ -302,77 +295,6 @@ class GameUtils(QObject):
|
||||||
# TODO move this to helper
|
# TODO move this to helper
|
||||||
self.cloud_save_utils.game_finished(app_name, always_ask=False)
|
self.cloud_save_utils.game_finished(app_name, always_ask=False)
|
||||||
|
|
||||||
def _launch_pre_command(self, env: dict):
|
|
||||||
proc = QProcess()
|
|
||||||
environment = QProcessEnvironment().systemEnvironment()
|
|
||||||
for e in env:
|
|
||||||
environment.insert(e, env[e])
|
|
||||||
proc.setProcessEnvironment(environment)
|
|
||||||
|
|
||||||
proc.readyReadStandardOutput.connect(
|
|
||||||
lambda: self.console.log(
|
|
||||||
str(proc.readAllStandardOutput().data(), "utf-8", "ignore")
|
|
||||||
)
|
|
||||||
)
|
|
||||||
proc.readyReadStandardError.connect(
|
|
||||||
lambda: self.console.error(
|
|
||||||
str(proc.readAllStandardError().data(), "utf-8", "ignore")
|
|
||||||
)
|
|
||||||
)
|
|
||||||
self.console.set_env(environment)
|
|
||||||
return proc
|
|
||||||
|
|
||||||
def _get_process(self, app_name, env):
|
|
||||||
process = GameProcess(app_name)
|
|
||||||
|
|
||||||
environment = QProcessEnvironment().systemEnvironment()
|
|
||||||
for e in env:
|
|
||||||
environment.insert(e, env[e])
|
|
||||||
process.setProcessEnvironment(environment)
|
|
||||||
|
|
||||||
process.readyReadStandardOutput.connect(
|
|
||||||
lambda: self.console.log(
|
|
||||||
str(process.readAllStandardOutput().data(), "utf-8", "ignore")
|
|
||||||
)
|
|
||||||
)
|
|
||||||
process.readyReadStandardError.connect(
|
|
||||||
lambda: self.console.error(
|
|
||||||
str(process.readAllStandardError().data(), "utf-8", "ignore")
|
|
||||||
)
|
|
||||||
)
|
|
||||||
process.finished.connect(lambda x: self.game_finished(x, app_name))
|
|
||||||
process.stateChanged.connect(
|
|
||||||
lambda state: self.console.show()
|
|
||||||
if (state == QProcess.Running
|
|
||||||
and QSettings().value("show_console", False, bool))
|
|
||||||
else None
|
|
||||||
)
|
|
||||||
self.console.set_env(environment)
|
|
||||||
return process
|
|
||||||
|
|
||||||
def _launch_origin(self, app_name, process: QProcess):
|
|
||||||
origin_uri = self.core.get_origin_uri(app_name, self.args.offline)
|
|
||||||
logger.info("Launch Origin Game: ")
|
|
||||||
if platform.system() == "Windows":
|
|
||||||
QDesktopServices.openUrl(QUrl(origin_uri))
|
|
||||||
self.finished.emit(app_name, "")
|
|
||||||
return
|
|
||||||
|
|
||||||
command = self.core.get_app_launch_command(app_name)
|
|
||||||
|
|
||||||
if not os.path.exists(command[0]) and shutil.which(command[0]) is None:
|
|
||||||
# wine binary does not exist
|
|
||||||
QMessageBox.warning(
|
|
||||||
None, "Warning",
|
|
||||||
self.tr(
|
|
||||||
"'{}' does not exist. Please change it in Settings"
|
|
||||||
).format(command[0]),
|
|
||||||
)
|
|
||||||
process.deleteLater()
|
|
||||||
return
|
|
||||||
command.append(origin_uri)
|
|
||||||
process.start(command[0], command[1:])
|
|
||||||
|
|
||||||
def sync_finished(self, app_name):
|
def sync_finished(self, app_name):
|
||||||
if app_name in self.launch_queue.keys():
|
if app_name in self.launch_queue.keys():
|
||||||
self.cloud_save_finished.emit(app_name)
|
self.cloud_save_finished.emit(app_name)
|
||||||
|
|
|
@ -22,8 +22,9 @@ def find_app_name(path: str, core) -> Optional[str]:
|
||||||
if os.path.exists(os.path.join(path, ".egstore")):
|
if os.path.exists(os.path.join(path, ".egstore")):
|
||||||
for i in os.listdir(os.path.join(path, ".egstore")):
|
for i in os.listdir(os.path.join(path, ".egstore")):
|
||||||
if i.endswith(".mancpn"):
|
if i.endswith(".mancpn"):
|
||||||
file = os.path.join(path, ".egstore", i)
|
with open(os.path.join(path, ".egstore", i)) as file:
|
||||||
return json.load(open(file, "r")).get("AppName")
|
app_name = json.load(file).get("AppName")
|
||||||
|
return app_name
|
||||||
elif app_name := legendary_utils.resolve_aliases(
|
elif app_name := legendary_utils.resolve_aliases(
|
||||||
core, os.path.basename(os.path.normpath(path))):
|
core, os.path.basename(os.path.normpath(path))):
|
||||||
# return None if game does not exist (Workaround for overlay)
|
# return None if game does not exist (Workaround for overlay)
|
||||||
|
|
|
@ -11,9 +11,9 @@ from PyQt5.QtCore import QObject, QProcess, pyqtSignal, QUrl, QRunnable, QThread
|
||||||
from PyQt5.QtGui import QDesktopServices
|
from PyQt5.QtGui import QDesktopServices
|
||||||
from PyQt5.QtNetwork import QLocalServer, QLocalSocket
|
from PyQt5.QtNetwork import QLocalServer, QLocalSocket
|
||||||
|
|
||||||
|
from .console import Console
|
||||||
from .lgd_helper import get_launch_args, InitArgs, get_configured_process, LaunchArgs, GameArgsError
|
from .lgd_helper import get_launch_args, InitArgs, get_configured_process, LaunchArgs, GameArgsError
|
||||||
from .message_models import ErrorModel, Actions, FinishedModel, BaseModel, StateChangedModel
|
from .message_models import ErrorModel, Actions, FinishedModel, BaseModel, StateChangedModel
|
||||||
from ..components.extra.console import Console
|
|
||||||
from ..shared import LegendaryCoreSingleton
|
from ..shared import LegendaryCoreSingleton
|
||||||
from ..widgets.rare_app import RareApp
|
from ..widgets.rare_app import RareApp
|
||||||
|
|
||||||
|
@ -94,9 +94,16 @@ class GameProcessApp(RareApp):
|
||||||
if self.console:
|
if self.console:
|
||||||
self.game_process.readyReadStandardOutput.connect(
|
self.game_process.readyReadStandardOutput.connect(
|
||||||
lambda: self.console.log(
|
lambda: self.console.log(
|
||||||
str(self.game_process.readAllStandardOutput().data(), "utf-8", "ignore")
|
self.game_process.readAllStandardOutput().data().decode("utf-8", "ignore")
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
self.game_process.readyReadStandardError.connect(
|
||||||
|
lambda: self.console.log(
|
||||||
|
self.game_process.readAllStandardError().data().decode("utf-8", "ignore")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
self.console.term.connect(lambda: self.game_process.terminate())
|
||||||
|
self.console.kill.connect(lambda: self.game_process.kill())
|
||||||
|
|
||||||
self.start_time = time.time()
|
self.start_time = time.time()
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
from PyQt5.QtCore import QProcessEnvironment
|
import platform
|
||||||
|
|
||||||
|
from PyQt5.QtCore import QProcessEnvironment, pyqtSignal
|
||||||
from PyQt5.QtGui import QTextCursor, QFont
|
from PyQt5.QtGui import QTextCursor, QFont
|
||||||
from PyQt5.QtWidgets import (
|
from PyQt5.QtWidgets import (
|
||||||
QPlainTextEdit,
|
QPlainTextEdit,
|
||||||
|
@ -15,6 +17,8 @@ from rare.ui.components.extra.console_env import Ui_ConsoleEnv
|
||||||
|
|
||||||
|
|
||||||
class Console(QDialog):
|
class Console(QDialog):
|
||||||
|
term = pyqtSignal()
|
||||||
|
kill = pyqtSignal()
|
||||||
env: QProcessEnvironment
|
env: QProcessEnvironment
|
||||||
|
|
||||||
def __init__(self, parent=None):
|
def __init__(self, parent=None):
|
||||||
|
@ -27,7 +31,6 @@ class Console(QDialog):
|
||||||
layout.addWidget(self.console)
|
layout.addWidget(self.console)
|
||||||
|
|
||||||
button_layout = QHBoxLayout()
|
button_layout = QHBoxLayout()
|
||||||
button_layout.addItem(QSpacerItem(0, 0, QSizePolicy.Expanding, QSizePolicy.Fixed))
|
|
||||||
|
|
||||||
self.env_button = QPushButton(self.tr("Show environment"))
|
self.env_button = QPushButton(self.tr("Show environment"))
|
||||||
button_layout.addWidget(self.env_button)
|
button_layout.addWidget(self.env_button)
|
||||||
|
@ -41,6 +44,18 @@ class Console(QDialog):
|
||||||
button_layout.addWidget(self.clear_button)
|
button_layout.addWidget(self.clear_button)
|
||||||
self.clear_button.clicked.connect(self.console.clear)
|
self.clear_button.clicked.connect(self.console.clear)
|
||||||
|
|
||||||
|
button_layout.addItem(QSpacerItem(0, 0, QSizePolicy.Expanding, QSizePolicy.Fixed))
|
||||||
|
|
||||||
|
self.terminate_button = QPushButton(self.tr("Terminate"))
|
||||||
|
self.terminate_button.setVisible(platform.system() == "Windows")
|
||||||
|
button_layout.addWidget(self.terminate_button)
|
||||||
|
self.terminate_button.clicked.connect(lambda: self.term.emit())
|
||||||
|
|
||||||
|
self.kill_button = QPushButton(self.tr("Kill"))
|
||||||
|
self.kill_button.setVisible(platform.system() == "Windows")
|
||||||
|
button_layout.addWidget(self.kill_button)
|
||||||
|
self.kill_button.clicked.connect(lambda: self.kill.emit())
|
||||||
|
|
||||||
layout.addLayout(button_layout)
|
layout.addLayout(button_layout)
|
||||||
|
|
||||||
self.setLayout(layout)
|
self.setLayout(layout)
|
|
@ -40,8 +40,8 @@ class Ui_ImportGroup(object):
|
||||||
self.import_folder_check.setFont(font)
|
self.import_folder_check.setFont(font)
|
||||||
self.import_folder_check.setObjectName("import_folder_check")
|
self.import_folder_check.setObjectName("import_folder_check")
|
||||||
self.formLayout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.import_folder_check)
|
self.formLayout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.import_folder_check)
|
||||||
self.horizontalLayout = QtWidgets.QHBoxLayout()
|
self.button_info_layout = QtWidgets.QHBoxLayout()
|
||||||
self.horizontalLayout.setObjectName("horizontalLayout")
|
self.button_info_layout.setObjectName("button_info_layout")
|
||||||
self.import_button = QtWidgets.QPushButton(ImportGroup)
|
self.import_button = QtWidgets.QPushButton(ImportGroup)
|
||||||
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Fixed)
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Fixed)
|
||||||
sizePolicy.setHorizontalStretch(0)
|
sizePolicy.setHorizontalStretch(0)
|
||||||
|
@ -49,12 +49,12 @@ class Ui_ImportGroup(object):
|
||||||
sizePolicy.setHeightForWidth(self.import_button.sizePolicy().hasHeightForWidth())
|
sizePolicy.setHeightForWidth(self.import_button.sizePolicy().hasHeightForWidth())
|
||||||
self.import_button.setSizePolicy(sizePolicy)
|
self.import_button.setSizePolicy(sizePolicy)
|
||||||
self.import_button.setObjectName("import_button")
|
self.import_button.setObjectName("import_button")
|
||||||
self.horizontalLayout.addWidget(self.import_button)
|
self.button_info_layout.addWidget(self.import_button)
|
||||||
self.info_label = QtWidgets.QLabel(ImportGroup)
|
self.info_label = QtWidgets.QLabel(ImportGroup)
|
||||||
self.info_label.setText("")
|
self.info_label.setText("")
|
||||||
self.info_label.setObjectName("info_label")
|
self.info_label.setObjectName("info_label")
|
||||||
self.horizontalLayout.addWidget(self.info_label)
|
self.button_info_layout.addWidget(self.info_label)
|
||||||
self.formLayout.setLayout(3, QtWidgets.QFormLayout.FieldRole, self.horizontalLayout)
|
self.formLayout.setLayout(3, QtWidgets.QFormLayout.FieldRole, self.button_info_layout)
|
||||||
|
|
||||||
self.retranslateUi(ImportGroup)
|
self.retranslateUi(ImportGroup)
|
||||||
QtCore.QMetaObject.connectSlotsByName(ImportGroup)
|
QtCore.QMetaObject.connectSlotsByName(ImportGroup)
|
||||||
|
|
|
@ -60,7 +60,7 @@
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="3" column="1">
|
<item row="3" column="1">
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
<layout class="QHBoxLayout" name="button_info_layout">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QPushButton" name="import_button">
|
<widget class="QPushButton" name="import_button">
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
|
|
Loading…
Reference in a new issue