pyglet 2.1.12__py3-none-any.whl → 3.0.dev1__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 (267) hide show
  1. pyglet/__init__.py +67 -61
  2. pyglet/__init__.pyi +15 -8
  3. pyglet/app/__init__.py +22 -13
  4. pyglet/app/async_app.py +212 -0
  5. pyglet/app/base.py +2 -1
  6. pyglet/app/{xlib.py → linux.py} +3 -3
  7. pyglet/config/__init__.py +101 -0
  8. pyglet/config/gl/__init__.py +30 -0
  9. pyglet/config/gl/egl.py +120 -0
  10. pyglet/config/gl/macos.py +262 -0
  11. pyglet/config/gl/windows.py +267 -0
  12. pyglet/config/gl/x11.py +142 -0
  13. pyglet/customtypes.py +43 -2
  14. pyglet/display/__init__.py +8 -6
  15. pyglet/display/base.py +3 -63
  16. pyglet/display/cocoa.py +12 -17
  17. pyglet/display/emscripten.py +39 -0
  18. pyglet/display/headless.py +23 -30
  19. pyglet/display/wayland.py +157 -0
  20. pyglet/display/win32.py +4 -17
  21. pyglet/display/xlib.py +19 -27
  22. pyglet/display/xlib_vidmoderestore.py +2 -2
  23. pyglet/enums.py +183 -0
  24. pyglet/event.py +0 -1
  25. pyglet/experimental/geoshader_sprite.py +15 -13
  26. pyglet/experimental/hidraw.py +6 -15
  27. pyglet/experimental/multitexture_sprite.py +31 -19
  28. pyglet/experimental/particles.py +13 -35
  29. pyglet/font/__init__.py +251 -85
  30. pyglet/font/base.py +116 -61
  31. pyglet/font/dwrite/__init__.py +349 -204
  32. pyglet/font/dwrite/dwrite_lib.py +27 -5
  33. pyglet/font/fontconfig.py +14 -6
  34. pyglet/font/freetype.py +138 -87
  35. pyglet/font/freetype_lib.py +19 -0
  36. pyglet/font/group.py +179 -0
  37. pyglet/font/harfbuzz/__init__.py +3 -3
  38. pyglet/font/pyodide_js.py +310 -0
  39. pyglet/font/quartz.py +319 -126
  40. pyglet/font/ttf.py +45 -3
  41. pyglet/font/user.py +14 -19
  42. pyglet/font/win32.py +45 -21
  43. pyglet/graphics/__init__.py +8 -787
  44. pyglet/graphics/allocation.py +115 -1
  45. pyglet/graphics/api/__init__.py +77 -0
  46. pyglet/graphics/api/base.py +299 -0
  47. pyglet/graphics/api/gl/__init__.py +58 -0
  48. pyglet/graphics/api/gl/base.py +24 -0
  49. pyglet/graphics/{vertexbuffer.py → api/gl/buffer.py} +104 -159
  50. pyglet/graphics/api/gl/cocoa/context.py +76 -0
  51. pyglet/graphics/api/gl/context.py +391 -0
  52. pyglet/graphics/api/gl/default_shaders.py +0 -0
  53. pyglet/graphics/api/gl/draw.py +627 -0
  54. pyglet/graphics/api/gl/egl/__init__.py +0 -0
  55. pyglet/graphics/api/gl/egl/context.py +92 -0
  56. pyglet/graphics/api/gl/enums.py +76 -0
  57. pyglet/graphics/api/gl/framebuffer.py +315 -0
  58. pyglet/graphics/api/gl/gl.py +5463 -0
  59. pyglet/graphics/api/gl/gl_info.py +188 -0
  60. pyglet/graphics/api/gl/global_opengl.py +226 -0
  61. pyglet/{gl → graphics/api/gl}/lib.py +34 -18
  62. pyglet/graphics/api/gl/shader.py +1476 -0
  63. pyglet/graphics/api/gl/shapes.py +55 -0
  64. pyglet/graphics/api/gl/sprite.py +102 -0
  65. pyglet/graphics/api/gl/state.py +219 -0
  66. pyglet/graphics/api/gl/text.py +190 -0
  67. pyglet/graphics/api/gl/texture.py +1526 -0
  68. pyglet/graphics/{vertexarray.py → api/gl/vertexarray.py} +11 -13
  69. pyglet/graphics/api/gl/vertexdomain.py +751 -0
  70. pyglet/graphics/api/gl/win32/__init__.py +0 -0
  71. pyglet/graphics/api/gl/win32/context.py +108 -0
  72. pyglet/graphics/api/gl/win32/wgl_info.py +24 -0
  73. pyglet/graphics/api/gl/xlib/__init__.py +0 -0
  74. pyglet/graphics/api/gl/xlib/context.py +174 -0
  75. pyglet/{gl → graphics/api/gl/xlib}/glx_info.py +26 -31
  76. pyglet/graphics/api/gl1/__init__.py +0 -0
  77. pyglet/{gl → graphics/api/gl1}/gl_compat.py +3 -2
  78. pyglet/graphics/api/gl2/__init__.py +0 -0
  79. pyglet/graphics/api/gl2/buffer.py +320 -0
  80. pyglet/graphics/api/gl2/draw.py +600 -0
  81. pyglet/graphics/api/gl2/global_opengl.py +122 -0
  82. pyglet/graphics/api/gl2/shader.py +200 -0
  83. pyglet/graphics/api/gl2/shapes.py +51 -0
  84. pyglet/graphics/api/gl2/sprite.py +79 -0
  85. pyglet/graphics/api/gl2/text.py +175 -0
  86. pyglet/graphics/api/gl2/vertexdomain.py +364 -0
  87. pyglet/graphics/api/webgl/__init__.py +233 -0
  88. pyglet/graphics/api/webgl/buffer.py +302 -0
  89. pyglet/graphics/api/webgl/context.py +234 -0
  90. pyglet/graphics/api/webgl/draw.py +590 -0
  91. pyglet/graphics/api/webgl/enums.py +76 -0
  92. pyglet/graphics/api/webgl/framebuffer.py +360 -0
  93. pyglet/graphics/api/webgl/gl.py +1537 -0
  94. pyglet/graphics/api/webgl/gl_info.py +130 -0
  95. pyglet/graphics/api/webgl/shader.py +1346 -0
  96. pyglet/graphics/api/webgl/shapes.py +92 -0
  97. pyglet/graphics/api/webgl/sprite.py +102 -0
  98. pyglet/graphics/api/webgl/state.py +227 -0
  99. pyglet/graphics/api/webgl/text.py +187 -0
  100. pyglet/graphics/api/webgl/texture.py +1227 -0
  101. pyglet/graphics/api/webgl/vertexarray.py +54 -0
  102. pyglet/graphics/api/webgl/vertexdomain.py +616 -0
  103. pyglet/graphics/api/webgl/webgl_js.pyi +307 -0
  104. pyglet/{image → graphics}/atlas.py +33 -32
  105. pyglet/graphics/base.py +10 -0
  106. pyglet/graphics/buffer.py +245 -0
  107. pyglet/graphics/draw.py +578 -0
  108. pyglet/graphics/framebuffer.py +26 -0
  109. pyglet/graphics/instance.py +178 -69
  110. pyglet/graphics/shader.py +267 -1553
  111. pyglet/graphics/state.py +83 -0
  112. pyglet/graphics/texture.py +703 -0
  113. pyglet/graphics/vertexdomain.py +695 -538
  114. pyglet/gui/ninepatch.py +10 -10
  115. pyglet/gui/widgets.py +120 -10
  116. pyglet/image/__init__.py +20 -1973
  117. pyglet/image/animation.py +12 -12
  118. pyglet/image/base.py +730 -0
  119. pyglet/image/codecs/__init__.py +9 -0
  120. pyglet/image/codecs/bmp.py +53 -30
  121. pyglet/image/codecs/dds.py +53 -31
  122. pyglet/image/codecs/gdiplus.py +38 -14
  123. pyglet/image/codecs/gdkpixbuf2.py +0 -2
  124. pyglet/image/codecs/js_image.py +99 -0
  125. pyglet/image/codecs/ktx2.py +161 -0
  126. pyglet/image/codecs/pil.py +1 -1
  127. pyglet/image/codecs/png.py +1 -1
  128. pyglet/image/codecs/wic.py +11 -2
  129. pyglet/info.py +26 -24
  130. pyglet/input/__init__.py +8 -0
  131. pyglet/input/base.py +163 -105
  132. pyglet/input/controller.py +13 -19
  133. pyglet/input/controller_db.py +39 -24
  134. pyglet/input/emscripten/__init__.py +18 -0
  135. pyglet/input/emscripten/gamepad_js.py +397 -0
  136. pyglet/input/linux/__init__.py +11 -5
  137. pyglet/input/linux/evdev.py +10 -11
  138. pyglet/input/linux/x11_xinput.py +2 -2
  139. pyglet/input/linux/x11_xinput_tablet.py +1 -1
  140. pyglet/input/macos/__init__.py +7 -2
  141. pyglet/input/macos/darwin_gc.py +559 -0
  142. pyglet/input/win32/__init__.py +1 -1
  143. pyglet/input/win32/directinput.py +34 -29
  144. pyglet/input/win32/xinput.py +11 -61
  145. pyglet/lib.py +3 -3
  146. pyglet/libs/__init__.py +1 -1
  147. pyglet/{gl → libs/darwin}/agl.py +1 -1
  148. pyglet/libs/darwin/cocoapy/__init__.py +2 -2
  149. pyglet/libs/darwin/cocoapy/cocoahelpers.py +181 -0
  150. pyglet/libs/darwin/cocoapy/cocoalibs.py +31 -0
  151. pyglet/libs/darwin/cocoapy/cocoatypes.py +27 -0
  152. pyglet/libs/darwin/cocoapy/runtime.py +81 -45
  153. pyglet/libs/darwin/coreaudio.py +4 -4
  154. pyglet/{gl → libs/darwin}/lib_agl.py +9 -8
  155. pyglet/libs/darwin/quartzkey.py +1 -3
  156. pyglet/libs/egl/__init__.py +2 -0
  157. pyglet/libs/egl/egl_lib.py +576 -0
  158. pyglet/libs/egl/eglext.py +51 -5
  159. pyglet/libs/linux/__init__.py +0 -0
  160. pyglet/libs/linux/egl/__init__.py +0 -0
  161. pyglet/libs/linux/egl/eglext.py +22 -0
  162. pyglet/libs/linux/glx/__init__.py +0 -0
  163. pyglet/{gl → libs/linux/glx}/glx.py +13 -14
  164. pyglet/{gl → libs/linux/glx}/glxext_arb.py +408 -192
  165. pyglet/{gl → libs/linux/glx}/glxext_mesa.py +1 -1
  166. pyglet/{gl → libs/linux/glx}/glxext_nv.py +345 -164
  167. pyglet/{gl → libs/linux/glx}/lib_glx.py +3 -2
  168. pyglet/libs/linux/wayland/__init__.py +0 -0
  169. pyglet/libs/linux/wayland/client.py +1068 -0
  170. pyglet/libs/linux/wayland/lib_wayland.py +207 -0
  171. pyglet/libs/linux/wayland/wayland_egl.py +38 -0
  172. pyglet/libs/{wayland → linux/wayland}/xkbcommon.py +26 -0
  173. pyglet/libs/{x11 → linux/x11}/xf86vmode.py +4 -4
  174. pyglet/libs/{x11 → linux/x11}/xinerama.py +2 -2
  175. pyglet/libs/{x11 → linux/x11}/xinput.py +10 -10
  176. pyglet/libs/linux/x11/xrandr.py +0 -0
  177. pyglet/libs/{x11 → linux/x11}/xrender.py +1 -1
  178. pyglet/libs/shared/__init__.py +0 -0
  179. pyglet/libs/shared/spirv/__init__.py +0 -0
  180. pyglet/libs/shared/spirv/lib_shaderc.py +85 -0
  181. pyglet/libs/shared/spirv/lib_spirv_cross.py +126 -0
  182. pyglet/libs/win32/__init__.py +27 -5
  183. pyglet/libs/win32/constants.py +59 -48
  184. pyglet/libs/win32/context_managers.py +20 -3
  185. pyglet/libs/win32/dinput.py +105 -88
  186. pyglet/{gl → libs/win32}/lib_wgl.py +52 -26
  187. pyglet/libs/win32/types.py +58 -23
  188. pyglet/{gl → libs/win32}/wgl.py +32 -25
  189. pyglet/{gl → libs/win32}/wglext_arb.py +364 -2
  190. pyglet/media/__init__.py +9 -10
  191. pyglet/media/codecs/__init__.py +12 -1
  192. pyglet/media/codecs/base.py +99 -96
  193. pyglet/media/codecs/ffmpeg.py +2 -2
  194. pyglet/media/codecs/ffmpeg_lib/libavformat.py +3 -8
  195. pyglet/media/codecs/webaudio_pyodide.py +111 -0
  196. pyglet/media/drivers/__init__.py +9 -4
  197. pyglet/media/drivers/base.py +4 -4
  198. pyglet/media/drivers/openal/__init__.py +1 -1
  199. pyglet/media/drivers/openal/adaptation.py +3 -3
  200. pyglet/media/drivers/pulse/__init__.py +1 -1
  201. pyglet/media/drivers/pulse/adaptation.py +3 -3
  202. pyglet/media/drivers/pyodide_js/__init__.py +8 -0
  203. pyglet/media/drivers/pyodide_js/adaptation.py +288 -0
  204. pyglet/media/drivers/xaudio2/adaptation.py +3 -3
  205. pyglet/media/player.py +276 -193
  206. pyglet/media/player_worker_thread.py +1 -1
  207. pyglet/model/__init__.py +39 -29
  208. pyglet/model/codecs/base.py +4 -4
  209. pyglet/model/codecs/gltf.py +3 -3
  210. pyglet/model/codecs/obj.py +71 -43
  211. pyglet/resource.py +129 -78
  212. pyglet/shapes.py +147 -177
  213. pyglet/sprite.py +47 -164
  214. pyglet/text/__init__.py +44 -54
  215. pyglet/text/caret.py +12 -7
  216. pyglet/text/document.py +19 -17
  217. pyglet/text/formats/html.py +2 -2
  218. pyglet/text/formats/structured.py +10 -40
  219. pyglet/text/layout/__init__.py +20 -13
  220. pyglet/text/layout/base.py +176 -287
  221. pyglet/text/layout/incremental.py +9 -10
  222. pyglet/text/layout/scrolling.py +7 -95
  223. pyglet/window/__init__.py +183 -172
  224. pyglet/window/cocoa/__init__.py +62 -51
  225. pyglet/window/cocoa/pyglet_delegate.py +2 -25
  226. pyglet/window/cocoa/pyglet_view.py +9 -8
  227. pyglet/window/dialog/__init__.py +184 -0
  228. pyglet/window/dialog/base.py +99 -0
  229. pyglet/window/dialog/darwin.py +121 -0
  230. pyglet/window/dialog/linux.py +72 -0
  231. pyglet/window/dialog/windows.py +194 -0
  232. pyglet/window/emscripten/__init__.py +779 -0
  233. pyglet/window/headless/__init__.py +44 -28
  234. pyglet/window/key.py +2 -0
  235. pyglet/window/mouse.py +2 -2
  236. pyglet/window/wayland/__init__.py +377 -0
  237. pyglet/window/win32/__init__.py +101 -46
  238. pyglet/window/xlib/__init__.py +104 -66
  239. {pyglet-2.1.12.dist-info → pyglet-3.0.dev1.dist-info}/METADATA +2 -3
  240. pyglet-3.0.dev1.dist-info/RECORD +322 -0
  241. {pyglet-2.1.12.dist-info → pyglet-3.0.dev1.dist-info}/WHEEL +1 -1
  242. pyglet/gl/__init__.py +0 -208
  243. pyglet/gl/base.py +0 -499
  244. pyglet/gl/cocoa.py +0 -309
  245. pyglet/gl/gl.py +0 -4625
  246. pyglet/gl/gl.pyi +0 -2320
  247. pyglet/gl/gl_compat.pyi +0 -3097
  248. pyglet/gl/gl_info.py +0 -190
  249. pyglet/gl/headless.py +0 -166
  250. pyglet/gl/wgl_info.py +0 -36
  251. pyglet/gl/wglext_nv.py +0 -1096
  252. pyglet/gl/win32.py +0 -268
  253. pyglet/gl/xlib.py +0 -295
  254. pyglet/image/buffer.py +0 -274
  255. pyglet/image/codecs/s3tc.py +0 -354
  256. pyglet/libs/x11/xrandr.py +0 -166
  257. pyglet-2.1.12.dist-info/RECORD +0 -234
  258. /pyglet/{libs/wayland → graphics/api/gl/cocoa}/__init__.py +0 -0
  259. /pyglet/libs/{egl → linux/egl}/egl.py +0 -0
  260. /pyglet/libs/{egl → linux/egl}/lib.py +0 -0
  261. /pyglet/libs/{ioctl.py → linux/ioctl.py} +0 -0
  262. /pyglet/libs/{wayland → linux/wayland}/gbm.py +0 -0
  263. /pyglet/libs/{x11 → linux/x11}/__init__.py +0 -0
  264. /pyglet/libs/{x11 → linux/x11}/cursorfont.py +0 -0
  265. /pyglet/libs/{x11 → linux/x11}/xlib.py +0 -0
  266. /pyglet/libs/{x11 → linux/x11}/xsync.py +0 -0
  267. {pyglet-2.1.12.dist-info/licenses → pyglet-3.0.dev1.dist-info}/LICENSE +0 -0
