batframework 1.0.6__py3-none-any.whl → 1.0.8a1__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 (59) hide show
  1. batFramework/__init__.py +23 -14
  2. batFramework/action.py +95 -106
  3. batFramework/actionContainer.py +11 -8
  4. batFramework/animatedSprite.py +60 -43
  5. batFramework/audioManager.py +52 -22
  6. batFramework/camera.py +87 -72
  7. batFramework/constants.py +19 -41
  8. batFramework/cutscene.py +12 -11
  9. batFramework/cutsceneBlocks.py +12 -14
  10. batFramework/dynamicEntity.py +5 -4
  11. batFramework/easingController.py +58 -0
  12. batFramework/entity.py +37 -130
  13. batFramework/enums.py +93 -3
  14. batFramework/fontManager.py +15 -7
  15. batFramework/gui/__init__.py +5 -1
  16. batFramework/gui/button.py +6 -144
  17. batFramework/gui/clickableWidget.py +206 -0
  18. batFramework/gui/constraints/__init__.py +1 -0
  19. batFramework/gui/constraints/constraints.py +378 -0
  20. batFramework/gui/container.py +147 -34
  21. batFramework/gui/debugger.py +39 -22
  22. batFramework/gui/dialogueBox.py +69 -43
  23. batFramework/gui/draggableWidget.py +38 -0
  24. batFramework/gui/image.py +33 -28
  25. batFramework/gui/indicator.py +30 -16
  26. batFramework/gui/interactiveWidget.py +72 -20
  27. batFramework/gui/label.py +240 -98
  28. batFramework/gui/layout.py +125 -53
  29. batFramework/gui/meter.py +76 -0
  30. batFramework/gui/radioButton.py +62 -0
  31. batFramework/gui/root.py +72 -48
  32. batFramework/gui/shape.py +257 -49
  33. batFramework/gui/slider.py +217 -2
  34. batFramework/gui/textInput.py +106 -60
  35. batFramework/gui/toggle.py +85 -42
  36. batFramework/gui/widget.py +259 -288
  37. batFramework/manager.py +30 -16
  38. batFramework/object.py +115 -0
  39. batFramework/{particles.py → particle.py} +37 -34
  40. batFramework/renderGroup.py +62 -0
  41. batFramework/resourceManager.py +36 -24
  42. batFramework/scene.py +94 -88
  43. batFramework/sceneManager.py +140 -57
  44. batFramework/scrollingSprite.py +113 -0
  45. batFramework/sprite.py +35 -23
  46. batFramework/tileset.py +34 -52
  47. batFramework/time.py +105 -56
  48. batFramework/transition.py +213 -1
  49. batFramework/utils.py +38 -18
  50. {batframework-1.0.6.dist-info → batframework-1.0.8a1.dist-info}/METADATA +1 -1
  51. batframework-1.0.8a1.dist-info/RECORD +56 -0
  52. {batframework-1.0.6.dist-info → batframework-1.0.8a1.dist-info}/WHEEL +1 -1
  53. batFramework/easing.py +0 -76
  54. batFramework/gui/constraints.py +0 -277
  55. batFramework/gui/frame.py +0 -25
  56. batFramework/transitionManager.py +0 -0
  57. batframework-1.0.6.dist-info/RECORD +0 -50
  58. {batframework-1.0.6.dist-info → batframework-1.0.8a1.dist-info}/LICENCE +0 -0
  59. {batframework-1.0.6.dist-info → batframework-1.0.8a1.dist-info}/top_level.txt +0 -0
batFramework/gui/shape.py CHANGED
@@ -1,79 +1,287 @@
1
1
  import batFramework as bf
2
2
  from .widget import Widget
3
3
  import pygame
4
+ from typing import Self,Iterable
5
+ from math import ceil
4
6
 
5
7
 
6
8
  class Shape(Widget):
