Source code for BaseMod.effects.effectExplorer

from PySide6.QtCore import Qt
from PySide6.QtGui import QPixmap, QAction, QColor
from PySide6.QtWidgets import QTreeWidgetItem

from BaseMod.effects.effectHistory import EffectAdd
from BaseMod.effects.ui.effectexplorer_ui import Ui_EffectExplorer
from RWS.Widgets import ViewDockWidget
from RWS.Loaders import Effect, EffectCategory
from RWS.Utils import color_lerp


[docs] class EffectExplorer(ViewDockWidget):
[docs] def __init__(self, editor, parent=None): super().__init__(parent) self.mod = editor.mod parent.addDockWidget(Qt.DockWidgetArea.RightDockWidgetArea, self) self.setFloating(True) self.ui = Ui_EffectExplorer() self.ui.setupUi(self) self.load_effects() self.ui.Effects.itemClicked.connect(self.effect_pressed) self.ui.Effects.itemSelectionChanged.connect(self.selection_changed) self.ui.Effects.itemDoubleClicked.connect(self.add_effect) self.ui.AddEffect.clicked.connect(self.add_effect) # self.ui.splitter.widget(0) self.ui.splitter.setSizes([2, 5]) self.ui.Search.textChanged.connect(self.search) # self.ui.splitter.splitterMoved.connect(self.moved) self.effect = None self.image = self.ui.Effectpreview.workscene.addPixmap(QPixmap(1, 1)) self.ui.Effectpreview.items.append(self.image) self.effect_explorer_action = QAction("Effect Explorer") self.mod.manager.window_menu.addAction(self.effect_explorer_action) self.link_action(self.effect_explorer_action) self.change_visibility(False) self.mod.bmconfig.effectexplorer_key.link_action(self.effect_explorer_action) self.mod.bmconfig.icon_color.valueChanged.connect(self.change_color) self.ui.Down.clicked.connect(lambda : self.ui.Effects.setCurrentItem(self.ui.Effects.itemBelow(self.ui.Effects.currentItem()))) self.ui.Up.clicked.connect(lambda : self.ui.Effects.setCurrentItem(self.ui.Effects.itemAbove(self.ui.Effects.currentItem())))
[docs] def change_color(self): self.ui.Down.setIcon(u":/misc/misc/arrow_down.svg") self.ui.Up.setIcon(u":/misc/misc/arrow_up.svg")
[docs] def resizeEvent(self, event): if hasattr(self, 'ui') and self.ui: width, height = self.width(), self.height() aspect_ratio = width / height if height else 1 if hasattr(self.ui, "splitter") and self.ui.splitter: self.ui.splitter.setOrientation(Qt.Orientation.Horizontal if aspect_ratio > 1.45 else Qt.Orientation.Vertical) super().resizeEvent(event)
[docs] def search(self): self.load_effects()
[docs] def add_effect(self): self.mod.manager.selected_viewport.level.add_history(EffectAdd, self.effect) if len(self.mod.manager.selected_viewport.level.l_effects) == 1: self.mod.effecteditor.select_effect(0)
[docs] def load_effects(self): filter = self.ui.Search.text() self.ui.Effects.clear() for i in self.mod.manager.effects.categories: item = QTreeWidgetItem([i.name]) item.setData(0, Qt.ItemDataRole.UserRole, i) icon = QPixmap(20, 20) icon.fill(i.color) item.setIcon(0, icon) for indx, e in enumerate(i.effects): if filter != "" and filter.lower() not in e.name.lower(): continue icon2 = QPixmap(20, 20) icon2.fill(color_lerp(i.color, QColor(0, 0, 0), indx / 15)) effect = QTreeWidgetItem([e.name]) effect.setData(0, Qt.ItemDataRole.UserRole, e) effect.setIcon(0, icon2) item.addChild(effect) if filter != "" and item.childCount() == 0: continue self.ui.Effects.addTopLevelItem(item) if filter != "": self.ui.Effects.expandAll()
[docs] def selection_changed(self): items = self.ui.Effects.selectedItems() if len(items) == 0: return self.set_preview(items[0])
[docs] def effect_pressed(self, item: QTreeWidgetItem, column: int): self.set_preview(item)
[docs] def set_preview(self, item: QTreeWidgetItem): if isinstance(item.data(0, Qt.ItemDataRole.UserRole), Effect): self.effect = item.data(0, Qt.ItemDataRole.UserRole) self.image.setPixmap(self.effect.preview) self.ui.Description.setText(item.data(0, Qt.ItemDataRole.UserRole).description) elif isinstance(item.data(0, Qt.ItemDataRole.UserRole), EffectCategory): self.ui.Effects.expand(self.ui.Effects.indexFromItem(item, 0)) self.ui.Description.setText(item.data(0, Qt.ItemDataRole.UserRole).name)