batframework 1.0.8a1__py3-none-any.whl → 1.0.8a3__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 (46) hide show
  1. batFramework/action.py +30 -14
  2. batFramework/actionContainer.py +5 -3
  3. batFramework/audioManager.py +0 -1
  4. batFramework/camera.py +29 -24
  5. batFramework/cutscene.py +2 -4
  6. batFramework/entity.py +9 -2
  7. batFramework/enums.py +11 -2
  8. batFramework/fontManager.py +1 -1
  9. batFramework/gui/__init__.py +3 -1
  10. batFramework/gui/button.py +5 -2
  11. batFramework/gui/clickableWidget.py +42 -29
  12. batFramework/gui/constraints/constraints.py +269 -57
  13. batFramework/gui/container.py +39 -21
  14. batFramework/gui/debugger.py +18 -11
  15. batFramework/gui/dialogueBox.py +20 -17
  16. batFramework/gui/draggableWidget.py +7 -5
  17. batFramework/gui/image.py +27 -15
  18. batFramework/gui/indicator.py +1 -4
  19. batFramework/gui/interactiveWidget.py +91 -30
  20. batFramework/gui/label.py +44 -35
  21. batFramework/gui/layout.py +115 -43
  22. batFramework/gui/meter.py +3 -8
  23. batFramework/gui/radioButton.py +47 -25
  24. batFramework/gui/root.py +50 -25
  25. batFramework/gui/shape.py +14 -19
  26. batFramework/gui/slider.py +70 -44
  27. batFramework/gui/style.py +10 -0
  28. batFramework/gui/styleManager.py +48 -0
  29. batFramework/gui/textInput.py +25 -22
  30. batFramework/gui/toggle.py +42 -29
  31. batFramework/gui/widget.py +176 -115
  32. batFramework/object.py +9 -10
  33. batFramework/renderGroup.py +7 -2
  34. batFramework/scene.py +70 -49
  35. batFramework/sceneManager.py +15 -20
  36. batFramework/scrollingSprite.py +5 -3
  37. batFramework/sprite.py +20 -14
  38. batFramework/stateMachine.py +1 -2
  39. batFramework/tileset.py +5 -5
  40. batFramework/utils.py +12 -10
  41. {batframework-1.0.8a1.dist-info → batframework-1.0.8a3.dist-info}/METADATA +1 -1
  42. batframework-1.0.8a3.dist-info/RECORD +58 -0
  43. {batframework-1.0.8a1.dist-info → batframework-1.0.8a3.dist-info}/WHEEL +1 -1
  44. batframework-1.0.8a1.dist-info/RECORD +0 -56
  45. {batframework-1.0.8a1.dist-info → batframework-1.0.8a3.dist-info}/LICENCE +0 -0
  46. {batframework-1.0.8a1.dist-info → batframework-1.0.8a3.dist-info}/top_level.txt +0 -0
@@ -6,7 +6,11 @@ from .meter import Meter
6
6
  from .shape import Shape
7
7
  from .interactiveWidget import InteractiveWidget
8
8
 
9
+
9
10
  class SliderHandle(Indicator, DraggableWidget):
11
+ def __init__(self):
12
+ super().__init__()
13
+ self.set_color(bf.color.CLOUD_SHADE)
10
14
 
11
15
  def __str__(self) -> str:
12
16
  return "SliderHandle"
@@ -20,9 +24,11 @@ class SliderHandle(Indicator, DraggableWidget):
20
24
  self.is_hovered = False
21
25
  self.do_on_exit()
22
26
 
23
- def do_on_drag(self,drag_start:tuple[float,float],drag_end: tuple[float,float]) -> None:
24
- super().do_on_drag(drag_start,drag_end)
25
- m : Meter = self.parent.meter
27
+ def do_on_drag(
28
+ self, drag_start: tuple[float, float], drag_end: tuple[float, float]
29
+ ) -> None:
30
+ super().do_on_drag(drag_start, drag_end)
31
+ m: Meter = self.parent.meter
26
32
  r = m.get_padded_rect()
27
33
  position = self.rect.centerx
28
34
  self.rect.clamp_ip(r)
@@ -35,13 +41,13 @@ class SliderHandle(Indicator, DraggableWidget):
35
41
  return Widget.top_at(self, x, y)
36
42
 
37
43
 
38
- class SliderMeter(Meter,InteractiveWidget):
44
+ class SliderMeter(Meter, InteractiveWidget):
39
45
 
