breeze-widget 0.3.0__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 (134) hide show
  1. breeze_widget-0.3.0.dist-info/METADATA +109 -0
  2. breeze_widget-0.3.0.dist-info/RECORD +134 -0
  3. breeze_widget-0.3.0.dist-info/WHEEL +5 -0
  4. breeze_widget-0.3.0.dist-info/licenses/LICENSE +21 -0
  5. breeze_widget-0.3.0.dist-info/top_level.txt +1 -0
  6. breezewidget/__init__.py +277 -0
  7. breezewidget/animation/__init__.py +12 -0
  8. breezewidget/animation/color.py +89 -0
  9. breezewidget/animation/property.py +48 -0
  10. breezewidget/animation/shadow.py +90 -0
  11. breezewidget/calendar_widget/__init__.py +33 -0
  12. breezewidget/calendar_widget/calendar_widget.py +659 -0
  13. breezewidget/calendar_widget/commons.py +276 -0
  14. breezewidget/calendar_widget/month_model.py +40 -0
  15. breezewidget/cards/__init__.py +34 -0
  16. breezewidget/cards/card.py +127 -0
  17. breezewidget/cards/header_card.py +72 -0
  18. breezewidget/cards/settings_cards.py +498 -0
  19. breezewidget/constants.py +99 -0
  20. breezewidget/core/__init__.py +42 -0
  21. breezewidget/core/config.py +406 -0
  22. breezewidget/core/exception_handler.py +176 -0
  23. breezewidget/core/router.py +104 -0
  24. breezewidget/core/translator.py +155 -0
  25. breezewidget/dialogs/__init__.py +18 -0
  26. breezewidget/dialogs/base.py +160 -0
  27. breezewidget/dialogs/color_dialog.py +170 -0
  28. breezewidget/dialogs/folder_list_dialog.py +91 -0
  29. breezewidget/dialogs/masked.py +247 -0
  30. breezewidget/dialogs/message.py +29 -0
  31. breezewidget/flyout/__init__.py +14 -0
  32. breezewidget/flyout/animation.py +78 -0
  33. breezewidget/flyout/flyout.py +264 -0
  34. breezewidget/flyout/teaching_tip.py +157 -0
  35. breezewidget/icons/__init__.py +7 -0
  36. breezewidget/icons/_svg.py +131 -0
  37. breezewidget/icons/_themed.py +102 -0
  38. breezewidget/icons/breeze_icon.py +57 -0
  39. breezewidget/icons/outline/alert-triangle.svg +21 -0
  40. breezewidget/icons/outline/arrow-left.svg +21 -0
  41. breezewidget/icons/outline/arrow-right.svg +21 -0
  42. breezewidget/icons/outline/calendar.svg +24 -0
  43. breezewidget/icons/outline/check.svg +19 -0
  44. breezewidget/icons/outline/chevron-down.svg +19 -0
  45. breezewidget/icons/outline/chevron-right.svg +19 -0
  46. breezewidget/icons/outline/circle-x.svg +20 -0
  47. breezewidget/icons/outline/device-floppy.svg +21 -0
  48. breezewidget/icons/outline/dots.svg +21 -0
  49. breezewidget/icons/outline/download.svg +21 -0
  50. breezewidget/icons/outline/edit.svg +21 -0
  51. breezewidget/icons/outline/external-link.svg +21 -0
  52. breezewidget/icons/outline/file-text.svg +23 -0
  53. breezewidget/icons/outline/folder.svg +19 -0
  54. breezewidget/icons/outline/home.svg +21 -0
  55. breezewidget/icons/outline/info-circle.svg +21 -0
  56. breezewidget/icons/outline/menu-2.svg +21 -0
  57. breezewidget/icons/outline/moon.svg +19 -0
  58. breezewidget/icons/outline/plus.svg +20 -0
  59. breezewidget/icons/outline/search.svg +20 -0
  60. breezewidget/icons/outline/settings.svg +20 -0
  61. breezewidget/icons/outline/sun.svg +20 -0
  62. breezewidget/icons/outline/trash.svg +23 -0
  63. breezewidget/icons/outline/users.svg +22 -0
  64. breezewidget/icons/outline/x.svg +20 -0
  65. breezewidget/icons/registry.py +269 -0
  66. breezewidget/icons/svg_icons.py +51 -0
  67. breezewidget/layout/__init__.py +7 -0
  68. breezewidget/layout/_utils.py +14 -0
  69. breezewidget/layout/expand.py +31 -0
  70. breezewidget/layout/flow.py +155 -0
  71. breezewidget/media/__init__.py +8 -0
  72. breezewidget/media/media_player.py +95 -0
  73. breezewidget/media/play_bar.py +181 -0
  74. breezewidget/media/video_widget.py +15 -0
  75. breezewidget/menu/__init__.py +8 -0
  76. breezewidget/menu/checkable_menu.py +49 -0
  77. breezewidget/menu/command_bar.py +183 -0
  78. breezewidget/menu/round_menu.py +56 -0
  79. breezewidget/navigation/__init__.py +23 -0
  80. breezewidget/navigation/breadcrumb.py +136 -0
  81. breezewidget/navigation/interface.py +229 -0
  82. breezewidget/navigation/pivot.py +172 -0
  83. breezewidget/navigation/segmented.py +74 -0
  84. breezewidget/navigation/tab_bar.py +135 -0
  85. breezewidget/pickers/__init__.py +9 -0
  86. breezewidget/pickers/calendar_picker.py +81 -0
  87. breezewidget/pickers/date_picker.py +115 -0
  88. breezewidget/pickers/fast_calendar_picker.py +13 -0
  89. breezewidget/pickers/time_picker.py +111 -0
  90. breezewidget/scroll/__init__.py +7 -0
  91. breezewidget/scroll/pips.py +135 -0
  92. breezewidget/scroll/smooth.py +95 -0
  93. breezewidget/status/__init__.py +18 -0
  94. breezewidget/status/badge.py +237 -0
  95. breezewidget/status/info_bar.py +120 -0
  96. breezewidget/status/progress_ring.py +214 -0
  97. breezewidget/status/state_tooltip.py +134 -0
  98. breezewidget/theme/__init__.py +30 -0
  99. breezewidget/theme/listener.py +132 -0
  100. breezewidget/theme/palette.py +121 -0
  101. breezewidget/theme/provider_base.py +13 -0
  102. breezewidget/theme/providers.py +990 -0
  103. breezewidget/theme/styles.py +178 -0
  104. breezewidget/theme/theme.py +157 -0
  105. breezewidget/views/__init__.py +19 -0
  106. breezewidget/views/avatar.py +110 -0
  107. breezewidget/views/cycle_list.py +83 -0
  108. breezewidget/views/flip_view.py +174 -0
  109. breezewidget/views/item_views.py +41 -0
  110. breezewidget/views/table_widget.py +154 -0
  111. breezewidget/widgets/__init__.py +53 -0
  112. breezewidget/widgets/_base.py +23 -0
  113. breezewidget/widgets/_chevron.py +56 -0
  114. breezewidget/widgets/_popup.py +25 -0
  115. breezewidget/widgets/button.py +257 -0
  116. breezewidget/widgets/checkbox.py +179 -0
  117. breezewidget/widgets/combo_box.py +55 -0
  118. breezewidget/widgets/icon_widget.py +49 -0
  119. breezewidget/widgets/label.py +41 -0
  120. breezewidget/widgets/line_edit.py +32 -0
  121. breezewidget/widgets/progress.py +15 -0
  122. breezewidget/widgets/slider.py +127 -0
  123. breezewidget/widgets/spin_box.py +128 -0
  124. breezewidget/widgets/switch.py +340 -0
  125. breezewidget/widgets/text_edit.py +15 -0
  126. breezewidget/window/__init__.py +22 -0
  127. breezewidget/window/_navigation.py +125 -0
  128. breezewidget/window/_title_buttons.py +137 -0
  129. breezewidget/window/breeze_window.py +61 -0
  130. breezewidget/window/material.py +67 -0
  131. breezewidget/window/ms_breeze_window.py +55 -0
  132. breezewidget/window/splash_screen.py +95 -0
  133. breezewidget/window/split_breeze_window.py +84 -0
  134. breezewidget/window/title_bar.py +199 -0
