batframework 1.0.8a7__py3-none-any.whl → 1.0.8a9__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 (70) hide show
  1. batFramework/__init__.py +51 -68
  2. batFramework/action.py +99 -126
  3. batFramework/actionContainer.py +9 -53
  4. batFramework/animatedSprite.py +82 -141
  5. batFramework/audioManager.py +26 -69
  6. batFramework/camera.py +69 -259
  7. batFramework/constants.py +54 -16
  8. batFramework/cutscene.py +29 -39
  9. batFramework/cutsceneBlocks.py +43 -36
  10. batFramework/debugger.py +48 -0
  11. batFramework/dynamicEntity.py +9 -18
  12. batFramework/easing.py +71 -0
  13. batFramework/entity.py +97 -48
  14. batFramework/gui/__init__.py +2 -10
  15. batFramework/gui/button.py +78 -9
  16. batFramework/gui/constraints.py +204 -0
  17. batFramework/gui/container.py +32 -174
  18. batFramework/gui/debugger.py +43 -131
  19. batFramework/gui/frame.py +19 -0
  20. batFramework/gui/image.py +20 -56
  21. batFramework/gui/indicator.py +21 -38
  22. batFramework/gui/interactiveWidget.py +13 -192
  23. batFramework/gui/label.py +74 -309
  24. batFramework/gui/layout.py +63 -231
  25. batFramework/gui/root.py +38 -134
  26. batFramework/gui/shape.py +57 -237
  27. batFramework/gui/toggle.py +51 -101
  28. batFramework/gui/widget.py +250 -358
  29. batFramework/manager.py +19 -52
  30. batFramework/particles.py +77 -0
  31. batFramework/scene.py +123 -281
  32. batFramework/sceneManager.py +116 -178
  33. batFramework/stateMachine.py +8 -11
  34. batFramework/time.py +58 -145
  35. batFramework/transition.py +124 -195
  36. batFramework/transitionManager.py +0 -0
  37. batFramework/triggerZone.py +1 -1
  38. batFramework/utils.py +147 -112
  39. batframework-1.0.8a9.dist-info/METADATA +53 -0
  40. batframework-1.0.8a9.dist-info/RECORD +42 -0
  41. {batframework-1.0.8a7.dist-info → batframework-1.0.8a9.dist-info}/WHEEL +1 -1
  42. batFramework/character.py +0 -27
  43. batFramework/easingController.py +0 -58
  44. batFramework/enums.py +0 -113
  45. batFramework/fontManager.py +0 -65
  46. batFramework/gui/clickableWidget.py +0 -220
  47. batFramework/gui/constraints/__init__.py +0 -1
  48. batFramework/gui/constraints/constraints.py +0 -815
  49. batFramework/gui/dialogueBox.py +0 -99
  50. batFramework/gui/draggableWidget.py +0 -40
  51. batFramework/gui/meter.py +0 -74
  52. batFramework/gui/radioButton.py +0 -84
  53. batFramework/gui/slider.py +0 -240
  54. batFramework/gui/style.py +0 -10
  55. batFramework/gui/styleManager.py +0 -48
  56. batFramework/gui/textInput.py +0 -247
  57. batFramework/object.py +0 -123
  58. batFramework/particle.py +0 -115
  59. batFramework/renderGroup.py +0 -67
  60. batFramework/resourceManager.py +0 -100
  61. batFramework/scrollingSprite.py +0 -114
  62. batFramework/sprite.py +0 -51
  63. batFramework/templates/__init__.py +0 -2
  64. batFramework/templates/character.py +0 -44
  65. batFramework/templates/states.py +0 -166
  66. batFramework/tileset.py +0 -46
  67. batframework-1.0.8a7.dist-info/LICENCE +0 -21
  68. batframework-1.0.8a7.dist-info/METADATA +0 -43
  69. batframework-1.0.8a7.dist-info/RECORD +0 -62
  70. {batframework-1.0.8a7.dist-info → batframework-1.0.8a9.dist-info}/top_level.txt +0 -0
