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,67 @@
1
+ """Closable Melty LoRA windows sharing data and rendering, with different policies."""
2
+ import meltygui_imgui as imgui
3
+ import meltygui
4
+ from meltygui import Style
5
+ from meltygui import glfw_window
6
+ from meltygui import pressed
7
+ from meltygui import default_scalar_accumulation
8
+ from meltygui import default_tint_accumulation
9
+ from meltygui.examples.lora_data import lora_preview
10
+ from meltygui.examples.lora_data import nested_style_kwargs
11
+ from meltygui.examples.tint_functions import darken
12
+ from meltygui.examples.tint_functions import wave
13
+ from meltygui.examples.scalar_policies import subtract
14
+ from meltygui.examples.scalar_policies import size_curve
15
+ from meltygui.examples.scalar_policies import weight_curve
16
+ from meltygui.examples.scalar_policies import shadow_curve
17
+ from meltygui.core.melty import Melty
18
+ from meltygui.core.core_render import render_func
19
+ from meltygui.view.header_view import draw_header
20
+
21
+
22
+ loras = lora_preview()
23
+ children = nested_style_kwargs()
24
+ node = children
25
+ while node:
26
+ node['style'] = Style((.035, .025, .045), font_size=.5, font_weight=25, shadow_offset=.4)
27
+ node = node.get('child_kwargs')
28
+
29
+ policies = (
30
+ ('Loras / Add', default_tint_accumulation, default_scalar_accumulation,
31
+ default_scalar_accumulation, default_scalar_accumulation),
32
+ ('Loras / Subtract', darken, subtract, subtract, subtract),
33
+ ('Loras / Nonlinear', wave, size_curve, weight_curve, shadow_curve),
34
+ )
35
+
36
+
37
+ def reopen():
38
+ for name, *_ in policies:
39
+ Melty.open_window(name)
40
+
41
+
42
+ @render_func(use_cache=False)
43
+ def lora_contents(input_value, draw_state):
44
+ changed, _ = meltygui.draw_any(input_value, name='Loras', icon='',
45
+ style=Style((.035, .025, .045)),
46
+ initial={'expanded': True}, child_kwargs=children)
47
+ return changed, input_value
48
+
49
+
50
+ @glfw_window(name='LoRA accumulation comparison', width=1800, height=1040,
51
+ show_name=True, with_header=draw_header, app_id='meltygui-gui-playground', style=Style())
52
+ @render_func(use_cache=False)
53
+ def lora_comparison(input_value, draw_state):
54
+ from meltygui.examples.gui_playground import toggle_styles
55
+ if pressed('ctrl+d'):
56
+ toggle_styles()
57
+ meltygui.draw_menu_bar({'Windows': {'Reopen LoRA windows': reopen},
58
+ 'Styles': {'Enable / disable (Ctrl+D)': toggle_styles}}, name='lora-comparison-menu')
59
+ imgui.text('Same LoRA data and render function. Each Melty window can be moved, resized, scrolled, and closed.')
60
+ for i, (name, tint_fn, size_fn, weight_fn, shadow_fn) in enumerate(policies):
61
+ lora_contents(loras, name=name, as_window=True, shadow=True, with_header=draw_header,
62
+ force_initial=True,
63
+ style=Style((.50, .53, .57), absolute=True, tint_fn=tint_fn,
64
+ font_size_fn=size_fn, font_weight_fn=weight_fn, shadow_fn=shadow_fn),
65
+ initial={'window_pos': (12 + i * 592, 15), 'width': 580,
66
+ 'height': 920, 'expanded': True})
67
+ return False, input_value
@@ -0,0 +1,49 @@
1
+ """Usage example for the inputs tab's mode-attached child_kwargs source.
2
+
3
+ @window draw_mode_test ──draw_any(mode=Modes.TEXT)──► draw_collection
4
+ │ child_kwargs
5
+
6
+ draw_text (one per key)
7
+
8
+ Mode.TEXT (view/mode.py) carries `child_kwargs={line_height, wrap,
9
+ syntax_highlight}` in its dict entry. Nothing here passes those — they reach
10
+ each draw_text leaf purely through the mode.
11
+
12
+ To see the new source: right-click a text leaf → inputs tab. Two child_kwargs
13
+ rows appear, and they are independently editable:
14
+
15
+ child_kwargs (mode) ← Mode.TEXT's dict, jumps to / saves into mode.py
16
+ child_kwargs ← whichever NON-mode parent source sets one (the
17
+ caller below, once you uncomment it)
18
+
19
+ Editing `line_height` on the mode row rewrites mode.py and every leaf
20
+ reflows; the plain row edits this file instead.
21
+ """
22
+ import meltygui_imgui as imgui
23
+
24
+ from meltygui.core.rendering.modes import Modes
25
+ from meltygui.core.core_render import render_func
26
+ from meltygui.core.rendering.window_decoration import window
27
+ from meltygui.core.rendering.render_dispatch import draw_any
28
+
29
+ # Module level so hotswap-re-exec reuses it - edits made in the window survive
30
+ # while iterating on the mode.
31
+ mode_test_text = {
32
+ "intro": "Mode.TEXT sends every string in this dict to draw_text.",
33
+ "styling": "line_height, wrap and syntax_highlight are NOT passed here — "
34
+ "they arrive from Mode.TEXT's child_kwargs and are editable "
35
+ "from the inputs tab's 'child_kwargs (mode)' row.",
36
+ "code_sample": "def unhighlighted(x):\n return x * 2 # syntax_highlight=False",
37
+ }
38
+
39
+
40
+ @window
41
+ @render_func(tint=(0.22, 0.38, 0.31), auto_resize=False, min_width=560, min_height=320)
42
+ def draw_mode_test(input_value, draw_state):
43
+ imgui.text("Mode.TEXT — leaf style comes from the mode's child_kwargs")
44
+ draw_any(mode_test_text, name="mode_test_body", mode=Modes.TEXT)
45
+ # Uncomment to give the leaves a SECOND, non-mode child_kwargs setter (this
46
+ # call site) - the inputs tab then shows both rows side by side, the mode
47
+ # one still winning at runtime:
48
+ # draw_any(mode_test_text, name="mode_test_body_caller", mode=Modes.TEXT,
49
+ # child_kwargs={"line_height": 2.0})
@@ -0,0 +1,119 @@
1
+ import inspect
2
+ import types
3
+ from pathlib import Path
4
+
5
+ import meltygui_imgui as imgui
6
+
7
+ from meltygui.core.rendering.modes import Modes
8
+ from meltygui.core.rendering.render_funcs import RenderFuncs
9
+ from meltygui.core.runtime.toggles import Toggles
10
+ from meltygui.code.new_converters import code_file_io
11
+ from meltygui.code.new_converters import convert_in_and_out_value
12
+ from meltygui.code.new_converters import string_to_cst_module
13
+ from meltygui.code.new_converters import cst_module_to_string
14
+ from meltygui.code.new_converters import cst_module_to_dict
15
+ from meltygui.code.new_converters import dict_to_cst_module
16
+ from meltygui.core.conversion.render_host import RenderHost
17
+ from meltygui.core.core_render import render_func
18
+ from meltygui.core.rendering.window_decoration import window
19
+ from meltygui.core.rendering.render_dispatch import draw_any
20
+ from meltygui.view.text_view import draw_text
21
+ from meltygui.core.cache.invalidation_tracker import Note
22
+ from meltygui.core.rendering.mode import Mode
23
+
24
+ class ModifiesPlayground:
25
+
26
+ def __init__(self, playground):
27
+ self.playground = playground
28
+
29
+ def modify(self, modification):
30
+ self.playground.modify(modification)
31
+
32
+ class InCode:
33
+ value = 949
34
+ is_tree = False
35
+ name = "Unset"
36
+ show_bg = True
37
+ use_cache = False
38
+ some_val = 0
39
+ some_list = [-152,69,45,-22]
40
+ om_val2 =0
41
+
42
+
43
+ # [tint=(0.0923043042421341, 0.041103292256593704, 0.23255813121795654)]
44
+ class Nested:
45
+ inner_value = [110,172,28]
46
+
47
+ # Two chained proxies. Each WRAPS a stateful func (stateful_work → view_func(value) →
48
+ # stateful_work) and HOLDS the value that func hands its view_func - so each is "just a
49
+ # dict with one value inside", at its own representation level:
50
+ #
51
+ # string_proxy wraps code_file_io holds {value: <source string>}\
52
+ # dict_proxy wraps convert_in_and_out_value holds {value: <GeneralParse dict>}
53
+ #
54
+ # code_file_io hands its view_func the source string; convert_in_and_out_value hands its
55
+ # view_func the chain_in OUTPUT (the new string) directly - so neither one needs a
56
+ # routed side-channel or materialize_from. Chaining is data-flow: dict_proxy.input_value
57
+ # IS string_proxy, so it reads string_proxy's held source ("just like a dict"); every
58
+ # edit to the tree flows back → convert's new source string → written onto string_proxy
59
+ # → code_file_io saves one frame later.
60
+ #
61
+ # Both are standalone, so draw_main calls draw() on each and renders it in its own
62
+ # window (string_proxy first, so its source is fresh when dict_proxy reads it).
63
+
64
+ # string_proxy = RenderHost(io_function=code_file_io, input_value=draw_text, name="String Proxy File",
65
+ #
66
+ # child_kwargs={"auto_load_edits": False, "auto_load":True}) # auto-reload on external file change
67
+ #
68
+ # dict_proxy = RenderHost(
69
+ # io_function=convert_in_and_out_value, input_value=string_proxy, name="Tree Proxy",
70
+ # child_kwargs={
71
+ # "chain_in": [string_to_cst_module, cst_module_to_dict],
72
+ # "chain_out": [dict_to_cst_module, cst_module_to_string],
73
+ # "route": {cst_module_to_dict: ("code_dict", "jump_to", "run_jedi", "drive")},
74
+ # })
75
+
76
+ # draw_text_static_file_load = inspect.getsource(draw_text)
77
+
78
+ # The shared framework pair, NOT a private copy. This module used to carry its
79
+ # own copy of code_hosts_for and its own cache, so this window passed draw_text
80
+ # through a second, independent pipeline while the editor route parsed the same
81
+ # span through the framework pair: two full 102KB str→cst→dict conversions per
82
+ # session (~430ms of duplicated background work, visible in the perf-trace
83
+ # timeline). One cache, one pair, one parse.
84
+ from meltygui.code.new_converters import code_hosts_for
85
+
86
+ string_proxy, dict_proxy = code_hosts_for(draw_text)
87
+
88
+
89
+ # @window(disable_scroll=False, use_cache=True)
90
+ # @render_func(tint=(0.043, 0.11, 0.20), auto_resize=True)
91
+ # def test_code_hosts(_, draw_state):
92
+ # Both proxies show themselves in their own windows (draw_main → draw()). This
93
+ # window just inspects them AS ordinary dicts - the framework has no idea they're
94
+ # proxies; it's rendering ordinary dicts whose single value was materialized by
95
+ # their wrappers. Editing here bubbles back exactly the same way.
96
+
97
+ #
98
+ # changed, value = draw_collection(string_proxy, name="String Proxy", disable_scroll=False, child_kwargs={"view_func": draw_text, "code_dict": dict_proxy})
99
+ # changed, value = draw_collection(dict_proxy, name="Dict Proxy", disable_scroll=False)
100
+
101
+ # draw_columns({"text":string_proxy, "dict":dict_proxy})
102
+
103
+ # global draw_text_static_file_load
104
+ # changed, value = draw_text(draw_text_static_file_load, show_name=True, use_cache=True, name="static baseline")
105
+ # if changed:
106
+ # draw_text_static_file_load = value
107
+
108
+ # changed, value = draw_collection(string_proxy, name="String Proxy Dict", child_kwargs={"view_func":draw_text})
109
+
110
+ # if changed:
111
+ # draw_state.invalidate_up_by_obj(obj=dict_proxy, time_delta=2, note=Note(name="String Proxy changed", tint=(1,1,1)), max_depth=10)
112
+
113
+ # request_render()
114
+ # New trick: `.deep.unwrap()` skips the redundant wrapper rungs (value / module /
115
+ # function name) and hands draw_collection the meaningful content dict with its keys
116
+ # intact - no manual ["value"][...] indexing or "if key in d" guards.
117
+ # tree = dict_proxy.deep.unwrap()
118
+ # if tree:
119
+ # changed, value = draw_collection(dict_proxy, name="Tree Proxy Dict", column=1, disable_scroll=False)
@@ -0,0 +1,60 @@
1
+ """One nested view under three font/shadow accumulation policies."""
2
+ import meltygui_imgui as imgui
3
+
4
+ from meltygui import Style
5
+ from meltygui import default_scalar_accumulation
6
+ from meltygui import glfw_window
7
+ from meltygui import pressed
8
+ from meltygui.examples.style_layouts import panel
9
+ from meltygui.core.styling.fonts import Font
10
+ from meltygui.core.core_render import render_func
11
+ from meltygui.view.header_view import draw_header
12
+
13
+
14
+ def subtract(context, residual):
15
+ return context - residual
16
+
17
+
18
+ def size_curve(context, residual):
19
+ return context * (1 + residual / 20)
20
+
21
+
22
+ def weight_curve(context, residual):
23
+ return context * (1 + residual / 400)
24
+
25
+
26
+ def shadow_curve(context, residual):
27
+ return context + residual / (1 + abs(context))
28
+
29
+
30
+ def nested(depth=0):
31
+ content = {'text': [(.06, .08, f'Level {depth + 1} / Aa 012')]}
32
+ if depth < 3:
33
+ content['children'] = [('child', (.055, .24, .89, .70),
34
+ Style((.055, .04, .065), font_size=2,
35
+ font_weight=100, shadow_offset=2), nested(depth + 1))]
36
+ return content
37
+
38
+
39
+ @glfw_window(name='Font and shadow policies', width=1140, height=550,
40
+ show_name=True, with_header=draw_header, app_id='meltygui-gui-playground',
41
+ style=Style((.30, .32, .36), absolute=True))
42
+ @render_func(use_cache=False)
43
+ def scalar_policy_window(input_value, draw_state):
44
+ from meltygui.examples.gui_playground import toggle_styles
45
+ if pressed('ctrl+d'):
46
+ toggle_styles()
47
+ imgui.text('Same nested view: +2 size, +100 weight, +2 shadow at every child. Ctrl+D toggles styles.')
48
+ w = max(900, draw_state.content_width - 20)
49
+ policies = [('Add', default_scalar_accumulation, default_scalar_accumulation, default_scalar_accumulation),
50
+ ('Subtract', subtract, subtract, subtract),
51
+ ('Nonlinear', size_curve, weight_curve, shadow_curve)]
52
+ panel({'children': [(label, (i / 3 + .01, .02, .31, .96),
53
+ Style((.055, .04, .065), font_size_fn=size_fn,
54
+ font_weight_fn=weight_fn, shadow_fn=shadow_fn),
55
+ {'text': [(.06, .03, label)], 'children': [
56
+ ('tree', (.02, .14, .96, .84), Style(), nested())]})
57
+ for i, (label, size_fn, weight_fn, shadow_fn) in enumerate(policies)]},
58
+ name='scalar-policies', style=Style(), font=Font.JETBRAINS_MONO_19,
59
+ width=w, height=450)
60
+ return False, input_value
@@ -0,0 +1,149 @@
1
+ """Three composed layouts for exploring residual styles in the GUI playground."""
2
+ import meltygui_imgui as imgui
3
+
4
+ import meltygui
5
+ from meltygui import Style
6
+ from meltygui import glfw_window
7
+ from meltygui import pressed
8
+ from meltygui.hdr_color import pack_color
9
+ from meltygui.core.styling.fonts import Font
10
+ from meltygui.core.melty import Melty
11
+ from meltygui.core.runtime.toggles import Toggles
12
+ from meltygui.core.core_render import render_func
13
+ from meltygui.view.header_view import draw_header
14
+
15
+
16
+ strength = 0.22
17
+ type_size = 0
18
+ type_weight = 0
19
+
20
+
21
+ def stronger():
22
+ global strength
23
+ strength = min(0.8, strength + 0.1)
24
+
25
+
26
+ def softer():
27
+ global strength
28
+ strength = max(0.02, strength - 0.1)
29
+
30
+
31
+ def larger_type():
32
+ global type_size
33
+ type_size = min(10, type_size + 1)
34
+
35
+
36
+ def smaller_type():
37
+ global type_size
38
+ type_size = max(-6, type_size - 1)
39
+
40
+
41
+ def heavier_type():
42
+ global type_weight
43
+ type_weight = min(200, type_weight + 100)
44
+
45
+
46
+ def lighter_type():
47
+ global type_weight
48
+ type_weight = max(-300, type_weight - 100)
49
+
50
+
51
+ @render_func(show_bg=False, show_header=False, use_cache=False, auto_resize=False)
52
+ def panel(input_value, draw_state, style=None):
53
+ """A real Melty context for each rectangle; children inherit its background."""
54
+ if Toggles.dynamic_styles:
55
+ Melty.add_background(style)
56
+ else:
57
+ imgui.get_window_draw_list().add_rect_filled(
58
+ draw_state.abs_left, draw_state.abs_top,
59
+ draw_state.abs_left + draw_state.width, draw_state.abs_top + draw_state.height,
60
+ pack_color(0.2, 0.22, 0.25, 1), 8)
61
+ x, y = draw_state.abs_left, draw_state.abs_top
62
+ w, h = draw_state.width, draw_state.height
63
+ # Paint children first, then text: crossing glyphs sample the actual surface.
64
+ for key, rect, child_style, content in input_value.get('children', ()):
65
+ left, top, width, height = rect
66
+ imgui.set_cursor_screen_pos((x + left * w, y + top * h))
67
+ panel(content, name=key, style=child_style, width=width * w, height=height * h)
68
+ dl = imgui.get_window_draw_list()
69
+ for left, top, label in input_value.get('text', ()):
70
+ dl.add_text(x + left * w, y + top * h, pack_color(0.58, 0.58, 0.58, 1), label)
71
+ imgui.set_cursor_screen_pos((x, y))
72
+ imgui.dummy(w, h)
73
+ return False, input_value
74
+
75
+
76
+ def terraces(delta, depth=0):
77
+ content = {'text': [(0.04, 0.06, f'Level {depth + 1}') ]}
78
+ if depth < 3:
79
+ content['children'] = [('inset', (0.07, 0.23, 0.86, 0.71), Style(delta, shadow_offset=2),
80
+ terraces(delta, depth + 1))]
81
+ return content
82
+
83
+
84
+ def workspace():
85
+ tile = {'text': [(0.07, 0.15, 'Shared card'), (0.07, 0.39, 'Same residual'),
86
+ (0.07, 0.65, 'Same text suggestion')]}
87
+ def column(label, base):
88
+ return (label, base, {'text': [(0.06, 0.06, label)], 'children': [
89
+ ('card', (0.06, 0.23, 0.88, 0.68), Style((strength, 0, strength)), tile)]})
90
+ columns = [column('Night', Style((0.07, 0.10, 0.16), absolute=True)),
91
+ column('Paper', Style((0.94, 0.91, 0.83), absolute=True)),
92
+ column('Ocean', Style((0.04, 0.43, 0.49), absolute=True))]
93
+ return {'children': [(label, (i / 3 + .012, .04, .309, .92), base, content)
94
+ for i, (label, base, content) in enumerate(columns)]}
95
+
96
+
97
+ def crossing():
98
+ veil = Style((.15, .45, .95, .35), absolute=True)
99
+ return {'children': [
100
+ ('night', (0, 0, .5, 1), Style((.035, .045, .07), absolute=True),
101
+ {'children': [('veil', (.16, .56, .84, .30), veil, {})]}),
102
+ ('paper', (.5, 0, .5, 1), Style((.95, .92, .84), absolute=True),
103
+ {'children': [('veil', (0, .56, .84, .30), veil, {})]})],
104
+ 'text': [(.30, .18, 'One text run crosses both surfaces'),
105
+ (.30, .36, 'The renderer chooses the contrast'),
106
+ (.12, .66, 'Same translucent blue / different inherited surfaces')]}
107
+
108
+
109
+ @glfw_window(name='Style compositions — GUI playground', width=1060, height=1000,
110
+ show_name=True, with_header=draw_header, app_id='meltygui-gui-playground',
111
+ style=Style(), disable_scroll=False)
112
+ @render_func(use_cache=False)
113
+ def style_compositions(input_value, draw_state):
114
+ from meltygui.examples.gui_playground import toggle_styles
115
+ from meltygui.examples.gui_playground import toggle_root
116
+ from meltygui.examples.gui_playground import reset
117
+ if pressed('ctrl+d'):
118
+ toggle_styles()
119
+ if pressed('ctrl+l'):
120
+ toggle_root()
121
+ meltygui.draw_menu_bar({
122
+ 'Styles': {'Enable / disable (Ctrl+D)': toggle_styles,
123
+ 'Light / dark root (Ctrl+L)': toggle_root, 'Reset': reset},
124
+ 'Residual': {'Stronger': stronger, 'Softer': softer},
125
+ 'Typography': {'Larger (+1)': larger_type, 'Smaller (-1)': smaller_type,
126
+ 'Heavier (+100)': heavier_type, 'Lighter (-100)': lighter_type},
127
+ }, name='composition-menu')
128
+ imgui.text(f'Dynamic styles: {"ON" if Toggles.dynamic_styles else "OFF"} | Residual strength: {strength:.2f}')
129
+ w = max(520, draw_state.content_width - 20)
130
+ imgui.text('01 / TERRACES Nested colour + shadow depth residuals (+2 per level)')
131
+ panel({'children': [
132
+ ('warm', (.01, .02, .32, .96), Style((strength, 0, 0)), terraces((strength, 0, 0))),
133
+ ('cool', (.34, .02, .32, .96), Style((0, strength / 2, strength)), terraces((0, strength / 2, strength))),
134
+ ('shade', (.67, .02, .32, .96), Style((-strength,) * 3), terraces((-strength,) * 3))]},
135
+ name='terraces', style=Style(), width=w, height=300)
136
+ imgui.text('02 / CONTEXT CARDS The same component on three absolute surfaces')
137
+ panel(workspace(), name='workspace', style=Style(), width=w, height=240)
138
+ imgui.text('03 / CROSSING Text adapts per pixel; the inset composites translucent blue')
139
+ panel(crossing(), name='crossing', style=Style(), width=w, height=220)
140
+ imgui.text('04 / TYPE Native-size hinted fonts; children add +3 pixels and +100 weight')
141
+ panel({'text': [(.03, .05, f'Parent / size {18.5 + type_size:g}, weight {400 + type_weight}')], 'children': [
142
+ ('medium', (.03, .23, .94, .70), Style((.08, .04, .10), font_size=3, font_weight=100),
143
+ {'text': [(.03, .07, f'Child / +3 pixels, weight {500 + type_weight}')], 'children': [
144
+ ('semibold', (.04, .35, .92, .55),
145
+ Style((.08, .04, .10), font_size=3, font_weight=100),
146
+ {'text': [(.03, .22, f'Grandchild / +6 pixels, weight {600 + type_weight} | Il1 0O')]})]})]},
147
+ name='typography', font=Font.JETBRAINS_MONO_19,
148
+ style=Style(font_size=type_size, font_weight=type_weight), width=w, height=300)
149
+ return False, input_value
@@ -0,0 +1,74 @@
1
+ """Demo for the tiled window manager (core/layout/tile_manager_core.py).
2
+
3
+ A Blender-style area layout drawn flat on one draw_state: every divider —
4
+ the window's frame edges, the column edges of the root split, the row
5
+ edges inside each column — is a shared edge object in the window's
6
+ collision solve, so dragging any of them pushes and pulls the rest and
7
+ out through the window frame, exactly like the columns playground.
8
+ """
9
+ from meltygui.core.conversion.dict_conversion import DictConversion
10
+ from meltygui.core.core_render import render_func
11
+ from meltygui.core.rendering.window_decoration import window
12
+ from meltygui.model.tile_model import Split
13
+ from meltygui.model.tile_model import Tile
14
+ from meltygui.core.layout.tile_manager_core import TileManagerState
15
+ from meltygui.core.layout.tile_manager_core import draw_tiles
16
+
17
+
18
+ class CounterState(DictConversion):
19
+ def __init__(self):
20
+ super().__init__()
21
+ self.count = 0
22
+
23
+
24
+ @render_func(multi_instance=True, tint=(0.20, 0.36, 0.52))
25
+ def draw_tile_counter(input_value: object, draw_state,
26
+ counter_state: CounterState = None, style_manager=None):
27
+ """Choose in two tiles to exercise independent, persisted view state."""
28
+ from meltygui.view.header_view import flat_button
29
+ clicked = flat_button(f"Count: {counter_state.count} — add one", draw_state,
30
+ "increment", width=180, style_manager=style_manager)
31
+ if clicked:
32
+ counter_state.count += 1
33
+ return clicked, input_value
34
+
35
+
36
+ @render_func(multi_instance=True, tint=(0.22, 0.44, 0.30))
37
+ def draw_tile_notes(input_value: object):
38
+ from meltygui.view.text_view import draw_text
39
+ changed, value = draw_text("" if input_value is None else input_value)
40
+ return changed, value if changed else input_value
41
+
42
+
43
+ class TileManagerDemoModel(DictConversion):
44
+ """The demo app owns the layout, including each tile's selected function."""
45
+
46
+ def __init__(self):
47
+ super().__init__()
48
+ self.tree = Split("x", [
49
+ Tile("outliner", tint=(0.20, 0.36, 0.52), render_func=draw_tile_counter),
50
+ Split("y", [
51
+ Tile("viewport", tint=(0.28, 0.28, 0.30), render_func=draw_tile_counter),
52
+ Tile("timeline", tint=(0.42, 0.30, 0.18)),
53
+ ]),
54
+ Split("y", [
55
+ Tile("properties", tint=(0.22, 0.44, 0.30)),
56
+ Tile("modifiers", tint=(0.36, 0.24, 0.44)),
57
+ Tile("materials", tint=(0.50, 0.22, 0.24)),
58
+ ]),
59
+ ])
60
+
61
+
62
+ # auto_resize=False: a fixed-size window gives the tree a stable frame;
63
+ # the tiles inside it and every edge moves independently of the rest.
64
+ @window
65
+ @render_func(tint=(0.24, 0.30, 0.20), auto_resize=False, min_width=720,
66
+ min_height=420, show_bg=True)
67
+ def draw_tiled_window_manager_demo(input_value: object, draw_state,
68
+ tile_state: TileManagerState = None,
69
+ app_model: TileManagerDemoModel = None,
70
+ multi_instance_renderers=()):
71
+ tree = app_model.tree if input_value is None else input_value
72
+ changed = draw_tiles(tree, draw_state, tile_state=tile_state,
73
+ multi_instance_renderers=multi_instance_renderers)
74
+ return changed, input_value