Path: blob/master/src/xmltablewindow.py
254 views
from PyQt5.QtWidgets import QTableWidgetItem, QWidget, QMenu, QAction, QMessageBox, QLineEdit, QInputDialog1from PyQt5.QtCore import Qt2from PyQt5.QtGui import QCursor3from utils import temp_path_shortener, imghashes4import engine.spritesheetutils as spritesheetutils5from xmltablewindowUI import Ui_TableWidgetThing6from utils import display_msg_box78class XMLTableView(QWidget):9def __init__(self, table_headings):10super().__init__()11self.ui = Ui_TableWidgetThing()12self.ui.setupUi(self)1314self.table_headings = table_headings15self.ui.xmltable.setColumnCount(len(table_headings))16self.ui.xmltable.setHorizontalHeaderLabels(table_headings)17self.ui.xmltable.contextMenuEvent = self.handle_context_menu_event1819# self.ui.xmltable.cellClicked.connect(self.handle_cell_click)20# self.ui.xmltable.cellActivated.connect(self.handle_cell_click)21# self.ui.xmltable.cellPressed.connect(self.handle_cell_click)22self.ui.xmltable.currentCellChanged.connect(self.handle_curr_cell_change)23self.ui.frame_preview_label.setStyleSheet("QFrame{ border: 1px solid black; }")24# self.ui.xmltable.selectionModel().selectionChanged.connect(self.handle_cell_selection)2526# list[SpriteFrame]27self.tabledata = []28self.canchange = True29self.frame_info = [None, None, None, None]30self.frame_spinboxes = [self.ui.framex_spinbox, self.ui.framey_spinbox, self.ui.framewidth_spinbox, self.ui.frameheight_spinbox]3132self.ui.framex_spinbox.valueChanged.connect(self.handle_framex_change)33self.ui.framey_spinbox.valueChanged.connect(self.handle_framey_change)34self.ui.framewidth_spinbox.valueChanged.connect(self.handle_framew_change)35self.ui.frameheight_spinbox.valueChanged.connect(self.handle_frameh_change)3637self.selected_row = None38self.selected_row_index = None3940self.was_opened = False4142self.selected_cells = []4344def handle_curr_cell_change(self, current_row, current_col, prev_row, prev_col):45self.selected_row_index = current_row46self.handle_display_stuff(self.selected_row_index)4748def handle_context_menu_event(self, event):49self.menu = QMenu(self)50renameAction = QAction('Set Value', self)51renameAction.triggered.connect(lambda: self.set_value_handle())52self.menu.addAction(renameAction)53# add other required actions54self.menu.popup(QCursor.pos())5556def set_value_handle(self):57_cells = self.ui.xmltable.selectedItems()58idx = -159for _cell in _cells:60if not (_cell.flags() & Qt.ItemIsEditable):61display_msg_box(self, "Bad cell selection", "There are un-editable cells in your selection!\nSelect cells from the same column, valid columns being\nFrameX, FrameY, FrameWidth or FrameHeight", QMessageBox.Critical)62return63else:64if idx != -1 and _cell.column() != idx:65display_msg_box(self, "Multiple Columns Selected", "Your selection spans multiple columns. Make sure to select cells that belong to the same column, valid columns being\nFrameX, FrameY, FrameWidth or FrameHeight", QMessageBox.Critical)66return67else:68idx = _cell.column()6970rows = [ x.row() for x in _cells ]71text, okPressed = QInputDialog.getText(self, f"Change Value of {self.table_headings[idx - 4]}", "New value:"+(" "*50), QLineEdit.Normal)72is_real_number = lambda s: s.isnumeric() or (s[0] == '-' and s[1:].isnumeric())73if okPressed and text != '' and is_real_number(text):74val = int(text)75old_selected_row_index = self.selected_row_index76old_selected_row = self.selected_row77for row_num in rows:78self.ui.xmltable.setItem(row_num, idx, QTableWidgetItem(str(val)))79self.selected_row_index = row_num80self.selected_row = self.tabledata[row_num]81self.handle_cell_change(row_num, idx)8283# restoring things back to normal84self.selected_row_index = old_selected_row_index85self.selected_row = old_selected_row86self.set_true_frame()87else:88print("Text invalid / cancel was pressed")899091def handle_framex_change(self, newval):92if self.canchange:93if self.selected_row:94self.selected_row.data.framex = newval95self.ui.xmltable.setItem(self.selected_row_index, 4, QTableWidgetItem(str(newval)))96self.set_true_frame()9798def handle_framey_change(self, newval):99if self.canchange:100if self.selected_row:101self.selected_row.data.framey = newval102self.ui.xmltable.setItem(self.selected_row_index, 5, QTableWidgetItem(str(newval)))103self.set_true_frame()104105def handle_framew_change(self, newval):106if self.canchange:107if self.selected_row:108self.selected_row.data.framew = newval109self.ui.xmltable.setItem(self.selected_row_index, 6, QTableWidgetItem(str(newval)))110self.set_true_frame()111112def handle_frameh_change(self, newval):113if self.canchange:114if self.selected_row:115self.selected_row.data.frameh = newval116self.ui.xmltable.setItem(self.selected_row_index, 7, QTableWidgetItem(str(newval)))117self.set_true_frame()118119def set_true_frame(self):120# set the frame pixmap121curimg = imghashes.get(self.selected_row.data.img_hash)122truframe = spritesheetutils.get_true_frame(123curimg,124self.selected_row.data.framex if self.selected_row.data.framex is not None else 0,125self.selected_row.data.framey if self.selected_row.data.framey is not None else 0,126self.selected_row.data.framew if self.selected_row.data.framew is not None else curimg.width,127self.selected_row.data.frameh if self.selected_row.data.frameh is not None else curimg.height,128).toqpixmap()129self.ui.frame_preview_label.setPixmap(truframe)130self.ui.frame_preview_label.setFixedSize(truframe.width(), truframe.height())131132def fill_data(self, data):133# data: list[Spriteframe]134table = self.ui.xmltable135if self.was_opened:136table.cellChanged.disconnect(self.handle_cell_change)137self.tabledata = data138table.setRowCount(len(data))139for rownum, label in enumerate(data):140tabledat = [label.data.imgpath, label.data.pose_name, label.data.img_width, label.data.img_height, label.data.framex, label.data.framey, label.data.framew, label.data.frameh]141for colnum, col in enumerate(tabledat):142table_cell = QTableWidgetItem(str(col))143if colnum < 4:144table_cell.setFlags(table_cell.flags() ^ Qt.ItemIsEditable)145table.setItem(rownum, colnum, table_cell)146147table.cellChanged.connect(self.handle_cell_change)148self.was_opened = True149150def handle_cell_change(self, row, col):151idx = col - 4152153if idx >= 0:154self.canchange = False155newval = self.ui.xmltable.item(row, col).text()156if newval.lower() == 'default':157# default framex = framey = 0, framew = img.width, frameh = img.height158if idx <= 1:159newval = 0160elif idx == 2:161newval = self.selected_row.data.img_width162elif idx == 3:163newval = self.selected_row.data.img_height164else:165print("Something's wrong")166self.ui.xmltable.setItem(row, col, QTableWidgetItem(str(newval)))167else:168try:169newval = int(newval)170assert (idx >= 2 and newval > 0) or (idx < 2)171except Exception as e:172print("Exception:\n", e)173if idx == 0:174newval = self.selected_row.data.framex175elif idx == 1:176newval = self.selected_row.data.framey177elif idx == 2:178newval = self.selected_row.data.framew179elif idx == 3:180newval = self.selected_row.data.frameh181else:182print("Something's wrong")183self.ui.xmltable.setItem(row, col, QTableWidgetItem(str(newval)))184185self.frame_spinboxes[idx].setValue(newval if newval else 0)186self.canchange = True187188# idx: 0 = framex, 1 = framey, 2 = framew, 3 = frameh189if idx == 0:190self.selected_row.data.framex = newval191elif idx == 1:192self.selected_row.data.framey = newval193elif idx == 2:194self.selected_row.data.framew = newval195elif idx == 3:196self.selected_row.data.frameh = newval197else:198print("[ERROR] Some error occured!")199200self.set_true_frame()201202# def handle_cell_selection(self, selected, deselected):203# if selected.indexes():204# self.selected_cells.extend(selected.indexes())205# self.selected_row_index = selected.indexes()[-1].row()206# self.handle_display_stuff(self.selected_row_index)207# elif deselected.indexes():208# for _cell in deselected.indexes():209# print(f"Removing: {_cell.row()}, {_cell.column()}")210# self.selected_cells.remove(_cell)211# self.selected_row_index = deselected.indexes()[-1].row()212# self.handle_display_stuff(self.selected_row_index)213# print(f'{[ (c.row(), c.column()) for c in self.selected_cells ]}')214# else:215# print("Something's weird here")216217def handle_display_stuff(self, row):218self.selected_row = self.tabledata[row]219short_path = temp_path_shortener(self.selected_row.data.imgpath)220221self.ui.frame_preview_label.clear()222self.set_true_frame()223224if self.selected_row.data.from_single_png:225self.ui.frame_info_label.setText(f"Image path: {short_path}\tFrom existing spritesheet: No")226else:227self.ui.frame_info_label.setText(f"Image path: {short_path}\tFrom existing spritesheet: Yes\tCo-ords in source spritesheet: x={self.selected_row.data.tx} y={self.selected_row.data.ty} w={self.selected_row.data.tw} h={self.selected_row.data.th}")228229self.frame_info = [self.selected_row.data.framex, self.selected_row.data.framey, self.selected_row.data.framew, self.selected_row.data.frameh]230for spinbox, info in zip(self.frame_spinboxes, self.frame_info):231self.canchange = False232spinbox.setValue(int(info) if info is not None and str(info).lower() != "default" else 0)233self.canchange = True234235