40
46
  def __str__(self) -> str:
41
47
  return "SliderMeter"
42
48
 
43
- def on_click_down(self,button:int)->None:
44
- if button == 1 :
49
+ def on_click_down(self, button: int) -> None:
50
+ if button == 1:
45
51
  self.parent.get_focus()
46
52
  r = self.get_root()
47
53
  if r:
@@ -50,20 +56,26 @@ class SliderMeter(Meter,InteractiveWidget):
50
56
 
51
57
  self.do_on_click_down(button)
52
58
 
59
+
53
60
  class Slider(Button):
54
61
  def __init__(self, text: str, default_value: float = 1.0) -> None:
55
62
  super().__init__(text, None)
56
63
  self.gap: float | int = 0
57
- self.spacing :bf.spacing = bf.spacing.MANUAL
64
+ self.spacing: bf.spacing = bf.spacing.MANUAL
58
65
  self.modified_callback = None
59
66
  self.meter: SliderMeter = SliderMeter()
60
- self.handle = SliderHandle().set_color(bf.color.CLOUD)
61
- self.add(self.meter,self.handle)
67
+ self.handle = SliderHandle()
68
+ self.add(self.meter, self.handle)
62
69
  self.meter.set_debug_color(bf.color.RED)
63
- self.set_value(default_value,True)
70
+ self.set_value(default_value, True)
64
71
  # print(self.handle.rect)
65
72
  # self.handle.set_visible(False)
66
-
73
+
74
+ def set_visible(self, value: bool) -> Self:
75
+ self.handle.set_visible(value)
76
+ self.meter.set_visible(value)
77
+ return super().set_visible(value)
78
+
67
79
  def __str__(self) -> str:
68
80
  return "Slider"
69
81
 
@@ -81,14 +93,17 @@ class Slider(Button):
81
93
  "antialias": False,
82
94
  "color": "white",
83
95
  "bgcolor": "black", # if (self.has_alpha_color() or self.draw_mode == bf.drawMode.TEXTURED) else self.color,
84
- "wraplength": int(self.get_padded_width()) if self.auto_wraplength else 0,
96
+ "wraplength": (
97
+ int(self.get_padded_width()) if self.auto_wraplength else 0
98
+ ),
85
99
  }
86
100
  self.text_rect.size = self._render_font(params).get_size()
87
- w,h = self.text_rect.size
88
- return self.inflate_rect_by_padding((0, 0,w + gap + self.meter.rect.w,h)).size
101
+ w, h = self.text_rect.size
102
+ return self.inflate_rect_by_padding((0, 0, w + gap + self.meter.rect.w, h)).size
89
103
 
90
- def set_spacing(self,spacing:bf.spacing)->Self:
91
- if spacing == self.spacing : return self
104
+ def set_spacing(self, spacing: bf.spacing) -> Self:
105
+ if spacing == self.spacing:
106
+ return self
92
107
  self.spacing = spacing
93
108
  self.dirty_shape = True
94
109
  return self
@@ -106,14 +121,14 @@ class Slider(Button):
106
121
  return self
107
122
 
108
123
  def set_value(self, value, no_callback: bool = False) -> Self:
109
- if self.meter.value != value :
124
+ if self.meter.value != value:
110
125
  self.meter.set_value(value)
111
126
  self.dirty_shape = True
112
127
  if self.modified_callback and (not no_callback):
113
128
  self.modified_callback(self.meter.value)
114
129
  return self
115
-
116
- def get_value(self)->float:
130
+
131
+ def get_value(self) -> float:
117
132
  return self.meter.get_value()
118
133
 
119
134
  def do_on_key_down(self, key):
@@ -123,9 +138,10 @@ class Slider(Button):
123
138
  elif key == pygame.K_LEFT:
124
139
  self.set_value(self.meter.get_value() - self.meter.step)
125
140
  bf.AudioManager().play_sound(self.click_down_sound)
126
-
141
+
127
142
  def do_on_click_down(self, button) -> None:
128
- if button == 1 : self.get_focus()
143
+ if button == 1:
144
+ self.get_focus()
129
145
 
130
146
  def value_to_position(self, value: float) -> float:
