92 lines
3.1 KiB
Python
92 lines
3.1 KiB
Python
import os
|
|
from logging import getLogger
|
|
from typing import Optional
|
|
|
|
from PyQt5.QtCore import pyqtSignal, Qt, QSignalBlocker
|
|
from PyQt5.QtGui import QShowEvent
|
|
from PyQt5.QtWidgets import QFileDialog, QFormLayout, QGroupBox
|
|
|
|
from rare.shared import LegendaryCoreSingleton, GlobalSignalsSingleton
|
|
from rare.utils import config_helper as config
|
|
from rare.widgets.indicator_edit import PathEdit, IndicatorReasonsCommon
|
|
|
|
logger = getLogger("WineSettings")
|
|
|
|
|
|
class WineSettings(QGroupBox):
|
|
# str: option key
|
|
environ_changed = pyqtSignal(str)
|
|
|
|
def __init__(self, parent=None):
|
|
super(WineSettings, self).__init__(parent=parent)
|
|
self.setTitle(self.tr("Wine settings"))
|
|
|
|
self.core = LegendaryCoreSingleton()
|
|
self.signals = GlobalSignalsSingleton()
|
|
|
|
self.app_name: Optional[str] = "default"
|
|
|
|
# Wine prefix
|
|
self.wine_prefix = PathEdit(
|
|
path="",
|
|
file_mode=QFileDialog.DirectoryOnly,
|
|
edit_func=lambda path: (os.path.isdir(path) or not path, path, IndicatorReasonsCommon.DIR_NOT_EXISTS),
|
|
save_func=self.save_prefix,
|
|
)
|
|
|
|
# Wine executable
|
|
self.wine_exec = PathEdit(
|
|
path="",
|
|
file_mode=QFileDialog.ExistingFile,
|
|
name_filters=["wine", "wine64"],
|
|
edit_func=lambda text: (os.path.exists(text) or not text, text, IndicatorReasonsCommon.DIR_NOT_EXISTS),
|
|
save_func=self.save_exec,
|
|
)
|
|
|
|
layout = QFormLayout(self)
|
|
layout.addRow(self.tr("Executable"), self.wine_exec)
|
|
layout.addRow(self.tr("Prefix"), self.wine_prefix)
|
|
layout.setFieldGrowthPolicy(QFormLayout.ExpandingFieldsGrow)
|
|
layout.setLabelAlignment(Qt.AlignRight | Qt.AlignVCenter)
|
|
layout.setFormAlignment(Qt.AlignLeading | Qt.AlignTop)
|
|
|
|
def showEvent(self, a0: QShowEvent):
|
|
if a0.spontaneous():
|
|
return super().showEvent(a0)
|
|
|
|
_ = QSignalBlocker(self.wine_prefix)
|
|
self.wine_prefix.setText(self.load_prefix())
|
|
_ = QSignalBlocker(self.wine_exec)
|
|
self.wine_exec.setText(self.load_exec())
|
|
self.setDisabled(config.get_boolean(self.app_name, "no_wine", fallback=False))
|
|
|
|
return super().showEvent(a0)
|
|
|
|
def tool_enabled(self, enabled: bool):
|
|
if enabled:
|
|
config.set_boolean(self.app_name, "no_wine", True)
|
|
else:
|
|
config.remove_option(self.app_name, "no_wine")
|
|
self.setDisabled(enabled)
|
|
|
|
def load_prefix(self) -> str:
|
|
if self.app_name is None:
|
|
raise RuntimeError
|
|
return config.get_wine_prefix(self.app_name, "")
|
|
|
|
def save_prefix(self, path: str) -> None:
|
|
if self.app_name is None:
|
|
raise RuntimeError
|
|
config.save_wine_prefix(self.app_name, path)
|
|
self.environ_changed.emit("WINEPREFIX")
|
|
|
|
def load_exec(self) -> str:
|
|
if self.app_name is None:
|
|
raise RuntimeError
|
|
return config.get_option(self.app_name, "wine_executable", "")
|
|
|
|
def save_exec(self, text: str) -> None:
|
|
if self.app_name is None:
|
|
raise RuntimeError
|
|
config.save_option(self.app_name, "wine_executable", text)
|