batframework 1.0.9a6__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.
- batFramework/__init__.py +20 -11
- batFramework/action.py +1 -1
- batFramework/animatedSprite.py +47 -116
- batFramework/animation.py +30 -5
- batFramework/audioManager.py +16 -13
- batFramework/baseScene.py +240 -0
- batFramework/camera.py +4 -0
- batFramework/constants.py +6 -1
- batFramework/cutscene.py +221 -21
- batFramework/cutsceneManager.py +5 -2
- batFramework/drawable.py +7 -5
- batFramework/easingController.py +10 -11
- batFramework/entity.py +21 -2
- batFramework/enums.py +48 -33
- batFramework/gui/__init__.py +3 -1
- batFramework/gui/animatedLabel.py +10 -2
- batFramework/gui/button.py +4 -31
- batFramework/gui/clickableWidget.py +42 -30
- batFramework/gui/constraints/constraints.py +212 -136
- batFramework/gui/container.py +72 -48
- batFramework/gui/debugger.py +12 -17
- batFramework/gui/draggableWidget.py +8 -11
- batFramework/gui/image.py +3 -10
- batFramework/gui/indicator.py +73 -1
- batFramework/gui/interactiveWidget.py +117 -100
- batFramework/gui/label.py +73 -63
- batFramework/gui/layout.py +221 -452
- batFramework/gui/meter.py +21 -7
- batFramework/gui/radioButton.py +0 -1
- batFramework/gui/root.py +99 -29
- batFramework/gui/selector.py +257 -0
- batFramework/gui/shape.py +13 -5
- batFramework/gui/slider.py +260 -93
- batFramework/gui/textInput.py +45 -21
- batFramework/gui/toggle.py +70 -52
- batFramework/gui/tooltip.py +30 -0
- batFramework/gui/widget.py +203 -125
- batFramework/manager.py +7 -8
- batFramework/particle.py +4 -1
- batFramework/propertyEaser.py +79 -0
- batFramework/renderGroup.py +17 -50
- batFramework/resourceManager.py +43 -13
- batFramework/scene.py +15 -335
- batFramework/sceneLayer.py +138 -0
- batFramework/sceneManager.py +31 -36
- batFramework/scrollingSprite.py +8 -3
- batFramework/sprite.py +1 -1
- batFramework/templates/__init__.py +1 -2
- batFramework/templates/controller.py +97 -0
- batFramework/timeManager.py +76 -22
- batFramework/transition.py +37 -103
- batFramework/utils.py +121 -3
- {batframework-1.0.9a6.dist-info → batframework-1.0.9a8.dist-info}/METADATA +24 -3
- batframework-1.0.9a8.dist-info/RECORD +66 -0
- {batframework-1.0.9a6.dist-info → batframework-1.0.9a8.dist-info}/WHEEL +1 -1
- batFramework/character.py +0 -27
- batFramework/templates/character.py +0 -43
- batFramework/templates/states.py +0 -166
- batframework-1.0.9a6.dist-info/RECORD +0 -63
- /batframework-1.0.9a6.dist-info/LICENCE → /batframework-1.0.9a8.dist-info/LICENSE +0 -0
- {batframework-1.0.9a6.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 =
|
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
|
-
|
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
|
-
|
185
|
-
|
186
|
-
|
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.
|
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.
|
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) ->
|
265
|
+
def _build_layout(self) -> bool:
|
266
|
+
ret = False
|
267
|
+
target_size = self.resolve_size(self.get_min_required_size())
|
248
268
|
|
249
|
-
|
250
|
-
|
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
|
-
|
253
|
-
|
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,
|
281
|
-
"wraplength":
|
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
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
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.
|
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
|
-
|
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
|
-
|
338
|
+
return size_changed
|
339
|
+
|
340
|
+
|
331
341
|
|
332
342
|
def paint(self) -> None:
|
333
343
|
super().paint()
|