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,184 @@
|
|
|
1
|
+
"""Thread-scoped Python standard streams for the editor's function console.
|
|
2
|
+
|
|
3
|
+
Other application threads keep their original streams. OS file descriptors and
|
|
4
|
+
subprocess output are deliberately untouched. Captures are bounded per run.
|
|
5
|
+
"""
|
|
6
|
+
import contextlib
|
|
7
|
+
import io
|
|
8
|
+
import sys
|
|
9
|
+
import threading
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
_local = threading.local()
|
|
13
|
+
_stream_lock = threading.RLock()
|
|
14
|
+
_stream_users = 0
|
|
15
|
+
_proxies = {}
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class _StreamProxy:
|
|
19
|
+
def __init__(self, name, fallback):
|
|
20
|
+
self.name = name
|
|
21
|
+
self.fallback = fallback
|
|
22
|
+
|
|
23
|
+
def __getattr__(self, name):
|
|
24
|
+
streams = getattr(_local, 'streams', {})
|
|
25
|
+
return getattr(streams.get(self.name, self.fallback), name)
|
|
26
|
+
|
|
27
|
+
def __iter__(self):
|
|
28
|
+
return self
|
|
29
|
+
|
|
30
|
+
def __next__(self):
|
|
31
|
+
line = self.readline()
|
|
32
|
+
if not line:
|
|
33
|
+
raise StopIteration
|
|
34
|
+
return line
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
@contextlib.contextmanager
|
|
38
|
+
def capture(console):
|
|
39
|
+
global _stream_users
|
|
40
|
+
with _stream_lock:
|
|
41
|
+
if not _stream_users:
|
|
42
|
+
for name in ('stdin', 'stdout', 'stderr'):
|
|
43
|
+
proxy = _StreamProxy(name, getattr(sys, name))
|
|
44
|
+
_proxies[name] = proxy
|
|
45
|
+
setattr(sys, name, proxy)
|
|
46
|
+
_stream_users += 1
|
|
47
|
+
previous = getattr(_local, 'streams', {})
|
|
48
|
+
_local.streams = dict(stdin=console.stdin, stdout=console.stdout, stderr=console.stderr)
|
|
49
|
+
try:
|
|
50
|
+
yield
|
|
51
|
+
finally:
|
|
52
|
+
_local.streams = previous
|
|
53
|
+
with _stream_lock:
|
|
54
|
+
_stream_users -= 1
|
|
55
|
+
if not _stream_users:
|
|
56
|
+
for name, proxy in _proxies.items():
|
|
57
|
+
if getattr(sys, name) is proxy:
|
|
58
|
+
setattr(sys, name, proxy.fallback)
|
|
59
|
+
_proxies.clear()
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class _Output(io.TextIOBase):
|
|
63
|
+
encoding = 'utf-8'
|
|
64
|
+
|
|
65
|
+
def __init__(self, console):
|
|
66
|
+
self.console = console
|
|
67
|
+
|
|
68
|
+
def writable(self):
|
|
69
|
+
return True
|
|
70
|
+
|
|
71
|
+
def write(self, text):
|
|
72
|
+
if not isinstance(text, str):
|
|
73
|
+
raise TypeError('write() requires str')
|
|
74
|
+
self.console.append(text)
|
|
75
|
+
return len(text)
|
|
76
|
+
|
|
77
|
+
def flush(self):
|
|
78
|
+
pass
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
class _Input(io.TextIOBase):
|
|
82
|
+
encoding = 'utf-8'
|
|
83
|
+
|
|
84
|
+
def __init__(self, console):
|
|
85
|
+
self.console = console
|
|
86
|
+
|
|
87
|
+
def readable(self):
|
|
88
|
+
return True
|
|
89
|
+
|
|
90
|
+
def readline(self, size=-1):
|
|
91
|
+
return self.console.read(size, line=True)
|
|
92
|
+
|
|
93
|
+
def read(self, size=-1):
|
|
94
|
+
return self.console.read(size, line=False)
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
class FunctionConsole:
|
|
98
|
+
LIMIT = 200_000
|
|
99
|
+
|
|
100
|
+
def __init__(self, wake=lambda: None):
|
|
101
|
+
self.wake = wake
|
|
102
|
+
self.condition = threading.Condition()
|
|
103
|
+
self.text = ''
|
|
104
|
+
self.input_text = ''
|
|
105
|
+
self.eof = False
|
|
106
|
+
self.waiting = False
|
|
107
|
+
self.running = False
|
|
108
|
+
self.draft = ''
|
|
109
|
+
self.thread = None
|
|
110
|
+
self.stdin = _Input(self)
|
|
111
|
+
self.stdout = _Output(self)
|
|
112
|
+
self.stderr = _Output(self)
|
|
113
|
+
|
|
114
|
+
def append(self, text):
|
|
115
|
+
with self.condition:
|
|
116
|
+
self.text = (self.text + text)[-self.LIMIT:]
|
|
117
|
+
self.wake()
|
|
118
|
+
|
|
119
|
+
def snapshot(self):
|
|
120
|
+
with self.condition:
|
|
121
|
+
return self.text, self.running, self.waiting
|
|
122
|
+
|
|
123
|
+
def send(self, text):
|
|
124
|
+
with self.condition:
|
|
125
|
+
if self.eof or not self.running:
|
|
126
|
+
return
|
|
127
|
+
self.text = (self.text + text + '\n')[-self.LIMIT:]
|
|
128
|
+
self.input_text += text + '\n'
|
|
129
|
+
self.condition.notify_all()
|
|
130
|
+
self.wake()
|
|
131
|
+
|
|
132
|
+
def close_input(self):
|
|
133
|
+
with self.condition:
|
|
134
|
+
self.eof = True
|
|
135
|
+
self.condition.notify_all()
|
|
136
|
+
self.wake()
|
|
137
|
+
|
|
138
|
+
def read(self, size, line):
|
|
139
|
+
if size == 0:
|
|
140
|
+
return ''
|
|
141
|
+
with self.condition:
|
|
142
|
+
while True:
|
|
143
|
+
newline = self.input_text.find('\n')
|
|
144
|
+
enough = size >= 0 and len(self.input_text) >= size
|
|
145
|
+
if self.eof or enough or (line and newline >= 0):
|
|
146
|
+
count = len(self.input_text) if size < 0 else min(size, len(self.input_text))
|
|
147
|
+
if line and newline >= 0:
|
|
148
|
+
count = min(count, newline + 1)
|
|
149
|
+
result, self.input_text = self.input_text[:count], self.input_text[count:]
|
|
150
|
+
self.waiting = False
|
|
151
|
+
return result
|
|
152
|
+
self.waiting = True
|
|
153
|
+
self.wake()
|
|
154
|
+
self.condition.wait()
|
|
155
|
+
|
|
156
|
+
def start(self, run, done):
|
|
157
|
+
"""Start one run; done(result) runs on the worker and must marshal UI work."""
|
|
158
|
+
with self.condition:
|
|
159
|
+
if self.running:
|
|
160
|
+
return False
|
|
161
|
+
self.running = True
|
|
162
|
+
self.waiting = self.eof = False
|
|
163
|
+
self.text = self.input_text = self.draft = ''
|
|
164
|
+
|
|
165
|
+
def worker():
|
|
166
|
+
try:
|
|
167
|
+
with capture(self):
|
|
168
|
+
try:
|
|
169
|
+
result = run()
|
|
170
|
+
except BaseException as error:
|
|
171
|
+
# SystemExit/KeyboardInterrupt must finish this run,
|
|
172
|
+
# never terminate the editor or strand its busy thread.
|
|
173
|
+
result = (False, f'{type(error).__name__}: {error}')
|
|
174
|
+
self.append(result[1] + '\n')
|
|
175
|
+
finally:
|
|
176
|
+
with self.condition:
|
|
177
|
+
self.running = self.waiting = False
|
|
178
|
+
self.wake()
|
|
179
|
+
done(result)
|
|
180
|
+
|
|
181
|
+
self.thread = threading.Thread(target=worker, name='meltygui-function-console', daemon=True)
|
|
182
|
+
self.thread.start()
|
|
183
|
+
self.wake()
|
|
184
|
+
return True
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
from typing import Dict
|
|
2
|
+
from meltygui.core.conversion.dict_conversion import DictConversion
|
|
3
|
+
|
|
4
|
+
class Orchestration(DictConversion):
|
|
5
|
+
"""One recorded input take: a stream of raw input events plus the
|
|
6
|
+
undo-stack cues that anchor its replay. Events and cues are PLAIN
|
|
7
|
+
primitive tuples so the lists serialize as data with the app state.
|
|
8
|
+
|
|
9
|
+
events: (dt, kind, *args) — dt seconds from record start; kind one of
|
|
10
|
+
"move" (x, y) · "down"/"up" (input_id, x, y) · "change" (input_id,
|
|
11
|
+
value — scroll) · "key" (glfw key, mods — mirrors
|
|
12
|
+
Melty.frame_key_events) · "char" (codepoint — imgui text input).
|
|
13
|
+
cues: (event_index, stack_name, change_kind, display_name, new_repr,
|
|
14
|
+
tile_repr) — recorded whenever an undo stack grew a new GROUP during
|
|
15
|
+
recording: "after replaying event_index events, this change should
|
|
16
|
+
exist." Replay pauses there until the live stack shows a matching
|
|
17
|
+
change (see orchestrator.Orchestrator._cue_satisfied)."""
|
|
18
|
+
|
|
19
|
+
def __init__(self):
|
|
20
|
+
super().__init__()
|
|
21
|
+
self.name = "Orchestration"
|
|
22
|
+
# True once the user renamed it by hand - stop_recording's auto-name
|
|
23
|
+
# (from the take's cues) never overwrites a hand-given name.
|
|
24
|
+
self.custom_name = False
|
|
25
|
+
self.tint = (0.719, 0.478, 0.208)
|
|
26
|
+
# When checked, finishing a replay walks the undo stacks back to
|
|
27
|
+
# where they were when the replay started - the app restores itself.
|
|
28
|
+
self.restore_on_finish = False
|
|
29
|
+
self.events = []
|
|
30
|
+
self.cues = []
|
|
31
|
+
# Argument overrides for the generalized commands: str(cue,) ->
|
|
32
|
+
# value. Empty = play reproduces the recording exactly (raw replay);
|
|
33
|
+
# any override routes replay through the command layer (new_value
|
|
34
|
+
# per leaf-edit cue, recorded value unless overridden here).
|
|
35
|
+
self.overrides = {}
|
|
36
|
+
self.duration = 0.0
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class Orchestrations(DictConversion):
|
|
40
|
+
"""The collection the Orchestrator window manages: id -> Orchestration.
|
|
41
|
+
Selection is UI state and lives on the window's draw_state (the
|
|
42
|
+
`selected_key` auto-state param), never here."""
|
|
43
|
+
|
|
44
|
+
def __init__(self):
|
|
45
|
+
super().__init__()
|
|
46
|
+
self.orchestrations: Dict[str, Orchestration] = {}
|
|
47
|
+
|
|
48
|
+
|