batframework 1.0.9a7__py3-none-any.whl → 1.0.9a8__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. batFramework/__init__.py +20 -11
  2. batFramework/action.py +1 -1
  3. batFramework/animatedSprite.py +47 -116
  4. batFramework/animation.py +30 -5
  5. batFramework/audioManager.py +8 -5
  6. batFramework/baseScene.py +240 -0
  7. batFramework/camera.py +4 -0
  8. batFramework/constants.py +6 -1
  9. batFramework/cutscene.py +221 -21
  10. batFramework/cutsceneManager.py +5 -2
  11. batFramework/drawable.py +7 -5
  12. batFramework/easingController.py +10 -11
  13. batFramework/entity.py +21 -2
  14. batFramework/enums.py +48 -33
  15. batFramework/gui/__init__.py +3 -1
  16. batFramework/gui/animatedLabel.py +10 -2
  17. batFramework/gui/button.py +4 -31
  18. batFramework/gui/clickableWidget.py +42 -30
  19. batFramework/gui/constraints/constraints.py +212 -136
  20. batFramework/gui/container.py +72 -48
  21. batFramework/gui/debugger.py +12 -17
  22. batFramework/gui/draggableWidget.py +8 -11
  23. batFramework/gui/image.py +3 -10
  24. batFramework/gui/indicator.py +73 -1
  25. batFramework/gui/interactiveWidget.py +117 -100
  26. batFramework/gui/label.py +73 -63
  27. batFramework/gui/layout.py +221 -452
  28. batFramework/gui/meter.py +21 -7
  29. batFramework/gui/radioButton.py +0 -1
  30. batFramework/gui/root.py +99 -29
  31. batFramework/gui/selector.py +257 -0
  32. batFramework/gui/shape.py +13 -5
  33. batFramework/gui/slider.py +260 -93
  34. batFramework/gui/textInput.py +45 -21
  35. batFramework/gui/toggle.py +70 -52
  36. batFramework/gui/tooltip.py +30 -0
  37. batFramework/gui/widget.py +203 -125
  38. batFramework/manager.py +7 -8
  39. batFramework/particle.py +4 -1
  40. batFramework/propertyEaser.py +79 -0
  41. batFramework/renderGroup.py +17 -50
  42. batFramework/resourceManager.py +43 -13
  43. batFramework/scene.py +15 -335
  44. batFramework/sceneLayer.py +138 -0
  45. batFramework/sceneManager.py +31 -36
  46. batFramework/scrollingSprite.py +8 -3
  47. batFramework/sprite.py +1 -1
  48. batFramework/templates/__init__.py +1 -2
  49. batFramework/templates/controller.py +97 -0
  50. batFramework/timeManager.py +76 -22
  51. batFramework/transition.py +37 -103
  52. batFramework/utils.py +121 -3
  53. {batframework-1.0.9a7.dist-info → batframework-1.0.9a8.dist-info}/METADATA +24 -3
  54. batframework-1.0.9a8.dist-info/RECORD +66 -0
  55. {batframework-1.0.9a7.dist-info → batframework-1.0.9a8.dist-info}/WHEEL +1 -1
  56. batFramework/character.py +0 -27
  57. batFramework/templates/character.py +0 -43
  58. batFramework/templates/states.py +0 -166
  59. batframework-1.0.9a7.dist-info/RECORD +0 -63
  60. /batframework-1.0.9a7.dist-info/LICENCE → /batframework-1.0.9a8.dist-info/LICENSE +0 -0
  61. {batframework-1.0.9a7.dist-info → batframework-1.0.9a8.dist-info}/top_level.txt +0 -0
batFramework/gui/label.py CHANGED
@@ -1,7 +1,7 @@
1
1
  import batFramework as bf
2
2
  import pygame
3
3
  from .shape import Shape
4
- from typing import Self
4
+ from typing import Literal, Self,Union
5
5
  from math import ceil
