Source code for RWESharp.Modify.Ui

from __future__ import annotations
from PySide6.QtWidgets import QWidget, QAbstractButton, QAbstractSlider
from typing import TYPE_CHECKING
from abc import ABC, abstractmethod
from RWESharp.info import PATH_FILES_CACHE
import os
if TYPE_CHECKING:
    from BaseMod.baseMod import BaseMod
    from RWESharp.widgets.SettingsViewer import SettingsViewer
    from RWESharp.widgets.Viewport import ViewPort
    from RWESharp.Configurable.Configurable import Configurable
    from RWESharp.Modify.Mod import Mod
    from RWESharp.Modify.Theme import Theme
    from RWESharp.Level.RWELevel import RWELevel

logfile = open(os.path.join(PATH_FILES_CACHE, "log.txt"), "a+")


[docs] class UI(QWidget): """ UI base for creating Editor UI's todo add more """
[docs] def __init__(self, mod: Mod, parent=None): super().__init__(parent) self.mod = mod
[docs] def begin_recording(self) -> None: """Records all of your actions if Debug mode is set :return: None """ if not self.mod.manager.application.debug: return ch: list[QWidget] = self.findChildren(QWidget) for i in ch: if isinstance(i, QAbstractButton): i.clicked.connect(self._answer(i, f"b {i.objectName()} pressed")) # todo elif isinstance(i, QAbstractSlider): i.valueChanged.connect(self._answer(i, f"s {i.objectName()} changed {i.value()}")) # todo
def _answer(self, obj, text): return lambda x: print(text, file=logfile, flush=True)
[docs] def editor_linked(self, editor) -> None: """Gets called whenever Editor with this UI is being added :param editor: Editor that was added :return: None """
@property def basemod(self) -> BaseMod: return self.mod.manager.basemod @property def selected_viewport(self) -> ViewPort: return self.mod.manager.selected_viewport @property def level(self) -> RWELevel: return self.mod.manager.selected_viewport.level @property def level_loaded(self) -> bool: """Returns if level was loaded :return: if viewport is available :rtype: bool """ return self.mod.manager.selected_viewport is not None
[docs] class ViewUI(UI): """ Addition to `UI` that allows to create View tabs todo add more """
[docs] def add_myself(self) -> ViewUI: """Adds `ViewUI` to View tab :return: self :rtype: ViewUI """ self.mod.add_view(self) self.begin_recording() return self
[docs] class SettingUI(ABC): """ SettingUI is UI for Preferences menu todo add more """
[docs] def __init__(self, mod: Mod): self.mod = mod self.settings: list[SettingUI.ManageableSetting] = []
[docs] @abstractmethod def init_ui(self, viewer: SettingsViewer) -> None: """Called when ui is being initiated :param viewer: SettingsViewer :return: None """
[docs] def reset_values(self): """Called when values need to be reset to the saved ones :return: None """ for i in self.settings: i.source2setting() i.apply_setting()
[docs] def reset_values_default(self): """Called when values need to be reset to default :return: None """ for i in self.settings: i.reset_values_default()
[docs] def apply_values(self): """Called when values need to be applied :return: None """ for i in self.settings: i.setting2source() i.apply_setting()
@property def is_changed(self): """Returns whenever settings values were changed :return: If settings were changed :rtype: bool """ for i in self.settings: if i.setting.value != i.setting.default: return True return False @property def basemod(self) -> BaseMod: return self.mod.manager.basemod
[docs] class ManageableSetting: """ todo this """ def __init__(self, setting: Configurable | None = None, source: Configurable | None = None, source2setting=lambda x: x, setting2source=lambda x: x): self.setting = setting self.source = source self.source2settingfunc = source2setting self.setting2sourcefunc = setting2source
[docs] def source2setting(self) -> None: """Updated default value of source `Configurable` to settings `Configurable` :return: None """ if self.setting is None: return if self.source is None: self.setting.update_value_default(self.source2settingfunc(None)) return self.setting.update_value_default(self.source2settingfunc(self.source.value))
[docs] def setting2source(self) -> None: """Updated default value of setting `Configurable` to sources `Configurable` :return: None """ if self.source is None: return if self.setting is None: self.source.update_value(self.setting2sourcefunc(None)) return self.source.update_value(self.setting2sourcefunc(self.setting.value))
[docs] def reset_values_default(self) -> None: """Reset settings value :return: None """ if self.setting is None: return if self.source is None: self.setting.update_value_default(self.source2settingfunc(None)) return self.setting.update_value(self.source2settingfunc(self.source.default))
[docs] def apply_setting(self) -> None: """Applies new settings value as settings default :return: None """ if self.setting is not None: self.setting.update_value_default(self.setting.value)
[docs] def add_myself(self, settingui: SettingUI) -> SettingUI.ManageableSetting: """Adds itself onto Settings Ui :param settingui: Ui to add to :return: self :rtype: SettingUI.ManageableSetting """ settingui.settings.append(self) return self
@property def value(self): """Settings value :return: Value """ return self.setting.value
[docs] class ThemeUI(UI): """ Ui for custom Themes todo add more """
[docs] def __init__(self, theme: Theme, parent=None): super().__init__(theme.mod, parent) self.theme = theme self.mod = theme.mod
[docs] @abstractmethod def setup_ui(self, viewer): pass