@@ -0,0 +1,109 @@
1
+ Metadata-Version: 2.4
2
+ Name: breeze-widget
3
+ Version: 0.3.0
4
+ Summary: Clean-room Breeze widget toolkit for PySide6 desktop applications
5
+ Author: Taron686
6
+ Maintainer: Taron686
7
+ License-Expression: MIT
8
+ Project-URL: Homepage, https://github.com/Taron686/breeze-widget
9
+ Project-URL: Repository, https://github.com/Taron686/breeze-widget
10
+ Project-URL: Documentation, https://github.com/Taron686/breeze-widget#readme
11
+ Project-URL: Issue Tracker, https://github.com/Taron686/breeze-widget/issues
12
+ Keywords: pyside6,qt,widgets,desktop,breeze,ui
13
+ Classifier: Development Status :: 3 - Alpha
14
+ Classifier: Environment :: X11 Applications :: Qt
15
+ Classifier: Intended Audience :: Developers
16
+ Classifier: Operating System :: OS Independent
17
+ Classifier: Programming Language :: Python :: 3 :: Only
18
+ Classifier: Programming Language :: Python :: 3.11
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Programming Language :: Python :: 3.13
21
+ Classifier: Topic :: Software Development :: User Interfaces
22
+ Requires-Python: >=3.11
23
+ Description-Content-Type: text/markdown
24
+ License-File: LICENSE
25
+ Requires-Dist: PySide6>=6.6.0
26
+ Provides-Extra: test
27
+ Requires-Dist: pytest>=8; extra == "test"
28
+ Requires-Dist: pytest-qt>=4.4; extra == "test"
29
+ Dynamic: license-file
30
+
31
+ # BreezeWidget
32
+
33
+ > Dieses Repository ist ein komplett vibe coded Work-in-Progress-Projekt fuer
34
+ > PySide6. Die API ist noch nicht final, interne Strukturen koennen sich aendern,
35
+ > und das Repo ist aktuell vor allem fuer Entwicklung, Tests, Experimente und
36
+ > Migrationen gedacht.
37
+
38
+ BreezeWidget ist eine saubere, lokale PySide6-Widget- und Theming-Schicht mit
39
+ einem Breeze-inspirierten Look. Das Projekt verfolgt das Ziel, Desktop-Apps mit
40
+ Qt/PySide6 ein konsistentes Fenstersystem, Theme-Handling, Icons, Navigation,
41
+ Status-Komponenten, Eingaben, Karten, Views und Demo-Oberflaechen bereitzustellen,
42
+ ohne von einer externen GPL-Widget-Bibliothek abhaengig zu sein.
43
+
44
+ ## Aktueller Status
45
+
46
+ Das Paket ist pre-1.0 und wird aktiv umgebaut. Die oeffentliche API ist in
47
+ [`AGENTS.md`](AGENTS.md) beschrieben und wird durch Tests abgesichert; alles
48
+ ausserhalb dieser dokumentierten Oberflaeche gilt als intern. Das Repo enthaelt
49
+ bereits lauffaehige Demos, Tests, lokale Icons, Theme-/Stylesheet-Infrastruktur
50
+ und eine wachsende Sammlung von PySide6-Komponenten, ist aber noch kein
51
+ stabiler Framework-Release.
52
+
53
+ ## Was man mit dem Repo machen kann
54
+
55
+ - BreezeWidget lokal installieren und in eigenen PySide6-Prototypen verwenden.
56
+ - BreezeWidget nach der PyPI-Veroeffentlichung direkt per `pip install`
57
+ installieren.
58
+ - Die Demo-Anwendungen starten, um den aktuellen Stand der UI-Schicht zu pruefen.
59
+ - Tests ausfuehren, um die dokumentierte Public API und Kernverhalten zu
60
+ verifizieren.
61
+ - Eigene Widgets oder Stylesheet-Fragmente gegen die vorhandene Theme- und
62
+ Icon-Infrastruktur entwickeln.
63
+ - Das Projekt frei forken, anpassen und weiterverwenden.
64
+
65
+ ## Installation aus PyPI
66
+
67
+ ```powershell
68
+ python -m pip install breeze-widget
69
+ ```
70
+
71
+ Das PyPI-Paket heisst `breeze-widget`; der Python-Import bleibt
72
+ `breezewidget`.
73
+
74
+ ## Installation fuer Entwicklung
75
+
76
+ ```powershell
77
+ .\.venv\Scripts\python.exe -m pip install -e ".[test]"
78
+ ```
79
+
80
+ ## Demos starten
81
+
82
+ ```powershell
83
+ .\.venv\Scripts\python.exe .\examples\breeze_demo.py
84
+ .\.venv\Scripts\python.exe .\examples\widget_demo.py
85
+ ```
86
+
87
+ ## Tests ausfuehren
88
+
89
+ ```powershell
90
+ $env:QT_QPA_PLATFORM = "offscreen"
91
+ .\.venv\Scripts\python.exe -m pytest
92
+ ```
93
+
94
+ ## Public API
95
+
96
+ Die Root-Imports aus `breezewidget` sowie die kuratierten Subsystemmodule
97
+ `breezewidget.window`, `breezewidget.theme`, `breezewidget.icons` und
98
+ `breezewidget.navigation` sind die relevante oeffentliche Oberflaeche. Details,
99
+ Symbolnamen, stabile Qt-Dynamic-Properties und nicht-oeffentliche Bereiche sind
100
+ im API-Vertrag in [`AGENTS.md`](AGENTS.md) festgehalten.
101
+
102
+ Direkte Imports aus tieferen Implementierungsmodulen sollten vermieden werden,
103
+ weil diese waehrend des Refactors verschoben oder umbenannt werden koennen.
104
+
105
+ ## Lizenz
106
+
107
+ BreezeWidget steht unter der MIT-Lizenz. Das Repo kann damit frei genutzt,
108
+ kopiert, veraendert und weitergegeben werden, auch ohne Bezahlung. Details
109
+ stehen in [`LICENSE`](LICENSE).
@@ -0,0 +1,134 @@
1
+ breeze_widget-0.3.0.dist-info/licenses/LICENSE,sha256=A7I-NChA54nto3XKGVU0hEJFXqLjxH4LJwIoA4hPkwU,1082
2
+ breezewidget/__init__.py,sha256=2lcy8SZKHp57Qd7HluVlZeODTDiZG3zqV964WnZM2Rc,5871
3
+ breezewidget/constants.py,sha256=n6TYHQDa_jdJJ0OcsA0hR9kRHUENOczhD_NUbOg2OZY,3466
4
+ breezewidget/animation/__init__.py,sha256=gOQhC0M8uyiX0SB_gMcglpc-IyBEt6jdpKQYVKLjEtE,324
5
+ breezewidget/animation/color.py,sha256=aB5VbPHyJ8K-8wu916EOaF8EuhF4oNy_xWZ4wHGJ1T4,2863
6
+ breezewidget/animation/property.py,sha256=1qemvBby6k2mqitt-JwaBRW6_Kb5BPBlEhY4TzhloKQ,1463
7
+ breezewidget/animation/shadow.py,sha256=AVR6cmpTNSKAEYAhYeGjsKUKzeJA2kMeD2J1_3V63as,3115
8
+ breezewidget/calendar_widget/__init__.py,sha256=IQPP4Q3YmCc_p_YiFg5fN01g7Axws4eU1EWy_XU9kQo,678
9
+ breezewidget/calendar_widget/calendar_widget.py,sha256=WGJz5-0NaEyzRq6CRuKsUwq9Cohi1QgGt9mIK2OjHXA,24761
10
+ breezewidget/calendar_widget/commons.py,sha256=qkYFPcOn1yz6TO-MhxxPRvjrzlaYdPm39aVKZ2BXr7c,10197
11
+ breezewidget/calendar_widget/month_model.py,sha256=yuMpRik9Lq55jllCyM_YvdWeRA5dzUlBijeyOcn_S6Q,1097
12
+ breezewidget/cards/__init__.py,sha256=xArzLKa80G-p1PpFtg83cLPKPhTDg3H9aMuIg-IoZyg,774
13
+ breezewidget/cards/card.py,sha256=AuJqDxtX7k0fy8fKRYvWvonLyMseYs13WiP18QBFzfY,4643
14
+ breezewidget/cards/header_card.py,sha256=OST3htZixKCeOn451fi9fsK-jV974i9M06BvfNW_v-w,2423
15
+ breezewidget/cards/settings_cards.py,sha256=SNfLQM1p8I3Bwzs8AE3uVR7XefNkIIlWLsKhp8aJjnA,15695
16
+ breezewidget/core/__init__.py,sha256=D12hZS-ETtrsCQuJy8YsbssLKp7QpnGf8d0zQ2RpH90,931
17
+ breezewidget/core/config.py,sha256=9Zk_kJMBxcmDjj3j0tTXKVx-jIlSAk9vxfh_uq_7Q8Y,13732
18
+ breezewidget/core/exception_handler.py,sha256=303BpvVpTA43f77_wM9mH6WBtjli-XET6oQIL7o2J1o,6756
19
+ breezewidget/core/router.py,sha256=v6BEZ7p85Lil8zIab_08JInNYzOizTzmctvk6Nk26ug,3718
20
+ breezewidget/core/translator.py,sha256=_wfZgT8lavbxSmpuYJTABwkMivAypjVC7AUTpVIWPt4,5213
21
+ breezewidget/dialogs/__init__.py,sha256=3lJzlq2fPicokzQv4rNjfs4TnwQ2AXwWTpoIOkAUyGo,435
22
+ breezewidget/dialogs/base.py,sha256=595u7k2j_fCJJwg5mg9PP5uN0sCrqMFzaei0TBSG5CM,6128
23
+ breezewidget/dialogs/color_dialog.py,sha256=1if1Mmge51TdKmrZLl9R8ZdcPm8yv2owdkICHGEWIfU,5863
24
+ breezewidget/dialogs/folder_list_dialog.py,sha256=btxhUBOVjeNhlL_CTB9js_NO060bmh_P-40rAZOfNXw,2843
25
+ breezewidget/dialogs/masked.py,sha256=nmZ7guE-oNAf_gshIbk_s5yv0gj1j9N7SJ7xYfvU4Bk,9334
26
+ breezewidget/dialogs/message.py,sha256=JlB6tKTfbP6XpLwqMaG2AdcU74bKMax2V0TYBHD9Zxs,987
27
+ breezewidget/flyout/__init__.py,sha256=bMxLgqDlX9krjBi25aFPfsb6zWVweLmnxNmcYQxWy1g,345
28
+ breezewidget/flyout/animation.py,sha256=htvJsufpUG2s3cT_l3VsiGxFESnQiPXeeENC3h7RmQ0,2477
29
+ breezewidget/flyout/flyout.py,sha256=js8-uudVDTyZxz7DpoGfxoVnXMp-PmcfsAZ-94YO6Ts,10036
30
+ breezewidget/flyout/teaching_tip.py,sha256=unCG8Dwt80UcaLHQLhhF3tZqtNh1CiZ6SxHbDbw2p8U,5232
31
+ breezewidget/icons/__init__.py,sha256=FWvelca1GwXcB8wNMCBsR6MhWbkmo7ZxPdTS0mjwO-o,195
32
+ breezewidget/icons/_svg.py,sha256=siNBrCqm3dw8oVvO4YjpboclyAgzjvAp9gVtkJAZKRk,4581
33
+ breezewidget/icons/_themed.py,sha256=TfhsO-RFzSK2QHVtU9QtbgFMywp4Czgbn5QDJsnWdOU,2699
34
+ breezewidget/icons/breeze_icon.py,sha256=tWLitHNmGoaDnfWZTFErL_VPedqmty8DiYQmTfM4MU4,1343
35
+ breezewidget/icons/registry.py,sha256=dvRHI_CFxWSSDKw4JseLcDKmBImx4J9FiJkd99RJi7g,7664
36
+ breezewidget/icons/svg_icons.py,sha256=bpZTC3f7CWuRc8rOvDrDD77_rFHWQq_4QgcWm8BbKzw,1358
37
+ breezewidget/icons/outline/alert-triangle.svg,sha256=_ILwLclwIpPLhgmortMkLA_l9bMzfXnTQaqTQ7RSatQ,563
38
+ breezewidget/icons/outline/arrow-left.svg,sha256=BY_EGQwXjszhGLYpS3QjXU-IxN-9F8YVnWchCgMiK8A,431
39
+ breezewidget/icons/outline/arrow-right.svg,sha256=87FLKxtocR5yhkw_IxAExCpTFxCN1ID-GJvJjV-tn5I,434
40
+ breezewidget/icons/outline/calendar.svg,sha256=l_qlrpelWLpKQns-xXaxFnDMDR28wSjERQf6VOgxRR8,568
41
+ breezewidget/icons/outline/check.svg,sha256=_jWbJ8dO0PT3K_q75cqWmouxOl85ZIuuY_nnmANOvtM,395
42
+ breezewidget/icons/outline/chevron-down.svg,sha256=Br0guMvlZblwRsXQ7JF_Ee1rKcDkiFqCrgVzJclyv5o,377
43
+ breezewidget/icons/outline/chevron-right.svg,sha256=JrMh5Cx8ftXVFh2a8GEDPfHUnvM7XS_CMJ4vbuPUyBo,381
44
+ breezewidget/icons/outline/circle-x.svg,sha256=-kO8uGktDuQO6XO6YlHsbsl2QDjtZ-tIDvrO_w7ilM8,441
45
+ breezewidget/icons/outline/device-floppy.svg,sha256=PRXDrBtoKkoOyYeOqU7LTCFEvBb4vmuk5uTI_RQPEBs,530
46
+ breezewidget/icons/outline/dots.svg,sha256=guO9Z40Rqv7YTTNiMn7hFAKoJVGtUxfU0A2vfN2jURw,438
47
+ breezewidget/icons/outline/download.svg,sha256=TDSYtNxOfwB9sjTyk7OWrhsj8YZG4dNvi8TgijG_l7E,450
48
+ breezewidget/icons/outline/edit.svg,sha256=35Ln0SYgVs_A1laKsL6C1MVRSzKM8xE8JAewbJkeJ-Q,538
49
+ breezewidget/icons/outline/external-link.svg,sha256=lR4nBBZiFoDpjoAiTvZGakP8nbP1EFogBb1iGwLjBjQ,487
50
+ breezewidget/icons/outline/file-text.svg,sha256=t20BgDR2QWD3Zhdo9Wo4AD7SCKIIQ3gaCgSqrgHcv2Y,547
51
+ breezewidget/icons/outline/folder.svg,sha256=Lf9rdAgASdBcaV91pEP_r6iP19PJRyjwLWRFGy2Rges,453
52
+ breezewidget/icons/outline/home.svg,sha256=bt69f5rGKnPogvG616SBb9R5nim6srJ89iaw8XCKmiA,524
53
+ breezewidget/icons/outline/info-circle.svg,sha256=i7LqiqblbKthN_RKCxoeq-q1Jrf5bqi-NtWDhopzdWI,456
54
+ breezewidget/icons/outline/menu-2.svg,sha256=oAgKTbAKQWjP6lSnRyTkFHy9nQA_ZecPo2eueXuc_tg,446
55
+ breezewidget/icons/outline/moon.svg,sha256=kh0nuyFPLscU_03u_6il78S7mJ42ffR_n1g1HS7_7gA,454
56
+ breezewidget/icons/outline/plus.svg,sha256=6iYw89S0gA7Z4fKBi3Bku2KyeUPEguc512vSMg-CYy0,400
57
+ breezewidget/icons/outline/search.svg,sha256=5Xm2mkuXj3ApCKSLG-902axz30Z5yxpgdMVnvsJ0jEE,422
58
+ breezewidget/icons/outline/settings.svg,sha256=1xE239g60Z7-F3fQF2il0j17KV3l3eOx_MxQgGgJpCM,944
59
+ breezewidget/icons/outline/sun.svg,sha256=bU3GJaVN6mxpboMgw1_PfiNdwDn1Eu8sMK-bBmOnqz8,525
60
+ breezewidget/icons/outline/trash.svg,sha256=KFh-toWvqxhQNNP-DhkgAKOKTzhOXejFxtolEpkdif8,553
61
+ breezewidget/icons/outline/users.svg,sha256=7h7JbhcIfLy1Zj2E0uXh5G1WNWwZ2IvEL4EAFUweKY8,550
62
+ breezewidget/icons/outline/x.svg,sha256=a5ew1RUSuE7uBMBkT9BwWanCHVN4hs20DvSEhdh0q8M,367
63
+ breezewidget/layout/__init__.py,sha256=iCpmgBda-_PWoBepImZr5zY7o7jq4RTvOPGZQKgE6Ck,196
64
+ breezewidget/layout/_utils.py,sha256=VnmtdR0OaXtTA1VB5NX-jwPoa5ytxTW1rz0_82Q-EyA,389
65
+ breezewidget/layout/expand.py,sha256=wZNurD5iIxP5xGq6UQse4FjVIcUFO6Osvhw5PxjW41A,1008
66
+ breezewidget/layout/flow.py,sha256=6saTy45VAQc6hGkznmpM4n7Lc-RlPUsjK1AMTTQ1O9g,5296
67
+ breezewidget/media/__init__.py,sha256=Si3V7ODykvYrwy6pS3Z1o1YaqtgkdNsiyERLuR4d7cI,256
68
+ breezewidget/media/media_player.py,sha256=HnF2evvSxmWDzWHFBvPbZOdFgyDtI2gqRlCGO59hfA4,3237
69
+ breezewidget/media/play_bar.py,sha256=V1s6CPZ5OudofiLAxgrYbhFH68_sgZVqv8p8VGVjZmg,7069
70
+ breezewidget/media/video_widget.py,sha256=L2CfhxSqQ6RbKQEyxHr4JcTBbMrsufk0S4nATe5Zcs4,486
71
+ breezewidget/menu/__init__.py,sha256=2B5Ia8sOu5K_-vCWe6C-mYPyk2DWMQkXsZ7kB_KUiR8,267
72
+ breezewidget/menu/checkable_menu.py,sha256=v2SCEggXel7oT2u0QNvWzVrA5d5_sTXocDP2OCe1HC4,1644
73
+ breezewidget/menu/command_bar.py,sha256=Sxt1ZGn6mq9v3QHLbQio477gRHOWWCwVyfIqv6H5erE,6698
74
+ breezewidget/menu/round_menu.py,sha256=2EGS2qaHmR2N6oeVPnJ8_JTvVd4UZlBuZZvgSPcwddE,1826
75
+ breezewidget/navigation/__init__.py,sha256=pe3UdbI0Dc47tiZRMJXR523z_1oerHQx8y2C9qRsqPI,554
76
+ breezewidget/navigation/breadcrumb.py,sha256=lSuAZN6qichAt6rkgL70nynfFeIr_DZs9KBJj8kKDQM,5044
77
+ breezewidget/navigation/interface.py,sha256=hNA1nBjdcff572jd9ZL7qLru9UDka8s1OA3RbPfwH2c,8815
78
+ breezewidget/navigation/pivot.py,sha256=nVEV5T3Qat2f-aHp6zI8a02rGbod-Qfp-2uEtTPOQDA,6033
79
+ breezewidget/navigation/segmented.py,sha256=0uZ7rJlT3mnnSn9B97_ow9ABLlvfLxS34XayP4qQQbE,2605
80
+ breezewidget/navigation/tab_bar.py,sha256=ZkU6_eyifx3W8CwzJlRqBbavRGmqPl6p87aIIc45TG0,4561
81
+ breezewidget/pickers/__init__.py,sha256=nQ63GI9__E3gmQdVJ3B4-3Lr-MuywWKl7T-vL-pUZe4,362
82
+ breezewidget/pickers/calendar_picker.py,sha256=Qbuh_emo08t8QyWp2SyBuycvdRl6nv_RJhGJJO8pzHU,2927
83
+ breezewidget/pickers/date_picker.py,sha256=e-svnqxHX_40oranVAp3nuDPMVR6eE_enmB_QWDZE34,4141
84
+ breezewidget/pickers/fast_calendar_picker.py,sha256=aIUP4x_eBLwRS6zlHKdOP2pELpOQ9D5ib2ENLFh70NU,421
85
+ breezewidget/pickers/time_picker.py,sha256=ucOaeAif4wYynCHROKg9Sj_fLbbxpm8prazx2AOO8Vs,3973
86
+ breezewidget/scroll/__init__.py,sha256=nMfYCJWh7SOQzBf-wQMf3JWQiWPPbF7rcJK_QtqtjK0,205
87
+ breezewidget/scroll/pips.py,sha256=KENvVgAyAiwCzo_fpJkeEvX5nV8TeDFso_Do9MhbBwU,4810
88
+ breezewidget/scroll/smooth.py,sha256=NiUjgVAOqfz35AyZg0tDu35aqwayRFhw7mQTZ7Bocf0,3463
89
+ breezewidget/status/__init__.py,sha256=rbqwdiBsYHo-4ya566t7vupmUSudBNM5jEPxLxC4KHw,471
90
+ breezewidget/status/badge.py,sha256=1uZ5H_ZcTi47MDIQpW_QHe1RTz2Fy9Qfx2g_vPgA6Mk,7594
91
+ breezewidget/status/info_bar.py,sha256=Aoed91xP1Sm-40U_Zwu5F2ixLZhbJSMoN2I7CVf8Kfc,4148
92
+ breezewidget/status/progress_ring.py,sha256=NKwkJWhy2aiZQjryhr_3yep3fU-12cemz1nZ1UJDa2E,6601
93
+ breezewidget/status/state_tooltip.py,sha256=pehKMDcxinJQ9rqLDbjrAd9UG9pwP0d6QC7SZ3_fjno,4821
94
+ breezewidget/theme/__init__.py,sha256=DFVHfxXWThNoRMletDFNwfO-iapxjEWXC9z39hogar8,661
95
+ breezewidget/theme/listener.py,sha256=NGbXyB6_ND72SYurJPIWtUtSk8KOCHKMMRPH8e7bvJI,4230
96
+ breezewidget/theme/palette.py,sha256=r2uJmzbU75cs9pXuR4nDPc0oRqXyKttl_1mlmRqPvb4,3179
97
+ breezewidget/theme/provider_base.py,sha256=4A2GOKT5H_WqO-me_Ne_S4pQWuvBP8-U9d9iQRF_srY,309
98
+ breezewidget/theme/providers.py,sha256=LNE38JsuGkfZp9H0ILW3IES5Xbhe4zFTFY0u36VyRF8,24514
99
+ breezewidget/theme/styles.py,sha256=-ANTAC81gmwUhQKcxLxXlgErLA-gS0AFtcY5esi2Sn8,5813
100
+ breezewidget/theme/theme.py,sha256=l-lsE75TK_wrKPTY7mKPFAHTjM414voFHI52agJ9lZ0,4667
101
+ breezewidget/views/__init__.py,sha256=zPjBhCfeuq8HT0Gh0uBp3XryYf0Qakk69vUuIG9ByNU,477
102
+ breezewidget/views/avatar.py,sha256=lVM0foL5qx2bChzHVPjMZeRQ6c0E1V_vfLFK-GGV8zc,3583
103
+ breezewidget/views/cycle_list.py,sha256=Kx_4pT4jy6QKbSOKkou1G5tgPjUik8gJ58KdVpP9B9k,2770
104
+ breezewidget/views/flip_view.py,sha256=bDa5tJXwHZz8x6yQjlwDy3cTPW-1Rk4Aycn3chU6NEs,5807
105
+ breezewidget/views/item_views.py,sha256=KAXrm9-d5LImngLYFrhS74fjuZEno-X-Scg-VwR7YTM,1454
106
+ breezewidget/views/table_widget.py,sha256=JSJOxSVNzCGVBIlXm0-PQPh5gKrB0l1ZmCZbXzpjPng,5623
107
+ breezewidget/widgets/__init__.py,sha256=z49p6dbg_zUCfNCn0xwG6iwAK7OpTUXT8u7GLVnSENI,1992
108
+ breezewidget/widgets/_base.py,sha256=5fUDgNMMVGit8GsOsAl_H2O7D5kYEmbq0IcgwpENSHI,669
109
+ breezewidget/widgets/_chevron.py,sha256=xrGx2PYpSDP41Y7c-sg8Bt7vHjc0-lq-cgAk-Fa0eUk,1718
110
+ breezewidget/widgets/_popup.py,sha256=TccO2Ue6hDDQDJXz-nkqOsbkDkslU96FjYa_1FBAIOY,845
111
+ breezewidget/widgets/button.py,sha256=FJ5K_8I9rDRkO6Hjit2A0dBeTj30YYjxTXYbzB1OSJM,8807
112
+ breezewidget/widgets/checkbox.py,sha256=AFyO2ZsRDwR2DDrNoLHL7ZqYgbCgaqLAFkBVf0MzDW0,5737
113
+ breezewidget/widgets/combo_box.py,sha256=N8cswYl912N_mnqFjw6OoL5PYwz4EwFzDUnIHrHJYaI,1726
114
+ breezewidget/widgets/icon_widget.py,sha256=zfW1w-8qCkxvPto13MrO6fORAUn_fxdsTGkmo7CjC_g,1520
115
+ breezewidget/widgets/label.py,sha256=MLz0UUeDObfoJkPihQ_z0Xt5biGlJD74HM0VejHMllU,1159
116
+ breezewidget/widgets/line_edit.py,sha256=-WLCUljwSyOx88VW4HzBlLxfe3LT5P-s7KLooMi-ydk,996
117
+ breezewidget/widgets/progress.py,sha256=WWOEwG2a6mt7M_oJuelgD0z82oD-hXsz6SBIkWhG_08,408
118
+ breezewidget/widgets/slider.py,sha256=4YrIqS3myklak4tCuCeijPLLYSoocEcJeiSxIpcYVmA,4943
119
+ breezewidget/widgets/spin_box.py,sha256=oxcpJ-qS3mJFtal0IAPVYsPHKXTMGu8xjmiAhHsuILU,3543
120
+ breezewidget/widgets/switch.py,sha256=E1qhUA_DRFZGNgq78QsQY-8JwDI2LUhsHOOCSPIZk70,12215
121
+ breezewidget/widgets/text_edit.py,sha256=KiqomsGOjGsVYvL_Fx9y94Op0Dcf6xhPtg3XR9QlYcE,413
122
+ breezewidget/window/__init__.py,sha256=4yEncxHZbvpS_1ReMpd1k2xZh12XUi5oLztHfqCHG14,563
123
+ breezewidget/window/_navigation.py,sha256=_K0rOYZu_xPvtNNeAYiPoMKKfA9DONGGe44riA5Pa-0,4580
124
+ breezewidget/window/_title_buttons.py,sha256=hc9KpLafTAG0aeZFQzbXXw5CX4FDgBa7D7uPRmPkwhk,4378
125
+ breezewidget/window/breeze_window.py,sha256=qmOOtj05nxvVUyDz3izx64wX8LwOxFx9G7i7WexuOPA,2123
126
+ breezewidget/window/material.py,sha256=-30kvLj2pPoeJk6dleixCZCwLroumfq5KXLTiW38yxA,2149
127
+ breezewidget/window/ms_breeze_window.py,sha256=w7wZ4f39niLPpzKtsTdnVCyWDBhD13RVP6hvIr_RacY,1739
128
+ breezewidget/window/splash_screen.py,sha256=yXuIBbKaKII3WB_k6Ti3OudIigi9VODaBYCxaeMDais,3044
129
+ breezewidget/window/split_breeze_window.py,sha256=IVBRxXELH9OfbEm_K3E_d6XebNiRx95fdoCosqDZH0A,2968
130
+ breezewidget/window/title_bar.py,sha256=wvL9Fs_Kgv_RVaO7ZN0Q18a3F_cjrPvAm_7c25P4VS4,7831
131
+ breeze_widget-0.3.0.dist-info/METADATA,sha256=JfvCp7LmeWKs1CWwdrx2PJkr5maumCefUrNgFFjKjLg,4120
132
+ breeze_widget-0.3.0.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
133
+ breeze_widget-0.3.0.dist-info/top_level.txt,sha256=8clOyFIbwr2BZU7dDecoSrS94fqkWuz5moS0gFgBwf0,13
134
+ breeze_widget-0.3.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (82.0.1)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 BreezeWidget contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1 @@
1
+ breezewidget
@@ -0,0 +1,277 @@
1
+ """Clean-room Breeze-style widgets for PySide6.
2
+
3
+ The public surface is intentionally shaped like a Qt widget toolkit: import a
4
+ widget, instantiate it with normal Qt parents, and compose it in layouts.
5
+ """
6
+
7
+ from .animation import BackgroundColorAnimation, DropShadowAnimation, PropertyAnimation
8
+ from .core import (
9
+ BoolValidator,
10
+ BreezeConfig,
11
+ BreezeRouter,
12
+ ColorConfigItem,
13
+ ColorSerializer,
14
+ ConfigItem,
15
+ ConfigSerializer,
16
+ ConfigValidator,
17
+ EnumSerializer,
18
+ ExceptionHandler,
19
+ FolderListValidator,
20
+ FolderValidator,
21
+ OptionsConfigItem,
22
+ OptionsValidator,
23
+ RangeConfigItem,
24
+ RangeValidator,
25
+ Translator,
26
+ )
27
+ from .layout import ExpandLayout, FlowLayout
28
+ from .menu import CheckableMenu, CommandBar, RoundMenu
29
+ from .pickers import CalendarPicker, DatePicker, FastCalendarPicker, TimePicker
30
+ from .views import (
31
+ Avatar,
32
+ CycleListWidget,
33
+ FlipView,
34
+ ListView,
35
+ TableItemDelegate,
36
+ TableView,
37
+ TableWidget,
38
+ TreeView,
39
+ )
40
+ from .media import MediaPlayer, PlayBar, VideoWidget
41
+ from .scroll import PipsPager, SmoothScrollArea
42
+ from .cards import (
43
+ CardWidget,
44
+ ComboBoxSettingCard,
45
+ CustomColorSettingCard,
46
+ ElevatedCardWidget,
47
+ ExpandSettingCard,
48
+ HeaderCardWidget,
49
+ HyperlinkCard,
50
+ OptionsSettingCard,
51
+ PushSettingCard,
52
+ RangeSettingCard,
53
+ SettingCard,
54
+ SettingCardGroup,
55
+ SimpleCardWidget,
56
+ SwitchSettingCard,
57
+ )
58
+ from .dialogs import MessageBox
59
+ from .flyout import Flyout, FlyoutAnimationType, FlyoutPlacement, TeachingTip
60
+ from .icons import BreezeIcon, IconRegistry, icon_from
61
+ from .navigation import (
62
+ BreadcrumbBar,
63
+ BreadcrumbItem,
64
+ NavigationInterface,
65
+ NavigationItemPosition,
66
+ Pivot,
67
+ PivotItem,
68
+ SegmentedWidget,
69
+ TabBar,
70
+ TabItem,
71
+ )
72
+ from .status import (
73
+ DotInfoBadge,
74
+ IconInfoBadge,
75
+ IndeterminateProgressRing,
76
+ InfoBadge,
77
+ InfoBar,
78
+ InfoBarPosition,
79
+ ProgressRing,
80
+ StateToolTip,
81
+ )
82
+ from .theme import (
83
+ BreezePalette,
84
+ OSThemeListener,
85
+ StyleSheetBase,
86
+ StyleSheetManager,
87
+ Theme,
88
+ ThemeManager,
89
+ applyTheme,
90
+ getPalette,
91
+ isDarkTheme,
92
+ setCustomStyleSheet,
93
+ setTheme,
94
+ setThemeColor,
95
+ )
96
+ from .widgets import (
97
+ BodyLabel,
98
+ BreezeThemeSwitch,
99
+ CaptionLabel,
100
+ CheckBox,
101
+ ClickableSlider,
102
+ ComboBox,
103
+ DateEdit,
104
+ DateTimeEdit,
105
+ DoubleSpinBox,
106
+ DropDownPushButton,
107
+ EditableComboBox,
108
+ HyperlinkButton,
109
+ IconWidget,
110
+ IndeterminateProgressBar,
111
+ LineEdit,
112
+ PasswordLineEdit,
113
+ PlainTextEdit,
114
+ PillPushButton,
115
+ PrimaryPushButton,
116
+ PrimaryToolButton,
117
+ ProgressBar,
118
+ PushButton,
119
+ RadioButton,
120
+ SearchLineEdit,
121
+ Slider,
122
+ SpinBox,
123
+ SplitPushButton,
124
+ StrongBodyLabel,
125
+ SubtitleLabel,
126
+ SwitchButton,
127
+ TextEdit,
128
+ TimeEdit,
129
+ TitleLabel,
130
+ ToggleButton,
131
+ ToolButton,
132
+ TransparentPushButton,
133
+ TransparentToolButton,
134
+ )
135
+ from .window import (
136
+ BreezeTitleBar,
137
+ BreezeWindow,
138
+ MSBreezeWindow,
139
+ SplitBreezeWindow,
140
+ )
141
+
142
+ __all__ = [
143
+ "BreezeRouter",
144
+ "ExceptionHandler",
145
+ "Translator",
146
+ "PropertyAnimation",
147
+ "BackgroundColorAnimation",
148
+ "DropShadowAnimation",
149
+ "BreezeConfig",
150
+ "ConfigItem",
151
+ "RangeConfigItem",
152
+ "OptionsConfigItem",
153
+ "ColorConfigItem",
154
+ "ConfigValidator",
155
+ "RangeValidator",
156
+ "OptionsValidator",
157
+ "BoolValidator",
158
+ "FolderValidator",
159
+ "FolderListValidator",
160
+ "ConfigSerializer",
161
+ "ColorSerializer",
162
+ "EnumSerializer",
163
+ "ExpandLayout",
164
+ "FlowLayout",
165
+ "PipsPager",
166
+ "SmoothScrollArea",
167
+ "RoundMenu",
168
+ "CheckableMenu",
169
+ "CommandBar",
170
+ "CalendarPicker",
171
+ "FastCalendarPicker",
172
+ "DatePicker",
173
+ "TimePicker",
174
+ "Theme",
175
+ "ThemeManager",
176
+ "OSThemeListener",
177
+ "BreezePalette",
178
+ "StyleSheetBase",
179
+ "StyleSheetManager",
180
+ "setTheme",
181
+ "setThemeColor",
182
+ "applyTheme",
183
+ "getPalette",
184
+ "isDarkTheme",
185
+ "setCustomStyleSheet",
186
+ "BreezeIcon",
187
+ "IconRegistry",
188
+ "icon_from",
189
+ "PushButton",
190
+ "BreezeThemeSwitch",
191
+ "PrimaryPushButton",
192
+ "TransparentPushButton",
193
+ "ToolButton",
194
+ "PrimaryToolButton",
195
+ "TransparentToolButton",
196
+ "ToggleButton",
197
+ "HyperlinkButton",
198
+ "DropDownPushButton",
199
+ "SplitPushButton",
200
+ "PillPushButton",
201
+ "IconWidget",
202
+ "LineEdit",
203
+ "SearchLineEdit",
204
+ "PasswordLineEdit",
205
+ "TextEdit",
206
+ "PlainTextEdit",
207
+ "ComboBox",
208
+ "EditableComboBox",
209
+ "SpinBox",
210
+ "DoubleSpinBox",
211
+ "DateEdit",
212
+ "TimeEdit",
213
+ "DateTimeEdit",
214
+ "Slider",
215
+ "ClickableSlider",
216
+ "ProgressBar",
217
+ "IndeterminateProgressBar",
218
+ "CheckBox",
219
+ "RadioButton",
220
+ "SwitchButton",
221
+ "CardWidget",
222
+ "SimpleCardWidget",
223
+ "ElevatedCardWidget",
224
+ "HeaderCardWidget",
225
+ "SettingCard",
226
+ "SettingCardGroup",
227
+ "SwitchSettingCard",
228
+ "ComboBoxSettingCard",
229
+ "RangeSettingCard",
230
+ "PushSettingCard",
231
+ "HyperlinkCard",
232
+ "ExpandSettingCard",
233
+ "OptionsSettingCard",
234
+ "CustomColorSettingCard",
235
+ "BodyLabel",
236
+ "CaptionLabel",
237
+ "StrongBodyLabel",
238
+ "TitleLabel",
239
+ "SubtitleLabel",
240
+ "InfoBar",
241
+ "InfoBarPosition",
242
+ "InfoBadge",
243
+ "DotInfoBadge",
244
+ "IconInfoBadge",
245
+ "ProgressRing",
246
+ "IndeterminateProgressRing",
247
+ "StateToolTip",
248
+ "Flyout",
249
+ "FlyoutPlacement",
250
+ "FlyoutAnimationType",
251
+ "TeachingTip",
252
+ "MessageBox",
253
+ "NavigationInterface",
254
+ "NavigationItemPosition",
255
+ "Pivot",
256
+ "PivotItem",
257
+ "SegmentedWidget",
258
+ "BreadcrumbBar",
259
+ "BreadcrumbItem",
260
+ "TabBar",
261
+ "TabItem",
262
+ "BreezeWindow",
263
+ "BreezeTitleBar",
264
+ "MSBreezeWindow",
265
+ "SplitBreezeWindow",
266
+ "ListView",
267
+ "TableView",
268
+ "TableWidget",
269
+ "TableItemDelegate",
270
+ "TreeView",
271
+ "FlipView",
272
+ "CycleListWidget",
273
+ "Avatar",
274
+ "MediaPlayer",
275
+ "PlayBar",
276
+ "VideoWidget",
277
+ ]
@@ -0,0 +1,12 @@
1
+ """Reusable motion helpers built on Qt's animation framework."""
2
+ from __future__ import annotations
3
+
4
+ from .color import BackgroundColorAnimation
5
+ from .property import PropertyAnimation
6
+ from .shadow import DropShadowAnimation
7
+
8
+ __all__ = [
9
+ "PropertyAnimation",
10
+ "BackgroundColorAnimation",
11
+ "DropShadowAnimation",
12
+ ]
@@ -0,0 +1,89 @@
1
+ """:class:`BackgroundColorAnimation` — animate a widget's background color
2
+ between two :class:`QColor` values via a dynamic ``backgroundColor`` Q_PROPERTY.
3
+
4
+ Useful for hover/pressed transitions on custom-painted widgets where a
5
+ plain QSS ``transition`` is unavailable.
6
+ """
7
+ from __future__ import annotations
8
+
9
+ from PySide6.QtCore import Property, QEasingCurve, QObject, QPropertyAnimation
10
+ from PySide6.QtGui import QColor
11
+ from PySide6.QtWidgets import QWidget
12
+
13
+
14
+ DEFAULT_DURATION_MS = 180
15
+ DEFAULT_EASING = QEasingCurve.Type.OutCubic
16
+
17
+
18
+ class BackgroundColorAnimation(QObject):
19
+ """Animate the background color of a target widget.
20
+
21
+ The animation owns a ``backgroundColor`` Q_PROPERTY on this object
22
+ that interpolates between the start and end :class:`QColor`. On every
23
+ tick the widget's stylesheet is refreshed with the current color.
24
+
25
+ Example::
26
+
27
+ anim = BackgroundColorAnimation(button)
28
+ anim.animateTo(QColor("#11d9f3"))
29
+ """
30
+
31
+ def __init__(
32
+ self,
33
+ target: QWidget,
34
+ initial: QColor | str | None = None,
35
+ duration_ms: int = DEFAULT_DURATION_MS,
36
+ easing: QEasingCurve.Type = DEFAULT_EASING,
37
+ ) -> None:
38
+ super().__init__(target)
39
+ self._target = target
40
+ self._color: QColor = QColor(initial) if initial is not None else QColor("#000000")
41
+ self._animation = QPropertyAnimation(self, b"backgroundColor", self)
42
+ self._animation.setDuration(duration_ms)
43
+ self._animation.setEasingCurve(easing)
44
+ self._apply()
45
+
46
+ # -- Qt property -------------------------------------------------------
47
+
48
+ def _get_color(self) -> QColor:
49
+ return QColor(self._color)
50
+
51
+ def _set_color(self, color: QColor) -> None:
52
+ self._color = QColor(color)
53
+ self._apply()
54
+
55
+ backgroundColor = Property(QColor, _get_color, _set_color)
56
+
57
+ # -- public API --------------------------------------------------------
58
+
59
+ def color(self) -> QColor:
60
+ return QColor(self._color)
61
+
62
+ def setDuration(self, ms: int) -> None:
63
+ self._animation.setDuration(int(ms))
64
+
65
+ def duration(self) -> int:
66
+ return self._animation.duration()
67
+
68
+ def animateTo(self, color: QColor | str) -> None:
69
+ """Animate from the current color to *color*."""
70
+ end = QColor(color)
71
+ self._animation.stop()
72
+ self._animation.setStartValue(QColor(self._color))
73
+ self._animation.setEndValue(end)
74
+ self._animation.start()
75
+
76
+ def stop(self) -> None:
77
+ self._animation.stop()
78
+
79
+ # -- internal ----------------------------------------------------------
80
+
81
+ def _apply(self) -> None:
82
+ if self._target is None:
83
+ return
84
+ self._target.setStyleSheet(
85
+ f"{type(self._target).__name__} {{ background-color: {self._color.name()}; }}"
86
+ )
87
+
88
+
89
+ __all__ = ["BackgroundColorAnimation"]