7
- def __init__(self, width: float, height: float):
8
- self._color = (0, 0, 0, 0)
9
- self._border_radius: list[int] = [0]
10
- self._outline: int = 0
11
- self._outline_color: tuple[int, int, int] | str = (0, 0, 0, 0)
12
- super().__init__(convert_alpha=True)
13
- self.set_size(width, height)
14
-
15
- def to_string_id(self) -> str:
9
+ def __init__(self, size: tuple[float, float] = None,*args,**kwargs):
10
+ super().__init__(size=size,convert_alpha=True)
11
+ self.color = (0, 0, 0, 0)
12
+ self.border_radius: list[int] = [0]
13
+ self.outline: int = 0
14
+ self.outline_color: tuple[int, int, int] | str = (0, 0, 0, 255)
15
+ self.texture_surface = None
16
+ self.texture_subsize = (0, 0)
17
+ self.relief = 0
18
+ self.shadow_color: tuple[int, int, int] | str = (0, 0, 0, 255)
19
+ self.draw_mode = bf.drawMode.SOLID
20
+
21
+ def get_padded_bottom(self) -> float:
22
+ return self.rect.bottom - self.padding[3] - self.relief
23
+
24
+ def get_padded_height(self) -> float:
25
+ return self.rect.h - self.padding[1] - self.padding[3] - self.relief
26
+
27
+ def get_padded_top(self)->float:
28
+ return self.rect.y + self.relief
29
+
30
+ def get_padded_rect(self)->pygame.FRect:
31
+ return pygame.FRect(
32
+ self.rect.x + self.padding[0],
33
+ self.rect.y + self.padding[1],
34
+ self.rect.w - self.padding[2] - self.padding[0],
35
+ self.rect.h - self.padding[1] - self.padding[3] - self.relief
36
+ )
37
+
38
+ def set_shadow_color(self, color: tuple[int, int, int] | str) -> Self:
39
+ self.shadow_color = color
40
+ self.dirty_surface = True
41
+ return self
42
+
43
+ def set_relief(self, relief: int) -> Self:
44
+ if relief < 0:
45
+ return self
46
+ if self.relief == relief : return self
47
+ self.relief = relief
48
+ self.dirty_shape = True
49
+ return self
50
+
51
+ def get_relief(self) -> int:
52
+ return self.relief
53
+
54
+ def set_texture(
55
+ self, surface: pygame.SurfaceType, subsize: tuple[int, int] | None = None
56
+ ) -> Self:
57
+ self.texture_surface = surface
58
+ if subsize is None:
59
+ subsize = (ceil(surface.get_width() / 3), ceil(surface.get_height() / 3))
60
+ self.texture_subsize = subsize
61
+ self.dirty_surface = True
62
+ return self
63
+
64
+ def set_draw_mode(self, mode: bf.drawMode) -> Self:
65
+ self.draw_mode = mode
66
+ self.dirty_surface = True
67
+ return self
68
+
69
+ def get_draw_mode(self) -> bf.drawMode:
70
+ return self.draw_mode
71
+
72
+ def has_alpha_color(self) -> bool:
73
+ return (pygame.Color(self.color).a != 255) or (
74
+ pygame.Color(self.outline_color).a != 255
75
+ )
76
+
77
+ def __str__(self) -> str:
16
78
  return "Shape"
17
79
 
18
- def set_color(self, color: tuple[int, int, int] | str) -> "Frame":
19
- self._color = color
20
- self.build()
80
+ def set_color(self, color: tuple[int, int, int] | str) -> Self:
81
+ self.color = color
82
+ self.dirty_surface = True
21
83
  return self
22
84
 
23
- def set_outline_color(self, color: tuple[int, int, int] | str) -> "Frame":
24
- self._outline_color = color
25
- self.build()
85
+ def set_outline_color(self, color: tuple[int, int, int] | str) -> Self:
86
+ self.outline_color = color
87
+ self.dirty_surface = True
26
88
  return self
27
89
 
28
- def set_border_radius(self, value: int | list[int]) -> "Frame":
90
+ def set_border_radius(self, value: int | list[int]) -> Self:
29
91
  if isinstance(value, int):
30
- self._border_radius = [value]
92
+ self.border_radius = [value]
31
93
  else:
32
- self._border_radius = value
33
- self.build()
94
+ self.border_radius = value
95
+ self.dirty_surface = True
34
96
  return self
35
97
 
36
- def set_outline_width(self, value: int) -> "Frame":
37
- self._outline = value
38
- self.build()
98
+ def set_outline_width(self, value: int) -> Self:
99
+ self.outline = value
100
+ self.dirty_surface = True
39
101
  return self
40
102
 
