import os
from PySide6.QtCore import Slot, Qt, QCoreApplication, Signal
from PySide6.QtGui import QAction, QColor, QImage
from PySide6.QtWidgets import QFileDialog, QMenu, QCheckBox, QTreeWidgetItem
from BaseMod.baseMod import BaseMod
from BaseMod.geo.GeoConsts import *
from BaseMod.tiles.tileHistory import DefaultMaterialChange
from BaseMod.tiles.ui.tiles_ui import Ui_Tiles
from BaseMod.tiles.ui.tiles_vis_ui import Ui_TilesView
from BaseMod.tiles.ui.tilesettings_ui import Ui_TileSettings
from RWS.Configurable import BoolConfigurable, IntConfigurable, StringConfigurable, FloatConfigurable, \
KeyConfigurable
from RWS.Core import PATH_FILES_IMAGES_PALETTES
from RWS.Loaders import palette_to_colortable
from RWS.Ui import ViewUI, UI, SettingUI
from RWS.Utils import paint_svg_qicon, color_lerp
from RWS.Widgets import SettingsViewer
[docs]
class TileViewUI(ViewUI):
render = Signal()
[docs]
def __init__(self, mod, parent=None):
super().__init__(mod, parent)
self.mod: BaseMod
self.ui = Ui_TilesView()
self.ui.setupUi(self)
self.drawtiles = BoolConfigurable(mod, "VIEW_tile.drawtiles", True, "Draw tiles")
self.drawl1 = BoolConfigurable(mod, "VIEW_tile.drawl1", True, "Draw layer 1")
self.drawl2 = BoolConfigurable(mod, "VIEW_tile.drawl2", True, "Draw layer 2")
self.drawl3 = BoolConfigurable(mod, "VIEW_tile.drawl3", True, "Draw layer 3")
self.drawheads = BoolConfigurable(mod, "VIEW_tile.drawlheads", False, "Draw tile heads")
self.drawbodies = BoolConfigurable(mod, "VIEW_tile.drawbodies", False, "Draw tile bodies")
self.drawmats = BoolConfigurable(mod, "VIEW_tile.drawlmats", True, "Draw materials")
self.drawoption = IntConfigurable(mod, "VIEW_tile.drawoption", 0, "Option how to draw tiles")
self.palettepath = StringConfigurable(mod, "VIEW_tile.palettepath",
os.path.join(PATH_FILES_IMAGES_PALETTES, "palette0.png"),
"Path to Palette")
self.fadepalettepath = StringConfigurable(mod, "VIEW_tile.fadepalettepath",
os.path.join(PATH_FILES_IMAGES_PALETTES, "palette0.png"),
"Path to Fade Palette")
self.drawpnotrendered = FloatConfigurable(mod, "VIEW_tile.drawpnotrend", .9,
"Primary layer draw opacity(classic and henry)")
self.drawsnotrendered = FloatConfigurable(mod, "VIEW_tile.drawsnotrend", .196,
"Secondary layer draw opacity(classic and henry)")
self.drawprendered = FloatConfigurable(mod, "VIEW_tile.drawprend", 1, "Primary layer draw opacity(rendered)")
self.drawsrendered = FloatConfigurable(mod, "VIEW_tile.drawsrend", 1, "Secondary layer draw opacity(rendered)")
self.renderall = BoolConfigurable(mod, "VIEW_tile.renderall", True, "Render layers behind current")
self.matborder = BoolConfigurable(mod, "VIEW_tile.matborder", True,
"Material Border")
if not os.path.exists(self.palettepath.value):
self.palettepath.reset_value()
if not os.path.exists(self.fadepalettepath.value):
self.fadepalettepath.reset_value()
self.palettepath.valueChanged.connect(self.change_colortable)
self.fadepalettepath.valueChanged.connect(self.change_colortable)
self.ui.BlendSlider.valueChanged.connect(self.change_colortable)
self.colortable = None
self.drawtiles.valueChanged.connect(self.hide_tiles)
self.drawltiles_key = KeyConfigurable(mod, "VIEW_tile.drawltiles_key", "Alt+t", "Hide all tiles")
self.drawl1_key = KeyConfigurable(mod, "VIEW_tile.drawl1_key", "Alt+Shift+1", "Show layer 1 tiles")
self.drawl2_key = KeyConfigurable(mod, "VIEW_tile.drawl2_key", "Alt+Shift+2", "Show layer 2 tiles")
self.drawl3_key = KeyConfigurable(mod, "VIEW_tile.drawl3_key", "Alt+Shift+3", "Show layer 3 tiles")
self.drawheads_key = KeyConfigurable(mod, "VIEW_tile.drawheads_key", "Alt+Shift+4", "Show tile heads")
self.drawbodies_key = KeyConfigurable(mod, "VIEW_tile.drawbodies_key", "Alt+Shift+5", "Show tile bodies")
self.drawlmats_key = KeyConfigurable(mod, "VIEW_tile.drawmats_key", "Alt+Shift+6", "Show tile materials")
self.menu = QMenu("Tiles")
self.menu_drawtiles = QAction("Tiles")
self.menu.addAction(self.menu_drawtiles)
self.menu.addSeparator()
self.menu_drawl1 = QAction("Layer 1")
self.drawl1.link_button_action(self.ui.VTilesLayer1, self.menu_drawl1, self.drawl1_key)
self.menu.addAction(self.menu_drawl1)
self.menu_drawl2 = QAction("Layer 2")
self.drawl2.link_button_action(self.ui.VTilesLayer2, self.menu_drawl2, self.drawl2_key)
self.menu.addAction(self.menu_drawl2)
self.menu_drawl3 = QAction("Layer 3")
self.drawl3.link_button_action(self.ui.VTilesLayer3, self.menu_drawl3, self.drawl3_key)
self.menu.addAction(self.menu_drawl3)
self.menu.addSeparator()
self.menu_drawmats = QAction("Materials")
self.drawmats.link_button_action(self.ui.VTilesMaterials, self.menu_drawmats, self.drawlmats_key)
self.menu.addAction(self.menu_drawmats)
self.menu_drawheads = QAction("Tile Heads")
self.drawheads.link_button_action(self.ui.VTilesHeads, self.menu_drawheads, self.drawheads_key)
self.menu.addAction(self.menu_drawheads)
self.menu_drawbodies = QAction("Tile Bodies")
self.drawbodies.link_button_action(self.ui.VTilesBodies, self.menu_drawbodies, self.drawbodies_key)
self.menu.addAction(self.menu_drawbodies)
self.ui.VTilesAllTiles.checkStateChanged.connect(self.all_layers)
self.mod.manager.view_menu.addMenu(self.menu)
self.drawoption.link_radio(
[
self.ui.VTilesClassic,
self.ui.VTilesImage,
self.ui.VTilesHenry,
self.ui.VTilesUnrendered,
self.ui.VTilesRendered,
self.ui.VTilesRendered_shade,
self.ui.VTilesRendered_rain
])
self.ui.PaletteSelectButton.clicked.connect(self.change_palette)
self.ui.FadePaletteSelectButton.clicked.connect(self.change_fade_palette)
self.VQuickTiles = QCheckBox()
self.VQuickTiles.setObjectName(u"VQuickTiles")
self.VQuickTiles.setText(QCoreApplication.translate("MainWindow", u"Tiles", None))
self.VQuickTiles.setChecked(True)
# self.VQuickTiles.checkStateChanged.connect(self.toggle_tiles)
self.mod.add_quickview_option(self.VQuickTiles)
self.drawtiles.link_button_action(self.VQuickTiles, self.menu_drawtiles, self.drawltiles_key)
self.change_colortable()
[docs]
@Slot()
def change_palette(self):
file, _ = QFileDialog.getOpenFileName(self, "Select a Palette", PATH_FILES_IMAGES_PALETTES)
if file == "":
return
self.palettepath.update_value(file)
self.drawoption.update_value(4)
[docs]
@Slot()
def change_fade_palette(self):
file, _ = QFileDialog.getOpenFileName(self, "Select a Fade Palette", PATH_FILES_IMAGES_PALETTES)
if file == "":
return
self.fadepalettepath.update_value(file)
self.drawoption.update_value(4)
[docs]
@Slot(Qt.CheckState)
def all_layers(self, state: Qt.CheckState):
if state == Qt.CheckState.Checked:
self.ui.VTilesLayer1.setChecked(True)
self.ui.VTilesLayer2.setChecked(True)
self.ui.VTilesLayer3.setChecked(True)
self.ui.VTilesHeads.setChecked(True)
self.ui.VTilesMaterials.setChecked(True)
[docs]
@Slot(Qt.CheckState)
def toggle_tiles(self, state: Qt.CheckState):
v = state == Qt.CheckState.Checked
self.drawl1.update_value(v)
self.drawl2.update_value(v)
self.drawl3.update_value(v)
[docs]
def hide_tiles(self):
self.drawl1.update_value(self.drawtiles.value)
self.drawl2.update_value(self.drawtiles.value)
self.drawl3.update_value(self.drawtiles.value)
[docs]
def showlayer(self, currentlayer):
self.drawl1.update_value(currentlayer == 0)
self.drawl2.update_value(currentlayer <= 1)
self.drawl3.update_value(True)
[docs]
def change_colortable(self):
colortable = palette_to_colortable(QImage(self.palettepath.value))
fadecolortable = palette_to_colortable(QImage(self.fadepalettepath.value))
blend = self.ui.BlendSlider.value() / 100
for x in range(3):
for y, yv in enumerate(colortable[x]):
for z, zv in enumerate(colortable[x][y]):
colortable[x][y][z] = color_lerp(QColor.fromRgba(zv), QColor.fromRgba(fadecolortable[x][y][z]), blend).rgba()
colortable[-2] = color_lerp(colortable[-2], fadecolortable[-2], blend)
colortable[-1] = color_lerp(colortable[-1], fadecolortable[-1], blend)
self.colortable = colortable
self.render.emit()
[docs]
class TileUI(UI):
[docs]
def __init__(self, mod, parent=None):
super().__init__(mod, parent)
self.ui = Ui_Tiles()
self.ui.setupUi(self)
mod: BaseMod
mod.tileview.drawoption.link_combobox(self.ui.RenderOption)
self.explorer = mod.tileeditor.explorer
self.editor = mod.tileeditor
self.editor.show_collisions.link_button(self.ui.ToggleCollisions)
self.editor.vis_layer.link_spinbox(self.ui.Layer)
self.editor.toolleft.link_combobox(self.ui.ToolTilesM1Select)
self.editor.toolright.link_combobox(self.ui.ToolTilesM2Select)
self.editor.deleteleft.link_button(self.ui.DeleteM1)
self.editor.deleteright.link_button(self.ui.DeleteM2)
self.editor.force_place.link_button(self.ui.ForcePlace)
self.editor.force_geo.link_button(self.ui.ForceGeo)
self.editor.strictmode.link_combobox(self.ui.StrictMode)
self.editor.brushsize.link_spinbox(self.ui.BrushSize)
self.tile_prev_key = KeyConfigurable(mod, "EDIT_tile.tile_prev", "w", "Previous Tile")
self.cat_prev_key = KeyConfigurable(mod, "EDIT_tile.cat_prev", "a", "Previous Category")
self.tile_next_key = KeyConfigurable(mod, "EDIT_tile.tile_next", "s", "Next Tile")
self.cat_next_key = KeyConfigurable(mod, "EDIT_tile.cat_next", "d", "Next Category")
self.force_geo_key = KeyConfigurable(mod, "EDIT_tiles.fgkey", "g", "Force geometry")
self.force_place_key = KeyConfigurable(mod, "EDIT_tiles.fpkey", "f", "Force place")
self.find_key = KeyConfigurable(mod, "EDIT_tile.find_key", "Ctrl+e", "Find tile")
self.delete_left_key = KeyConfigurable(mod, "EDIT_tile.delete_left", "q", "Delete Left Toggle")
self.delete_right_key = KeyConfigurable(mod, "EDIT_tile.delete_right", "e", "Delete Left Toggle")
self.follow_layer = BoolConfigurable(mod, "EDIT_tile.followlayer", True, "Follow Layer when drawing")
self.explorer_key = KeyConfigurable(mod, "EDIT_tile.explorer_key", "Ctrl+f", "Show Tile Explorer")
self.explorer_key.link_button(self.ui.OpenExplorer)
self.follow_layer.link_button(self.ui.Follow)
self.delete_left_key.link_button(self.ui.DeleteM1)
self.delete_right_key.link_button(self.ui.DeleteM2)
self.tile_next_key.link_button(self.ui.TileNext)
self.tile_prev_key.link_button(self.ui.TilePrev)
self.cat_next_key.link_button(self.ui.CatNext)
self.cat_prev_key.link_button(self.ui.CatPrev)
self.find_key.link_button(self.ui.FindTE)
self.force_geo_key.link_button(self.ui.ForceGeo)
self.force_place_key.link_button(self.ui.ForcePlace)
self.ui.CatNext.clicked.connect(self.explorer.cat_next)
self.ui.CatPrev.clicked.connect(self.explorer.cat_prev)
self.ui.TileNext.clicked.connect(self.explorer.item_next)
self.ui.TilePrev.clicked.connect(self.explorer.item_prev)
self.ui.FindTE.clicked.connect(self.explorer.focussearch)
mod.bmconfig.icon_color.valueChanged.connect(self.change_color)
self.change_color(mod.bmconfig.icon_color.value)
self.ui.OpenExplorer.clicked.connect(self.open_explorer)
self.load_materials()
self.ui.Materials.currentTextChanged.connect(self.update_default_material)
self.can_update_default_material = True
self.ui.RecentTiles.itemDoubleClicked.connect(self.select)
[docs]
def select(self, item: QTreeWidgetItem, column):
tile = item.data(0, Qt.ItemDataRole.UserRole)
self.basemod.tileeditor.add_tile([tile])
[docs]
def update_default_material(self, text):
if not self.can_update_default_material:
return
self.level.add_history(DefaultMaterialChange, text)
[docs]
def load_materials(self):
self.ui.Materials.clear()
for i in self.editor.manager.tiles.find_category("materials").tiles:
self.ui.Materials.addItem(i.image, i.name)
[docs]
def set_default_material(self):
self.can_update_default_material = False
self.ui.Materials.setCurrentText(self.level.l_tiles.default_material)
self.can_update_default_material = True
[docs]
def change_color(self, color: QColor):
items = [IMG_PEN, IMG_BRUSH, IMG_LINE, IMG_RECT, IMG_RECT_HOLLOW, IMG_CIRCLE, IMG_CIRCLE_HOLLOW]
for i in range(7):
self.ui.ToolTilesM1Select.setItemIcon(i, paint_svg_qicon(items[i], color))
self.ui.ToolTilesM2Select.setItemIcon(i, paint_svg_qicon(items[i], color))
[docs]
def change_palette(self):
file, _ = QFileDialog.getOpenFileName(self, "Select a Palette", PATH_FILES_IMAGES_PALETTES)
if file == "":
return
self.editor.palette_image.update_value(file)
self.editor.tile_item.set_tile(self.editor.tile_item.tile, self.editor.colortable, 4)
[docs]
def open_explorer(self):
self.editor.explorer.change_visibility(True)
self.editor.explorer.focussearch()
[docs]
def reloadrecent(self):
from RWESharp.Loaders.Tile import Tile
self.ui.RecentTiles.clear()
for i in self.basemod.tileeditor.recent_tiles:
i: Tile
item = QTreeWidgetItem(self.ui.RecentTiles)
item.setIcon(0, i.image)
item.setText(0, i.name)
item.setText(1, i.category.name)
item.setData(0, Qt.ItemDataRole.UserRole, i)
self.ui.RecentTiles.resizeColumnToContents(0)
[docs]
class TileSettings(SettingUI):
[docs]
def __init__(self, mod):
super().__init__(mod)
self.tileviewui = self.mod.tileview
l1 = lambda x: int(x * 255)
l2 = lambda x: x / 255
self.rp = SettingUI.ManageableSetting(IntConfigurable(None, "rp", 0, "Opacity of rendered primary layer"), self.tileviewui.drawprendered, l1, l2).add_myself(self)
self.np = SettingUI.ManageableSetting(IntConfigurable(None, "np", 0, "Opacity of not rendered primary layer"), self.tileviewui.drawpnotrendered, l1, l2).add_myself(self)
self.rs = SettingUI.ManageableSetting(IntConfigurable(None, "rs", 0, "Opacity of rendered secondary layer"), self.tileviewui.drawsrendered, l1, l2).add_myself(self)
self.ns = SettingUI.ManageableSetting(IntConfigurable(None, "ns", 0, "Opacity of not rendered secondary layer"), self.tileviewui.drawsnotrendered, l1, l2).add_myself(self)
self.renderall = SettingUI.ManageableSetting(BoolConfigurable(None, "renderall", False,
"Draw layers behind current one"), self.tileviewui.renderall).add_myself(self)
self.matborder = SettingUI.ManageableSetting(BoolConfigurable(None, "matborder", True,
"Add black border to materials"),
self.tileviewui.matborder).add_myself(self)
self.drawoption = IntConfigurable(None, "drawoption", 0, "Draw option")
self.reset_values()
[docs]
def init_ui(self, viewer: SettingsViewer):
self.ui = Ui_TileSettings()
self.ui.setupUi(viewer)
self.ui.TilePreview.add_manager(self.mod.manager, self)
self.rp.setting.link_slider_spinbox(self.ui.Popr, self.ui.Popr_2)
self.rs.setting.link_slider_spinbox(self.ui.Sopr, self.ui.Sopr_2)
self.np.setting.link_slider_spinbox(self.ui.Popn, self.ui.Popn_2)
self.ns.setting.link_slider_spinbox(self.ui.Sopn, self.ui.Sopn_2)
self.drawoption.link_combobox(self.ui.RenderOption)
self.drawoption.valueChanged.connect(self.ui.TilePreview.update_option)
self.matborder.setting.link_button(self.ui.MatBorder)
self.renderall.setting.link_button(self.ui.Rall)
self.ui.Pshow.setChecked(True)
self.ui.Sshow.setChecked(True)
self.ui.Sshow.toggled.connect(self.ui.TilePreview.update_preview)
self.ui.Pshow.toggled.connect(self.ui.TilePreview.update_preview)
for i in [self.rp, self.rs, self.np, self.ns, self.renderall]:
i.setting.valueChanged.connect(self.ui.TilePreview.update_preview)
self.ui.LayerSlider.valueChanged.connect(self.ui.TilePreview.update_preview)
self.ui.TilePreview.update_preview()