batFramework/gui/label.py CHANGED
@@ -2,344 +2,109 @@ import batFramework as bf
2
2
  import pygame
3
3
  from .shape import Shape
4
4
  from typing import Self
5
- from math import ceil
6
5
 
7
6
  class Label(Shape):
8
- _text_cache = {}
9
-
10
- def __init__(self, text: str = "") -> None:
11
- self.text = text
12
-
13
- self.resized_flag: bool = False
14
-
7
+ def __init__(self,text:str) -> None:
8
+ self._text = ""
15
9
  # Enable/Disable antialiasing
16
- self.antialias: bool = bf.FontManager().DEFAULT_ANTIALIAS
17
-
18
- self.text_size = bf.FontManager().DEFAULT_TEXT_SIZE
19
-
20
- self.auto_wraplength: bool = False
21
-
22
- self.alignment: bf.alignment = bf.alignment.CENTER
23
-
24
- self.text_color: tuple[int, int, int] | str = "black"
25
-
26
- self.text_outline_color: tuple[int, int, int] | str = "gray50"
27
-
28
- self.text_outline_surface: pygame.Surface = None
29
-
30
- self._text_outline_mask = pygame.Mask((3, 3), fill=True)
31
-
10
+ self._antialias : bool = True
11
+
12
+ self._text_size = bf.const.DEFAULT_TEXT_SIZE
13
+
14
+ self._text_color : tuple[int,int,int]|str = "black"
32
15
  # font name (given when loaded by utils) to use for the text
33
- self.font_name = None
16
+ self._font_name = None
34
17
  # reference to the font object
35
- self.font_object = None
18
+ self._font_object = None
36
19
  # Rect containing the text of the label
37
- self.text_rect = pygame.FRect(0, 0, 0, 0)
20
+ self._text_rect = None
38
21
  # text surface (result of font.render)
39
- self.text_surface: pygame.Surface = pygame.Surface((0, 0))
40
- self.do_caching: bool = False
41
-
42
- self.show_text_outline: bool = False
43
-
44
- self.is_italic: bool = False
45
-
46
- self.is_bold: bool = False
47
-
48
- self.is_underlined: bool = False
49
-
50
- super().__init__((0, 0))
51
- self.set_padding((10, 4))
22
+ self._text_surface : pygame.Surface | None= None
23
+ super().__init__(width=0,height=0)
24
+ self.set_padding((10,4))
52
25
  self.set_debug_color("blue")
53
- self.set_color("gray50")
26
+ self.set_color("white")
54
27
  self.set_autoresize(True)
55
28
  self.set_font(force=True)
29
+ self.set_text(text)
56
30
 
57
- @staticmethod
58
- def clear_cache():
59
- Label._text_cache = {}
60
-
61
- def __str__(self) -> str:
62
- return f"Label({repr(self.text)})"
63
-
64
- def enable_caching(self) -> Self:
65
- self.do_caching = True
31
+ def set_text_color(self,color)->Self:
32
+ self._text_color = color
33
+ self.build()
66
34
  return self
67
35
 
68
- def disable_caching(self) -> Self:
69
- self.do_caching = False
70
- return self
36
+ def to_string_id(self)->str:
37
+ return f"Label({self._text})"
71
38
 
72
- def set_text_color(self, color) -> Self:
73
- self.text_color = color
74
- self.dirty_surface = True
75
- return self
76
39
 
77
- def set_italic(self, value: bool) -> Self:
78
- if value == self.is_italic:
79
- return self
80
- self.is_italic = value
81
- if self.autoresize_h or self.autoresize_w:
82
- self.dirty_shape = True
83
- else:
84
- self.dirty_surface = True
85
- return self
40
+ def get_bounding_box(self):
41
+ yield from super().get_bounding_box()
42
+ if self._text_rect : yield self._text_rect.move(*self.rect.topleft)
86
43
 
