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,160 @@
1
+ """Tint debug window — a freeform external-edit rig for the manual merge
2
+ system. It manages its OWN file IO on `sample.py` (raw read_text/write_text,
3
+ no PendingSave, no code cache, no self-write hash), so its Save is
4
+ indistinguishable from an outside program writing the file: the watcher
5
+ tracks it as external drift, editors park on the merge banner, and the merge
6
+ window shows the incoming diff. Load/Save are manual buttons only — nothing
7
+ here is automatic."""
8
+
9
+ from datetime import datetime
10
+ from pathlib import Path
11
+
12
+ import meltygui_imgui as imgui
13
+
14
+ from meltygui.core.melty import Melty
15
+ from meltygui.core.rendering.render_funcs import RenderFuncs
16
+ from meltygui.core.windowing.glfw_utils import request_render
17
+ from meltygui.core.core_render import render_func
18
+ from meltygui.core.rendering.window_decoration import window
19
+ from meltygui.view.text_view import draw_text
20
+
21
+ # Anchored at src/sample.py regardless of cwd (this file lives at
22
+ # src/lsd/gl_gui/view/playground/) - inside the watched project tree, where
23
+ # MelWatch tracks external writes.
24
+ SAMPLE_PATH = (Path(__file__).resolve().parents[1] / "examples" / "sample.py")
25
+
26
+ _DEFAULT_SAMPLE = '''"""Freeform scratch file for external-edit testing."""
27
+
28
+
29
+ class SampleTints:
30
+ tint = (0.5, 0.2, 0.8)
31
+ outline = (1.0, 0.5, 0.0)
32
+
33
+
34
+ def sample_function():
35
+ return "hello"
36
+ '''
37
+
38
+
39
+ @window(disable_scroll=False, icon="", display_name="External Editor",
40
+ tint=(0.29, 0.08, 0.74))
41
+ @render_func(tint=(0.35, 0.18, 0.42))
42
+ def external_editor(draw_state=None):
43
+ misc = draw_state.misc
44
+ buffer = misc.get("_sample_buffer")
45
+
46
+ # First open: seed the buffer from disk (creating the file if needed) -
47
+ # the one implicit load; everything after is button-driven.
48
+ if buffer is None:
49
+ if not SAMPLE_PATH.exists():
50
+ SAMPLE_PATH.write_text(_DEFAULT_SAMPLE)
51
+ buffer = misc["_sample_buffer"] = SAMPLE_PATH.read_text()
52
+
53
+ row_h = 26
54
+ if RenderFuncs.button(" Load", width=90, height=row_h,
55
+ name="tint_debug_load")[0]:
56
+ # Raw read, on purpose: NOT Melty.read_code - this window's view of
57
+ # the file must be its own, independent of the studio's cache.
58
+ try:
59
+ misc["_sample_buffer"] = buffer = SAMPLE_PATH.read_text()
60
+ misc["_sample_status"] = f"loaded {datetime.now():%H:%M:%S}"
61
+ except OSError as e:
62
+ misc["_sample_status"] = f"load failed: {e}"
63
+ draw_state.invalidate_up(max_depth=4)
64
+ request_render()
65
+ imgui.same_line(spacing=8)
66
+ if RenderFuncs.button(" Save", width=90, height=row_h,
67
+ name="tint_debug_save")[0]:
68
+ # Raw write, on purpose: no codec, no PendingSave, no self-write
69
+ # hash - the watcher sees this as EXTERNAL edit.
70
+ try:
71
+ SAMPLE_PATH.write_text(buffer)
72
+ misc["_sample_status"] = f"saved {datetime.now():%H:%M:%S} (external write)"
73
+ except OSError as e:
74
+ misc["_sample_status"] = f"save failed: {e}"
75
+ draw_state.invalidate_up(max_depth=4)
76
+ request_render()
77
+ imgui.same_line(spacing=12)
78
+ imgui.align_text_to_frame_padding()
79
+ imgui.text_colored(str(SAMPLE_PATH), 0.6, 0.65, 0.7, 1.0)
80
+
81
+ # ── Canned edits: mutate the buffer without typing ────────────────────
82
+ # Each returns the new buffer text; None means "no change". The counter
83
+ # keeps generated names unique across clicks.
84
+ n = misc.get("_sample_counter", 0)
85
+
86
+ def _add_def(text):
87
+ return (text.rstrip("\n")
88
+ + f"\n\n\ndef generated_{n}():\n return {n}\n")
89
+
90
+ def _add_comment_top(text):
91
+ # Insert below the module docstring if it leads the file, else at
92
+ # the very top - shifts every line down (good for rebase testing).
93
+ lines = text.split("\n")
94
+ at = 0
95
+ if lines and lines[0].lstrip().startswith(('"""', "'''")):
96
+ q = lines[0].lstrip()[:3]
97
+ at = 1 if lines[0].count(q) >= 2 else next(
98
+ (i + 1 for i in range(1, len(lines)) if q in lines[i]), 0)
99
+ lines.insert(at, f"# external comment {n} {datetime.now():%H:%M:%S}")
100
+ return "\n".join(lines)
101
+
102
+ def _bump_tint(text):
103
+ # Rewrite the first tuple line mentioning 'tint' with fresh values.
104
+ lines = text.split("\n")
105
+ for i, line in enumerate(lines):
106
+ if "tint" in line and "(" in line:
107
+ indent = line[:len(line) - len(line.lstrip())]
108
+ v = (n % 9 + 1) / 10.0
109
+ lines[i] = f"{indent}tint = ({v}, {v / 2:.2f}, {1.0 - v:.2f})"
110
+ return "\n".join(lines)
111
+ return None
112
+
113
+ def _edit_return(text):
114
+ # Change every `return "..."` / `return N` payload in place - an
115
+ # in-span body edit that does NOT shift line counts.
116
+ lines = text.split("\n")
117
+ hit = False
118
+ for i, line in enumerate(lines):
119
+ s = line.strip()
120
+ if s.startswith("return "):
121
+ indent = line[:len(line) - len(line.lstrip())]
122
+ lines[i] = f'{indent}return "edit {n}"'
123
+ hit = True
124
+ return "\n".join(lines) if hit else None
125
+
126
+ for label, fn in (("+ def", _add_def), ("+ top comment", _add_comment_top),
127
+ ("~ tint", _bump_tint), ("~ returns", _edit_return)):
128
+ if RenderFuncs.button(f" {label}", height=row_h,
129
+ name=f"tint_debug_{label}")[0]:
130
+ new = fn(buffer)
131
+ if new is not None:
132
+ misc["_sample_buffer"] = buffer = new
133
+ misc["_sample_counter"] = n + 1
134
+ misc["_sample_status"] = f"buffer edited ({label.strip()})"
135
+ draw_state.invalidate_up(max_depth=4)
136
+ request_render()
137
+ imgui.same_line(spacing=6)
138
+ imgui.new_line()
139
+
140
+ # Debug readout: does the studio currently see this file as drifted?
141
+ from meltygui.editor.external_changes import ExternalChanges
142
+ from meltygui.editor.pending_save import PendingSave
143
+ key = str(SAMPLE_PATH)
144
+ tracked = key in ExternalChanges.originals
145
+ unmerged = tracked and key in PendingSave.unmerged_drift_paths()
146
+ pending = any(a.path == SAMPLE_PATH for a in PendingSave.pending_saves)
147
+ status = misc.get("_sample_status", "")
148
+ imgui.text_colored(
149
+ f"tracked drift: {'yes' if tracked else 'no'} "
150
+ f"unmerged: {'yes' if unmerged else 'no'} "
151
+ f"pending edits: {'yes' if pending else 'no'} {status}",
152
+ 0.75, 0.7, 0.5, 1.0)
153
+
154
+ edited, new_text = draw_text(buffer, name="tint_debug_editor",
155
+ show_header=False, use_cache=True,
156
+ bg_offset=-4, shadow=True)
157
+ if edited and new_text != buffer:
158
+ misc["_sample_buffer"] = new_text
159
+
160
+ return False, None
@@ -0,0 +1,56 @@
1
+ """One reusable layout, three root-window tint accumulation policies."""
2
+ import math
3
+
4
+ import meltygui_imgui as imgui
5
+ from meltygui import Style
6
+ from meltygui import default_tint_accumulation
7
+ from meltygui import glfw_window
8
+ from meltygui import pressed
9
+ from meltygui.examples.style_layouts import panel
10
+ from meltygui.examples.style_layouts import terraces
11
+ from meltygui.core.core_render import render_func
12
+ from meltygui.view.header_view import draw_header
13
+
14
+
15
+ def darken(context_tint, tint_res):
16
+ return tuple(c - r for c, r in zip(context_tint, tint_res))
17
+
18
+
19
+ def wave(context_tint, tint_res):
20
+ # Nonlinear, deliberately bounded demo; zero residual remains an identity.
21
+ return tuple(math.sin(math.asin(max(-1, min(1, c))) + r * 3)
22
+ for c, r in zip(context_tint, tint_res))
23
+
24
+
25
+ @render_func(use_cache=False)
26
+ def reusable_window(input_value, draw_state):
27
+ from meltygui.examples.gui_playground import toggle_styles
28
+ if pressed('ctrl+d'):
29
+ toggle_styles()
30
+ imgui.text('Same render function. Same positive residuals.')
31
+ w = max(320, draw_state.content_width - 18)
32
+ panel(terraces((.10, .08, .06)), name='levels',
33
+ style=Style((.10, .08, .06)), width=w, height=310)
34
+ imgui.text('Reusable cards inherit the window policy')
35
+ card = {'text': [(.08, .15, 'Shared component'), (.08, .43, 'Same text suggestion')],
36
+ 'children': [('inset', (.08, .65, .84, .25), Style((.10, .08, .06)),
37
+ {'text': [(.08, .18, 'Nested detail')]})]}
38
+ panel(card, name='card', style=Style((.10, .08, .06), shadow_offset=2),
39
+ width=w, height=150)
40
+ imgui.text('This subtree explicitly restores the default')
41
+ panel({'text': [(.05, .2, 'Default accumulation override')],
42
+ 'children': [('nested', (.05, .50, .90, .4), Style((.10, .08, .06)),
43
+ {'text': [(.04, .15, 'Descendants inherit the override')]})]},
44
+ name='override', style=Style((.10, .08, .06), tint_fn=default_tint_accumulation),
45
+ width=w, height=120)
46
+ return False, input_value
47
+
48
+
49
+ # Register the SAME render function three times. Only root Style() changes.
50
+ for title, accumulate in (('Lighten', default_tint_accumulation),
51
+ ('Darken', darken), ('Wave', wave)):
52
+ glfw_window(name=f'Tint policy / {title}', width=560, height=720,
53
+ show_name=True, with_header=draw_header, app_id='meltygui-gui-playground',
54
+ disable_scroll=False,
55
+ style=Style((.52, .56, .60), absolute=True, tint_fn=accumulate))(
56
+ reusable_window)
@@ -0,0 +1,88 @@
1
+ """Stack trace playground — a window for exercising draw_stack_trace.
2
+
3
+ Two capture buttons: "Raise & catch" runs a small three-deep helper chain
4
+ that raises, catches the ValueError, and renders it — the trace reads main →
5
+ render loop → this window → _alpha → _beta → _gamma with the raising line
6
+ last. "Capture stack" snapshots the CURRENT live stack (no exception) as
7
+ FrameSummary rows — the button-click path itself, straight down from main.
8
+ """
9
+
10
+ import traceback
11
+
12
+ from meltygui.core.rendering.render_funcs import RenderFuncs
13
+ from meltygui.core.runtime.toggles import Tint
14
+ from meltygui.core.core_render import render_func
15
+ from meltygui.core.rendering.window_decoration import window
16
+ from meltygui.view.trace_view import draw_stack_trace
17
+
18
+
19
+ class StackTracePlayground:
20
+ # The captured exception / FrameSummary rows. A class attribute, not
21
+ # draw_state.misc: misc is serialized and an exception (with its live
22
+ # traceback frames) must never reach the pickle. Hotswap keeps the live
23
+ # value (unchanged source expression), so a capture survives edits here.
24
+ captured = None
25
+ status = ""
26
+
27
+
28
+ # ── Sample call chain - three frames deep so the trace has some shape ────────
29
+
30
+ def _alpha():
31
+ greeting = "hello from the playground"
32
+ return _beta(greeting)
33
+
34
+
35
+ def _beta(greeting):
36
+ numbers = [1, 2, 3]
37
+ return _gamma(greeting, numbers)
38
+
39
+
40
+ def _gamma(greeting, numbers):
41
+ raise ValueError(f"sample failure: {greeting!r} over {numbers!r}")
42
+
43
+
44
+ def capture_sample_exception():
45
+ try:
46
+ _alpha()
47
+ except ValueError as exc:
48
+ return exc
49
+
50
+
51
+ @window(disable_scroll=False, icon=None, display_name="Stack Trace Playground",
52
+ tint=(0.09, 0.035, 0.03))
53
+ @render_func(tint=(0.9, 0.35, 0.28))
54
+ def stack_trace_playground(draw_state=None):
55
+ # [tint=(0.9, 0.35, 0.28)]
56
+ button_height = 26
57
+
58
+ if RenderFuncs.button(" Raise & catch", width=130, height=button_height,
59
+ name="stack playground raise")[0]:
60
+ StackTracePlayground.captured = capture_sample_exception()
61
+ StackTracePlayground.status = "caught ValueError from _gamma"
62
+ if RenderFuncs.button(" Capture stack", width=130, height=button_height,
63
+ name="stack playground capture")[0]:
64
+ # FrameSummary rows, not live frames: a held frame object would pin
65
+ # this whole render pass's locals for the session.
66
+ StackTracePlayground.captured = traceback.extract_stack()
67
+ StackTracePlayground.status = "captured the live stack at the click"
68
+ if RenderFuncs.button(" Clear", width=90, height=button_height,
69
+ name="stack playground clear")[0]:
70
+ StackTracePlayground.captured = None
71
+ StackTracePlayground.status = ""
72
+
73
+ if StackTracePlayground.captured is None:
74
+ RenderFuncs.draw_text("No capture yet — Raise & catch runs a sample "
75
+ "three-deep failure; Capture stack snapshots "
76
+ "the live stack under this click.",
77
+ name="stack playground hint", show_bg=False,
78
+ editable=False, tint=Tint.subtle_text())
79
+ return False, None
80
+
81
+ if StackTracePlayground.status:
82
+ RenderFuncs.draw_text(StackTracePlayground.status,
83
+ name="stack playground status", show_bg=False,
84
+ single_line=True, editable=False,
85
+ syntax_highlight=False, tint=Tint.subtle_text())
86
+ draw_stack_trace(StackTracePlayground.captured,
87
+ name="stack playground trace")
88
+ return False, None
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env python3
2
+ """Two peer OS windows, one with a child window that follows it.
3
+
4
+ PYTHONPATH=<latent-descent> python meltygui/examples/two_windows.py
5
+ """
6
+ import meltygui
7
+ from meltygui import glfw_window
8
+ from meltygui import pressed
9
+
10
+ notes = "type here\n"
11
+ log = "child window: drag me, then drag the parent\n"
12
+
13
+
14
+ @glfw_window(name='Notes')
15
+ def notes_window():
16
+ global notes, log
17
+ changed, new = meltygui.draw_text(notes, name='notes', syntax_highlight=False)
18
+ if changed:
19
+ notes = new
20
+ # A child OS window of this one: onable, follows it, closes
21
+ # when this call stops (Ctrl+L toggles it).
22
+ if not state['hide_log']:
23
+ changed, new = meltygui.draw_text(log, name='log', glfw_window=True, window_size=(520, 300),
24
+ syntax_highlight=False)
25
+ if changed:
26
+ log = new
27
+ if pressed('ctrl+l'):
28
+ state['hide_log'] = not state['hide_log']
29
+
30
+
31
+ state = {'hide_log': False}
32
+
33
+
34
+ @glfw_window(name='Scratch', width=600, height=400)
35
+ def scratch_window():
36
+ meltygui.draw_text("a second peer window\n", name='scratch', syntax_highlight=False)
File without changes