meltygui 0.1.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 (372) hide show
  1. meltygui/__init__.py +107 -0
  2. meltygui/accounts/__init__.py +0 -0
  3. meltygui/accounts/internet_accounts.py +1355 -0
  4. meltygui/chat/__init__.py +91 -0
  5. meltygui/chat/activity.py +75 -0
  6. meltygui/chat/backends.py +36 -0
  7. meltygui/chat/chat_interface.py +732 -0
  8. meltygui/chat/chat_proxy.py +352 -0
  9. meltygui/chat/codex_proxy.py +592 -0
  10. meltygui/chat/codex_settings.py +100 -0
  11. meltygui/chat/codex_transport.py +60 -0
  12. meltygui/chat/command_parser.py +204 -0
  13. meltygui/chat/images.py +227 -0
  14. meltygui/chat/messages.py +417 -0
  15. meltygui/chat/metadata.py +139 -0
  16. meltygui/chat/writer_locks.py +64 -0
  17. meltygui/code/__init__.py +0 -0
  18. meltygui/code/basic_converters.py +533 -0
  19. meltygui/code/chain_converters.py +2111 -0
  20. meltygui/code/code_checks.py +2209 -0
  21. meltygui/code/core_syntax.py +1430 -0
  22. meltygui/code/file_converters.py +1933 -0
  23. meltygui/code/fileref.py +702 -0
  24. meltygui/code/hotswap_guard.py +144 -0
  25. meltygui/code/libcst_conversion.py +9724 -0
  26. meltygui/code/live_instrument.py +392 -0
  27. meltygui/code/live_view.py +2490 -0
  28. meltygui/code/melty_scan.py +2684 -0
  29. meltygui/code/new_codecs.py +1255 -0
  30. meltygui/code/new_converters.py +3017 -0
  31. meltygui/code/project_code.py +278 -0
  32. meltygui/code/source_context.py +63 -0
  33. meltygui/code/symbol_roster.py +1588 -0
  34. meltygui/code/syntax_check.py +34 -0
  35. meltygui/code/syntax_check_worker.py +114 -0
  36. meltygui/completion/__init__.py +0 -0
  37. meltygui/completion/fim.py +1232 -0
  38. meltygui/completion/fim_context.py +481 -0
  39. meltygui/completion/providers/__init__.py +0 -0
  40. meltygui/completion/providers/anthropic_oauth.py +446 -0
  41. meltygui/completion/providers/anthropic_requests.py +69 -0
  42. meltygui/completion/providers/claude.py +203 -0
  43. meltygui/completion/providers/claude_usage.py +499 -0
  44. meltygui/completion/providers/codex_accounts.py +180 -0
  45. meltygui/completion/providers/copilot.py +617 -0
  46. meltygui/completion/providers/oauth_popup.py +220 -0
  47. meltygui/completion/providers/ollama.py +320 -0
  48. meltygui/completion/providers/profiles.py +23 -0
  49. meltygui/core/README.md +88 -0
  50. meltygui/core/__init__.py +1 -0
  51. meltygui/core/automation/__init__.py +1 -0
  52. meltygui/core/automation/action_core.py +153 -0
  53. meltygui/core/automation/collection_action.py +45 -0
  54. meltygui/core/automation/mcp_eval.py +167 -0
  55. meltygui/core/automation/mcp_hotswap.py +107 -0
  56. meltygui/core/automation/mcp_query.py +552 -0
  57. meltygui/core/automation/mcp_server.py +657 -0
  58. meltygui/core/automation/orchestration_core.py +2636 -0
  59. meltygui/core/automation/query_core.py +124 -0
  60. meltygui/core/automation/search_core.py +26 -0
  61. meltygui/core/automation/selector_core.py +340 -0
  62. meltygui/core/automation/value_core.py +1752 -0
  63. meltygui/core/cache/__init__.py +1 -0
  64. meltygui/core/cache/cache_diagnostics.py +0 -0
  65. meltygui/core/cache/invalidation_decoration.py +153 -0
  66. meltygui/core/cache/invalidation_tracker.py +43 -0
  67. meltygui/core/cache/tile_cache.py +5968 -0
  68. meltygui/core/conversion/__init__.py +1 -0
  69. meltygui/core/conversion/bubbling.py +599 -0
  70. meltygui/core/conversion/cache_tree.py +188 -0
  71. meltygui/core/conversion/chain.py +113 -0
  72. meltygui/core/conversion/converter_register.py +145 -0
  73. meltygui/core/conversion/data_decoration.py +67 -0
  74. meltygui/core/conversion/dict_conversion.py +1815 -0
  75. meltygui/core/conversion/dict_conversion_util.py +177 -0
  76. meltygui/core/conversion/dynamic_obj.py +89 -0
  77. meltygui/core/conversion/graph_compare.py +183 -0
  78. meltygui/core/conversion/load_save_v2.py +1032 -0
  79. meltygui/core/conversion/missing_saved_class.py +39 -0
  80. meltygui/core/conversion/path_finder.py +606 -0
  81. meltygui/core/conversion/render_host.py +1083 -0
  82. meltygui/core/core_render.py +6537 -0
  83. meltygui/core/definition_hotswap.py +231 -0
  84. meltygui/core/diagnostics/__init__.py +1 -0
  85. meltygui/core/diagnostics/attribute_churn.py +38 -0
  86. meltygui/core/diagnostics/fps_counter.py +39 -0
  87. meltygui/core/diagnostics/gpu_frame_timer.py +103 -0
  88. meltygui/core/diagnostics/inspection_core.py +169 -0
  89. meltygui/core/diagnostics/monitor_core.py +105 -0
  90. meltygui/core/diagnostics/notifications.py +706 -0
  91. meltygui/core/diagnostics/perf_trace.py +281 -0
  92. meltygui/core/diagnostics/profile_decoration.py +88 -0
  93. meltygui/core/diagnostics/resize_trace.py +62 -0
  94. meltygui/core/diagnostics/screenshot_core.py +247 -0
  95. meltygui/core/diagnostics/session_status.py +98 -0
  96. meltygui/core/diagnostics/trace_core.py +445 -0
  97. meltygui/core/files/__init__.py +1 -0
  98. meltygui/core/files/file_core.py +208 -0
  99. meltygui/core/files/file_explorer_core.py +104 -0
  100. meltygui/core/files/file_tree_core.py +198 -0
  101. meltygui/core/files/file_watch_core.py +43 -0
  102. meltygui/core/files/import_graph_core.py +43 -0
  103. meltygui/core/files/metadata_core.py +51 -0
  104. meltygui/core/graphics/__init__.py +1 -0
  105. meltygui/core/graphics/cuda_context_core.py +166 -0
  106. meltygui/core/graphics/cuda_interop_core.py +136 -0
  107. meltygui/core/graphics/cuda_kernel_core.py +91 -0
  108. meltygui/core/graphics/framebuffer_recorder.py +337 -0
  109. meltygui/core/graphics/gl_state.py +658 -0
  110. meltygui/core/graphics/lut_core.py +52 -0
  111. meltygui/core/graphics/overlay_renderer.py +984 -0
  112. meltygui/core/graphics/scene_target.py +180 -0
  113. meltygui/core/graphics/screenshot.py +439 -0
  114. meltygui/core/graphics/shader_func.py +478 -0
  115. meltygui/core/graphics/tensor_core.py +45 -0
  116. meltygui/core/graphics/text_texture.py +329 -0
  117. meltygui/core/graphics/wayland_color.py +635 -0
  118. meltygui/core/input/__init__.py +1 -0
  119. meltygui/core/input/collision.py +165 -0
  120. meltygui/core/input/drag_drop_core.py +1525 -0
  121. meltygui/core/input/hypr_left_drag.py +323 -0
  122. meltygui/core/input/input_core.py +245 -0
  123. meltygui/core/input/input_handler.py +1101 -0
  124. meltygui/core/input/mouse_cursor.py +355 -0
  125. meltygui/core/input/pynput_backend.py +1054 -0
  126. meltygui/core/input/space_mouse.py +338 -0
  127. meltygui/core/input/touchpad_backend.py +393 -0
  128. meltygui/core/input/view_selection.py +177 -0
  129. meltygui/core/layout/__init__.py +1 -0
  130. meltygui/core/layout/column_core.py +2153 -0
  131. meltygui/core/layout/cursor_core.py +161 -0
  132. meltygui/core/layout/dropdown_core.py +278 -0
  133. meltygui/core/layout/edge_constraints.py +155 -0
  134. meltygui/core/layout/grid_core.py +117 -0
  135. meltygui/core/layout/header_core.py +23 -0
  136. meltygui/core/layout/header_runtime.py +67 -0
  137. meltygui/core/layout/layout_core.py +87 -0
  138. meltygui/core/layout/tile_manager_core.py +591 -0
  139. meltygui/core/melty.py +6726 -0
  140. meltygui/core/module_map.json +896 -0
  141. meltygui/core/module_names.py +19 -0
  142. meltygui/core/rendering/__init__.py +1 -0
  143. meltygui/core/rendering/core_decoration.py +431 -0
  144. meltygui/core/rendering/core_render_helpers.py +328 -0
  145. meltygui/core/rendering/func_metadata.py +398 -0
  146. meltygui/core/rendering/mode.py +818 -0
  147. meltygui/core/rendering/mode_defaults.py +41 -0
  148. meltygui/core/rendering/modes.py +136 -0
  149. meltygui/core/rendering/parameter_core.py +1665 -0
  150. meltygui/core/rendering/render_dispatch.py +1891 -0
  151. meltygui/core/rendering/render_funcs.py +273 -0
  152. meltygui/core/rendering/shaped.py +312 -0
  153. meltygui/core/rendering/window_decoration.py +25 -0
  154. meltygui/core/runtime/__init__.py +1 -0
  155. meltygui/core/runtime/app.py +735 -0
  156. meltygui/core/runtime/app_session.py +140 -0
  157. meltygui/core/runtime/background.py +564 -0
  158. meltygui/core/runtime/extensions.py +53 -0
  159. meltygui/core/runtime/gc_manager.py +1163 -0
  160. meltygui/core/runtime/lifecycle.py +21 -0
  161. meltygui/core/runtime/paths.py +27 -0
  162. meltygui/core/runtime/settings.py +14 -0
  163. meltygui/core/runtime/singleton.py +16 -0
  164. meltygui/core/runtime/thread_safe_bool.py +24 -0
  165. meltygui/core/runtime/thread_signal.py +30 -0
  166. meltygui/core/runtime/toggles.py +3115 -0
  167. meltygui/core/services/__init__.py +1 -0
  168. meltygui/core/services/account_core.py +10 -0
  169. meltygui/core/services/chat_core.py +19 -0
  170. meltygui/core/services/claude_terminal_core.py +346 -0
  171. meltygui/core/services/terminal_core.py +458 -0
  172. meltygui/core/services/terminal_runtime.py +78 -0
  173. meltygui/core/styling/__init__.py +1 -0
  174. meltygui/core/styling/color_core.py +46 -0
  175. meltygui/core/styling/fonts.py +639 -0
  176. meltygui/core/styling/global_style.py +338 -0
  177. meltygui/core/styling/style.py +198 -0
  178. meltygui/core/styling/style_core.py +522 -0
  179. meltygui/core/styling/warm_start.py +149 -0
  180. meltygui/core/windowing/__init__.py +1 -0
  181. meltygui/core/windowing/backends/PYIMGUI_LICENSE +28 -0
  182. meltygui/core/windowing/backends/__init__.py +1 -0
  183. meltygui/core/windowing/backends/imgui_renderer.py +138 -0
  184. meltygui/core/windowing/backends/native_wayland.py +850 -0
  185. meltygui/core/windowing/backends/protocols/xdg-decoration-unstable-v1.xml +156 -0
  186. meltygui/core/windowing/backends/protocols/xdg-shell.xml +1420 -0
  187. meltygui/core/windowing/backends/wayland_protocol.py +101 -0
  188. meltygui/core/windowing/dock_core.py +182 -0
  189. meltygui/core/windowing/frame_geometry.py +42 -0
  190. meltygui/core/windowing/geometry_feed.py +864 -0
  191. meltygui/core/windowing/glfw_utils.py +1343 -0
  192. meltygui/core/windowing/os_frame.py +1552 -0
  193. meltygui/core/windowing/surface.py +643 -0
  194. meltygui/core/windowing/titlebar.py +1560 -0
  195. meltygui/core/windowing/titlebar_buttons.py +281 -0
  196. meltygui/core/windowing/wayland_move.py +932 -0
  197. meltygui/core/windowing/window_api.py +62 -0
  198. meltygui/core/windowing/window_constants.py +339 -0
  199. meltygui/core/windowing/window_visibility.py +162 -0
  200. meltygui/debug/__init__.py +0 -0
  201. meltygui/debug/app_view_utils.py +9 -0
  202. meltygui/editor/__init__.py +0 -0
  203. meltygui/editor/bash_syntax.py +30 -0
  204. meltygui/editor/code_line_fast.py +152 -0
  205. meltygui/editor/diff.py +139 -0
  206. meltygui/editor/external_changes.py +159 -0
  207. meltygui/editor/file_header.py +41 -0
  208. meltygui/editor/live_usage.py +169 -0
  209. meltygui/editor/live_view_views.py +1803 -0
  210. meltygui/editor/pending_save.py +1351 -0
  211. meltygui/editor/roster_tints.py +547 -0
  212. meltygui/editor/source_preview.py +16 -0
  213. meltygui/editor/source_tools.py +10 -0
  214. meltygui/editor/source_ui.py +70 -0
  215. meltygui/editor/spell_check.py +77 -0
  216. meltygui/editor/text_editor.py +9076 -0
  217. meltygui/editor/usage_picker.py +538 -0
  218. meltygui/events/__init__.py +0 -0
  219. meltygui/events/example.py +118 -0
  220. meltygui/examples/__init__.py +0 -0
  221. meltygui/examples/columns_demo.py +33 -0
  222. meltygui/examples/columns_window_demo.py +60 -0
  223. meltygui/examples/context_menu_demo.py +24 -0
  224. meltygui/examples/context_menu_window_demo.py +49 -0
  225. meltygui/examples/gui_playground.py +127 -0
  226. meltygui/examples/live_view_playground.py +256 -0
  227. meltygui/examples/lora.py +43 -0
  228. meltygui/examples/lora_data.py +59 -0
  229. meltygui/examples/lora_policies.py +67 -0
  230. meltygui/examples/mode_demo.py +49 -0
  231. meltygui/examples/modifies_demo.py +119 -0
  232. meltygui/examples/scalar_policies.py +60 -0
  233. meltygui/examples/style_layouts.py +149 -0
  234. meltygui/examples/tile_manager_demo.py +74 -0
  235. meltygui/examples/tint_demo.py +160 -0
  236. meltygui/examples/tint_functions.py +56 -0
  237. meltygui/examples/trace_demo.py +88 -0
  238. meltygui/examples/two_windows.py +36 -0
  239. meltygui/files/__init__.py +0 -0
  240. meltygui/files/fast_file_explorer.py +439 -0
  241. meltygui/gnome_extension/lsd-window-geometry@latent-descent/extension.js +237 -0
  242. meltygui/gnome_extension/lsd-window-geometry@latent-descent/lsd-window-geometry@latent-descent.iml +9 -0
  243. meltygui/gnome_extension/lsd-window-geometry@latent-descent/metadata.json +7 -0
  244. meltygui/graphics/__init__.py +6 -0
  245. meltygui/graphics/base.py +85 -0
  246. meltygui/graphics/examples.py +507 -0
  247. meltygui/graphics/executor.py +520 -0
  248. meltygui/graphics/filter.py +667 -0
  249. meltygui/graphics/filter.pyi +856 -0
  250. meltygui/graphics/generate_stubs.py +22 -0
  251. meltygui/graphics/registry.py +203 -0
  252. meltygui/graphics/shader_compiler.py +155 -0
  253. meltygui/graphics/shaders.py +1302 -0
  254. meltygui/graphics/stub_generator.py +250 -0
  255. meltygui/graphics/texture_manager.py +170 -0
  256. meltygui/graphics/texture_min_max.py +295 -0
  257. meltygui/hdr_color.py +757 -0
  258. meltygui/image_load.py +308 -0
  259. meltygui/model/__init__.py +1 -0
  260. meltygui/model/account_model.py +142 -0
  261. meltygui/model/camera_model.py +159 -0
  262. meltygui/model/chat_model.py +86 -0
  263. meltygui/model/code_model.py +62 -0
  264. meltygui/model/code_proxy_model.py +876 -0
  265. meltygui/model/collection_model.py +41 -0
  266. meltygui/model/color_model.py +127 -0
  267. meltygui/model/cuda_tensor_model.py +36 -0
  268. meltygui/model/cuda_texture_model.py +149 -0
  269. meltygui/model/dropdown_model.py +137 -0
  270. meltygui/model/file_metadata_model.py +73 -0
  271. meltygui/model/file_model.py +289 -0
  272. meltygui/model/format_model.py +390 -0
  273. meltygui/model/graph_model.py +98 -0
  274. meltygui/model/icon_model.py +1024 -0
  275. meltygui/model/import_graph_model.py +468 -0
  276. meltygui/model/layout_model.py +15 -0
  277. meltygui/model/lut_model.py +266 -0
  278. meltygui/model/search_model.py +173 -0
  279. meltygui/model/tensor_model.py +402 -0
  280. meltygui/model/terminal_model.py +329 -0
  281. meltygui/model/texture_model.py +146 -0
  282. meltygui/model/tile_model.py +24 -0
  283. meltygui/model/trace_model.py +198 -0
  284. meltygui/model/trace_report_model.py +146 -0
  285. meltygui/models/__init__.py +0 -0
  286. meltygui/models/file_meta.py +613 -0
  287. meltygui/models/function_console.py +184 -0
  288. meltygui/models/orchestration.py +48 -0
  289. meltygui/pbr.py +1576 -0
  290. meltygui/png_unfilter.c +49 -0
  291. meltygui/resources/JetBrainsMono-Regular.ttf +0 -0
  292. meltygui/resources/THIRD_PARTY_NOTICES.md +21 -0
  293. meltygui/resources/dejavu/DejaVuSans-Bold.ttf +0 -0
  294. meltygui/resources/dejavu/DejaVuSans-ExtraLight.ttf +0 -0
  295. meltygui/resources/dejavu/DejaVuSans.ttf +0 -0
  296. meltygui/resources/dejavu/LICENSE.txt +78 -0
  297. meltygui/resources/fontawesome-LICENSE.txt +121 -0
  298. meltygui/resources/fontawesome-webfont.ttf +0 -0
  299. meltygui/resources/hdri/studio_small_09_1k.hdr +0 -0
  300. meltygui/resources/jetbrains-weights/JetBrainsMono-Bold.ttf +0 -0
  301. meltygui/resources/jetbrains-weights/JetBrainsMono-ExtraBold.ttf +0 -0
  302. meltygui/resources/jetbrains-weights/JetBrainsMono-ExtraLight.ttf +0 -0
  303. meltygui/resources/jetbrains-weights/JetBrainsMono-Light.ttf +0 -0
  304. meltygui/resources/jetbrains-weights/JetBrainsMono-Medium.ttf +0 -0
  305. meltygui/resources/jetbrains-weights/JetBrainsMono-SemiBold.ttf +0 -0
  306. meltygui/resources/jetbrains-weights/JetBrainsMono-Thin.ttf +0 -0
  307. meltygui/resources/jetbrains-weights/OFL.txt +93 -0
  308. meltygui/resources/jetbrains-weights/README.md +2 -0
  309. meltygui/state/__init__.py +0 -0
  310. meltygui/state/account_state.py +22 -0
  311. meltygui/state/animation_state.py +97 -0
  312. meltygui/state/annotation_state.py +22 -0
  313. meltygui/state/chat_state.py +36 -0
  314. meltygui/state/code_state.py +10 -0
  315. meltygui/state/core_enums.py +59 -0
  316. meltygui/state/core_markers.py +115 -0
  317. meltygui/state/core_undo.py +1075 -0
  318. meltygui/state/file_state.py +75 -0
  319. meltygui/state/graph_state.py +26 -0
  320. meltygui/state/inspection_state.py +47 -0
  321. meltygui/state/menu_state.py +10 -0
  322. meltygui/state/model_enums.py +11 -0
  323. meltygui/state/new_core_model.py +2394 -0
  324. meltygui/state/orchestration_state.py +14 -0
  325. meltygui/state/query_state.py +24 -0
  326. meltygui/state/tensor_state.py +10 -0
  327. meltygui/state/terminal_state.py +23 -0
  328. meltygui/state/trace_state.py +32 -0
  329. meltygui/state/voxel_state.py +12 -0
  330. meltygui/text_index.py +816 -0
  331. meltygui/utils/__init__.py +0 -0
  332. meltygui/utils/jump_to_code.py +344 -0
  333. meltygui/utils/pkl_inspect.py +90 -0
  334. meltygui/utils/render_utils.py +1419 -0
  335. meltygui/view/__init__.py +1 -0
  336. meltygui/view/account_view.py +524 -0
  337. meltygui/view/action_view.py +73 -0
  338. meltygui/view/chat_decoration_view.py +112 -0
  339. meltygui/view/chat_view.py +1703 -0
  340. meltygui/view/code_view.py +2677 -0
  341. meltygui/view/collection_view.py +1185 -0
  342. meltygui/view/color_view.py +824 -0
  343. meltygui/view/control_view.py +559 -0
  344. meltygui/view/decoration_view.py +439 -0
  345. meltygui/view/diagnostic_view.py +177 -0
  346. meltygui/view/dropdown_view.py +1082 -0
  347. meltygui/view/file_view.py +1599 -0
  348. meltygui/view/graph_cuda_view.py +105 -0
  349. meltygui/view/graph_view.py +882 -0
  350. meltygui/view/header_view.py +848 -0
  351. meltygui/view/input_view.py +238 -0
  352. meltygui/view/inspection_view.py +1783 -0
  353. meltygui/view/layout_view.py +596 -0
  354. meltygui/view/lut_view.py +45 -0
  355. meltygui/view/menu_view.py +212 -0
  356. meltygui/view/orchestration_view.py +658 -0
  357. meltygui/view/query_view.py +118 -0
  358. meltygui/view/search_view.py +342 -0
  359. meltygui/view/tab_view.py +258 -0
  360. meltygui/view/tensor_view.py +430 -0
  361. meltygui/view/terminal_view.py +355 -0
  362. meltygui/view/text_view.py +8031 -0
  363. meltygui/view/texture_view.py +480 -0
  364. meltygui/view/tile_view.py +38 -0
  365. meltygui/view/trace_view.py +923 -0
  366. meltygui/view/voxel_cuda_view.py +824 -0
  367. meltygui/view/voxel_view.py +1860 -0
  368. meltygui/view/window_view.py +111 -0
  369. meltygui-0.1.0.dist-info/METADATA +143 -0
  370. meltygui-0.1.0.dist-info/RECORD +372 -0
  371. meltygui-0.1.0.dist-info/WHEEL +4 -0
  372. meltygui-0.1.0.dist-info/licenses/LICENSE +202 -0