87
- def set_bold(self, value: bool) -> Self:
88
- if value == self.is_bold:
89
- return self
90
- self.is_bold = value
91
- if self.autoresize_h or self.autoresize_w:
92
- self.dirty_shape = True
93
- else:
94
- self.dirty_surface = True
44
+ def set_font(self,font_name:str=None,force:bool = False)-> "Label":
45
+ if font_name == self._font_name and not force: return self
46
+ self._font_name = font_name
47
+ self._font_object = bf.utils.get_font(self._font_name,self._text_size)
48
+ self.build()
95
49
  return self
96
50
 
97
- def set_underlined(self, value: bool) -> Self:
98
- if value == self.is_underlined:
99
- return self
100
- self.is_underlined = value
101
- self.dirty_surface = True
51
+ def set_text_size(self,text_size:int) -> "Label":
52
+ text_size = round(text_size/2) * 2
53
+ if text_size == self._text_size : return self
54
+ self._text_size = text_size
55
+ self._font_object = bf.utils.get_font(self._font_name,self._text_size)
56
+ self.build()
102
57
  return self
103
58
 
104
- def set_text_outline_mask_size(self,size:tuple[int,int])->Self:
105
- old_size = self._text_outline_mask.get_size()
106
- m = [[self._text_outline_mask.get_at((x,y)) for x in range(min(old_size[0],size[0]))] for y in range(min(old_size[1],size[1]))]
107
- self._text_outline_mask = pygame.Mask(size, fill=True)
108
- self.set_text_outline_matrix(m)
109
- return self
110
-
111
- def set_text_outline_matrix(self, matrix: list[list[0 | 1]]) -> Self:
112
- if matrix is None:
113
- matrix = [[0 for _ in range(3)] for _ in range(3)]
114
- for y in range(3):
115
- for x in range(3):
116
- self._text_outline_mask.set_at((x, y), matrix[2 - y][2 - x])
117
- self.dirty_shape = True
118
- return self
119
-
120
- def set_text_outline_color(self, color) -> Self:
121
- self.text_outline_color = color
122
- self.dirty_surface = True
123
- return self
124
-
125
- def enable_text_outline(self) -> Self:
126
- self.show_text_outline = True
127
- self.dirty_shape = True
128
- return self
129
-
130
- def disable_text_outline(self) -> Self:
131
- self.show_text_outline = False
132
- self.dirty_shape = True
133
- return self
134
-
135
- def set_alignment(self, alignment: bf.alignment) -> Self:
136
- self.alignment = alignment
137
- self.dirty_surface = True
138
- return self
139
-
140
- def set_auto_wraplength(self, val: bool) -> Self:
141
- self.auto_wraplength = val
142
- if self.autoresize_h or self.autoresize_w:
143
- self.dirty_shape = True
144
- else:
145
- self.dirty_surface = True
146
- return self
59
+ def get_text_size(self)-> int:
60
+ return self._text_size
147
61
 
148
- def get_debug_outlines(self):
149
- if self.visible:
150
- offset = self._get_outline_offset() if self.show_text_outline else (0,0)
151
- yield (self.text_rect.move(self.rect.x - offset[0],self.rect.y - offset[1]), "purple")
152
- yield from super().get_debug_outlines()
62
+ def is_antialias(self)->bool:
63
+ return self._antialias
153
64
 
154
- def set_font(self, font_name: str = None, force: bool = False) -> Self:
155
- if font_name == self.font_name and not force:
156
- return self
157
- self.font_name = font_name
158
- self.font_object = bf.FontManager().get_font(self.font_name, self.text_size)
159
- if self.autoresize_h or self.autoresize_w:
160
- self.dirty_shape = True
161
- else:
162
- self.dirty_surface = True
65
+ def set_antialias(self,value:bool)->"Label":
66
+ self._antialias = value
67
+ self.build()
163
68
  return self
164
69
 
165
- def set_text_size(self, text_size: int) -> Self:
166
- text_size = round(text_size / 2) * 2
167
- if text_size == self.text_size:
168
- return self
169
- self.text_size = text_size
170
- self.font_object = bf.FontManager().get_font(self.font_name, self.text_size)
171
- if self.autoresize_h or self.autoresize_w:
172
- self.dirty_shape = True
70
+ def set_text(self,text:str) -> "Label":
71
+ if text == self._text : return self
72
+ self._text = text
73
+ self.build()
173
74
  return self