6
6
 
7
7
  class Label(Shape):
@@ -10,6 +10,10 @@ class Label(Shape):
10
10
  def __init__(self, text: str = "") -> None:
11
11
  self.text = text
12
12
 
13
+ # Allows scrolling the text
14
+ self.allow_scroll : bool = True
15
+
16
+ # Scroll variable
13
17
  self.scroll :pygame.Vector2 = pygame.Vector2(0,0)
14
18
 
15
19
  self.resized_flag: bool = False
@@ -31,6 +35,7 @@ class Label(Shape):
31
35
 
32
36
  self._text_outline_mask = pygame.Mask((3, 3), fill=True)
33
37
 
38
+ self.line_alignment = pygame.FONT_LEFT
34
39
  # font name (given when loaded by utils) to use for the text
35
40
  self.font_name = None
36
41
  # reference to the font object
@@ -59,11 +64,23 @@ class Label(Shape):
59
64
  def __str__(self) -> str:
60
65
  return f"Label({repr(self.text)})"
61
66
 
67
+
68
+ def set_allow_scroll(self, value:bool)->Self:
69
+ if self.allow_scroll == value: return self
70
+ self.allow_scroll = value
71
+ self.dirty_shape = True
72
+ return self
73
+
62
74
  def set_text_color(self, color) -> Self:
63
75
  self.text_color = color
64
76
  self.dirty_surface = True
65
77
  return self
66
78
 
79
+ def set_line_alignment(self, alignment: Union[Literal["left"], Literal["right"], Literal["center"]]) -> Self:
80
+ self.line_alignment = alignment
81
+ self.dirty_surface = True
82
+ return self
83
+
67
84
  def set_italic(self, value: bool) -> Self:
68
85
  if value == self.is_italic:
69
86
  return self
@@ -136,10 +153,12 @@ class Label(Shape):
136
153
  return self
137
154
 
138
155
  def get_debug_outlines(self):
139
- if self.visible:
140
- offset = self._get_outline_offset() if self.show_text_outline else (0,0)
141
- yield (self.text_rect.move(self.rect.x - offset[0] - self.scroll.x,self.rect.y - offset[1] - self.scroll.y), "purple")
142
156
  yield from super().get_debug_outlines()
157
+ if self.visible:
158
+ yield (self.text_rect.move(self.rect.x - self.scroll.x,self.rect.y - self.scroll.y), "purple")
159
+
160
+ # offset = self._get_outline_offset() if self.show_text_outline else (0,0)
161
+ # yield (self.text_rect.move(self.rect.x - offset[0] - self.scroll.x,self.rect.y - offset[1] - self.scroll.y), "purple")
143
162
 
144
163
  def set_font(self, font_name: str = None, force: bool = False) -> Self:
145
164
  if font_name == self.font_name and not force:
@@ -153,13 +172,12 @@ class Label(Shape):
153
172
  return self
154
173
 
155
174
  def set_text_size(self, text_size: int) -> Self:
156
- text_size = round(text_size / 2) * 2
175
+ text_size = (text_size // 2) * 2
157
176
  if text_size == self.text_size:
158
177
  return self
159
178
  self.text_size = text_size
160
179
  self.font_object = bf.FontManager().get_font(self.font_name, self.text_size)
161
- if self.autoresize_h or self.autoresize_w:
162
- self.dirty_shape = True
180
+ self.dirty_shape = True
163
181
  return self
164
182
 
165
183
  def get_text_size(self) -> int:
@@ -181,15 +199,9 @@ class Label(Shape):
181
199
  return self
182
200
 
183
201
  def get_min_required_size(self) -> tuple[float, float]:
184
- if not (self.autoresize_w or self.autoresize_h):
185
- return self.rect.size
186
- if not self.text_rect:
187
- self.text_rect.size = self._get_text_rect_required_size()
188
- res = self.inflate_rect_by_padding((0, 0, *self.text_rect.size)).size
189
-
190
- return res[0] if self.autoresize_w else self.rect.w, (
191
- res[1] if self.autoresize_h else self.rect.h
192
- )
202
+ return self.expand_rect_with_padding(
203
+ (0, 0, *self._get_text_rect_required_size())
204
+ ).size
193
205
 
194
206
  def get_text(self) -> str:
195
207
  return self.text
@@ -203,28 +215,32 @@ class Label(Shape):
203
215
  old_italic = self.font_object.get_italic()
204
216
  old_bold = self.font_object.get_bold()
205
217
  old_underline = self.font_object.get_underline()
206
-
218
+ old_align = self.font_object.align
207
219
  # setup font
208
220
  self.font_object.set_italic(self.is_italic)
209
221
  self.font_object.set_bold(self.is_bold)
210
222
  self.font_object.set_underline(self.is_underlined)
211
-
223
+ self.font_object.align = self.line_alignment
212
224
  surf = self.font_object.render(**params)
213
225
 
214
226
  # reset font
215
227
  self.font_object.set_italic(old_italic)
216
228
  self.font_object.set_bold(old_bold)
217
229
  self.font_object.set_underline(old_underline)
230
+ self.font_object.align = old_align
218
231
  else:
219
232
  params.pop("font_name")
220
233
  surf = self.font_object.render(**params)
221
234
 
222
235
  return surf
223
-
236
+
237
+ def _get_outline_offset(self)->tuple[int,int]:
238
+ mask_size = self._text_outline_mask.get_size()
239
+ return mask_size[0]//2,mask_size[1]//2
240
+
224
241
  def _get_text_rect_required_size(self):
225
- font_height = self.font_object.get_linesize()
242
+ font_height = self.font_object.get_ascent() - self.font_object.get_descent()
226
243
  if not self.text:
227
- # font_height = self.font_object.get_ascent() - self.font_object.get_ascent()
228
244
  size = (0,font_height)
229
245
  else:
230
246
  tmp_text = self.text
@@ -236,49 +252,43 @@ class Label(Shape):
236
252
  "antialias": self.antialias,
237
253
  "color": self.text_color,
238
254
  "bgcolor": None, # if (self.has_alpha_color() or self.draw_mode == bf.drawMode.TEXTURED) else self.color,
239
- "wraplength": int(self.get_padded_width()) if self.auto_wraplength and not self.autoresize_w else 0,
255
+ "wraplength": int(self.get_inner_width()) if self.auto_wraplength and not self.autoresize_w else 0,
240
256
  }
241
257
 
242
258
  size = self._render_font(params).get_size()
243
259
  size = size[0],max(font_height,size[1])
260
+
261
+ # print(self.text,size)
244
262
  s = self._get_outline_offset() if self.show_text_outline else (0,0)
245
263
  return size[0] + s[0]*2, size[1] + s[1]*2
246
264
 
247
- def _build_layout(self) -> None:
265
+ def _build_layout(self) -> bool:
266
+ ret = False
267
+ target_size = self.resolve_size(self.get_min_required_size())
248
268
 
249
- # print(self.text_rect.size,self._get_text_rect_required_size(),repr(self.text))
250
- self.text_rect.size = self._get_text_rect_required_size()
269
+ if self.rect.size != target_size :
270
+ self.set_size(target_size)
271
+ ret = True
272
+ # self.apply_post_updates(skip_draw=True)
273
+ # return True
251
274
 
252
- if self.autoresize_h or self.autoresize_w:
253
- target_rect = self.inflate_rect_by_padding((0, 0, *self.text_rect.size))
254
- if not self.autoresize_w:
255
- target_rect.w = self.rect.w
256
- if not self.autoresize_h:
257
- target_rect.h = self.rect.h
258
- if self.rect.size != target_rect.size:
259
- # print("Size not good ! ",self.rect.size,target_rect.size,repr(self.text))
260
- self.set_size(target_rect.size)
261
- self.apply_updates()
262
-
263
- offset = self._get_outline_offset() if self.show_text_outline else (0,0)
264
- padded = self.get_padded_rect().move(-self.rect.x + offset[0], -self.rect.y + offset[1])
275
+ self.text_rect.size = self._get_text_rect_required_size()
276
+ padded = self.get_local_padded_rect()
265
277
  self.align_text(self.text_rect, padded, self.alignment)
266
-
267
- def _get_outline_offset(self)->tuple[int,int]:
268
- mask_size = self._text_outline_mask.get_size()
269
- return mask_size[0]//2,mask_size[1]//2
278
+ return ret
270
279
 
271
280
  def _paint_text(self) -> None:
272
281
  if self.font_object is None:
273
282
  print(f"No font for widget with text : '{self}' :(")
274
283
  return
284
+ wrap = int(self.get_inner_width()) if self.auto_wraplength and not self.autoresize_w else 0
275
285
  params = {
276
286
  "font_name": self.font_object.name,
277
287
  "text": self.text,
278
288
  "antialias": self.antialias,
279
289
  "color": self.text_color,
280
- "bgcolor": None, # if (self.has_alpha_color() or self.draw_mode == bf.drawMode.TEXTURED) else self.color,
281
- "wraplength": int(self.get_padded_width()) if self.auto_wraplength and not self.autoresize_w else 0,
290
+ "bgcolor": None,
291
+ "wraplength": wrap,
282
292
  }
283
293
 
284
294
  self.text_surface = self._render_font(params)
@@ -289,27 +299,22 @@ class Label(Shape):
289
299
  .to_surface(setcolor=self.text_outline_color, unsetcolor=(0, 0, 0, 0))
290
300
  )
291
301
 
292
- outline_offset = self._get_outline_offset() if self.show_text_outline else (0,0)
293
-
294
-
295
- # prepare fblit list
296
- l = []
297
- if self.show_text_outline:
298
- l.append(
299
- (self.text_outline_surface,
300
- (self.text_rect.x - outline_offset[0] - self.scroll.x,self.text_rect.y - outline_offset[1] - self.scroll.y))
301
- )
302
- l.append(
303
- (self.text_surface, self.text_rect.move(-self.scroll))
304
- )
302
+ outline_offset = list(self._get_outline_offset())
303
+ outline_offset[0]-=self.scroll.x
304
+ outline_offset[1]-=self.scroll.y
305
+ l = [
306
+ (self.text_outline_surface,(self.text_rect.x - self.scroll.x,self.text_rect.y - self.scroll.y)),
307
+ (self.text_surface, self.text_rect.move(*outline_offset))
308
+ ]
309
+ else:
310
+ l = [(self.text_surface, self.text_rect.move(-self.scroll))]
305
311
 
306
312
  # clip surface
307
313
 
308
314
  old = self.surface.get_clip()
309
- self.surface.set_clip(self.get_padded_rect().move(-self.rect.x,-self.rect.y))
315
+ self.surface.set_clip(self.get_local_padded_rect())
310
316
  self.surface.fblits(l)
311
317
  self.surface.set_clip(old)
312
-
313
318
 
314
319
  def align_text(
315
320
  self, text_rect: pygame.FRect, area: pygame.FRect, alignment: bf.alignment
@@ -323,11 +328,16 @@ class Label(Shape):
323
328
  text_rect.__setattr__(alignment.value, pos)
324
329
  text_rect.y = ceil(text_rect.y)
325
330
 
326
-
327
-
328
- def build(self) -> None:
331
+ def build(self) -> bool:
332
+ """
333
+ return True if size changed
334
+ """
335
+
336
+ size_changed = self._build_layout()
329
337
  super().build()
330
- self._build_layout()
338
+ return size_changed
339
+
340
+
331
341
 
332
342
  def paint(self) -> None:
333
343
  super().paint()