Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
UncertainProd
GitHub Repository: UncertainProd/FnF-Spritesheet-and-XML-Maker
Path: blob/master/src/spriteframe.py
254 views
1
from PIL import Image
2
from PyQt5.QtCore import QSize, Qt
3
from PyQt5.QtGui import QIcon
4
from PyQt5.QtWidgets import QCheckBox, QFrame, QPushButton, QWidget, QLabel, QApplication
5
from framedata import FrameData
6
from utils import SPRITEFRAME_SIZE, imghashes
7
from os import path
8
9
10
class SpriteFrame(QWidget):
11
def __init__(self, parent, imgpath, from_single_png = True, posename = "", **texinfo):
12
super().__init__(parent)
13
self._frameparent = parent
14
15
# non-ui stuff
16
fromsinglepng = from_single_png
17
# if from_single_png is None:
18
# fromsinglepng = True
19
20
# "calculate" the pose_name
21
first_num_index = 0
22
if not fromsinglepng:
23
first_num_index = len(posename)
24
for i in range(len(posename)-1, 0, -1):
25
if posename[i].isnumeric():
26
first_num_index = i
27
else:
28
break
29
true_pname = "idle" if fromsinglepng else posename[:first_num_index]
30
31
self.data = FrameData(imgpath, fromsinglepng, true_pname, **texinfo)
32
self.modified = False
33
34
# ui stuff
35
self.image_pixmap = imghashes.get(self.data.img_hash).toqpixmap()
36
self.myframe = QFrame(self)
37
self.img_label = QLabel(self.myframe)
38
39
self.img_label.setPixmap(self.image_pixmap.scaled(SPRITEFRAME_SIZE, SPRITEFRAME_SIZE))
40
41
self.setFixedSize(QSize(SPRITEFRAME_SIZE, SPRITEFRAME_SIZE))
42
43
self.remove_btn = QPushButton(self.myframe)
44
self.remove_btn.move(90, 90)
45
self.remove_btn.setIcon(QIcon('./assets/remove-frame-icon.svg'))
46
self.remove_btn.setIconSize(QSize(40, 40))
47
self.remove_btn.setFixedSize(40, 40)
48
self.remove_btn.setToolTip("Delete Frame")
49
self.remove_btn.clicked.connect(lambda: self.remove_self(self.frameparent))
50
51
self.select_checkbox = QCheckBox(self.myframe)
52
self.select_checkbox.move(5, 5)
53
self.select_checkbox.stateChanged.connect(lambda : self.add_to_selected_arr(self.frameparent))
54
55
self.current_border_color = "black"
56
self.myframe.setStyleSheet("QFrame{border-style:solid; border-color:" + self.current_border_color + "; border-width:2px}")
57
58
@property
59
def frameparent(self):
60
return self._frameparent
61
62
@frameparent.setter
63
def frameparent(self, newparent):
64
self._frameparent = newparent
65
self.setParent(self._frameparent)
66
67
# overriding the default mousePressEvent
68
def mousePressEvent(self, event):
69
btnpressed = event.button()
70
if btnpressed == 1: # left mouse button
71
prevstate = self.select_checkbox.checkState()
72
newstate = 0 if prevstate != 0 else 1
73
self.select_checkbox.setChecked(newstate)
74
modifiers = QApplication.keyboardModifiers()
75
if modifiers == Qt.ShiftModifier:
76
self.frameparent.ranged_selection_handler(self)
77
else:
78
modifiers = QApplication.keyboardModifiers()
79
if modifiers == Qt.ShiftModifier:
80
self.frameparent.ranged_deletion_handler(self)
81
82
# overriding the default enterEvent
83
def enterEvent(self, event):
84
self.myframe.setStyleSheet("QFrame{ border-style:solid; border-color:#FFC9DEF5; border-width:4px }")
85
86
# overriding the default leaveEvent
87
def leaveEvent(self, event):
88
self.myframe.setStyleSheet("QFrame{border-style:solid; border-color:" + self.current_border_color + "; border-width:2px}")
89
90
def remove_self(self, parent):
91
parent.labels.remove(self)
92
if self in parent.selected_labels:
93
parent.selected_labels.remove(self)
94
parent.num_labels -= 1
95
96
parent.frames_layout.removeWidget(self)
97
# parent.update_frame_dict(self.img_xml_data.pose_name, self, remove=True)
98
self.deleteLater()
99
100
parent.re_render_grid()
101
# print("Deleting image, count: ", parent.num_labels, "Len of labels", len(parent.labels))
102
if len(parent.labels) == 0:
103
parent.ui.posename_btn.setDisabled(True)
104
parent.ui.actionPreview_Animation.setEnabled(False)
105
parent.ui.actionView_XML_structure.setEnabled(False)
106
# parent.ui.actionChange_Frame_Ordering.setEnabled(False)
107
108
def add_to_selected_arr(self, parent):
109
if self.select_checkbox.checkState() == 0:
110
parent.selected_labels.remove(self)
111
self.current_border_color = "black"
112
self.myframe.setStyleSheet("QFrame{border-style:solid; border-color:" + self.current_border_color + "; border-width:2px}")
113
else:
114
parent.selected_labels.append(self)
115
self.current_border_color = "green"
116
self.myframe.setStyleSheet("QFrame{border-style:solid; border-color:" + self.current_border_color + "; border-width:2px}")
117
118
parent.ui.actionEdit_Frame_Properties.setDisabled(len(parent.selected_labels) <= 0)
119
120
def get_tooltip_string(self, parent):
121
charname = parent.ui.charname_textbox.text()
122
charname = charname.strip() if charname.strip() != "" else "[ENTER YOUR CHARACTER NAME]"
123
inside_subtex_name = f"{charname} {self.data.pose_name}####" if self.data.from_single_png or self.modified else f"{self.data.pose_name}####"
124
125
ttstring = f'''Image: {path.basename(self.data.imgpath)}
126
Current Pose: {self.data.pose_name}
127
Will appear in XML as:
128
\t<SubTexture name=\"{inside_subtex_name}\" (...) >
129
\t# = digit from 0-9'''
130
131
return ttstring
132
133
def flip_img(self, dxn):
134
# flip the PIL img of self
135
if dxn == 'X':
136
img = imghashes.get(self.data.img_hash).transpose(Image.FLIP_LEFT_RIGHT)
137
elif dxn == 'Y':
138
img = imghashes.get(self.data.img_hash).transpose(Image.FLIP_TOP_BOTTOM)
139
else:
140
print("Something went wrong!")
141
142
# change hash accordingly
143
self.data.change_img(img)
144
145
# do pixmap stuff
146
# Note: the above fn could have closed the img so pass the hash instead
147
self.change_ui_img(self.data.img_hash)
148
149
def change_ui_img(self, newimghash):
150
self.image_pixmap = imghashes.get(newimghash).toqpixmap()
151
self.img_label.setPixmap(self.image_pixmap.scaled(SPRITEFRAME_SIZE, SPRITEFRAME_SIZE))
152
153
154
if __name__ == '__main__':
155
print("To run the actual application, Please type: \npython xmlpngUI.py\nor \npython3 xmlpngUI.py \ndepending on what works")
156