41
- def build(self) -> None:
42
- if self.surface.get_size() != self.get_size_int():
43
- self.surface = pygame.Surface(self.get_size_int())
44
- if self.convert_alpha:
45
- self.surface = self.surface.convert_alpha()
46
- self.surface.fill((0, 0, 0, 0))
47
- if self.parent:
48
- self.parent.children_modified()
49
- if self._border_radius == [0]:
50
- self._build_shape()
51
- if self._outline:
52
- self._build_outline()
103
+ def paint(self)->None:
104
+ if self.draw_mode == bf.drawMode.TEXTURED:
105
+ self._paint_textured()
106
+ return
107
+ if self.border_radius == [0]:
108
+ self._paint_shape()
109
+ if self.outline:
110
+ self._paint_outline()
53
111
  else:
54
- self._build_rounded_shape()
55
- if self._outline:
56
- self._build_rounded_outline()
112
+ self._paint_rounded_shape()
113
+ if self.outline:
114
+ self._paint_rounded_outline()
115
+
57
116
 
58
- def _build_shape(self) -> None:
59
- self.surface.fill(self._color)
60
117
 
61
- def _build_rounded_shape(self) -> None:
118
+ def _paint_textured(self) -> None:
62
119
  self.surface.fill((0, 0, 0, 0))