75
+
76
+ def get_text(self)->str:
77
+ return self._text
174
78
 
175
- def get_text_size(self) -> int:
176
- return self.text_size
177
79
 
178
- def is_antialias(self) -> bool:
179
- return self.antialias
180
-
181
- def set_antialias(self, value: bool) -> Self:
182
- self.antialias = value
183
- self.dirty_surface = True
184
- return self
185
-
186
- def set_text(self, text: str) -> Self:
187
- if text == self.text:
188
- return self
189
- self.text = text
190
- self.dirty_shape = True
191
- return self
192
-
193
- def get_min_required_size(self) -> tuple[float, float]:
194
- if not (self.autoresize_w or self.autoresize_h):
195
- return self.rect.size
196
- if not self.text_rect:
197
- self.text_rect.size = self._get_text_rect_required_size()
198
- res = self.inflate_rect_by_padding((0, 0, *self.text_rect.size)).size
199
-
200
- return res
201
- return res[0] if self.autoresize_w else self.rect.w, (
202
- res[1] if self.autoresize_h else self.rect.h
203
- )
204
-
205
- def get_text(self) -> str:
206
- return self.text
207
-
208
- def _render_font(self, params: dict) -> pygame.Surface:
209
- key = tuple(params.values())
210
-
211
- cached_value = Label._text_cache.get(key, None)
212
-
213
- if self.draw_mode == bf.drawMode.SOLID:
214
- if cached_value is None:
215
- params.pop("font_name")
216
-
217
- # save old settings
218
- old_italic = self.font_object.get_italic()
219
- old_bold = self.font_object.get_bold()
220
- old_underline = self.font_object.get_underline()
221
-
222
- # setup font
223
- self.font_object.set_italic(self.is_italic)
224
- self.font_object.set_bold(self.is_bold)
225
- self.font_object.set_underline(self.is_underlined)
226
-
227
- surf = self.font_object.render(**params)
228
-
229
- # reset font
230
- self.font_object.set_italic(old_italic)
231
- self.font_object.set_bold(old_bold)
232
- self.font_object.set_underline(old_underline)
233
-
234
- if self.do_caching:
235
- Label._text_cache[key] = surf
236
- else:
237
- surf = cached_value
238
- else:
239
- params.pop("font_name")
240
- surf = self.font_object.render(**params)
241
-
242
- return surf
243
- def _get_text_rect_required_size(self):
244
- font_height = self.font_object.get_linesize()
245
- if not self.text:
246
- # font_height = self.font_object.get_ascent() - self.font_object.get_ascent()
247
- size = (0,font_height)
248
- else:
249
- tmp_text = self.text
250
- if self.text.endswith('\n'):
251
- tmp_text+=" "
252
- params = {
253
- "font_name": self.font_object.name,
254
- "text": tmp_text,
255
- "antialias": self.antialias,
256
- "color": self.text_color,
257
- "bgcolor": None, # if (self.has_alpha_color() or self.draw_mode == bf.drawMode.TEXTURED) else self.color,
258
- "wraplength": int(self.get_padded_width()) if self.auto_wraplength and not self.autoresize_w else 0,
259
- }
260
-
261
- size = self._render_font(params).get_size()
262
- size = size[0],max(font_height,size[1])
263
- s = self._get_outline_offset() if self.show_text_outline else (0,0)
264
- return size[0] + s[0]*2, size[1] + s[1]*2
265
-
266
- def _build_layout(self) -> None:
267
-
268
- self.text_rect.size = self._get_text_rect_required_size()
269
- # self.text_rect.w = ceil(self.text_rect.w)
270
- # self.text_rect.h = ceil(self.text_rect.h)
271
-
272
- if self.autoresize_h or self.autoresize_w:
273
- target_rect = self.inflate_rect_by_padding((0, 0, *self.text_rect.size))
274
- if not self.autoresize_w:
275
- target_rect.w = self.rect.w
276
- if not self.autoresize_h:
277
- target_rect.h = self.rect.h
278
- if self.rect.size != target_rect.size:
279
- self.set_size(target_rect.size)
280
- self.build()
281
- return
282
- offset = self._get_outline_offset() if self.show_text_outline else (0,0)
283
- padded = self.get_padded_rect().move(-self.rect.x + offset[0], -self.rect.y + offset[1])
284
- self.align_text(self.text_rect, padded, self.alignment)
285
-
286
- def _get_outline_offset(self)->tuple[int,int]:
287
- mask_size = self._text_outline_mask.get_size()
288
- return mask_size[0]//2,mask_size[1]//2
289
-
290
- def _paint_text(self) -> None:
291
- if self.font_object is None:
292
- print(f"No font for widget with text : '{self}' :(")
80
+ def _build_text(self)-> None:
81
+ if self._font_object is None:
82
+ print("No font :(")
293
83
  return
