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 @@
|
|
|
1
|
+
"""Shared framework cache machinery."""
|
|
File without changes
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import functools
|
|
2
|
+
from typing import Any
|
|
3
|
+
|
|
4
|
+
from meltygui.utils.render_utils import print_stack_trace
|
|
5
|
+
from meltygui.core.windowing.glfw_utils import request_render
|
|
6
|
+
from meltygui.core.rendering.core_decoration import auto_eval
|
|
7
|
+
from meltygui.core.rendering.core_decoration import Core
|
|
8
|
+
from meltygui.core.cache.invalidation_tracker import Note
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def live(cls):
|
|
12
|
+
# Get excluded attrs from class (if defined)
|
|
13
|
+
excluded = getattr(cls, '__excluded_attrs__', set())
|
|
14
|
+
deep_refresh_names = getattr(cls, '__deep_refresh__', set())
|
|
15
|
+
invalidate_all = getattr(cls, '__invalidate_all__', set())
|
|
16
|
+
|
|
17
|
+
setattr(cls, '__melty__', True)
|
|
18
|
+
|
|
19
|
+
# Add internal flag to excluded set
|
|
20
|
+
init_flag = f'__{cls.__name__}_initializing__'
|
|
21
|
+
excluded = excluded | {init_flag}
|
|
22
|
+
|
|
23
|
+
# Store the original methods
|
|
24
|
+
original_setattr = cls.__setattr__ if hasattr(cls, '__setattr__') else object.__setattr__
|
|
25
|
+
original_init = cls.__init__
|
|
26
|
+
|
|
27
|
+
@functools.wraps(original_setattr)
|
|
28
|
+
def new_setattr(self, name: str, value: Any) -> None:
|
|
29
|
+
# Prefix-routed writes: a view view opts in by declaring LOCATE_PREFIX
|
|
30
|
+
# and a `_locate_set(name, value)` handler (DrawState does it for the
|
|
31
|
+
# set_*where accessors). The prefix is read off type(self), not the
|
|
32
|
+
# decorated class; @live sits on the DictConversion base, so a
|
|
33
|
+
# decoration attribute lookup would never see the subclass's override.
|
|
34
|
+
# Names that don't start with 'l' pay one slice string check and nothing
|
|
35
|
+
# else; that cheapness is why the logic lives here instead of in a
|
|
36
|
+
# __setattr__ of its own, which would add a Python frame to every
|
|
37
|
+
# attribute write in the app.
|
|
38
|
+
if name[:1] == 'l':
|
|
39
|
+
locate_prefix = getattr(type(self), 'LOCATE_PREFIX', None)
|
|
40
|
+
if locate_prefix and name.startswith(locate_prefix):
|
|
41
|
+
self._locate_set(name, value)
|
|
42
|
+
return
|
|
43
|
+
meltygui = Core.melty
|
|
44
|
+
if meltygui.silence_invalidate or meltygui.frame_count < 2:
|
|
45
|
+
# Silenced - the render wrapper's own bookkeeping writes land here
|
|
46
|
+
# ~100x per render_func call, so do nothing with the raw data.
|
|
47
|
+
# scroll_offset is the one attr with a side effect even while
|
|
48
|
+
# silenced: a real change bumps the version which keys the
|
|
49
|
+
# _ancestor_scroll memo (see DrawState._ancestor_scroll).
|
|
50
|
+
if name == 'scroll_offset' and getattr(self, name, None) != value:
|
|
51
|
+
meltygui.scroll_version = getattr(meltygui, 'scroll_version', 0) + 1
|
|
52
|
+
try:
|
|
53
|
+
original_setattr(self, name, value)
|
|
54
|
+
except Exception as e:
|
|
55
|
+
print(f"Error setting attribute {name} on {self}: {e}")
|
|
56
|
+
print_stack_trace(e=e)
|
|
57
|
+
return
|
|
58
|
+
|
|
59
|
+
# Set the attribute using the original __setattr__
|
|
60
|
+
original_value = None
|
|
61
|
+
try:
|
|
62
|
+
original_value = getattr(self, name, None)
|
|
63
|
+
original_setattr(self, name, value)
|
|
64
|
+
except Exception as e:
|
|
65
|
+
print(f"Error setting attribute {name} on {self}: {e}")
|
|
66
|
+
print_stack_trace(e=e)
|
|
67
|
+
|
|
68
|
+
if name == 'scroll_offset' and value != original_value:
|
|
69
|
+
meltygui.scroll_version = getattr(meltygui, 'scroll_version', 0) + 1
|
|
70
|
+
|
|
71
|
+
# Check if we're initializing
|
|
72
|
+
initializing = getattr(self, init_flag, False)
|
|
73
|
+
|
|
74
|
+
excluded = getattr(self, '__excluded_attrs__', set())
|
|
75
|
+
deep_refresh_names = getattr(self, '__deep_refresh__', set())
|
|
76
|
+
invalidate_all = getattr(self, '__invalidate_all__', set())
|
|
77
|
+
do_deep_refresh = name in deep_refresh_names
|
|
78
|
+
visible = name not in excluded
|
|
79
|
+
visible = visible or do_deep_refresh
|
|
80
|
+
|
|
81
|
+
if name in invalidate_all:
|
|
82
|
+
if Core.melty.init_complete():
|
|
83
|
+
print(f"Invalidate all called due to change in {name}")
|
|
84
|
+
Core.melty.cache.invalidate_all()
|
|
85
|
+
return
|
|
86
|
+
|
|
87
|
+
# Private caches and excluded bookkeeping never invalidate a view.
|
|
88
|
+
# Comparing their values first would walk large text streams, line
|
|
89
|
+
# maps and syntax trees on every frame for a result we discard.
|
|
90
|
+
if (initializing or not visible or name.startswith('_')
|
|
91
|
+
or name == "driver" or meltygui.frame_count <= 2):
|
|
92
|
+
return
|
|
93
|
+
|
|
94
|
+
# Call invalidate() if:
|
|
95
|
+
# - not currently initializing
|
|
96
|
+
# - attribute is not excluded
|
|
97
|
+
# - object has invalidate method
|
|
98
|
+
try:
|
|
99
|
+
# if name == "clipped" or name == "fully_clipped":
|
|
100
|
+
# changed = value != original_value and value
|
|
101
|
+
# else:
|
|
102
|
+
changed = value != original_value
|
|
103
|
+
|
|
104
|
+
if changed:
|
|
105
|
+
# if Core.melty.frame_count > 10 and Core.melty.frame_count % 20 == 0 and name == "width":
|
|
106
|
+
# print_stack_trace()
|
|
107
|
+
|
|
108
|
+
if not initializing and visible and not name.startswith('_') \
|
|
109
|
+
and name != "driver" and Core.melty.frame_count > 2:
|
|
110
|
+
Core.melty.last_attr = name
|
|
111
|
+
from meltygui.core.diagnostics.attribute_churn import AttributeChurnMonitor
|
|
112
|
+
AttributeChurnMonitor.record(type(self).__name__, name)
|
|
113
|
+
if do_deep_refresh:
|
|
114
|
+
note = Note(name=name, reason="(deep) invalidate_up_by_obj", tint=(0, 0, 1))
|
|
115
|
+
Core.melty.cache.invalidate_up_by_obj(obj=self, max_depth=2, force=True, note=note)
|
|
116
|
+
else:
|
|
117
|
+
note = Note(name=name, reason="invalidate_by_obj", tint=(0, 0, 1))
|
|
118
|
+
Core.melty.cache.invalidate_by_obj(self, name, note=note)
|
|
119
|
+
|
|
120
|
+
from meltygui.core.runtime.toggles import Toggles
|
|
121
|
+
if Toggles.InvalidateTracker.attrib_change_stack_trace:
|
|
122
|
+
print_stack_trace()
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
except Exception as e:
|
|
128
|
+
pass
|
|
129
|
+
|
|
130
|
+
@functools.wraps(original_init)
|
|
131
|
+
def new_init(self, *args, **kwargs):
|
|
132
|
+
for name in dir(self.__class__):
|
|
133
|
+
attr = getattr(self.__class__, name, None)
|
|
134
|
+
if callable(attr) and getattr(attr, '_add_to_dict', False):
|
|
135
|
+
self.__dict__[name] = getattr(self, name)
|
|
136
|
+
else:
|
|
137
|
+
if isinstance(attr, auto_eval):
|
|
138
|
+
self.__dict__[name] = attr.fget
|
|
139
|
+
self.__dict__[name] = attr.fget.__get__(self, self.__class__)
|
|
140
|
+
# Set initialization flag
|
|
141
|
+
object.__setattr__(self, init_flag, True)
|
|
142
|
+
try:
|
|
143
|
+
# Call original __init__
|
|
144
|
+
original_init(self, *args, **kwargs)
|
|
145
|
+
finally:
|
|
146
|
+
# Clear initialization flag
|
|
147
|
+
object.__setattr__(self, init_flag, False)
|
|
148
|
+
|
|
149
|
+
# Monkey patch the class
|
|
150
|
+
cls.__setattr__ = new_setattr
|
|
151
|
+
cls.__init__ = new_init
|
|
152
|
+
|
|
153
|
+
return cls
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
from typing import Dict, Any
|
|
3
|
+
|
|
4
|
+
from meltygui.core.diagnostics.notifications import notify
|
|
5
|
+
from meltygui.core.runtime.toggles import Toggles
|
|
6
|
+
from meltygui.core.rendering.core_decoration import defaults
|
|
7
|
+
from meltygui.core.rendering.core_decoration import Core
|
|
8
|
+
|
|
9
|
+
@dataclass
|
|
10
|
+
class Note:
|
|
11
|
+
name: str = ""
|
|
12
|
+
tint: tuple = (1,0,0)
|
|
13
|
+
reason: str = ""
|
|
14
|
+
draw_state: any = None
|
|
15
|
+
frame: int = 0
|
|
16
|
+
rect: any=None
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@defaults(attrib="keep_for_frames", tint=(0.22271497547626495,0.674418568611145,0.2395225167274475))
|
|
20
|
+
class InvalidateTracker:
|
|
21
|
+
invalidations: Dict[str, Any] = {}
|
|
22
|
+
|
|
23
|
+
@classmethod
|
|
24
|
+
def on_frame_end(cls):
|
|
25
|
+
if not Toggles.InvalidateTracker.enable and not Toggles.InvalidateTracker.draw_bvh:
|
|
26
|
+
cls.invalidations = {}
|
|
27
|
+
return
|
|
28
|
+
|
|
29
|
+
to_delete = []
|
|
30
|
+
|
|
31
|
+
for key in list(cls.invalidations.keys()):
|
|
32
|
+
inv = cls.invalidations[key]
|
|
33
|
+
on_frame = inv.frame
|
|
34
|
+
|
|
35
|
+
if on_frame + Toggles.InvalidateTracker.keep_for_frames < Core.melty.frame_count:
|
|
36
|
+
to_delete.append(key)
|
|
37
|
+
|
|
38
|
+
for key in to_delete:
|
|
39
|
+
cls.invalidations.pop(key, None)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
if Toggles.InvalidateTracker.enable:
|
|
43
|
+
notify(f"Invalidations: {len(cls.invalidations)}", tag="InvalidateTracker", tint=(1,1,0.4), urgent=False)
|