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.
- batFramework/action.py +30 -14
- batFramework/actionContainer.py +5 -3
- batFramework/audioManager.py +0 -1
- batFramework/camera.py +29 -24
- batFramework/cutscene.py +2 -4
- batFramework/entity.py +9 -2
- batFramework/enums.py +11 -2
- batFramework/fontManager.py +1 -1
- batFramework/gui/__init__.py +3 -1
- batFramework/gui/button.py +5 -2
- batFramework/gui/clickableWidget.py +42 -29
- batFramework/gui/constraints/constraints.py +269 -57
- batFramework/gui/container.py +39 -21
- batFramework/gui/debugger.py +18 -11
- batFramework/gui/dialogueBox.py +20 -17
- batFramework/gui/draggableWidget.py +7 -5
- batFramework/gui/image.py +27 -15
- batFramework/gui/indicator.py +1 -4
- batFramework/gui/interactiveWidget.py +91 -30
- batFramework/gui/label.py +44 -35
- batFramework/gui/layout.py +115 -43
- batFramework/gui/meter.py +3 -8
- batFramework/gui/radioButton.py +47 -25
- batFramework/gui/root.py +50 -25
- batFramework/gui/shape.py +14 -19
- batFramework/gui/slider.py +70 -44
- batFramework/gui/style.py +10 -0
- batFramework/gui/styleManager.py +48 -0
- batFramework/gui/textInput.py +25 -22
- batFramework/gui/toggle.py +42 -29
- batFramework/gui/widget.py +176 -115
- batFramework/object.py +9 -10
- batFramework/renderGroup.py +7 -2
- batFramework/scene.py +70 -49
- batFramework/sceneManager.py +15 -20
- batFramework/scrollingSprite.py +5 -3
- batFramework/sprite.py +20 -14
- batFramework/stateMachine.py +1 -2
- batFramework/tileset.py +5 -5
- batFramework/utils.py +12 -10
- {batframework-1.0.8a1.dist-info → batframework-1.0.8a3.dist-info}/METADATA +1 -1
- batframework-1.0.8a3.dist-info/RECORD +58 -0
- {batframework-1.0.8a1.dist-info → batframework-1.0.8a3.dist-info}/WHEEL +1 -1
- batframework-1.0.8a1.dist-info/RECORD +0 -56
- {batframework-1.0.8a1.dist-info → batframework-1.0.8a3.dist-info}/LICENCE +0 -0
- {batframework-1.0.8a1.dist-info → batframework-1.0.8a3.dist-info}/top_level.txt +0 -0
batFramework/gui/slider.py
CHANGED
@@ -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(
|
24
|
-
|
25
|
-
|
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
|
64
|
+
self.spacing: bf.spacing = bf.spacing.MANUAL
|
58
65
|
self.modified_callback = None
|
59
66
|
self.meter: SliderMeter = SliderMeter()
|
60
|
-
self.handle =
|
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":
|
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
|
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
|
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
|
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) / (
|
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] =
|
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
|
181
|
-
|
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
|
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(
|
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,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
|
batFramework/gui/textInput.py
CHANGED
@@ -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
|
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
|
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
|
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
|
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
|
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
|
-
|
122
|
-
|
123
|
-
|
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
|
-
|
batFramework/gui/toggle.py
CHANGED
@@ -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
|
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
|
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
|
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":
|
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 =
|
61
|
-
|
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
|
89
|
-
|
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
|
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
|
)
|