@@ -0,0 +1,338 @@
1
+ from typing import Any
2
+
3
+ from meltygui.core.rendering.window_decoration import window
4
+
5
+
6
+ @window
7
+ class BackgroundSettings:
8
+ dot_spacing = 4.917
9
+ dot_size = 1.798
10
+ emphasis_size = 1.2
11
+ dot_color = (0.2, 0.23, 0.3, 1.0)
12
+ bg_color = (0.027, 0.055, 0.07, 1.0)
13
+
14
+
15
+ class GlobalStyle:
16
+ object_corner_radius = 5.0
17
+ window_corner_radius = 5.0
18
+ item_corner_radius = 5.0
19
+
20
+ attr_name_indent = 20
21
+ base_value = 0.3
22
+ secondary_value = 0.5
23
+ background_settings = BackgroundSettings()
24
+ widget_styles = {}
25
+ excluded_names = set()
26
+ skip_if_none = set()
27
+ profiler = {
28
+ "object_attr": {
29
+ 'dynamic_value': 0.042,
30
+ 'dynamic_offset': -3.855,
31
+ 'dynamic_saturation_factor': -3.855,
32
+ 'dynamic_saturation_offset': -3.855,
33
+ 'value': -3.855,
34
+ 'saturation': 0.5
35
+ },
36
+ }
37
+ dropdown = {
38
+ "standard": {
39
+ "background": {
40
+ "value": 0.01,
41
+ "saturation": 1.0,
42
+ "alpha": 1.0,
43
+ 'max_value': 1.0
44
+ },
45
+ "text": {
46
+ "value": 0.01,
47
+ "saturation": 1.0,
48
+ "alpha": 1.0,
49
+ 'max_value': 1.0
50
+ },
51
+ "button": {
52
+ "value": 0.12,
53
+ "saturation": 0.9,
54
+ "alpha": 1.0,
55
+ 'max_value': 1.0
56
+ }
57
+ },
58
+ "hovered": {
59
+ "background": {
60
+ "value": 0.066,
61
+ "saturation": 1.0,
62
+ "alpha": 1.0,
63
+ 'max_value': 1.0
64
+ },
65
+ "text": {
66
+ "value": 0.01,
67
+ "saturation": 1.0,
68
+ "alpha": 1.0,
69
+ 'max_value': 1.0
70
+ },
71
+ "button": {
72
+ "value": 0.12,
73
+ "saturation": 0.9,
74
+ "alpha": 1.0,
75
+ 'max_value': 1.0
76
+ }
77
+ },
78
+ }
79
+
80
+ indented_bg = {
81
+ "dict_child": {
82
+ "value": 0.01,
83
+ "saturation": 1.0,
84
+ "alpha": 1.0,
85
+ 'max_value': 1.0
86
+ },
87
+ "dict_child_outline": {
88
+ "value": 0.01,
89
+ "saturation": 1.0,
90
+ "alpha": 1.0,
91
+ 'max_value': 1.0
92
+ },
93
+ "object_attr": {
94
+ "value": 0.12,
95
+ "saturation": 0.9,
96
+ "alpha": 1.0,
97
+ 'max_value': 1.0,
98
+ 'dynamic_value': 0.042,
99
+ 'dynamic_offset': -3.855,
100
+ },
101
+ "object_attr_outline": {
102
+ "value": 0.01,
103
+ "saturation": 1.0,
104
+ "alpha": 1.0,
105
+ 'max_value': 1.0
106
+ },
107
+ }
108
+ radio_button = {
109
+ "active_base": {
110
+ "value": 0.2,
111
+ "saturation": 1.0,
112
+ "alpha": 1.0,
113
+ 'max_value': 1.0
114
+ },
115
+ "active_hover": {
116
+ "value": 0.5,
117
+ "saturation": 1.0,
118
+ "alpha": 1.0,
119
+ 'max_value': 1.0
120
+ },
121
+ "active_pressed": {
122
+ "value": 0.3,
123
+ "saturation": 0.4,
124
+ "alpha": 0.35,
125
+ 'max_value': 1.0
126
+ },
127
+ "inactive_base": {
128
+ "value": 0.2,
129
+ "saturation": 0.4,
130
+ "alpha": 0.35,
131
+ 'max_value': 1.0
132
+ },
133
+ "inactive_hover": {
134
+ "value": 0.4,
135
+ "saturation": 0.5,
136
+ "alpha": 1.0,
137
+ 'max_value': 1.0
138
+ },
139
+ "inactive_pressed": {
140
+ "value": 0.35,
141
+ "saturation": 0.5,
142
+ "alpha": 0.35,
143
+ 'max_value': 1.0
144
+ },
145
+
146
+ }
147
+
148
+ main_const = {
149
+ "window": {
150
+ "background": {
151
+ "value": 0.01,
152
+ "saturation": 0.7,
153
+ "alpha": 1.0
154
+ },
155
+ "border": {
156
+ "value": 0.34,
157
+ "saturation": 0.9,
158
+ "alpha": 1.0
159
+ },
160
+ "child_bg": {
161
+ "value": 0.01,
162
+ "saturation": 0.7,
163
+ "alpha": 1.0
164
+ },
165
+ "popup_bg": {
166
+ "value": 0.01,
167
+ "saturation": 0.7,
168
+ "alpha": 1.0
169
+ },
170
+ "title_bg": {
171
+ "value": 0.01,
172
+ "saturation": 0.7,
173
+ "alpha": 1.0
174
+ },
175
+ "title_bg_active": {
176
+ "value": 0.01,
177
+ "saturation": 0.7,
178
+ "alpha": 1.0
179
+ },
180
+ "title_bg_collapsed": {
181
+ "value": 0.01,
182
+ "saturation": 0.5,
183
+ "alpha": 1.0
184
+ },
185
+ "header": {
186
+ "value": 0.01,
187
+ "saturation": 0.9,
188
+ "alpha": 1.0
189
+ },
190
+ "header_hovered": {
191
+ "value": 0.45,
192
+ "saturation": 0.9,
193
+ "alpha": 1.0
194
+ },
195
+ "header_active": {
196
+ "value": 0.55,
197
+ "saturation": 1.0,
198
+ "alpha": 1.0
199
+ }
200
+ },
201
+
202
+ "widget": {
203
+ "text": {
204
+ "value": 0.95,
205
+ "saturation": 0.2,
206
+ "alpha": 1.0
207
+ },
208
+ "text_disabled": {
209
+ "value": 0.5,
210
+ "saturation": 0.2,
211
+ "alpha": 1.0
212
+ },
213
+ "resize_grip": {
214
+ "value": 0.35,
215
+ "saturation": 0.8,
216
+ "alpha": 1.0
217
+ },
218
+ "resize_hovered": {
219
+ "value": 0.45,
220
+ "saturation": 0.9,
221
+ "alpha": 1.0
222
+ },
223
+ "resize_active": {
224
+ "value": 0.55,
225
+ "saturation": 1.0,
226
+ "alpha": 1.0
227
+ },
228
+ "button": {
229
+ "value": 0.35,
230
+ "saturation": 0.8,
231
+ "alpha": 1.0
232
+ },
233
+ "button_hovered": {
234
+ "value": 0.45,
235
+ "saturation": 0.9,
236
+ "alpha": 1.0
237
+ },
238
+ "button_active": {
239
+ "value": 0.55,
240
+ "saturation": 1.0,
241
+ "alpha": 1.0
242
+ },
243
+ "check_mark": {
244
+ "value": 0.9,
245
+ "saturation": 1.0,
246
+ "alpha": 1.0
247
+ },
248
+ "text_selected_bg": {
249
+ "value": 0.35,
250
+ "saturation": 0.8,
251
+ "alpha": 1.0
252
+ },
253
+ "slider_grab": {
254
+ "value": 0.5,
255
+ "saturation": 0.9,
256
+ "alpha": 1.0
257
+ },
258
+ "slider_grab_active": {
259
+ "value": 0.6,
260
+ "saturation": 1.0,
261
+ "alpha": 1.0
262
+ },
263
+ "scrollbar_grab": {
264
+ "value": 0.5,
265
+ "saturation": 0.9,
266
+ "alpha": 1.0
267
+ },
268
+ "scrollbar_grab_hovered": {
269
+ "value": 0.5,
270
+ "saturation": 0.9,
271
+ "alpha": 1.0
272
+ },
273
+ "scrollbar_grab_active": {
274
+ "value": 0.5,
275
+ "saturation": 0.9,
276
+ "alpha": 1.0
277
+ }
278
+ },
279
+
280
+ "frame": {
281
+ "frame_bg": {
282
+ "value": 0.15,
283
+ "saturation": 0.9,
284
+ "alpha": 1.0
285
+ },
286
+ "frame_hovered": {
287
+ "value": 0.25,
288
+ "saturation": 0.5,
289
+ "alpha": 1.0
290
+ },
291
+ "frame_active": {
292
+ "value": 0.3,
293
+ "saturation": 0.6,
294
+ "alpha": 1.0
295
+ },
296
+ "separator": {
297
+ "value": 0.4,
298
+ "saturation": 0.7,
299
+ "alpha": 1.0
300
+ }
301
+ },
302
+
303
+ "tab": {
304
+ "tab": {
305
+ "value": 0.25,
306
+ "saturation": 0.7,
307
+ "alpha": 1.0
308
+ },
309
+ "tab_hovered": {
310
+ "value": 0.35,
311
+ "saturation": 0.8,
312
+ "alpha": 1.0
313
+ },
314
+ "tab_active": {
315
+ "value": 0.4,
316
+ "saturation": 0.9,
317
+ "alpha": 1.0
318
+ }
319
+ }
320
+ }
321
+
322
+ @classmethod
323
+ def get_global_constant(cls, constant_name: str, folder, default_type=None, default: Any = None):
324
+
325
+ if not hasattr(cls, folder) or getattr(cls, folder) is None:
326
+ setattr(cls, folder, {})
327
+ constant_dict = getattr(cls, folder)
328
+ if constant_name not in constant_dict or constant_dict[constant_name] is None and default is not None:
329
+ constant_dict[constant_name] = default
330
+
331
+ if default_type is not None and (constant_name not in constant_dict
332
+ or not isinstance(constant_dict[constant_name], default_type)):
333
+ constant_dict[constant_name] = default_type()
334
+ #
335
+ # if hasattr(self.settings, "_base_pref") and self.settings._base_pref is not None:
336
+ # setattr(self.settings._base_pref._constants, folder, f"global_constant.{folder}")
337
+
338
+ return constant_dict[constant_name]
@@ -0,0 +1,198 @@
1
+ """Residual backgrounds and the draw-list renderer's text colour policy.
2
+
3
+ Tuple colours remain absolute extended sRGB. Style opts into signed shifts;
4
+ the renderer works in linear scRGB, just like hdr_color.
5
+ """
6
+ import math
7
+
8
+
9
+ class Style(tuple):
10
+ def __new__(cls, rgb=(0, 0, 0), *, absolute=False, shadow_offset=None,
11
+ font_size=None, font_weight=None, tint_fn=None,
12
+ font_size_fn=None, font_weight_fn=None, shadow_fn=None):
13
+ values = tuple(float(value) for value in rgb)
14
+ if len(values) not in (3, 4) or not all(map(math.isfinite, values)):
15
+ raise ValueError("Style requires three finite channels and optional alpha")
16
+ style = super().__new__(cls, values)
17
+ style.absolute = bool(absolute)
18
+ for name, fn in (("tint_fn", tint_fn), ("font_size_fn", font_size_fn),
19
+ ("font_weight_fn", font_weight_fn), ("shadow_fn", shadow_fn)):
20
+ if fn is not None and not callable(fn):
21
+ raise TypeError(f"{name} must be callable or None")
22
+ setattr(style, name, fn)
23
+ for name, value in (("shadow_offset", shadow_offset), ("font_size", font_size),
24
+ ("font_weight", font_weight)):
25
+ if value is not None:
26
+ value = float(value)
27
+ if not math.isfinite(value):
28
+ raise ValueError(f"{name} must be finite")
29
+ setattr(style, name, value)
30
+ return style
31
+
32
+ def __repr__(self):
33
+ return (f"Style({tuple(self)!r}, absolute={self.absolute!r}, "
34
+ f"shadow_offset={self.shadow_offset!r}, font_size={self.font_size!r}, "
35
+ f"font_weight={self.font_weight!r}, tint_fn={self.tint_fn!r}, "
36
+ f"font_size_fn={self.font_size_fn!r}, font_weight_fn={self.font_weight_fn!r}, "
37
+ f"shadow_fn={self.shadow_fn!r})")
38
+
39
+ def __getnewargs_ex__(self):
40
+ return (tuple(self),), {"absolute": self.absolute, "shadow_offset": self.shadow_offset,
41
+ "font_size": self.font_size, "font_weight": self.font_weight,
42
+ "tint_fn": self.tint_fn, "font_size_fn": self.font_size_fn,
43
+ "font_weight_fn": self.font_weight_fn, "shadow_fn": self.shadow_fn}
44
+
45
+ def __eq__(self, other):
46
+ if not isinstance(other, tuple):
47
+ return NotImplemented
48
+ # Plain tuples mean absolute. Metadata must participate in dirty
49
+ # detection: switching black from residual to absolute is an edit.
50
+ absolute = other.absolute if isinstance(other, Style) else True
51
+ return (self.absolute == absolute
52
+ and all(getattr(self, name, None) == getattr(other, name, None)
53
+ for name in ("shadow_offset", "font_size", "font_weight", "tint_fn",
54
+ "font_size_fn", "font_weight_fn", "shadow_fn"))
55
+ and tuple.__eq__(self, other))
56
+
57
+ def __ne__(self, other):
58
+ equal = self.__eq__(other)
59
+ return NotImplemented if equal is NotImplemented else not equal
60
+
61
+ __hash__ = tuple.__hash__
62
+
63
+
64
+ def default_scalar_accumulation(context, residual):
65
+ """Default size, weight, and shadow policy; also an explicit subtree reset."""
66
+ return context + residual
67
+
68
+
69
+ def _scalar(fn, context, residual):
70
+ value = float(fn(context, residual))
71
+ if not math.isfinite(value):
72
+ raise ValueError("Style accumulation callback must return a finite scalar")
73
+ return value
74
+
75
+
76
+ def _font_value(value, absolute, base):
77
+ return value(base) if callable(value) else (value if absolute else base + value)
78
+
79
+
80
+ def _font_step(previous, absolute, fn, residual):
81
+ # Evaluate against the selected font's real base size/weight, not a delta
82
+ # from zero. An explicit base font inside a font view keeps its own context.
83
+ return lambda base: _scalar(fn, _font_value(previous, absolute, base), residual)
84
+
85
+
86
+ def resolve_font_style(style, parent=(0.0, 0.0, False, False)):
87
+ """Compose inherited policies; evaluate nonlinear steps at font selection.
88
+
89
+ The first four fields keep the existing delta/absolute representation.
90
+ Custom functions append two inherited policies and may turn a field into
91
+ a deferred scalar calculation. This preserves native font selection and
92
+ avoids guessing the font family/base size before the view requests it.
93
+ """
94
+ values = list(parent[:4])
95
+ functions = list(parent[4:] or (default_scalar_accumulation,) * 2)
96
+ for i, name in enumerate(('font_size', 'font_weight')):
97
+ override = getattr(style, name + '_fn', None)
98
+ if override is not None:
99
+ functions[i] = override
100
+ value = getattr(style, name, None)
101
+ if value is not None:
102
+ if style.absolute:
103
+ values[i], values[i + 2] = value, True
104
+ elif functions[i] is default_scalar_accumulation and not callable(values[i]):
105
+ values[i] += value
106
+ else:
107
+ values[i] = _font_step(values[i], values[i + 2], functions[i], value)
108
+ values[i + 2] = True
109
+ if any(fn is not default_scalar_accumulation for fn in functions):
110
+ values.extend(functions)
111
+ return tuple(values)
112
+
113
+
114
+ def evaluate_font_style(context, size, weight):
115
+ return (_font_value(context[0], context[2], size),
116
+ _font_value(context[1], context[3], weight))
117
+
118
+
119
+ def resolve_shadow_offset(style, parent=0.0, shadow_fn=None):
120
+ """Signed shadow depth; omitted values inherit, absolute values bypass policy."""
121
+ offset = getattr(style, 'shadow_offset', None)
122
+ if offset is None:
123
+ return parent
124
+ if style.absolute:
125
+ return offset
126
+ fn = getattr(style, 'shadow_fn', None)
127
+ if fn is None:
128
+ fn = shadow_fn if shadow_fn is not None else default_scalar_accumulation
129
+ return _scalar(fn, parent, offset)
130
+
131
+
132
+ def default_tint_accumulation(context_tint, tint_res):
133
+ """Current extended-sRGB policy: positive toward white, negative toward zero."""
134
+ return tuple(channel + max(-1.0, min(1.0, delta)) *
135
+ (max(0.0, 1.0 - channel) if delta >= 0 else channel)
136
+ for channel, delta in zip(context_tint, tint_res))
137
+
138
+
139
+ def draw_background(style, parent, tint_fn=None):
140
+ """Resolve one deferred background to linear RGBA for the paint pass.
141
+
142
+ tint_fn receives extended-sRGB triples, before linear conversion/compositing.
143
+ The default moves positive residuals toward white, negative toward black.
144
+ Absolute colours keep HDR headroom and wide gamut. Alpha composites in
145
+ linear light against the enclosing background before descendants use it.
146
+ """
147
+ from meltygui.hdr_color import srgb_to_linear
148
+ from meltygui.hdr_color import linear_to_srgb
149
+
150
+ if style is None:
151
+ return parent
152
+ if isinstance(style, Style) and not style.absolute:
153
+ base = tuple(linear_to_srgb(channel) for channel in parent[:3])
154
+ accumulate = getattr(style, 'tint_fn', None)
155
+ if accumulate is None:
156
+ accumulate = tint_fn if tint_fn is not None else default_tint_accumulation
157
+ rgb = tuple(float(c) for c in accumulate(base, tuple(style[:3])))
158
+ if len(rgb) != 3 or not all(map(math.isfinite, rgb)):
159
+ raise ValueError("tint_fn must return three finite extended-sRGB channels")
160
+ else:
161
+ rgb = style[:3]
162
+ alpha = max(0.0, min(1.0, style[3])) if len(style) == 4 else 1.0
163
+ return tuple(srgb_to_linear(channel) * alpha + behind * (1 - alpha)
164
+ for channel, behind in zip(rgb, parent)) + (1.0,)
165
+
166
+
167
+ def adjust_text_color():
168
+ """The single text-colour policy, executed per glyph pixel on the GPU.
169
+
170
+ Edit this function to change text appearance. The suggestion and sampled
171
+ background are linear scRGB. Preserve readable suggestions, otherwise
172
+ move toward black or reference white by the smallest necessary amount.
173
+ Coverage/opacity remain the draw-list renderer's responsibility.
174
+ """
175
+ return """
176
+ uniform sampler2D StyleContext;
177
+ uniform int DynamicStyles;
178
+ uniform float TextContrast;
179
+
180
+ vec3 adjust_text_color(vec3 suggestion) {
181
+ vec3 background = texelFetch(StyleContext, ivec2(gl_FragCoord.xy), 0).rgb;
182
+ vec3 weights = vec3(0.2126, 0.7152, 0.0722);
183
+ float behind = max(0.0, dot(background, weights));
184
+ float proposed = max(0.0, dot(suggestion, weights));
185
+ float ratio = (max(behind, proposed) + 0.05) /
186
+ (min(behind, proposed) + 0.05);
187
+ if (ratio >= TextContrast) return suggestion;
188
+
189
+ float dark = (behind + 0.05) / TextContrast - 0.05;
190
+ float light = (behind + 0.05) * TextContrast - 0.05;
191
+ float toDark = dark >= 0.0 && proposed > 0.0
192
+ ? clamp((proposed - dark) / proposed, 0.0, 1.0) : 2.0;
193
+ float toLight = light <= 1.0 && proposed < 1.0
194
+ ? clamp((light - proposed) / (1.0 - proposed), 0.0, 1.0) : 2.0;
195
+ return toDark <= toLight ? mix(suggestion, vec3(0), toDark)
196
+ : mix(suggestion, vec3(1), toLight);
197
+ }
198
+ """