pyglet/gui/ninepatch.py CHANGED
@@ -2,12 +2,12 @@ from __future__ import annotations
2
2
 
3
3
  from typing import TYPE_CHECKING
4
4
 
5
- from pyglet.gl import GL_TRIANGLE_STRIP, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA
5
+ from pyglet.enums import BlendFactor
6
6
  from pyglet.sprite import Sprite
7
7
 
8
8
  if TYPE_CHECKING:
9
- from pyglet.image import AbstractImage, Animation
10
- from pyglet.graphics import Batch, Group
9
+ from pyglet.image import _AbstractImage, Animation
10
+ from pyglet.graphics import Batch, Group, GeometryMode
11
11
  from pyglet.text.layout import TextLayout
12
12
 
13
13
 
@@ -31,11 +31,11 @@ class NinePatch(Sprite):
31
31
  """
32
32
 
33
33
  def __init__(self,
34
- img: AbstractImage | Animation,
34
+ img: _AbstractImage | Animation,
35
35
  x: float = 0, y: float = 0, z: float = 0,
36
36
  width: int | None = None, height: int | None = None,
37
- blend_src: int = GL_SRC_ALPHA,
38
- blend_dest: int = GL_ONE_MINUS_SRC_ALPHA,
37
+ blend_src: BlendFactor = BlendFactor.SRC_ALPHA,
38
+ blend_dest: BlendFactor = BlendFactor.ONE_MINUS_SRC_ALPHA,
39
39
  batch: Batch | None = None,
40
40
  group: Group | None = None):
41
41
  """Create a NinePatch instance.
