Path: blob/master/src/spriteframe.py
254 views
from PIL import Image1from PyQt5.QtCore import QSize, Qt2from PyQt5.QtGui import QIcon3from PyQt5.QtWidgets import QCheckBox, QFrame, QPushButton, QWidget, QLabel, QApplication4from framedata import FrameData5from utils import SPRITEFRAME_SIZE, imghashes6from os import path789class SpriteFrame(QWidget):10def __init__(self, parent, imgpath, from_single_png = True, posename = "", **texinfo):11super().__init__(parent)12self._frameparent = parent1314# non-ui stuff15fromsinglepng = from_single_png16# if from_single_png is None:17# fromsinglepng = True1819# "calculate" the pose_name20first_num_index = 021if not fromsinglepng:22first_num_index = len(posename)23for i in range(len(posename)-1, 0, -1):24if posename[i].isnumeric():25first_num_index = i26else:27break28true_pname = "idle" if fromsinglepng else posename[:first_num_index]2930self.data = FrameData(imgpath, fromsinglepng, true_pname, **texinfo)31self.modified = False3233# ui stuff34self.image_pixmap = imghashes.get(self.data.img_hash).toqpixmap()35self.myframe = QFrame(self)36self.img_label = QLabel(self.myframe)3738self.img_label.setPixmap(self.image_pixmap.scaled(SPRITEFRAME_SIZE, SPRITEFRAME_SIZE))3940self.setFixedSize(QSize(SPRITEFRAME_SIZE, SPRITEFRAME_SIZE))4142self.remove_btn = QPushButton(self.myframe)43self.remove_btn.move(90, 90)44self.remove_btn.setIcon(QIcon('./assets/remove-frame-icon.svg'))45self.remove_btn.setIconSize(QSize(40, 40))46self.remove_btn.setFixedSize(40, 40)47self.remove_btn.setToolTip("Delete Frame")48self.remove_btn.clicked.connect(lambda: self.remove_self(self.frameparent))4950self.select_checkbox = QCheckBox(self.myframe)51self.select_checkbox.move(5, 5)52self.select_checkbox.stateChanged.connect(lambda : self.add_to_selected_arr(self.frameparent))5354self.current_border_color = "black"55self.myframe.setStyleSheet("QFrame{border-style:solid; border-color:" + self.current_border_color + "; border-width:2px}")5657@property58def frameparent(self):59return self._frameparent6061@frameparent.setter62def frameparent(self, newparent):63self._frameparent = newparent64self.setParent(self._frameparent)6566# overriding the default mousePressEvent67def mousePressEvent(self, event):68btnpressed = event.button()69if btnpressed == 1: # left mouse button70prevstate = self.select_checkbox.checkState()71newstate = 0 if prevstate != 0 else 172self.select_checkbox.setChecked(newstate)73modifiers = QApplication.keyboardModifiers()74if modifiers == Qt.ShiftModifier:75self.frameparent.ranged_selection_handler(self)76else:77modifiers = QApplication.keyboardModifiers()78if modifiers == Qt.ShiftModifier:79self.frameparent.ranged_deletion_handler(self)8081# overriding the default enterEvent82def enterEvent(self, event):83self.myframe.setStyleSheet("QFrame{ border-style:solid; border-color:#FFC9DEF5; border-width:4px }")8485# overriding the default leaveEvent86def leaveEvent(self, event):87self.myframe.setStyleSheet("QFrame{border-style:solid; border-color:" + self.current_border_color + "; border-width:2px}")8889def remove_self(self, parent):90parent.labels.remove(self)91if self in parent.selected_labels:92parent.selected_labels.remove(self)93parent.num_labels -= 19495parent.frames_layout.removeWidget(self)96# parent.update_frame_dict(self.img_xml_data.pose_name, self, remove=True)97self.deleteLater()9899parent.re_render_grid()100# print("Deleting image, count: ", parent.num_labels, "Len of labels", len(parent.labels))101if len(parent.labels) == 0:102parent.ui.posename_btn.setDisabled(True)103parent.ui.actionPreview_Animation.setEnabled(False)104parent.ui.actionView_XML_structure.setEnabled(False)105# parent.ui.actionChange_Frame_Ordering.setEnabled(False)106107def add_to_selected_arr(self, parent):108if self.select_checkbox.checkState() == 0:109parent.selected_labels.remove(self)110self.current_border_color = "black"111self.myframe.setStyleSheet("QFrame{border-style:solid; border-color:" + self.current_border_color + "; border-width:2px}")112else:113parent.selected_labels.append(self)114self.current_border_color = "green"115self.myframe.setStyleSheet("QFrame{border-style:solid; border-color:" + self.current_border_color + "; border-width:2px}")116117parent.ui.actionEdit_Frame_Properties.setDisabled(len(parent.selected_labels) <= 0)118119def get_tooltip_string(self, parent):120charname = parent.ui.charname_textbox.text()121charname = charname.strip() if charname.strip() != "" else "[ENTER YOUR CHARACTER NAME]"122inside_subtex_name = f"{charname} {self.data.pose_name}####" if self.data.from_single_png or self.modified else f"{self.data.pose_name}####"123124ttstring = f'''Image: {path.basename(self.data.imgpath)}125Current Pose: {self.data.pose_name}126Will appear in XML as:127\t<SubTexture name=\"{inside_subtex_name}\" (...) >128\t# = digit from 0-9'''129130return ttstring131132def flip_img(self, dxn):133# flip the PIL img of self134if dxn == 'X':135img = imghashes.get(self.data.img_hash).transpose(Image.FLIP_LEFT_RIGHT)136elif dxn == 'Y':137img = imghashes.get(self.data.img_hash).transpose(Image.FLIP_TOP_BOTTOM)138else:139print("Something went wrong!")140141# change hash accordingly142self.data.change_img(img)143144# do pixmap stuff145# Note: the above fn could have closed the img so pass the hash instead146self.change_ui_img(self.data.img_hash)147148def change_ui_img(self, newimghash):149self.image_pixmap = imghashes.get(newimghash).toqpixmap()150self.img_label.setPixmap(self.image_pixmap.scaled(SPRITEFRAME_SIZE, SPRITEFRAME_SIZE))151152153if __name__ == '__main__':154print("To run the actual application, Please type: \npython xmlpngUI.py\nor \npython3 xmlpngUI.py \ndepending on what works")155156