63
- pygame.draw.rect(
64
- self.surface, self._color, (0, 0, *self.rect.size), 0, *self._border_radius
120
+ if self.texture_surface is None:
121
+ return
122
+ w, h = self.surface.get_size()
123
+ sw, sh = self.texture_surface.get_size()
124
+ sub = self.texture_subsize
125
+
126
+ # center
127
+ center_surface = self.texture_surface.subsurface((sub[0], sub[1], *sub))
128
+ top_surface = self.texture_surface.subsurface((sub[0], 0, *sub))
129
+ bottom_surface = self.texture_surface.subsurface((sub[0], sh - sub[1], *sub))
130
+ left_surface = self.texture_surface.subsurface((0, sub[1], *sub))
131
+ right_surface = self.texture_surface.subsurface((sw - sub[0], sub[1], *sub))
132
+
133
+ lst = []
134
+ for y in range(sub[1], h + 1 - sub[1] * 2, sub[1]):
135
+ for x in range(sub[0], w + 1 - sub[0] * 2, sub[0]):
136
+ lst.append((center_surface, (x, y)))
137
+
138
+ w_remainder = w % sub[0]
139
+ h_remainder = h % sub[1]
140
+ fix_x = ((w // sub[0]) - 1) * sub[0]
141
+ fix_y = ((h // sub[1]) - 1) * sub[1]
142
+
143
+ if (w > sub[0]) and (w_remainder > 0):
144
+ # Center : Fix gaps on the x axis
145
+ h_portion = center_surface.subsurface(0, 0, w_remainder, sub[1])
146
+ for y in range(sub[1], h - sub[1] * 2, sub[1]):
147
+ lst.append((h_portion, (fix_x, y)))
148
+
149
+ # Fix partial gaps on the top
150
+
151
+ t_portion = top_surface.subsurface(0, 0, w_remainder, sub[1])
152
+ lst.append((t_portion, (fix_x, 0)))
153
+
154
+ # Fix partial gaps on the bottom
155
+ b_portion = bottom_surface.subsurface(0, 0, w_remainder, sub[1])
156
+ lst.append((b_portion, (fix_x, h - sub[1] - 1)))
157
+
158
+ if (h > sub[1]) and (h_remainder > 0):
159
+ # Center : Fix gaps on the y axis
160
+ v_portion = center_surface.subsurface(0, 0, sub[0], h_remainder)
161
+ for x in range(sub[0], w - sub[0] * 2, sub[0]):
162
+ lst.append((v_portion, (x, fix_y)))
163
+
164
+ # Fix partial gaps on the left
165
+ l_portion = left_surface.subsurface(0, 0, sub[0], h_remainder)
166
+ lst.append((l_portion, (0, fix_y)))
167
+
168
+ # Fix partial gaps on the right
169
+ r_portion = right_surface.subsurface(0, 0, sub[0], h_remainder)
170
+ lst.append((r_portion, (w - sub[0] - 1, fix_y)))
171
+
172
+ # fix corner gap
173
+ if h > sub[1] or w > sub[0]:
174
+ corner_portion = center_surface.subsurface(
175
+ 0,
176
+ 0,
177
+ w_remainder if w_remainder else sub[0],
178
+ h_remainder if h_remainder else sub[1],
179
+ )
180
+ if w_remainder == 0:
181
+ fix_x -= sub[0]
182
+ if h_remainder == 0:
183
+ fix_y -= sub[1]
184
+ lst.append((corner_portion, (fix_x - 1, fix_y - 1)))
185
+
186
+ # borders
187
+ lst.extend(
188
+ [(top_surface, (x, 0)) for x in range(sub[0], w + 1 - sub[0] * 2, sub[0])]
189
+ + [
190
+ (bottom_surface, (x, h - sub[1] - 1))
191
+ for x in range(sub[0], w + 1 - sub[0] * 2, sub[0])
192
+ ]
193
+ + [
194
+ (left_surface, (0, y))
195
+ for y in range(sub[1], h + 1 - sub[1] * 2, sub[1])
196
+ ]
197
+ + [
198
+ (right_surface, (w - sub[0] - 1, y))
199
+ for y in range(sub[1], h + 1 - sub[1] * 2, sub[1])
200
+ ]
201
+ + [
202
+ (self.texture_surface.subsurface((0, 0, *sub)), (0, 0)),
203
+ (
204
+ self.texture_surface.subsurface((sw - sub[0], 0, *sub)),
205
+ (w - sub[0] - 1, 0),
206
+ ),
207
+ (
208
+ self.texture_surface.subsurface((0, sh - sub[1], *sub)),
209
+ (0, h - sub[1] - 1),
210
+ ),
211
+ (
212
+ self.texture_surface.subsurface((sw - sub[0], sh - sub[1], *sub)),
213
+ (w - sub[0] - 1, h - sub[1] - 1),
214
+ ),
215
+ ]
65
216
  )
66
217
 
67
- def _build_outline(self) -> None:
218
+ self.surface.fblits(lst)
219
+
220
+ def _get_elevated_rect(self) -> pygame.FRect:
221
+ return pygame.FRect(
222
+ 0,0 , self.rect.w, self.rect.h - self.relief
223
+ )
224
+
225
+ def _get_base_rect(self) -> pygame.FRect:
226
+ return pygame.FRect(
227
+ 0, self.rect.h - self.relief , self.rect.w, self.relief
228
+ )
229
+
230
+ def _paint_shape(self) -> None:
231
+ self.surface.fill((0, 0, 0, 0))
232
+ self.surface.fill(self.shadow_color, self._get_base_rect())
233
+ self.surface.fill(self.color, self._get_elevated_rect())
234
+
235
+ def _paint_rounded_shape(self) -> None:
236
+ self.surface.fill((0, 0, 0, 0))
237
+ e = self._get_elevated_rect()
238
+ b = e.copy()
239
+ b.bottom = self.rect.h
240
+ pygame.draw.rect(self.surface, self.shadow_color, b, 0, *self.border_radius)
241
+ pygame.draw.rect(self.surface, self.color, e, 0, *self.border_radius)
242
+
243
+ def _paint_outline(self) -> None:
244
+ if self.relief:
245
+ pygame.draw.rect(
246
+ self.surface,
247
+ self.outline_color,
248
+ (
249
+ 0,
250
+ self.relief - self.get_relief(),
251
+ self.rect.w,
252
+ self.rect.h - self.relief,
253
+ ),
254
+ self.outline,
255
+ )
68
256
  pygame.draw.rect(
69
- self.surface, self._outline_color, (0, 0, *self.rect.size), self._outline
257
+ self.surface,
258
+ self.outline_color,
259
+ (
260
+ 0,
261
+ self.relief - self.get_relief(),
262
+ self.rect.w,
263
+ self.rect.h - (self.relief - self.get_relief()),
264
+ ),
265
+ self.outline,
70
266
  )
71
267
 
72
- def _build_rounded_outline(self) -> None:
268
+ def _paint_rounded_outline(self) -> None:
269
+ e = self._get_elevated_rect()
270
+ b = e.copy()
271
+ b.h += e.bottom - b.bottom
272
+
73
273
  pygame.draw.rect(
74
274
  self.surface,
75
- self._outline_color,
76
- (0, 0, *self.rect.size),
77
- self._outline,
78
- *self._border_radius,
275
+ self.outline_color,
276
+ e,
277
+ self.outline,
278
+ *self.border_radius,
79
279
  )
280
+ if self.relief:
281
+ pygame.draw.rect(
282
+ self.surface,
283
+ self.outline_color,
284
+ b,
285
+ self.outline,
286
+ *self.border_radius,
287
+ )
@@ -1,5 +1,220 @@
1
1
  import batFramework as bf
2
+ from .meter import Meter
3
+ from .button import Button
4
+ from .indicator import *
5
+ from .meter import Meter
6
+ from .shape import Shape
7
+ from .interactiveWidget import InteractiveWidget
2
8
 
9
+ class SliderHandle(Indicator, DraggableWidget):
10
+
11
+ def __str__(self) -> str:
12
+ return "SliderHandle"
13
+
14
+ def on_click_down(self, button: int) -> None:
15
+ super().on_click_down(button)
16
+ if button == 1:
17
+ self.parent.get_focus()
18
+
19
+ def on_exit(self) -> None:
20
+ self.is_hovered = False
21
+ self.do_on_exit()
22
+
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
26
+ r = m.get_padded_rect()
27
+ position = self.rect.centerx
28
+ self.rect.clamp_ip(r)
29
+ # Adjust handle position to value
30
+ new_value = self.parent.position_to_value(position)
31
+ self.parent.set_value(new_value)
32
+ self.rect.centerx = self.parent.value_to_position(new_value)
33
+
34
+ def top_at(self, x, y):
35
+ return Widget.top_at(self, x, y)
36
+
37
+
38
+ class SliderMeter(Meter,InteractiveWidget):
39
+
40
+ def __str__(self) -> str:
41
+ return "SliderMeter"
42
+
43
+ def on_click_down(self,button:int)->None:
44
+ if button == 1 :
45
+ self.parent.get_focus()
46
+ r = self.get_root()
47
+ if r:
48
+ pos = r.drawing_camera.screen_to_world(pygame.mouse.get_pos())[0]
49
+ self.parent.set_value(self.parent.position_to_value(pos))
50
+
51
+ self.do_on_click_down(button)
52
+
53
+ class Slider(Button):
54
+ def __init__(self, text: str, default_value: float = 1.0) -> None:
55
+ super().__init__(text, None)
56
+ self.gap: float | int = 0
57
+ self.spacing :bf.spacing = bf.spacing.MANUAL
58
+ self.modified_callback = None
59
+ self.meter: SliderMeter = SliderMeter()
60
+ self.handle = SliderHandle().set_color(bf.color.CLOUD)
61
+ self.add(self.meter,self.handle)
62
+ self.meter.set_debug_color(bf.color.RED)
63
+ self.set_value(default_value,True)
64
+ # print(self.handle.rect)
65
+ # self.handle.set_visible(False)
66
+
67
+ def __str__(self) -> str:
68
+ return "Slider"
69
+
70
+ def set_gap(self, value: int | float) -> Self:
71
+ value = max(0, value)
72
+ self.gap = value
73
+ return self
74
+
75
+ def get_min_required_size(self) -> tuple[float, float]:
76
+ gap = self.gap if self.text else 0
77
+ if not self.text_rect:
78
+ params = {
79
+ "font_name": self.font_object.name,
80
+ "text": self.text,
81
+ "antialias": False,
82
+ "color": "white",
83
+ "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,
85
+ }
86
+ 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
89
+
90
+ def set_spacing(self,spacing:bf.spacing)->Self:
91
+ if spacing == self.spacing : return self
92
+ self.spacing = spacing
93
+ self.dirty_shape = True
94
+ return self
95
+
96
+ def set_modify_callback(self, callback) -> Self:
97
+ self.modified_callback = callback
98
+ return self
99
+
100
+ def set_range(self, range_min: float, range_max: float) -> Self:
101
+ self.meter.set_range(range_min, range_max)
102
+ return self
103
+
104
+ def set_step(self, step: float) -> Self:
105
+ self.meter.set_step(step)
106
+ return self
107
+
108
+ def set_value(self, value, no_callback: bool = False) -> Self:
109
+ if self.meter.value != value :
110
+ self.meter.set_value(value)
111
+ self.dirty_shape = True
112
+ if self.modified_callback and (not no_callback):
113
+ self.modified_callback(self.meter.value)
114
+ return self
115
+
116
+ def get_value(self)->float:
117
+ return self.meter.get_value()
118
+
119
+ def do_on_key_down(self, key):
120
+ if key == pygame.K_RIGHT:
121
+ self.set_value(self.meter.get_value() + self.meter.step)
122
+ bf.AudioManager().play_sound(self.click_down_sound)
123
+ elif key == pygame.K_LEFT:
124
+ self.set_value(self.meter.get_value() - self.meter.step)
125
+ bf.AudioManager().play_sound(self.click_down_sound)
126
+
127
+ def do_on_click_down(self, button) -> None:
128
+ if button == 1 : self.get_focus()
129
+
130
+ def value_to_position(self, value: float) -> float:
131
+ """
132
+ Converts a value to a position on the meter, considering the step size.
133
+ """
134
+ rect = self.meter.get_padded_rect()
135
+ value_range = self.meter.get_range()
136
+ value = round(value / self.meter.step) * self.meter.step
137
+ position_ratio = (value - self.meter.min_value) / value_range
138
+ # print(self.handle.rect)
139
+ # 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)
141
+
142
+ def position_to_value(self, position: float) -> float:
143
+ """
144
+ Converts a position on the meter to a value, considering the step size.
145
+ """
146
+ handle_half = self.handle.rect.w/2
147
+ rect = self.meter.get_padded_rect()
148
+ position = max(rect.left + handle_half, min(position, rect.right - handle_half))
149
+
150
+ position_ratio = (position - rect.left - handle_half) / (rect.width - self.handle.rect.w)
151
+ value_range = self.meter.get_range()
152
+ value = self.meter.min_value + position_ratio * value_range
153
+ return round(value / self.meter.step) * self.meter.step
154
+
155
+ def _build_layout(self) -> None:
156
+
157
+ gap = self.gap if self.text else 0
158
+
159
+ params = {
160
+ "font_name": self.font_object.name,
161
+ "text": self.text,
162
+ "antialias": False,
163
+ "color": "white",
164
+ "bgcolor": "black", # if (self.has_alpha_color() or self.draw_mode == bf.drawMode.TEXTURED) else self.color,
165
+ "wraplength": int(self.get_padded_width()) if self.auto_wraplength else 0,
166
+ }
167
+
168
+ self.text_rect.size = self._render_font(params).get_size()
169
+
170
+ meter_size = [self.text_rect.h * 10, self.font_object.point_size]
171
+ 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
+
176
+
177
+
178
+ if self.autoresize_h or self.autoresize_w:
179
+ 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
182
+ if self.rect.size != target_rect.size:
183
+ self.set_size(target_rect.size)
184
+ self.build()
185
+ return
186
+
187
+ # ------------------------------------ size is ok
188
+ padded = self.get_padded_rect().move(-self.rect.x,-self.rect.y)
189
+
190
+ self.meter.set_size_if_autoresize(meter_size)
191
+ handle_size = 2*[self.meter.get_padded_height()]
192
+
193
+ self.handle.set_size_if_autoresize(handle_size)
194
+
195
+ self.align_text(tmp_rect,padded,self.alignment)
196
+ self.text_rect.midleft = tmp_rect.midleft
197
+
198
+ if self.text :
199
+ match self.spacing:
200
+ case bf.spacing.MAX:
201
+ gap = padded.w - self.text_rect.w - self.meter.rect.w
202
+ case bf.spacing.MIN:
203
+ gap = 0
204
+ case bf.spacing.HALF:
205
+ gap = (padded.w)/2 - self.text_rect.w
206
+
207
+ # place meter
208
+
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)
210
+ # place handle
211
+
212
+ # print(self.meter.rect.top - self.rect.top)
213
+ # print(self.meter.rect.h)
214
+
215
+ x = self.value_to_position(self.meter.value)
216
+ r = self.meter.get_padded_rect()
217
+ self.handle.set_center(x,r.centery)
218
+
219
+ # self.handle.set_center(x,self.rect.top)
3
220
 
4
- class Slider(bf.Widget):
5
- pass