@@ -71,11 +71,11 @@ class NinePatch(Sprite):
71
71
 
72
72
  @classmethod
73
73
  def create_around_layout(cls,
74
- img: AbstractImage | Animation,
74
+ img: _AbstractImage | Animation,
75
75
  layout: TextLayout,
76
76
  border: int = 0,
77
- blend_src: int = GL_SRC_ALPHA,
78
- blend_dest: int = GL_ONE_MINUS_SRC_ALPHA,
77
+ blend_src: BlendFactor = BlendFactor.SRC_ALPHA,
78
+ blend_dest: BlendFactor = BlendFactor.ONE_MINUS_SRC_ALPHA,
79
79
  batch: Batch | None = None,
80
80
  group: Group | None = None):
81
81
  """Given a Label, create a NinePatch instance sized to surround it.
@@ -137,7 +137,7 @@ class NinePatch(Sprite):
137
137
  uvs = [i for v in range(4) for h in range(4) for i in (uv_x + seg_w * h, uv_y + seg_h * v, 0)]
138
138
 
139
139
  self._vertex_list = self.program.vertex_list_indexed(
140
- 16, GL_TRIANGLE_STRIP, indices, self._batch, self._group,
140
+ 16, GeometryMode.TRIANGLE_STRIP, indices, self._batch, self._group,
141
141
  position=('f', self._get_vertices()),
142
142
  colors=('Bn', self._rgba * 16),
143
143
  translate=('f', (self._x, self._y, self._z) * 16),
pyglet/gui/widgets.py CHANGED
@@ -5,14 +5,15 @@ from __future__ import annotations
5
5
  from typing import TYPE_CHECKING
6
6
 
7
7
  import pyglet
8
+
8
9
  from pyglet.event import EventDispatcher
9
- from pyglet.graphics import Group
10
+ from pyglet.graphics import Batch, Group
10
11
  from pyglet.text.caret import Caret
11
12
  from pyglet.text.layout import IncrementalTextLayout
12
13
 
13
14
  if TYPE_CHECKING:
14
- from pyglet.graphics import Batch
15
- from pyglet.image import AbstractImage
15
+ from pyglet.customtypes import RGBColor
16
+ from pyglet.image import _AbstractImage
16
17
 
17
18
 
18
19
  class WidgetBase(EventDispatcher):
@@ -135,7 +136,7 @@ class WidgetBase(EventDispatcher):
135
136
  raise NotImplementedError('Value depends on control type!')
136
137
 
137
138
  @value.setter
138
- def value(self, value: int | float | bool) -> None:
139
+ def value(self, value: float | bool) -> None:
139
140
  raise NotImplementedError('Value depends on control type!')
140
141
 
141
142
  def _check_hit(self, x: int, y: int) -> bool:
@@ -194,9 +195,9 @@ class PushButton(WidgetBase):
194
195
  """