294
-
295
- params = {
296
- "font_name": self.font_object.name,
297
- "text": self.text,
298
- "antialias": self.antialias,
299
- "color": self.text_color,
300
- "bgcolor": None, # if (self.has_alpha_color() or self.draw_mode == bf.drawMode.TEXTURED) else self.color,
301
- "wraplength": int(self.get_padded_width()) if self.auto_wraplength and not self.autoresize_w else 0,
302
- }
303
-
304
- self.text_surface = self._render_font(params)
305
-
306
- if self.show_text_outline:
307
- self.text_outline_surface = (
308
- pygame.mask.from_surface(self.text_surface)
309
- .convolve(self._text_outline_mask)
310
- .to_surface(setcolor=self.text_outline_color, unsetcolor=(0, 0, 0, 0))
311
- )
312
-
313
- l = []
314
- outline_offset = self._get_outline_offset() if self.show_text_outline else (0,0)
315
-
316
- if self.show_text_outline:
317
- l.append(
318
- (self.text_outline_surface,
319
- (self.text_rect.x - outline_offset[0],self.text_rect.y - outline_offset[1]))
320
- )
321
- l.append(
322
- (self.text_surface, self.text_rect)
84
+ # render(text, antialias, color, bgcolor=None, wraplength=0) -> Surface
85
+ self._text_surface = self._font_object.render(
86
+ text = self._text,
87
+ antialias = self._antialias,
88
+ color = self._text_color,
89
+ bgcolor = self._color,
90
+ wraplength = 0
323
91
  )
324
- self.surface.fblits(l)
325
-
326
- def align_text(
327
- self, text_rect: pygame.FRect, area: pygame.FRect, alignment: bf.alignment
328
- ):
329
- if alignment == bf.alignment.LEFT:
330
- alignment = bf.alignment.MIDLEFT
331
- elif alignment == bf.alignment.MIDRIGHT:
332
- alignment = bf.alignment.MIDRIGHT
333
-
334
- pos = area.__getattribute__(alignment.value)
335
- text_rect.__setattr__(alignment.value, pos)
336
- text_rect.y = ceil(text_rect.y)
337
-
338
- def build(self) -> None:
92
+ self._text_rect = self._text_surface.get_frect()
93
+
94
+ def _build_layout(self)->None:
95
+ if self.autoresize:
96
+ if self.rect.size != self.inflate_rect_by_padding(self._text_rect).size :
97
+ self.set_size(
98
+ self._text_rect.w + self.padding[0]+self.padding[2],
99
+ self._text_rect.h + self.padding[1]+self.padding[3]
100
+ )
101
+ return
102
+ self._text_rect.center = self.get_content_rect_rel().center
103
+ self.surface.blit(self._text_surface,self._text_rect)
104
+
105
+ def build(self)->None:
339
106
  super().build()
107
+ if not self._font_object:return
108
+ self._build_text()
340
109
  self._build_layout()
341
110
 
342
- def paint(self) -> None:
343
- super().paint()
344
- if self.font_object:
345
- self._paint_text()