from random import randint
from PySide6.QtCore import Qt, QPoint, QItemSelectionModel
from PySide6.QtGui import QPixmap, QColor, QAction
from PySide6.QtWidgets import QTreeWidgetItem, QDialog, QInputDialog, QMenu
from BaseMod.effects.effectHistory import EffectOptionChange, EffectRemove, EffectMove, EffectDuplicate
from BaseMod.effects.ui.effects_ui import Ui_Effects
from BaseMod.effects.ui.effectsdialog import Ui_EffectDialog
from BaseMod.effects.ui.effectsview_ui import Ui_EffectsView
from RWS.Configurable import KeyConfigurable, ColorConfigurable, BoolConfigurable
from RWS.Ui import UI, ViewUI
[docs]
class EffectDialog(QDialog):
[docs]
def __init__(self, options: list[str], name, parent=None):
super().__init__(parent)
self.ui = Ui_EffectDialog()
self.ui.setupUi(self)
self.options = options
self.ui.EffectSettingValueComboBox.addItems(options)
self.ui.label.setText(name)
self.setWindowTitle(name)
[docs]
class EffectViewUI(ViewUI):
[docs]
def __init__(self, mod, parent=None):
super().__init__(mod, parent)
self.ui = Ui_EffectsView()
self.ui.setupUi(self)
self.coloroff = ColorConfigurable(mod, "VIEW_effect.color_off", QColor(132, 25, 138, 100), "No value color")
self.coloron = ColorConfigurable(mod, "VIEW_effect.color_on", QColor(28, 148, 15, 130), "Full value color")
self.showadditional = BoolConfigurable(mod, "VIEW_effect.show_additional", False, "Show additional Effect Layer")
self.showadditional_key = KeyConfigurable(mod, "VIEW_effect.show_additional_key", "Alt+e", "Show additional Effect Layer")
self.menu_addeffect = QAction("Additional Effect")
self.mod.manager.view_menu.addAction(self.menu_addeffect)
self.showadditional.link_button_action(self.ui.ShowAddEffect, self.menu_addeffect, self.showadditional_key)
self.coloroff.link_color_picker(self.ui.Color0)
self.coloron.link_color_picker(self.ui.Color100)
self.ui.EffectIndex.valueChanged.connect(self.redraw)
self.showadditional.valueChanged.connect(self.redraw)
self.coloron.valueChanged.connect(self.redraw)
self.coloroff.valueChanged.connect(self.redraw)
# self.ui.EffectIndex.setMaximum()
[docs]
def redraw(self):
self.level.viewport.modulenames["effects"].texture.index = self.ui.EffectIndex.value()
self.level.viewport.modulenames["effects"].redraw()
[docs]
class EffectsUI(UI):
[docs]
def __init__(self, mod, parent=None):
super().__init__(mod, parent)
from BaseMod.baseMod import BaseMod
self.ui = Ui_Effects()
self.ui.setupUi(self)
mod: BaseMod
self.editor = mod.effecteditor
self.editor.effectui = self
self.explorer = self.editor.effect_explorer
self.ui.EffectsTree.setAlternatingRowColors(True)
self.effectup_key = KeyConfigurable(mod, "EDIT_effect.effectup", "w", "Previous effect")
self.effectdown_key = KeyConfigurable(mod, "EDIT_effect.effectdown", "s", "Next effect")
self.effectmoveup_key = KeyConfigurable(mod, "EDIT_effect.effectmoveup", "Shift+w", "Move effect back")
self.effectmovedown_key = KeyConfigurable(mod, "EDIT_effect.effectmovedown", "Shift+s", "Move effect forward")
self.duplicate_key = KeyConfigurable(mod, "EDIT_effect.duplicate", "Ctrl+d", "Duplicate effect")
self.delete_key = KeyConfigurable(mod, "EDIT_effect.delete", "Delete", "Delete effect")
self.explorer_key = KeyConfigurable(mod, "EDIT_effect.explorer_key", "Ctrl+e", "Open Effect Explorer")
self.brushup_key = KeyConfigurable(mod, "EDIT_effect.brushup", "Ctrl+Shift+=", "Brush Size +")
self.brushdown_key = KeyConfigurable(mod, "EDIT_effect.brushdown", "Ctrl+Shift+-", "Brush Size -")
self.explorer_key.link_button(self.ui.Explorer)
self.ui.Explorer.clicked.connect(self.open_explorer)
self.effectup_key.link_button(self.ui.Up)
self.effectdown_key.link_button(self.ui.Down)
self.effectmoveup_key.link_button(self.ui.MoveUp)
self.effectmovedown_key.link_button(self.ui.MoveDown)
self.delete_key.link_button(self.ui.DeleteEffect)
self.duplicate_key.link_button(self.ui.DuplicateEffect)
self.ui.EffectsTree.itemClicked.connect(self.effect_pressed)
self.explorer.ui.AddEffect.clicked.connect(self.add_effects)
self.editor.effectindex.valueChanged.connect(self.effect_select)
self.ui.Up.clicked.connect(self.effect_up)
self.ui.Down.clicked.connect(self.effect_down)
self.ui.DeleteEffect.clicked.connect(self.delete_effect)
self.ui.MoveUp.clicked.connect(self.effect_move_up)
self.ui.MoveDown.clicked.connect(self.effect_move_down)
self.ui.DuplicateEffect.clicked.connect(self.duplicate_effect)
self.ui.OptionsTree.itemDoubleClicked.connect(self.effect_settings_double_click)
self.ui.OptionsTree.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
self.ui.OptionsTree.customContextMenuRequested.connect(self.settings_context_menu)
self.brushup_key.link_button(self.ui.BrushSizeUp)
self.brushdown_key.link_button(self.ui.BrushSizeDown)
self.ui.BrushSizeUp.clicked.connect(self.brushup)
self.ui.BrushSizeDown.clicked.connect(self.brushdown)
[docs]
def brushup(self):
self.editor.brushsize.update_value(self.editor.brushsize.value + 1)
self.editor.update_brush()
[docs]
def brushdown(self):
self.editor.brushsize.update_value(max(1, self.editor.brushsize.value - 1))
self.editor.update_brush()
[docs]
def delete_effect(self):
if 0 <= self.editor.effectindex.value < len(self.level.l_effects):
self.level.add_history(EffectRemove, self.editor.effectindex.value)
[docs]
def open_explorer(self):
self.explorer.change_visibility(True)
#self.explorer.focussearch()
[docs]
def effect_up(self):
if len(self.level.l_effects) == 0:
return
self.editor.effectindex.update_value((self.editor.effectindex.value - 1) % len(self.level.l_effects))
[docs]
def effect_down(self):
if len(self.level.l_effects) == 0:
return
self.editor.effectindex.update_value((self.editor.effectindex.value + 1) % len(self.level.l_effects))
[docs]
def effect_move_up(self):
if len(self.level.l_effects) == 0:
return
if self.editor.effectindex.value > 0:
self.level.add_history(EffectMove, self.editor.effectindex.value, -1)
[docs]
def effect_move_down(self):
if len(self.level.l_effects) == 0:
return
if self.editor.effectindex.value < len(self.level.l_effects) - 1:
self.level.add_history(EffectMove, self.editor.effectindex.value, 1)
[docs]
def duplicate_effect(self):
if len(self.level.l_effects) == 0:
return
if 0 <= self.editor.effectindex.value < len(self.level.l_effects):
self.level.add_history(EffectDuplicate, self.editor.effectindex.value)
[docs]
def add_effects(self):
self.ui.EffectsTree.clear()
if not self.level_loaded:
return
for i, effect in enumerate(self.mod.manager.selected_viewport.level.l_effects):
item = QTreeWidgetItem([str(i), effect["nm"]])
item.setData(0, Qt.ItemDataRole.UserRole, i)
item.setData(1, Qt.ItemDataRole.UserRole, effect)
e = self.mod.manager.effects.find_effect(effect["nm"])
if e is not None:
icon = QPixmap(20, 20)
icon.fill(e.color)
item.setIcon(0, icon)
self.ui.EffectsTree.addTopLevelItem(item)
self.ui.EffectsTree.resizeColumnToContents(0)
self.effect_settings()
[docs]
def effect_pressed(self, item: QTreeWidgetItem, column: int):
self.editor.effectindex.update_value(item.data(0, Qt.ItemDataRole.UserRole))
[docs]
def effect_select(self, row):
item = self.ui.EffectsTree.topLevelItem(row)
# print(item, self.ui.EffectsTree.currentItem(), row)
if self.ui.EffectsTree.currentItem() != item:
self.ui.EffectsTree.setCurrentItem(item, 1, QItemSelectionModel.SelectionFlag.ClearAndSelect)
self.effect_settings()
[docs]
def effect_settings(self):
self.ui.OptionsTree.clear()
self.ui.OptionsTree.setAlternatingRowColors(True)
self.ui.OptionsTree.setColumnCount(2)
self.ui.OptionsTree.setHeaderLabels(['Setting', 'Value'])
if not self.level_loaded or len(self.level.l_effects) == 0:
return
effect = self.level.l_effects[self.editor.effectindex.value]
for index, i in enumerate(effect["options"]):
if i[0].lower() == "delete/move":
continue
item = QTreeWidgetItem([i[0], str(i[2])])
item.setData(0, Qt.ItemDataRole.UserRole, index)
self.ui.OptionsTree.addTopLevelItem(item)
self.ui.OptionsTree.resizeColumnToContents(0)
[docs]
def effect_settings_double_click(self, item: QTreeWidgetItem, column):
if column == 1:
index = item.data(0, Qt.ItemDataRole.UserRole)
options = self.level.l_effects[self.editor.effectindex.value]["options"][index]
if item.text(0).lower() == "seed":
value, ok = QInputDialog.getInt(self, f"Enter Seed", f"Seed:", int(options[2]))
if ok:
self.level.add_history(EffectOptionChange, self.editor.effectindex.value, index, str(value))
return
d = EffectDialog(options[1], options[0])
value = d.exec()
if value == QDialog.DialogCode.Accepted:
self.level.add_history(EffectOptionChange, self.editor.effectindex.value, index, d.ui.EffectSettingValueComboBox.currentText())
[docs]
def setoption(self, index, value):
def callback():
self.level.add_history(EffectOptionChange, self.editor.effectindex.value, index, value)
return callback