195
196
 
196
197
  def __init__(self, x: int, y: int,
197
- pressed: AbstractImage,
198
- unpressed: AbstractImage,
199
- hover: AbstractImage | None = None,
198
+ pressed: _AbstractImage,
199
+ unpressed: _AbstractImage,
200
+ hover: _AbstractImage | None = None,
200
201
  batch: Batch | None = None,
201
202
  group: Group | None = None) -> None:
202
203
  """Create a push button.
@@ -265,7 +266,7 @@ class PushButton(WidgetBase):
265
266
  return
266
267
  self._sprite.image = self._unpressed_img
267
268
  self._pressed = False
268
- self.dispatch_event('on_release', self)
269
+ self.dispatch_event('on_release')
269
270
 
270
271
  def on_mouse_motion(self, x: int, y: int, dx: int, dy: int) -> None:
271
272
  if not self.enabled or self._pressed:
@@ -288,13 +289,122 @@ PushButton.register_event_type('on_press')
288
289
  PushButton.register_event_type('on_release')
289
290
 
290
291
 
292
+ class TextButton(WidgetBase):
293
+ """Instance of a text push button.
294
+
295
+ Triggers the event 'on_press' when it is clicked by the mouse.
296
+ Triggers the event 'on_release' when the mouse is released.
297
+ """
298
+
299
+ def __init__(self, x: int, y: int, text: str,
300
+ pressed_color: RGBColor = (255, 0, 0),
301
+ unpressed_color: RGBColor = (255, 255, 255),
302
+ hover_color: RGBColor = (0, 255, 0),
303
+ batch: Batch | None = None,
304
+ group: Group | None = None) -> None:
305
+ """Create a push button.
306
+
307
+ Args:
308
+ x:
309
+ X coordinate of the push button.
310
+ y:
311
+ Y coordinate of the push button.
312
+ pressed_color:
313
+ Color to change text when the button is pressed.
314
+ unpressed_color:
315
+ Color to change text when the button isn't pressed.
316
+ hover_color:
317
+ Color to change text when the button is being hovered over.
318
+ batch:
319
+ Optional batch to add the push button to.
320
+ group:
321
+ Optional parent group of the push button.
322
+ """
323
+ self._text = text
324
+ self._batch = batch or pyglet.graphics.Batch()
325
+ self._user_group = group
326
+ fg_group = Group(order=1, parent=group)
327
+ self._label = pyglet.text.Label(text=self._text, x=x, y=y, batch=batch, group=fg_group)
328
+ super().__init__(x, y, self._label.content_width, self._label.content_height)
329
+ self._pressed_color = pressed_color
330
+ self._unpressed_color = unpressed_color
331
+ self._hover_color = hover_color
332
+ self._pressed = False
333
+
334
+ @property
335
+ def text(self) -> str:
336
+ return self._text
337
+
338
+ @text.setter
339
+ def text(self, text: str) -> None:
340
+ self._text = text
341
+ self._label.text = text
342
+
343
+ def _update_position(self) -> None:
344
+ self._label.position = self._x, self._y, 0
345
+
346
+ @property
347
+ def value(self) -> bool:
348
+ """Whether the button is pressed or not."""
349
+ return self._pressed
350
+
351
+ @value.setter
352
+ def value(self, value: bool) -> None:
353
+ assert type(value) is bool, "This Widget's value must be True or False."
354
+ self._pressed = value
355
+ self._label.color = self._pressed_color if self._pressed else self._unpressed_color
356
+
357
+ def update_groups(self, order: int) -> None:
358
+ self._label.group = Group(order=order + 1, parent=self._user_group)
359
+
360
+ def on_mouse_press(self, x: int, y: int, buttons: int, modifiers: int) -> None:
361
+ if not self.enabled or not self._check_hit(x, y):
362
+ return
363
+ self._label.color = self._pressed_color
364
+ self._pressed = True
365
+ self.dispatch_event('on_press', self)
366
+
367
+ def on_mouse_release(self, x: int, y: int, buttons: int, modifiers: int) -> None:
368
+ if not self.enabled or not self._pressed:
369
+ return
370
+ self._label.color = self._hover_color if self._check_hit(x, y) else self._unpressed_color
371
+ self._pressed = False
372
+ self.dispatch_event('on_release', self)
373
+
374
+ def on_mouse_leave(self, x: int, y: int) -> None:
375
+ if not self.enabled or not self._pressed:
376
+ return
377
+ self._label.color = self._unpressed_color
378
+ self._pressed = False
379
+ self.dispatch_event('on_release')
380
+
381
+ def on_mouse_motion(self, x: int, y: int, dx: int, dy: int) -> None:
382
+ if not self.enabled or self._pressed:
383
+ return
384
+ self._label.color = self._hover_color if self._check_hit(x, y) else self._unpressed_color
385
+
386
+ def on_mouse_drag(self, x: int, y: int, dx: int, dy: int, buttons: int, modifiers: int) -> None:
387
+ if not self.enabled or self._pressed:
388
+ return
389
+ self._label.color = self._hover_color if self._check_hit(x, y) else self._unpressed_color
390
+
391
+ def on_press(self, widget: TextButton) -> None:
392
+ """Event: Dispatched when the button is clicked."""
393
+
394
+ def on_release(self, widget: TextButton) -> None:
395
+ """Event: Dispatched when the button is released."""
396
+
397
+
398
+ TextButton.register_event_type('on_press')
399
+ TextButton.register_event_type('on_release')
400
+
291
401
  class ToggleButton(PushButton):
292
402
  """Instance of a toggle button.
293
403
 
294
404
  Triggers the event 'on_toggle' when the mouse is pressed or released.
295
405
  """
296
406
 
297
- def _get_release_image(self, x: int, y: int) -> AbstractImage:
407
+ def _get_release_image(self, x: int, y: int) -> _AbstractImage:
298
408
  return self._hover_img if self._check_hit(x, y) else self._unpressed_img
299
409
 
300
410
  def on_mouse_press(self, x: int, y: int, buttons: int, modifiers: int) -> None:
@@ -325,7 +435,7 @@ class Slider(WidgetBase):
325
435
  """
326
436
 
327
437
  def __init__(self, x: int, y: int,
328
- base: AbstractImage, knob: AbstractImage,
438
+ base: _AbstractImage, knob: _AbstractImage,
329
439
  edge: int = 0,
330
440
  batch: Batch | None = None,
331
441
  group: Group | None = None) -> None: