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,212 @@
1
+ """Menu view functions and supporting definitions."""
2
+ from meltygui.core.layout.dropdown_core import _close_menu
3
+ from meltygui.state.menu_state import _menu_state
4
+ from meltygui.core.runtime.toggles import Toggles
5
+ from colorsys import hsv_to_rgb
6
+ from colorsys import rgb_to_hsv
7
+ from meltygui.core.melty import Melty
8
+ from meltygui.core.core_render import render_func
9
+ from meltygui.state.new_core_model import MenuBarState
10
+ import meltygui_imgui as imgui
11
+ import traceback
12
+
13
+
14
+ @render_func(use_cache=True, show_bg=False, shadow=False, selectable=False, is_tree=False,
15
+ with_header=None, disable_scroll=True, show_add_delete=False)
16
+ def draw_menu_bar(input_value: dict, draw_state, name, unique, menu_bar_state: MenuBarState,
17
+ bar_height=25.0, title_pad=12.0, title_gap=2.0, **kwargs):
18
+ """The bar: `input_value` is {title: menu}, a menu being what draw_dd_menu
19
+ draws (dict / list, callables or values at the leaves). Returns
20
+ ``(True, picked_value)`` on the frame a leaf is picked (a callable leaf
21
+ has been called by then), else ``(False, input_value)``."""
22
+ from meltygui.core.conversion.cache_tree import UNSET_VALUE
23
+ from meltygui.core.windowing.glfw_utils import request_render
24
+ from meltygui.view.dropdown_view import draw_dd_menu
25
+ from meltygui.view.header_view import flat_button
26
+ from meltygui.core.layout.dropdown_core import _close_menu
27
+ from meltygui.state.menu_state import _menu_state
28
+ from meltygui.model.dropdown_model import _dd_as_tuple
29
+ from meltygui.core.layout.dropdown_core import _dd_close
30
+ from meltygui.core.layout.dropdown_core import _dd_handle_keys
31
+ from meltygui.view.dropdown_view import _dd_menu_fit
32
+ from meltygui.model.dropdown_model import _dd_walk
33
+ import meltygui.core.windowing.window_api as glfw
34
+
35
+ # [tint=(0.94, 0.45, 0.25)]
36
+ open_title_alpha = 1.0 # the open title's button background
37
+ # [tint=(0.94, 0.45, 0.25)]
38
+ idle_title_alpha = 0.0 # idle titles are label-only
39
+ titles = list(input_value.keys()) if isinstance(input_value, dict) else []
40
+ state = menu_bar_state
41
+ # The bar draws from the CURRENT tint - the context's (the app's / the
42
+ # enclosing view's) or a caller's tint= the caller pushed - the way
43
+ # every other view's text does. No decorator tint of its own: one used
44
+ # to paint the titles into whatever surrounded them.
45
+ bar_tint = Melty.style_manager.get_tint() or draw_state.tint or (1.0, 1.0, 1.0)
46
+ is_open = Melty.popover_focused_ds is draw_state and state.open_title in input_value
47
+
48
+ # The slot moved on without us (a click outside, another menu opened):
49
+ # finish the close so this menu's state and text focus don't linger.
50
+ if state.open_title is not None and not is_open:
51
+ _close_menu(draw_state, state)
52
+
53
+ def open_menu(title):
54
+ if state.open_title is not None and state.open_title != title:
55
+ _dd_close(state.menus.get(state.open_title))
56
+ if state.open_title is None:
57
+ # First open of a visit: take the keyboard (editors gate off on
58
+ # Melty.text_focused_ds) and remember whose it was.
59
+ state._prev_text_focus = Melty.text_focused_ds
60
+ Melty.popover_focused_ds = draw_state
61
+ Melty._popover_open_frame = Melty.frame_count # grace the opening click
62
+ Melty.text_focused_ds = draw_state
63
+ Melty._text_focus_grant_frame = Melty.frame_count
64
+ state.open_title = title
65
+ menu_state = _menu_state(state, title)
66
+ _dd_close(menu_state)
67
+ menu_state._kbd_mode = False
68
+ menu_state._last_mouse = None
69
+ draw_state.invalidate()
70
+ request_render()
71
+
72
+ # ── the bar: one flat_button per title, left to right ──
73
+ bar_left, bar_top = draw_state.abs_left, draw_state.abs_top
74
+ mouse_x, mouse_y = imgui.get_mouse_pos()
75
+ bar_hovered = draw_state._bounding_hovered and not Melty.on_drag
76
+ x = bar_left
77
+ title_left = {}
78
+ hovered_title = None
79
+ for title in titles:
80
+ label = str(title)
81
+ text_w = imgui.calc_text_size(label).x
82
+ width = text_w + 2 * title_pad
83
+ title_left[title] = x - bar_left
84
+ hovered = bar_hovered and x <= mouse_x < x + width and bar_top <= mouse_y < bar_top + bar_height
85
+ if hovered:
86
+ hovered_title = title
87
+ showing = is_open and title == state.open_title
88
+ imgui.set_cursor_screen_pos((x, bar_top))
89
+ clicked = flat_button(label, draw_state, view_id=f"menu_bar_{unique}_{label}",
90
+ width=width, height=bar_height, hovered=hovered,
91
+ alpha=open_title_alpha if showing else idle_title_alpha,
92
+ color=bar_tint, shadow=False)
93
+ if clicked:
94
+ if showing:
95
+ _close_menu(draw_state, state)
96
+ is_open = False
97
+ else:
98
+ open_menu(title)
99
+ is_open = True
100
+ x += width + title_gap
101
+ # The bar's own content rect: the titles' row, whatever the popovers do.
102
+ imgui.set_cursor_screen_pos((bar_left, bar_top))
103
+ imgui.dummy(max(1.0, x - bar_left), bar_height)
104
+
105
+ # Native menu bar feel: with one menu open, HOVERING another title opens
106
+ # it - on the EDGE (the pointer arrived on a new title), never per frame: a
107
+ # pointer resting on a title would otherwise undo every Left / Right.
108
+ if hovered_title != state._hovered_title:
109
+ state._hovered_title = hovered_title
110
+ if is_open and hovered_title is not None and hovered_title != state.open_title:
111
+ open_menu(hovered_title)
112
+
113
+ # A mouse move hands the highlight back to hover (until the next nav key).
114
+ if is_open:
115
+ menu_state = _menu_state(state, state.open_title)
116
+ last = menu_state._last_mouse
117
+ if last is not None and (abs(mouse_x - last[0]) > 0.5 or abs(mouse_y - last[1]) > 0.5):
118
+ menu_state._kbd_mode = False
119
+ menu_state._last_mouse = (mouse_x, mouse_y)
120
+
121
+ # ── every menu is a latching popover: called EVERY frame with closed= ──
122
+ # (a window drawn only while open never re-registers on reopen — see
123
+ # draw_context_menu_items). Placed through the CURSOR, never window_pos:
124
+ # the wrapper folds a nested window's window_pos into the bar's content
125
+ # measure, and a bar_height offset would double the bar.
126
+ # Row labels are Tint.dd_text over the menu tint; a dark bar tint made
127
+ # them dim against the popover, so its value is floored like the context
128
+ # menu's (draw_context_menu_items) — raise the floor for brighter labels.
129
+ # [tint=(0.994, 0.872, 0.0)]
130
+ menu_tint_value_floor = 0.5
131
+ hue, saturation, value = rgb_to_hsv(*bar_tint[:3])
132
+ menu_tint = (hsv_to_rgb(hue, saturation, menu_tint_value_floor)
133
+ if value < menu_tint_value_floor else tuple(bar_tint[:3]))
134
+ picked = None
135
+ cursor = imgui.get_cursor_screen_pos()
136
+ for title in titles:
137
+ items = input_value[title]
138
+ menu_state = _menu_state(state, title)
139
+ showing = is_open and title == state.open_title
140
+ menu_ds = menu_state._menu_ds
141
+ if showing and menu_ds is not None:
142
+ opening = Melty._popover_open_frame == Melty.frame_count
143
+ if opening and menu_state.menu_size is not None:
144
+ menu_ds.width, menu_ds.height = menu_state.menu_size
145
+ menu_state._menu_fit = tuple(menu_state.menu_size)
146
+ if menu_ds.width is None or menu_ds.width < 5:
147
+ menu_ds.width = Toggles.Dropdown.min_width
148
+ imgui.set_cursor_screen_pos((bar_left + title_left[title], bar_top + bar_height))
149
+ changed, value, menu_ds = draw_dd_menu(
150
+ items, tint=menu_tint, name=f"{name}##menu_bar_{unique}_{title}",
151
+ closed=not showing, temp=True, shadow=False, auto_resize=False,
152
+ window_pos=(0, 0), max_height=Toggles.Dropdown.max_height,
153
+ parent_window=draw_state, swoosh=False, disable_scroll=False,
154
+ show_search=False, root_state=menu_state, path_prefix=(),
155
+ return_extras=True)
156
+ menu_state._menu_ds = menu_ds
157
+ if not showing or menu_ds is None:
158
+ continue
159
+ # Content-fit until the user drag-resizes it (draw_dropdown's rule).
160
+ current = (menu_ds.width, menu_ds.height)
161
+ last_fit = menu_state._menu_fit
162
+ if last_fit is not None and current != last_fit and current[0] and current[1]:
163
+ menu_state.menu_size = current # the resize handle moved it
164
+ menu_state._menu_fit = current
165
+ elif menu_state.menu_size is None:
166
+ fit = _dd_menu_fit(menu_ds)
167
+ if fit is not None and fit != current:
168
+ menu_ds.width, menu_ds.height = fit
169
+ request_render()
170
+ menu_state._menu_fit = (menu_ds.width, menu_ds.height)
171
+ if changed:
172
+ picked = (title, _dd_as_tuple(menu_state._picked_path), value)
173
+ imgui.set_cursor_screen_pos(cursor)
174
+
175
+ # ── keys while open: Esc closes, Left / Right cross titles, the rest is the menu's ──
176
+ if is_open and picked is None:
177
+ keys = [k for k, _mods in Melty.frame_key_events]
178
+ if glfw.KEY_ESCAPE in keys:
179
+ _close_menu(draw_state, state)
180
+ return False, input_value
181
+ title = state.open_title
182
+ menu_state = _menu_state(state, title)
183
+ items = input_value[title]
184
+ cursor_path = _dd_as_tuple(menu_state.cursor_path)
185
+ at_root = len(cursor_path) <= 1
186
+ on_branch = bool(cursor_path) and isinstance(_dd_walk(items, cursor_path), (dict, list))
187
+ step = 0
188
+ if glfw.KEY_LEFT in keys and at_root:
189
+ step = -1
190
+ elif glfw.KEY_RIGHT in keys and not on_branch:
191
+ step = 1
192
+ if step:
193
+ open_menu(titles[(titles.index(title) + step) % len(titles)])
194
+ _menu_state(state, state.open_title)._kbd_mode = True
195
+ else:
196
+ value = _dd_handle_keys(items, menu_state, search="", text_focused=False)
197
+ if value is not UNSET_VALUE:
198
+ picked = (title, _dd_as_tuple(menu_state._picked_path), value)
199
+
200
+ # ── a pick: run a callable leaf, close, and report it upstream ──
201
+ if picked is not None:
202
+ title, path, value = picked
203
+ state.selected_path = (title,) + tuple(path)
204
+ _close_menu(draw_state, state)
205
+ if callable(value):
206
+ try:
207
+ value()
208
+ except Exception:
209
+ traceback.print_exc()
210
+ return True, value
211
+
212
+ return False, input_value