from __future__ import annotations
from RWESharp.Modify.Ui import SettingUI
from RWESharp.Configurable.QtTypes import KeyConfigurable
from PySide6.QtWidgets import QTreeWidgetItem
from PySide6.QtCore import Qt
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from RWESharp.Modify.Mod import Mod
[docs]
class TreeElement:
[docs]
def __init__(self, mod: Mod, text: str, name: str, parent=None, children: list[TreeElement] = None):
self.mod: Mod = mod
self.text: str = text
self.name: str = name
self.children: list[TreeElement] = []
self.parent: TreeElement | None = parent
if children is not None:
self.add_children(*children)
if parent is not None:
self.parent.add_child(self)
[docs]
def add_children(self, *children: TreeElement):
for i in children:
self.add_child(i)
[docs]
def add_child(self, child: TreeElement):
child.parent = self
self.children.append(child)
[docs]
def find_child(self, name: str, recursive=False) -> TreeElement | None:
for i in self.children:
if name == i.name:
return i
if recursive:
return i.find_child(name, True)
return None
[docs]
def construct_tree(self) -> QTreeWidgetItem:
me = QTreeWidgetItem([self.text])
self.set_data(me)
for i in self.children:
me.addChild(i.construct_tree())
return me
[docs]
def set_data(self, item):
item.setData(0, Qt.ItemDataRole.UserRole, [self.name])
[docs]
class SettingElement(TreeElement):
[docs]
def __init__(self, mod: Mod, text: str, name: str, ui: SettingUI = None, parent=None, children: list[SettingElement] = None):
super().__init__(mod, text, name, parent, children)
self.ui: SettingUI | None = ui
[docs]
def add_myself(self):
self.mod.add_setting(self)
return self
[docs]
def set_data(self, item):
item.setData(0, Qt.ItemDataRole.UserRole, [self.name, self.ui])
[docs]
class HotkeyElement(TreeElement):
[docs]
def __init__(self, mod: Mod, text: str, name: str, key: KeyConfigurable | None = None, parent=None, children: list[HotkeyElement] = None):
super().__init__(mod, text, name, parent, children)
self.key: KeyConfigurable | None = key
[docs]
def add_myself(self):
self.mod.add_hotkey(self)
return self
[docs]
def set_data(self, item):
if self.key is None:
item.setData(0, Qt.ItemDataRole.UserRole, [self.name])
return
item.setData(0, Qt.ItemDataRole.UserRole, [self.name, self.key])
item.setText(1, self.key.value.toString())
[docs]
def add_children_configurables(self, *keys: KeyConfigurable):
for i in keys:
HotkeyElement(self.mod, i.shortdesc, i.name, i, self)
[docs]
def get_hotkeys_from_pattern(mod: Mod, pattern: str) -> list[KeyConfigurable]:
keys = []
for i in mod.configs:
if isinstance(i, KeyConfigurable) and pattern in i.name:
keys.append(i)
return keys