Source code for BaseMod.tiles.tileExplorer

from PySide6.QtCore import Qt, QPoint
from PySide6.QtGui import QPixmap, QColor, QAction
from PySide6.QtWidgets import QMainWindow, QTreeWidgetItem, QListWidgetItem, QTableWidgetItem

from BaseMod.Explorer import Explorer
from BaseMod.tiles.tilePin import TilePin
from RWS.Configurable import BoolConfigurable, IntConfigurable
from RWS.Core import CELLSIZE, SPRITESIZE, PATH_COLLECTIONS_TILES
from RWS.Loaders import Tile, Tiles


[docs] class TileExplorer(Explorer):
[docs] def category_items(self, cat) -> list: return cat.tiles
[docs] def preview_item(self, item): if item is None: self.tileimage.setOpacity(0) return self.preview_tile(item) self.ui.Properties.clear() self.ui.Properties.setRowCount(5) self.ui.Properties.setColumnCount(1) self.ui.Properties.setVerticalHeaderItem(0, QTableWidgetItem("Name")) self.ui.Properties.setItem(0, 0, QTableWidgetItem(item.name)) self.ui.Properties.setVerticalHeaderItem(1, QTableWidgetItem("Description")) self.ui.Properties.setItem(1, 0, QTableWidgetItem(item.description)) self.ui.Properties.setVerticalHeaderItem(2, QTableWidgetItem("Size")) self.ui.Properties.setItem(2, 0, QTableWidgetItem(f"{item.size.width()}x{item.size.height()}")) self.ui.Properties.setVerticalHeaderItem(3, QTableWidgetItem("b. tiles")) self.ui.Properties.setItem(3, 0, QTableWidgetItem(str(item.bfTiles))) self.ui.Properties.setVerticalHeaderItem(4, QTableWidgetItem("Tags")) self.ui.Properties.setItem(4, 0, QTableWidgetItem(", ".join(item.tags))) self.ui.Properties.adjustSize() self.ui.Properties.resizeColumnsToContents()
# self.ui.Properties.resizeRowsToContents() # self.ui.Properties.verticalHeaderDefaultSectionSize = 25 # self.ui.Properties.verticalHeaderStretchLastSection = True # self.ui.Properties.setAutoScroll(True)
[docs] def itemtype(self) -> type: return Tile
[docs] def get_categories(self) -> list: return self.tiles.categories
[docs] def get_all_items(self) -> list: return self.tiles.all_tiles()
[docs] def item_from_data(self, data) -> QListWidgetItem | None: filter = self.ui.SearchBar.text() if filter != "" and filter.lower() not in data.name.lower() and not self.simplemode: return None item = QListWidgetItem(data.name) item.setData(Qt.ItemDataRole.UserRole, data) item.setIcon(self.get_icon(data)) return item
[docs] def treeitem_from_data(self, data) -> QTreeWidgetItem | None: filter = self.ui.SearchBar.text() if filter != "" and filter.lower() not in data.name.lower(): return None tileitem = QTreeWidgetItem([data.name]) tileitem.setData(0, Qt.ItemDataRole.UserRole, data) tileitem.setIcon(0, self.get_icon(data)) return tileitem
[docs] def cat_from_data(self, cat) -> QTreeWidgetItem | None: filter = self.ui.SearchBar.text() if filter != "" and filter.lower() not in cat.name.lower() and not self.simplemode: return None color = cat.color color: QColor image = QPixmap(20, 20) image.fill(color) item = QTreeWidgetItem([cat.name]) item.setIcon(0, image) item.setData(0, Qt.ItemDataRole.UserRole, cat) if self.category_colors.value: biggestratio = 0 biggestcolor = Qt.GlobalColor.white for i in Qt.GlobalColor: ratio = (color.lightnessF() + 0.05) ratio2 = (QColor(i).lightnessF() + 0.05) diff = max(ratio, ratio2) - min(ratio, ratio2) if diff > biggestratio: biggestratio = diff biggestcolor = i item.setForeground(0, biggestcolor) return item
[docs] def __init__(self, editor, parent: QMainWindow): self.tiles: Tiles = editor.manager.tiles super().__init__(editor.mod, parent) self.tileview = self.mod.tileview self.tile_cols = BoolConfigurable(self.mod, "TileExplorer.tile_collisions", True, "show tile collisions") self.tile_preview = BoolConfigurable(self.mod, "TileExplorer.tile_preview", True, "show tile preview") # self.drawoption = IntConfigurable(self.mod, "TileExplorer.drawoption", 7, "show tile collisions") self.layer = IntConfigurable(self.mod, "TileExplorer.layer", 0, "layer") self.tile_cols.link_button(self.ui.ToggleCollisions) self.tile_cols.valueChanged.connect(self.hide_cols) self.tile_preview.link_button(self.ui.TogglePreview) self.tile_preview.valueChanged.connect(self.hide_preview) # self.drawoption.link_combobox(self.ui.RenderOption) # self.drawoption.valueChanged.connect(self.change_draw_option) self.layer.link_combobox(self.ui.LayerBox) self.layer.valueChanged.connect(self.change_draw_option) self.tileview.drawoption.valueChanged.connect(self.change_draw_option) self.tileview.drawoption.link_combobox(self.ui.RenderOption) self.tileview.render.connect(lambda : self.change_items()) self.tileview.render.connect(lambda : self.preview_tile(self.selected[0]) if len(self.selected) > 0 else None) self.ui.SearchBar.textChanged.connect(self.search) self.ui.Pin.clicked.connect(self.pin_tile) self.itemselected.connect(editor.add_tile) self.pins = [] self.tileimage = self.preview.workscene.addPixmap(QPixmap(1, 1)) self.tilecolsimage = self.preview.workscene.addPixmap(QPixmap(1, 1)) self.preview.items.append(self.tileimage) self.preview.items.append(self.tilecolsimage) self.ui.LItem.setText("Tile") self.ui.LItems.setText("Tiles") self.setWindowTitle("Tile Explorer") self.hide() self.tile_explorer_action = QAction("Tile Explorer") self.manager.window_menu.addAction(self.tile_explorer_action) self.link_action(self.tile_explorer_action) self.mod.bmconfig.tileexplorer_key.link_action(self.tile_explorer_action) self.tiles.tileschanged.connect(self.load_categories)
@property def custom_categories_path(self): return PATH_COLLECTIONS_TILES
[docs] def categories_modified(self): self.tiles.add_custom_tiles()
[docs] def category_is_custom(self, cat) -> bool: return cat in self.tiles.custom_categories
[docs] def category_name(self, cat) -> str: return cat.name
[docs] def item_name(self, item) -> str: return item.name
[docs] def category_at_index(self, index): return self.tiles.categories[index]
[docs] def pin_tile(self): for i in self.selected: pin = TilePin(i, self, self.manager.window) pin.change_visibility(True) self.pins.append(pin) pin.setFocus()
[docs] def unpin_tile(self, tile: Tile): for i in range(len(self.pins) - 1, -1, -1): if self.pins[i].tile == tile: self.remove_pin(self.pins[i])
[docs] def unpin_all(self): for i in range(len(self.pins) - 1, -1, -1): self.remove_pin(self.pins[i])
[docs] def remove_pin(self, pin): pin.deleteLater() self.pins.remove(pin)
[docs] def preview_tile(self, tile): self.tileimage.setOpacity(1) self.tileimage.setPixmap(tile.return_tile_pixmap(self.synced_draw_option, self.layer.value, self.tileview.colortable)) self.tilecolsimage.setPixmap(tile.collisions_image()) self.tileimage.setData(2, (CELLSIZE / SPRITESIZE) if self.synced_draw_option == 0 else 1) self.tileimage.setData(1, QPoint(0, 0) if self.synced_draw_option == 0 else (-QPoint(tile.bfTiles, tile.bfTiles) * CELLSIZE)) self.preview.set_pos(QPoint(0, 0)) self.preview.set_zoom() self.preview.verticalScrollBar().setValue(0) self.preview.horizontalScrollBar().setValue(0)
[docs] def change_draw_option(self): self.change_items() if len(self.selected) > 0: self.preview_tile(self.selected[0]) if self.simplemode: self.load_categories()
@property def synced_draw_option(self): return self.mod.tileview.drawoption.value
[docs] def hide_cols(self, value): self.tilecolsimage.setOpacity(1 if value else 0)
[docs] def hide_preview(self, value): self.tileimage.setOpacity(1 if value and len(self.selected) > 0 else 0)
[docs] def get_icon(self, tile: Tile): return tile.return_tile_pixmap(self.synced_draw_option, self.layer.value, self.tileview.colortable)