@@ -105,27 +105,27 @@ def paintEvent(self, event):
105105 painter = QPainter (self )
106106 painter .setRenderHint (QPainter .RenderHint .Antialiasing , False ) # Keep pixel look
107107
108- if not self .raw_skin :
108+ if not self .raw_skin or self . raw_skin . isNull () :
109109 # Draw placeholder text centered
110110 painter .setPen (Qt .GlobalColor .white )
111111 painter .drawText (self .rect (), Qt .AlignmentFlag .AlignCenter , "No Skin Loaded" )
112112 return
113113
114- # Basic 2D Front View Mapping
115- # Head: 8,8 (8x8)
116- # Body: 20,20 (8x12)
117- # Arms: 44,20 (4x12) - Note: Alex/Slim is 3x12
118- # Legs: 4,20 (4x12)
119-
120114 # Scaling
121115 s = 16 # Draw scale
122116
123117 # Center X
124118 cx = self .width () // 2
125119 cy = 50
126120
121+ sw = self .raw_skin .width ()
122+ sh = self .raw_skin .height ()
123+
127124 # Helper to draw rect from skin to screen
128125 def draw_part (sx , sy , w , h , dx , dy ):
126+ # Safety check for dimensions
127+ if sx + w > sw or sy + h > sh :
128+ return
129129 part = self .raw_skin .copy (sx , sy , w , h ).scaled (w * s , h * s , Qt .AspectRatioMode .IgnoreAspectRatio )
130130 painter .drawPixmap (dx , dy , part )
131131
@@ -261,8 +261,14 @@ def refresh_skin(self):
261261 return
262262
263263 self .status_label .setText ("Fetching skin..." )
264+ if self .fetcher and self .fetcher .isRunning ():
265+ self .fetcher .terminate ()
266+ self .fetcher .wait ()
267+
264268 self .fetcher = SkinFetcher (uuid )
265269 self .fetcher .finished .connect (self .on_skin_fetched )
270+ self .fetcher .finished .connect (self .fetcher .quit )
271+ self .fetcher .finished .connect (self .fetcher .deleteLater )
266272 self .fetcher .start ()
267273
268274 @pyqtSlot (QPixmap , bool )
@@ -286,8 +292,14 @@ def upload_skin(self):
286292 token = self .minecraft_info .get ("access_token" )
287293
288294 self .status_label .setText ("Uploading skin..." )
295+ if self .uploader and self .uploader .isRunning ():
296+ self .uploader .terminate ()
297+ self .uploader .wait ()
298+
289299 self .uploader = SkinUploader (token , file_path , variant )
290300 self .uploader .finished .connect (self .on_upload_finished )
301+ self .uploader .finished .connect (self .uploader .quit )
302+ self .uploader .finished .connect (self .uploader .deleteLater )
291303 self .uploader .start ()
292304
293305 @pyqtSlot (bool , str )
0 commit comments