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.
- meltygui/__init__.py +107 -0
- meltygui/accounts/__init__.py +0 -0
- meltygui/accounts/internet_accounts.py +1355 -0
- meltygui/chat/__init__.py +91 -0
- meltygui/chat/activity.py +75 -0
- meltygui/chat/backends.py +36 -0
- meltygui/chat/chat_interface.py +732 -0
- meltygui/chat/chat_proxy.py +352 -0
- meltygui/chat/codex_proxy.py +592 -0
- meltygui/chat/codex_settings.py +100 -0
- meltygui/chat/codex_transport.py +60 -0
- meltygui/chat/command_parser.py +204 -0
- meltygui/chat/images.py +227 -0
- meltygui/chat/messages.py +417 -0
- meltygui/chat/metadata.py +139 -0
- meltygui/chat/writer_locks.py +64 -0
- meltygui/code/__init__.py +0 -0
- meltygui/code/basic_converters.py +533 -0
- meltygui/code/chain_converters.py +2111 -0
- meltygui/code/code_checks.py +2209 -0
- meltygui/code/core_syntax.py +1430 -0
- meltygui/code/file_converters.py +1933 -0
- meltygui/code/fileref.py +702 -0
- meltygui/code/hotswap_guard.py +144 -0
- meltygui/code/libcst_conversion.py +9724 -0
- meltygui/code/live_instrument.py +392 -0
- meltygui/code/live_view.py +2490 -0
- meltygui/code/melty_scan.py +2684 -0
- meltygui/code/new_codecs.py +1255 -0
- meltygui/code/new_converters.py +3017 -0
- meltygui/code/project_code.py +278 -0
- meltygui/code/source_context.py +63 -0
- meltygui/code/symbol_roster.py +1588 -0
- meltygui/code/syntax_check.py +34 -0
- meltygui/code/syntax_check_worker.py +114 -0
- meltygui/completion/__init__.py +0 -0
- meltygui/completion/fim.py +1232 -0
- meltygui/completion/fim_context.py +481 -0
- meltygui/completion/providers/__init__.py +0 -0
- meltygui/completion/providers/anthropic_oauth.py +446 -0
- meltygui/completion/providers/anthropic_requests.py +69 -0
- meltygui/completion/providers/claude.py +203 -0
- meltygui/completion/providers/claude_usage.py +499 -0
- meltygui/completion/providers/codex_accounts.py +180 -0
- meltygui/completion/providers/copilot.py +617 -0
- meltygui/completion/providers/oauth_popup.py +220 -0
- meltygui/completion/providers/ollama.py +320 -0
- meltygui/completion/providers/profiles.py +23 -0
- meltygui/core/README.md +88 -0
- meltygui/core/__init__.py +1 -0
- meltygui/core/automation/__init__.py +1 -0
- meltygui/core/automation/action_core.py +153 -0
- meltygui/core/automation/collection_action.py +45 -0
- meltygui/core/automation/mcp_eval.py +167 -0
- meltygui/core/automation/mcp_hotswap.py +107 -0
- meltygui/core/automation/mcp_query.py +552 -0
- meltygui/core/automation/mcp_server.py +657 -0
- meltygui/core/automation/orchestration_core.py +2636 -0
- meltygui/core/automation/query_core.py +124 -0
- meltygui/core/automation/search_core.py +26 -0
- meltygui/core/automation/selector_core.py +340 -0
- meltygui/core/automation/value_core.py +1752 -0
- meltygui/core/cache/__init__.py +1 -0
- meltygui/core/cache/cache_diagnostics.py +0 -0
- meltygui/core/cache/invalidation_decoration.py +153 -0
- meltygui/core/cache/invalidation_tracker.py +43 -0
- meltygui/core/cache/tile_cache.py +5968 -0
- meltygui/core/conversion/__init__.py +1 -0
- meltygui/core/conversion/bubbling.py +599 -0
- meltygui/core/conversion/cache_tree.py +188 -0
- meltygui/core/conversion/chain.py +113 -0
- meltygui/core/conversion/converter_register.py +145 -0
- meltygui/core/conversion/data_decoration.py +67 -0
- meltygui/core/conversion/dict_conversion.py +1815 -0
- meltygui/core/conversion/dict_conversion_util.py +177 -0
- meltygui/core/conversion/dynamic_obj.py +89 -0
- meltygui/core/conversion/graph_compare.py +183 -0
- meltygui/core/conversion/load_save_v2.py +1032 -0
- meltygui/core/conversion/missing_saved_class.py +39 -0
- meltygui/core/conversion/path_finder.py +606 -0
- meltygui/core/conversion/render_host.py +1083 -0
- meltygui/core/core_render.py +6537 -0
- meltygui/core/definition_hotswap.py +231 -0
- meltygui/core/diagnostics/__init__.py +1 -0
- meltygui/core/diagnostics/attribute_churn.py +38 -0
- meltygui/core/diagnostics/fps_counter.py +39 -0
- meltygui/core/diagnostics/gpu_frame_timer.py +103 -0
- meltygui/core/diagnostics/inspection_core.py +169 -0
- meltygui/core/diagnostics/monitor_core.py +105 -0
- meltygui/core/diagnostics/notifications.py +706 -0
- meltygui/core/diagnostics/perf_trace.py +281 -0
- meltygui/core/diagnostics/profile_decoration.py +88 -0
- meltygui/core/diagnostics/resize_trace.py +62 -0
- meltygui/core/diagnostics/screenshot_core.py +247 -0
- meltygui/core/diagnostics/session_status.py +98 -0
- meltygui/core/diagnostics/trace_core.py +445 -0
- meltygui/core/files/__init__.py +1 -0
- meltygui/core/files/file_core.py +208 -0
- meltygui/core/files/file_explorer_core.py +104 -0
- meltygui/core/files/file_tree_core.py +198 -0
- meltygui/core/files/file_watch_core.py +43 -0
- meltygui/core/files/import_graph_core.py +43 -0
- meltygui/core/files/metadata_core.py +51 -0
- meltygui/core/graphics/__init__.py +1 -0
- meltygui/core/graphics/cuda_context_core.py +166 -0
- meltygui/core/graphics/cuda_interop_core.py +136 -0
- meltygui/core/graphics/cuda_kernel_core.py +91 -0
- meltygui/core/graphics/framebuffer_recorder.py +337 -0
- meltygui/core/graphics/gl_state.py +658 -0
- meltygui/core/graphics/lut_core.py +52 -0
- meltygui/core/graphics/overlay_renderer.py +984 -0
- meltygui/core/graphics/scene_target.py +180 -0
- meltygui/core/graphics/screenshot.py +439 -0
- meltygui/core/graphics/shader_func.py +478 -0
- meltygui/core/graphics/tensor_core.py +45 -0
- meltygui/core/graphics/text_texture.py +329 -0
- meltygui/core/graphics/wayland_color.py +635 -0
- meltygui/core/input/__init__.py +1 -0
- meltygui/core/input/collision.py +165 -0
- meltygui/core/input/drag_drop_core.py +1525 -0
- meltygui/core/input/hypr_left_drag.py +323 -0
- meltygui/core/input/input_core.py +245 -0
- meltygui/core/input/input_handler.py +1101 -0
- meltygui/core/input/mouse_cursor.py +355 -0
- meltygui/core/input/pynput_backend.py +1054 -0
- meltygui/core/input/space_mouse.py +338 -0
- meltygui/core/input/touchpad_backend.py +393 -0
- meltygui/core/input/view_selection.py +177 -0
- meltygui/core/layout/__init__.py +1 -0
- meltygui/core/layout/column_core.py +2153 -0
- meltygui/core/layout/cursor_core.py +161 -0
- meltygui/core/layout/dropdown_core.py +278 -0
- meltygui/core/layout/edge_constraints.py +155 -0
- meltygui/core/layout/grid_core.py +117 -0
- meltygui/core/layout/header_core.py +23 -0
- meltygui/core/layout/header_runtime.py +67 -0
- meltygui/core/layout/layout_core.py +87 -0
- meltygui/core/layout/tile_manager_core.py +591 -0
- meltygui/core/melty.py +6726 -0
- meltygui/core/module_map.json +896 -0
- meltygui/core/module_names.py +19 -0
- meltygui/core/rendering/__init__.py +1 -0
- meltygui/core/rendering/core_decoration.py +431 -0
- meltygui/core/rendering/core_render_helpers.py +328 -0
- meltygui/core/rendering/func_metadata.py +398 -0
- meltygui/core/rendering/mode.py +818 -0
- meltygui/core/rendering/mode_defaults.py +41 -0
- meltygui/core/rendering/modes.py +136 -0
- meltygui/core/rendering/parameter_core.py +1665 -0
- meltygui/core/rendering/render_dispatch.py +1891 -0
- meltygui/core/rendering/render_funcs.py +273 -0
- meltygui/core/rendering/shaped.py +312 -0
- meltygui/core/rendering/window_decoration.py +25 -0
- meltygui/core/runtime/__init__.py +1 -0
- meltygui/core/runtime/app.py +735 -0
- meltygui/core/runtime/app_session.py +140 -0
- meltygui/core/runtime/background.py +564 -0
- meltygui/core/runtime/extensions.py +53 -0
- meltygui/core/runtime/gc_manager.py +1163 -0
- meltygui/core/runtime/lifecycle.py +21 -0
- meltygui/core/runtime/paths.py +27 -0
- meltygui/core/runtime/settings.py +14 -0
- meltygui/core/runtime/singleton.py +16 -0
- meltygui/core/runtime/thread_safe_bool.py +24 -0
- meltygui/core/runtime/thread_signal.py +30 -0
- meltygui/core/runtime/toggles.py +3115 -0
- meltygui/core/services/__init__.py +1 -0
- meltygui/core/services/account_core.py +10 -0
- meltygui/core/services/chat_core.py +19 -0
- meltygui/core/services/claude_terminal_core.py +346 -0
- meltygui/core/services/terminal_core.py +458 -0
- meltygui/core/services/terminal_runtime.py +78 -0
- meltygui/core/styling/__init__.py +1 -0
- meltygui/core/styling/color_core.py +46 -0
- meltygui/core/styling/fonts.py +639 -0
- meltygui/core/styling/global_style.py +338 -0
- meltygui/core/styling/style.py +198 -0
- meltygui/core/styling/style_core.py +522 -0
- meltygui/core/styling/warm_start.py +149 -0
- meltygui/core/windowing/__init__.py +1 -0
- meltygui/core/windowing/backends/PYIMGUI_LICENSE +28 -0
- meltygui/core/windowing/backends/__init__.py +1 -0
- meltygui/core/windowing/backends/imgui_renderer.py +138 -0
- meltygui/core/windowing/backends/native_wayland.py +850 -0
- meltygui/core/windowing/backends/protocols/xdg-decoration-unstable-v1.xml +156 -0
- meltygui/core/windowing/backends/protocols/xdg-shell.xml +1420 -0
- meltygui/core/windowing/backends/wayland_protocol.py +101 -0
- meltygui/core/windowing/dock_core.py +182 -0
- meltygui/core/windowing/frame_geometry.py +42 -0
- meltygui/core/windowing/geometry_feed.py +864 -0
- meltygui/core/windowing/glfw_utils.py +1343 -0
- meltygui/core/windowing/os_frame.py +1552 -0
- meltygui/core/windowing/surface.py +643 -0
- meltygui/core/windowing/titlebar.py +1560 -0
- meltygui/core/windowing/titlebar_buttons.py +281 -0
- meltygui/core/windowing/wayland_move.py +932 -0
- meltygui/core/windowing/window_api.py +62 -0
- meltygui/core/windowing/window_constants.py +339 -0
- meltygui/core/windowing/window_visibility.py +162 -0
- meltygui/debug/__init__.py +0 -0
- meltygui/debug/app_view_utils.py +9 -0
- meltygui/editor/__init__.py +0 -0
- meltygui/editor/bash_syntax.py +30 -0
- meltygui/editor/code_line_fast.py +152 -0
- meltygui/editor/diff.py +139 -0
- meltygui/editor/external_changes.py +159 -0
- meltygui/editor/file_header.py +41 -0
- meltygui/editor/live_usage.py +169 -0
- meltygui/editor/live_view_views.py +1803 -0
- meltygui/editor/pending_save.py +1351 -0
- meltygui/editor/roster_tints.py +547 -0
- meltygui/editor/source_preview.py +16 -0
- meltygui/editor/source_tools.py +10 -0
- meltygui/editor/source_ui.py +70 -0
- meltygui/editor/spell_check.py +77 -0
- meltygui/editor/text_editor.py +9076 -0
- meltygui/editor/usage_picker.py +538 -0
- meltygui/events/__init__.py +0 -0
- meltygui/events/example.py +118 -0
- meltygui/examples/__init__.py +0 -0
- meltygui/examples/columns_demo.py +33 -0
- meltygui/examples/columns_window_demo.py +60 -0
- meltygui/examples/context_menu_demo.py +24 -0
- meltygui/examples/context_menu_window_demo.py +49 -0
- meltygui/examples/gui_playground.py +127 -0
- meltygui/examples/live_view_playground.py +256 -0
- meltygui/examples/lora.py +43 -0
- meltygui/examples/lora_data.py +59 -0
- meltygui/examples/lora_policies.py +67 -0
- meltygui/examples/mode_demo.py +49 -0
- meltygui/examples/modifies_demo.py +119 -0
- meltygui/examples/scalar_policies.py +60 -0
- meltygui/examples/style_layouts.py +149 -0
- meltygui/examples/tile_manager_demo.py +74 -0
- meltygui/examples/tint_demo.py +160 -0
- meltygui/examples/tint_functions.py +56 -0
- meltygui/examples/trace_demo.py +88 -0
- meltygui/examples/two_windows.py +36 -0
- meltygui/files/__init__.py +0 -0
- meltygui/files/fast_file_explorer.py +439 -0
- meltygui/gnome_extension/lsd-window-geometry@latent-descent/extension.js +237 -0
- meltygui/gnome_extension/lsd-window-geometry@latent-descent/lsd-window-geometry@latent-descent.iml +9 -0
- meltygui/gnome_extension/lsd-window-geometry@latent-descent/metadata.json +7 -0
- meltygui/graphics/__init__.py +6 -0
- meltygui/graphics/base.py +85 -0
- meltygui/graphics/examples.py +507 -0
- meltygui/graphics/executor.py +520 -0
- meltygui/graphics/filter.py +667 -0
- meltygui/graphics/filter.pyi +856 -0
- meltygui/graphics/generate_stubs.py +22 -0
- meltygui/graphics/registry.py +203 -0
- meltygui/graphics/shader_compiler.py +155 -0
- meltygui/graphics/shaders.py +1302 -0
- meltygui/graphics/stub_generator.py +250 -0
- meltygui/graphics/texture_manager.py +170 -0
- meltygui/graphics/texture_min_max.py +295 -0
- meltygui/hdr_color.py +757 -0
- meltygui/image_load.py +308 -0
- meltygui/model/__init__.py +1 -0
- meltygui/model/account_model.py +142 -0
- meltygui/model/camera_model.py +159 -0
- meltygui/model/chat_model.py +86 -0
- meltygui/model/code_model.py +62 -0
- meltygui/model/code_proxy_model.py +876 -0
- meltygui/model/collection_model.py +41 -0
- meltygui/model/color_model.py +127 -0
- meltygui/model/cuda_tensor_model.py +36 -0
- meltygui/model/cuda_texture_model.py +149 -0
- meltygui/model/dropdown_model.py +137 -0
- meltygui/model/file_metadata_model.py +73 -0
- meltygui/model/file_model.py +289 -0
- meltygui/model/format_model.py +390 -0
- meltygui/model/graph_model.py +98 -0
- meltygui/model/icon_model.py +1024 -0
- meltygui/model/import_graph_model.py +468 -0
- meltygui/model/layout_model.py +15 -0
- meltygui/model/lut_model.py +266 -0
- meltygui/model/search_model.py +173 -0
- meltygui/model/tensor_model.py +402 -0
- meltygui/model/terminal_model.py +329 -0
- meltygui/model/texture_model.py +146 -0
- meltygui/model/tile_model.py +24 -0
- meltygui/model/trace_model.py +198 -0
- meltygui/model/trace_report_model.py +146 -0
- meltygui/models/__init__.py +0 -0
- meltygui/models/file_meta.py +613 -0
- meltygui/models/function_console.py +184 -0
- meltygui/models/orchestration.py +48 -0
- meltygui/pbr.py +1576 -0
- meltygui/png_unfilter.c +49 -0
- meltygui/resources/JetBrainsMono-Regular.ttf +0 -0
- meltygui/resources/THIRD_PARTY_NOTICES.md +21 -0
- meltygui/resources/dejavu/DejaVuSans-Bold.ttf +0 -0
- meltygui/resources/dejavu/DejaVuSans-ExtraLight.ttf +0 -0
- meltygui/resources/dejavu/DejaVuSans.ttf +0 -0
- meltygui/resources/dejavu/LICENSE.txt +78 -0
- meltygui/resources/fontawesome-LICENSE.txt +121 -0
- meltygui/resources/fontawesome-webfont.ttf +0 -0
- meltygui/resources/hdri/studio_small_09_1k.hdr +0 -0
- meltygui/resources/jetbrains-weights/JetBrainsMono-Bold.ttf +0 -0
- meltygui/resources/jetbrains-weights/JetBrainsMono-ExtraBold.ttf +0 -0
- meltygui/resources/jetbrains-weights/JetBrainsMono-ExtraLight.ttf +0 -0
- meltygui/resources/jetbrains-weights/JetBrainsMono-Light.ttf +0 -0
- meltygui/resources/jetbrains-weights/JetBrainsMono-Medium.ttf +0 -0
- meltygui/resources/jetbrains-weights/JetBrainsMono-SemiBold.ttf +0 -0
- meltygui/resources/jetbrains-weights/JetBrainsMono-Thin.ttf +0 -0
- meltygui/resources/jetbrains-weights/OFL.txt +93 -0
- meltygui/resources/jetbrains-weights/README.md +2 -0
- meltygui/state/__init__.py +0 -0
- meltygui/state/account_state.py +22 -0
- meltygui/state/animation_state.py +97 -0
- meltygui/state/annotation_state.py +22 -0
- meltygui/state/chat_state.py +36 -0
- meltygui/state/code_state.py +10 -0
- meltygui/state/core_enums.py +59 -0
- meltygui/state/core_markers.py +115 -0
- meltygui/state/core_undo.py +1075 -0
- meltygui/state/file_state.py +75 -0
- meltygui/state/graph_state.py +26 -0
- meltygui/state/inspection_state.py +47 -0
- meltygui/state/menu_state.py +10 -0
- meltygui/state/model_enums.py +11 -0
- meltygui/state/new_core_model.py +2394 -0
- meltygui/state/orchestration_state.py +14 -0
- meltygui/state/query_state.py +24 -0
- meltygui/state/tensor_state.py +10 -0
- meltygui/state/terminal_state.py +23 -0
- meltygui/state/trace_state.py +32 -0
- meltygui/state/voxel_state.py +12 -0
- meltygui/text_index.py +816 -0
- meltygui/utils/__init__.py +0 -0
- meltygui/utils/jump_to_code.py +344 -0
- meltygui/utils/pkl_inspect.py +90 -0
- meltygui/utils/render_utils.py +1419 -0
- meltygui/view/__init__.py +1 -0
- meltygui/view/account_view.py +524 -0
- meltygui/view/action_view.py +73 -0
- meltygui/view/chat_decoration_view.py +112 -0
- meltygui/view/chat_view.py +1703 -0
- meltygui/view/code_view.py +2677 -0
- meltygui/view/collection_view.py +1185 -0
- meltygui/view/color_view.py +824 -0
- meltygui/view/control_view.py +559 -0
- meltygui/view/decoration_view.py +439 -0
- meltygui/view/diagnostic_view.py +177 -0
- meltygui/view/dropdown_view.py +1082 -0
- meltygui/view/file_view.py +1599 -0
- meltygui/view/graph_cuda_view.py +105 -0
- meltygui/view/graph_view.py +882 -0
- meltygui/view/header_view.py +848 -0
- meltygui/view/input_view.py +238 -0
- meltygui/view/inspection_view.py +1783 -0
- meltygui/view/layout_view.py +596 -0
- meltygui/view/lut_view.py +45 -0
- meltygui/view/menu_view.py +212 -0
- meltygui/view/orchestration_view.py +658 -0
- meltygui/view/query_view.py +118 -0
- meltygui/view/search_view.py +342 -0
- meltygui/view/tab_view.py +258 -0
- meltygui/view/tensor_view.py +430 -0
- meltygui/view/terminal_view.py +355 -0
- meltygui/view/text_view.py +8031 -0
- meltygui/view/texture_view.py +480 -0
- meltygui/view/tile_view.py +38 -0
- meltygui/view/trace_view.py +923 -0
- meltygui/view/voxel_cuda_view.py +824 -0
- meltygui/view/voxel_view.py +1860 -0
- meltygui/view/window_view.py +111 -0
- meltygui-0.1.0.dist-info/METADATA +143 -0
- meltygui-0.1.0.dist-info/RECORD +372 -0
- meltygui-0.1.0.dist-info/WHEEL +4 -0
- 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
|