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