131
147
  """
@@ -137,22 +153,28 @@ class Slider(Button):
137
153
  position_ratio = (value - self.meter.min_value) / value_range
138
154
  # print(self.handle.rect)
139
155
  # print(rect.left + (self.handle.rect.w/2) + position_ratio * (rect.width - self.handle.rect.w),self.handle.rect.w,self.rect.right)
140
- return rect.left + (self.handle.rect.w/2) + position_ratio * (rect.width - self.handle.rect.w)
156
+ return (
157
+ rect.left
158
+ + (self.handle.rect.w / 2)
159
+ + position_ratio * (rect.width - self.handle.rect.w)
160
+ )
141
161
 
142
162
  def position_to_value(self, position: float) -> float:
143
163
  """
144
164
  Converts a position on the meter to a value, considering the step size.
145
165
  """
146
- handle_half = self.handle.rect.w/2
166
+ handle_half = self.handle.rect.w / 2
147
167
  rect = self.meter.get_padded_rect()
148
168
  position = max(rect.left + handle_half, min(position, rect.right - handle_half))
149
169
 
150
- position_ratio = (position - rect.left - handle_half) / (rect.width - self.handle.rect.w)
170
+ position_ratio = (position - rect.left - handle_half) / (
171
+ rect.width - self.handle.rect.w
172
+ )
151
173
  value_range = self.meter.get_range()
152
174
  value = self.meter.min_value + position_ratio * value_range
153
175
  return round(value / self.meter.step) * self.meter.step
154
176
 
155
- def _build_layout(self) -> None:
177
+ def _build_layout(self) -> None:
156
178
 
157
179
  gap = self.gap if self.text else 0
158
180
 
@@ -169,52 +191,56 @@ class Slider(Button):
169
191
 
170
192
  meter_size = [self.text_rect.h * 10, self.font_object.point_size]
171
193
  if not self.autoresize_w:
172
- meter_size[0] = self.get_padded_width() - self.text_rect.w - gap
173
-
174
- tmp_rect = pygame.FRect(0,0,self.text_rect.w + gap + meter_size[0],self.text_rect.h)
175
-
194
+ meter_size[0] = self.get_padded_width() - self.text_rect.w - gap
176
195
 
196
+ tmp_rect = pygame.FRect(
197
+ 0, 0, self.text_rect.w + gap + meter_size[0], self.text_rect.h
198
+ )
177
199
 
178
- if self.autoresize_h or self.autoresize_w:
200
+ if self.autoresize_h or self.autoresize_w:
179
201
  target_rect = self.inflate_rect_by_padding(tmp_rect)
180
- if not self.autoresize_w : target_rect.w = self.rect.w
181
- if not self.autoresize_h : target_rect.h = self.rect.h
202
+ if not self.autoresize_w:
203
+ target_rect.w = self.rect.w
204
+ if not self.autoresize_h:
205
+ target_rect.h = self.rect.h
182
206
  if self.rect.size != target_rect.size:
183
207
  self.set_size(target_rect.size)
184
208
  self.build()
185
209
  return
186
210
 
187
211
  # ------------------------------------ size is ok
188
- padded = self.get_padded_rect().move(-self.rect.x,-self.rect.y)
212
+ padded = self.get_padded_rect().move(-self.rect.x, -self.rect.y)
189
213
 
190
214
  self.meter.set_size_if_autoresize(meter_size)
191
- handle_size = 2*[self.meter.get_padded_height()]
192
-
215
+ handle_size = 2 * [self.meter.get_padded_height()]
216
+
193
217
  self.handle.set_size_if_autoresize(handle_size)
194
218
 
195
- self.align_text(tmp_rect,padded,self.alignment)
219
+ self.align_text(tmp_rect, padded, self.alignment)
196
220
  self.text_rect.midleft = tmp_rect.midleft
197
221
 
198
- if self.text :
222
+ if self.text:
199
223
  match self.spacing:
200
224
  case bf.spacing.MAX:
201
225
  gap = padded.w - self.text_rect.w - self.meter.rect.w
202
226
  case bf.spacing.MIN:
203
227
  gap = 0
204
- case bf.spacing.HALF:
205
- gap = (padded.w)/2 - self.text_rect.w
206
228
 
207
- # place meter
229
+ # place meter
208
230
 
209
- self.meter.set_position(*self.text_rect.move(self.rect.x + gap,self.rect.y + (self.text_rect.h /2) - meter_size[1]/2).topright)
231
+ self.meter.set_position(
232
+ *self.text_rect.move(
233
+ self.rect.x + gap,
234
+ self.rect.y + (self.text_rect.h / 2) - meter_size[1] / 2,
235
+ ).topright
236
+ )
210
237
  # place handle
211
238
 
212
239
  # print(self.meter.rect.top - self.rect.top)
213
240
  # print(self.meter.rect.h)
214
-
241
+
215
242
  x = self.value_to_position(self.meter.value)
216
243
  r = self.meter.get_padded_rect()
217
- self.handle.set_center(x,r.centery)
244
+ self.handle.set_center(x, r.centery)
218
245
 
219
246
  # self.handle.set_center(x,self.rect.top)
220
-
@@ -0,0 +1,10 @@
1
+ from .widget import Widget
2
+
3
+
4
+ class Style:
5
+
6
+ def __init__(self):
7
+ pass
8
+
9
+ def apply(self, widget: Widget):
10
+ pass
@@ -0,0 +1,48 @@
1
+ from ..utils import Singleton
2
+ from .widget import Widget
3
+
4
+
5
+ class Style:
6
+ def __init__(self):
7
+ pass
8
+
9
+ def apply(self, widget: Widget):
10
+ pass
11
+
12
+
13
+ class StyleManager(metaclass=Singleton):
14
+ def __init__(self):
15
+ self.styles: list[Style] = []
16
+ self.widgets: set[Widget] = set()
17
+ self.lookup: dict[Widget, bool] = {}
18
+
19
+ def register_widget(self, widget: Widget):
20
+ if widget in self.widgets:
21
+ return
22
+ self.widgets.add(widget)
23
+ self.lookup[widget] = False
24
+ self.update()
25
+
26
+ def refresh_widget(self, widget: Widget):
27
+ if widget in self.widgets:
28
+ self.lookup[widget] = True
29
+ self.update()
30
+
31
+ def remove_widget(self, widget: Widget):
32
+ if widget not in self.widgets:
33
+ return
34
+ self.widgets.remove(widget)
35
+ self.lookup.pop(widget)
36
+
37
+ def add(self, style: Style):
38
+ self.styles.append(style)
39
+ self.lookup = {key: False for key in self.lookup}
40
+ self.update()
41
+
42
+ def update(self):
43
+ for widget in self.widgets:
44
+ if self.lookup[widget]:
45
+ continue
46
+ for style in self.styles:
47
+ style.apply(widget)
48
+ self.lookup[widget] = True
@@ -1,5 +1,5 @@
1
1
  import batFramework as bf
2
- from typing import Self,Callable
2
+ from typing import Self, Callable
3
3
  from .label import Label
4
4
  from .interactiveWidget import InteractiveWidget
5
5
  import pygame
@@ -12,20 +12,21 @@ class TextInput(Label, InteractiveWidget):
12
12
  self.cursor_timer = bf.Timer(0.3, self._cursor_toggle, loop=True).start()
13
13
  self.cursor_timer.pause()
14
14
  self.show_cursor: bool = False
15
- self.on_modify :Callable[[str],str] = None
15
+ self.on_modify: Callable[[str], str] = None
16
16
  self.set_focusable(True)
17
17
  self.set_outline_color("black")
18
18
  super().__init__("")
19
19
 
20
- def set_modify_callback(self,callback : Callable[[str],str])->Self:
20
+ def set_modify_callback(self, callback: Callable[[str], str]) -> Self:
21
21
  self.on_modify = callback
22
22
  return self
23
23
 
24
- def to_string_id(self) -> str:
24
+ def __str__(self) -> str:
25
25
  return f"TextInput({self.text})"
26
26
 
27
- def _cursor_toggle(self,value:bool = None):
28
- if value is None : value = not self.show_cursor
27
+ def _cursor_toggle(self, value: bool = None):
28
+ if value is None:
29
+ value = not self.show_cursor
29
30
  self.show_cursor = value
30
31
  self.dirty_surface = True
31
32
 
@@ -44,6 +45,7 @@ class TextInput(Label, InteractiveWidget):
44
45
  self.old_key_repeat = pygame.key.get_repeat()
45
46
  self.cursor_timer.resume()
46
47
  self._cursor_toggle(True)
48
+ self.set_cursor_position(len(self.get_text()))
47
49
  pygame.key.set_repeat(200, 50)
48
50
 
49
51
  def do_on_lose_focus(self):
@@ -75,10 +77,10 @@ class TextInput(Label, InteractiveWidget):
75
77
  elif event.type == pygame.KEYDOWN:
76
78
  if event.key == pygame.K_ESCAPE:
77
79
  self.lose_focus()
78
-
80
+
79
81
  elif event.key == pygame.K_BACKSPACE:
80
82
  if cursor_position > 0:
81
- self.set_text(text[:cursor_position - 1] + text[cursor_position:])
83
+ self.set_text(text[: cursor_position - 1] + text[cursor_position:])
82
84
  self.set_cursor_position(cursor_position - 1)
83
85
 
84
86
  elif event.key == pygame.K_RIGHT:
@@ -89,13 +91,14 @@ class TextInput(Label, InteractiveWidget):
89
91
 
90
92
  else:
91
93
  return
92
- else :
94
+ else:
93
95
  return
94
96
 
95
97
  event.consumed = True
96
-
98
+
97
99
  def set_text(self, text: str) -> Self:
98
- if self.on_modify : text = self.on_modify(text)
100
+ if self.on_modify:
101
+ text = self.on_modify(text)
99
102
  return super().set_text(text)
100
103
 
101
104
  def _paint_cursor(self) -> None:
@@ -104,8 +107,8 @@ class TextInput(Label, InteractiveWidget):
104
107
  partial_text_size = self.font_object.size(
105
108
  self.get_text()[: self.cursor_position]
106
109
  )
107
-
108
- cursor_rect = pygame.Rect(0, 0,1, self.font_object.point_size )
110
+
111
+ cursor_rect = pygame.Rect(0, 0, 1, self.font_object.point_size)
109
112
  if self.cursor_position != 0: # align left properly
110
113
  cursor_rect.midleft = self.text_rect.move(partial_text_size[0], 0).midleft
111
114
  else:
@@ -117,18 +120,18 @@ class TextInput(Label, InteractiveWidget):
117
120
  super().paint()
118
121
  self._paint_cursor()
119
122
 
120
-
121
- def align_text(self,text_rect:pygame.FRect,area:pygame.FRect,alignment: bf.alignment):
122
- if alignment == bf.alignment.LEFT : alignment = bf.alignment.MIDLEFT
123
- elif alignment == bf.alignment.MIDRIGHT : alignment = bf.alignment.MIDRIGHT
123
+ def align_text(
124
+ self, text_rect: pygame.FRect, area: pygame.FRect, alignment: bf.alignment
125
+ ):
126
+ if alignment == bf.alignment.LEFT:
127
+ alignment = bf.alignment.MIDLEFT
128
+ elif alignment == bf.alignment.MIDRIGHT:
129
+ alignment = bf.alignment.MIDRIGHT
124
130
 
125
131
  pos = area.__getattribute__(alignment.value)
126
- text_rect.__setattr__(alignment.value,pos)
127
- w = self.font_object.size(
128
- self.get_text()[: self.cursor_position]
129
- )[0]
132
+ text_rect.__setattr__(alignment.value, pos)
133
+ w = self.font_object.size(self.get_text()[: self.cursor_position])[0]
130
134
  if self.text_rect.x + w > area.right:
131
135
  self.text_rect.right = area.right
132
136
  elif self.text_rect.x + w < area.left:
133
137
  self.text_rect.left = area.left - w
134
-
@@ -6,15 +6,19 @@ import pygame
6
6
 
7
7
 
8
8
  class Toggle(Button):
9
- def __init__(self, text: str, callback=None,default_value: bool = False) -> None:
9
+ def __init__(self, text: str, callback=None, default_value: bool = False) -> None:
10
10
  self.value: bool = default_value
11
11
  self.indicator: ToggleIndicator = ToggleIndicator(default_value)
12
12
  self.gap: float | int = 0
13
- self.spacing :bf.spacing = bf.spacing.MANUAL
13
+ self.spacing: bf.spacing = bf.spacing.MANUAL
14
14
  super().__init__(text, callback)
15
15
  self.add(self.indicator)
16
16
  # self.set_gap(int(max(4, self.get_padded_width() / 3)))
17
17
 
18
+ def set_visible(self, value: bool) -> Self:
19
+ self.indicator.set_visible(value)
20
+ return super().set_visible(value)
21
+
18
22
  def set_value(self, value: bool, do_callback=False) -> Self:
19
23
  self.value = value
20
24
  self.indicator.set_value(value)
@@ -23,18 +27,20 @@ class Toggle(Button):
23
27
  self.callback(self.value)
24
28
  return self
25
29
 
26
- def set_spacing(self,spacing:bf.spacing)->Self:
27
- if spacing == self.spacing : return self
30
+ def set_spacing(self, spacing: bf.spacing) -> Self:
31
+ if spacing == self.spacing:
32
+ return self
28
33
  self.spacing = spacing
29
34
  self.dirty_shape = True
30
35
  return self
31
-
36
+
32
37
  def click(self) -> None:
33
38
  self.set_value(not self.value, True)
34
39
 
35
40
  def set_gap(self, value: int | float) -> Self:
36
41
  value = max(0, value)
37
- if value == self.gap : return self
42
+ if value == self.gap:
43
+ return self
38
44
  self.gap = value
39
45
  self.dirty_shape = True
40
46
  return self
@@ -53,18 +59,25 @@ class Toggle(Button):
53
59
  "antialias": False,
54
60
  "color": "white",
55
61
  "bgcolor": "black", # if (self.has_alpha_color() or self.draw_mode == bf.drawMode.TEXTURED) else self.color,
56
- "wraplength": int(self.get_padded_width()) if self.auto_wraplength else 0,
62
+ "wraplength": (
63
+ int(self.get_padded_width()) if self.auto_wraplength else 0
64
+ ),
57
65
  }
58
66
  self.text_rect.size = self._render_font(params).get_size()
59
- w,h = self.text_rect.size
60
- size = max(self.indicator.rect.w,w + self.font_object.point_size + (self.gap if self.text else 0)), max(h,self.font_object.point_size,self.indicator.rect.h)
61
- return self.inflate_rect_by_padding((0,0,*size)).size
67
+ w, h = self.text_rect.size
68
+ size = (
69
+ max(
70
+ self.indicator.rect.w,
71
+ w + self.font_object.point_size + (self.gap if self.text else 0),
72
+ ),
73
+ self.text_rect.h,
74
+ )
75
+ return self.inflate_rect_by_padding((0, 0, *size)).size
62
76
 
63
-
64
77
  def _build_layout(self) -> None:
65
78
 
66
- gap = self.gap if self.text else 0
67
-
79
+ gap = self.gap if self.text else 0
80
+
68
81
  params = {
69
82
  "font_name": self.font_object.name,
70
83
  "text": self.text,
@@ -77,37 +90,37 @@ class Toggle(Button):
77
90
 
78
91
  indicator_height = self.font_object.point_size
79
92
 
80
- self.indicator.set_size((indicator_height,indicator_height))
81
-
82
-
83
- tmp_rect = pygame.FRect(0,0,self.text_rect.w + gap + indicator_height , self.text_rect.h)
93
+ self.indicator.set_size((indicator_height, indicator_height))
84
94
 
95
+ tmp_rect = pygame.FRect(
96
+ 0, 0, self.text_rect.w + gap + indicator_height, self.text_rect.h
97
+ )
85
98
 
86
- if self.autoresize_h or self.autoresize_w:
99
+ if self.autoresize_h or self.autoresize_w:
87
100
  target_rect = self.inflate_rect_by_padding(tmp_rect)
88
- if not self.autoresize_w : target_rect.w = self.rect.w
89
- if not self.autoresize_h : target_rect.h = self.rect.h
101
+ if not self.autoresize_w:
102
+ target_rect.w = self.rect.w
103
+ if not self.autoresize_h:
104
+ target_rect.h = self.rect.h
90
105
  if self.rect.size != target_rect.size:
91
106
  self.set_size(target_rect.size)
92
107
  self.build()
93
108
  return
94
-
95
- padded = self.get_padded_rect().move(-self.rect.x,-self.rect.y)
96
-
97
- self.align_text(tmp_rect,padded,self.alignment)
109
+
110
+ padded = self.get_padded_rect().move(-self.rect.x, -self.rect.y)
111
+
112
+ self.align_text(tmp_rect, padded, self.alignment)
98
113
  self.text_rect.midleft = tmp_rect.midleft
99
- if self.text :
114
+ if self.text:
100
115
  match self.spacing:
101
116
  case bf.spacing.MAX:
102
117
  gap = padded.w - self.text_rect.w - self.indicator.rect.w
103
118
  case bf.spacing.MIN:
104
119
  gap = 0
105
- case bf.spacing.HALF:
106
- gap = (padded.w)/2 - self.text_rect.w
107
120
 
108
121
  self.indicator.set_position(
109
122
  *self.text_rect.move(
110
- self.rect.x+gap,
111
- self.rect.y + (self.text_rect.h /2) - self.indicator.rect.h/2
123
+ self.rect.x + gap,
124
+ self.rect.y + (self.text_rect.h / 2) - self.indicator.rect.h / 2,
112
125
  ).topright
113
126
  )