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,67 @@
|
|
|
1
|
+
"""Closable Melty LoRA windows sharing data and rendering, with different policies."""
|
|
2
|
+
import meltygui_imgui as imgui
|
|
3
|
+
import meltygui
|
|
4
|
+
from meltygui import Style
|
|
5
|
+
from meltygui import glfw_window
|
|
6
|
+
from meltygui import pressed
|
|
7
|
+
from meltygui import default_scalar_accumulation
|
|
8
|
+
from meltygui import default_tint_accumulation
|
|
9
|
+
from meltygui.examples.lora_data import lora_preview
|
|
10
|
+
from meltygui.examples.lora_data import nested_style_kwargs
|
|
11
|
+
from meltygui.examples.tint_functions import darken
|
|
12
|
+
from meltygui.examples.tint_functions import wave
|
|
13
|
+
from meltygui.examples.scalar_policies import subtract
|
|
14
|
+
from meltygui.examples.scalar_policies import size_curve
|
|
15
|
+
from meltygui.examples.scalar_policies import weight_curve
|
|
16
|
+
from meltygui.examples.scalar_policies import shadow_curve
|
|
17
|
+
from meltygui.core.melty import Melty
|
|
18
|
+
from meltygui.core.core_render import render_func
|
|
19
|
+
from meltygui.view.header_view import draw_header
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
loras = lora_preview()
|
|
23
|
+
children = nested_style_kwargs()
|
|
24
|
+
node = children
|
|
25
|
+
while node:
|
|
26
|
+
node['style'] = Style((.035, .025, .045), font_size=.5, font_weight=25, shadow_offset=.4)
|
|
27
|
+
node = node.get('child_kwargs')
|
|
28
|
+
|
|
29
|
+
policies = (
|
|
30
|
+
('Loras / Add', default_tint_accumulation, default_scalar_accumulation,
|
|
31
|
+
default_scalar_accumulation, default_scalar_accumulation),
|
|
32
|
+
('Loras / Subtract', darken, subtract, subtract, subtract),
|
|
33
|
+
('Loras / Nonlinear', wave, size_curve, weight_curve, shadow_curve),
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def reopen():
|
|
38
|
+
for name, *_ in policies:
|
|
39
|
+
Melty.open_window(name)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
@render_func(use_cache=False)
|
|
43
|
+
def lora_contents(input_value, draw_state):
|
|
44
|
+
changed, _ = meltygui.draw_any(input_value, name='Loras', icon='',
|
|
45
|
+
style=Style((.035, .025, .045)),
|
|
46
|
+
initial={'expanded': True}, child_kwargs=children)
|
|
47
|
+
return changed, input_value
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
@glfw_window(name='LoRA accumulation comparison', width=1800, height=1040,
|
|
51
|
+
show_name=True, with_header=draw_header, app_id='meltygui-gui-playground', style=Style())
|
|
52
|
+
@render_func(use_cache=False)
|
|
53
|
+
def lora_comparison(input_value, draw_state):
|
|
54
|
+
from meltygui.examples.gui_playground import toggle_styles
|
|
55
|
+
if pressed('ctrl+d'):
|
|
56
|
+
toggle_styles()
|
|
57
|
+
meltygui.draw_menu_bar({'Windows': {'Reopen LoRA windows': reopen},
|
|
58
|
+
'Styles': {'Enable / disable (Ctrl+D)': toggle_styles}}, name='lora-comparison-menu')
|
|
59
|
+
imgui.text('Same LoRA data and render function. Each Melty window can be moved, resized, scrolled, and closed.')
|
|
60
|
+
for i, (name, tint_fn, size_fn, weight_fn, shadow_fn) in enumerate(policies):
|
|
61
|
+
lora_contents(loras, name=name, as_window=True, shadow=True, with_header=draw_header,
|
|
62
|
+
force_initial=True,
|
|
63
|
+
style=Style((.50, .53, .57), absolute=True, tint_fn=tint_fn,
|
|
64
|
+
font_size_fn=size_fn, font_weight_fn=weight_fn, shadow_fn=shadow_fn),
|
|
65
|
+
initial={'window_pos': (12 + i * 592, 15), 'width': 580,
|
|
66
|
+
'height': 920, 'expanded': True})
|
|
67
|
+
return False, input_value
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"""Usage example for the inputs tab's mode-attached child_kwargs source.
|
|
2
|
+
|
|
3
|
+
@window draw_mode_test ──draw_any(mode=Modes.TEXT)──► draw_collection
|
|
4
|
+
│ child_kwargs
|
|
5
|
+
▼
|
|
6
|
+
draw_text (one per key)
|
|
7
|
+
|
|
8
|
+
Mode.TEXT (view/mode.py) carries `child_kwargs={line_height, wrap,
|
|
9
|
+
syntax_highlight}` in its dict entry. Nothing here passes those — they reach
|
|
10
|
+
each draw_text leaf purely through the mode.
|
|
11
|
+
|
|
12
|
+
To see the new source: right-click a text leaf → inputs tab. Two child_kwargs
|
|
13
|
+
rows appear, and they are independently editable:
|
|
14
|
+
|
|
15
|
+
child_kwargs (mode) ← Mode.TEXT's dict, jumps to / saves into mode.py
|
|
16
|
+
child_kwargs ← whichever NON-mode parent source sets one (the
|
|
17
|
+
caller below, once you uncomment it)
|
|
18
|
+
|
|
19
|
+
Editing `line_height` on the mode row rewrites mode.py and every leaf
|
|
20
|
+
reflows; the plain row edits this file instead.
|
|
21
|
+
"""
|
|
22
|
+
import meltygui_imgui as imgui
|
|
23
|
+
|
|
24
|
+
from meltygui.core.rendering.modes import Modes
|
|
25
|
+
from meltygui.core.core_render import render_func
|
|
26
|
+
from meltygui.core.rendering.window_decoration import window
|
|
27
|
+
from meltygui.core.rendering.render_dispatch import draw_any
|
|
28
|
+
|
|
29
|
+
# Module level so hotswap-re-exec reuses it - edits made in the window survive
|
|
30
|
+
# while iterating on the mode.
|
|
31
|
+
mode_test_text = {
|
|
32
|
+
"intro": "Mode.TEXT sends every string in this dict to draw_text.",
|
|
33
|
+
"styling": "line_height, wrap and syntax_highlight are NOT passed here — "
|
|
34
|
+
"they arrive from Mode.TEXT's child_kwargs and are editable "
|
|
35
|
+
"from the inputs tab's 'child_kwargs (mode)' row.",
|
|
36
|
+
"code_sample": "def unhighlighted(x):\n return x * 2 # syntax_highlight=False",
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
@window
|
|
41
|
+
@render_func(tint=(0.22, 0.38, 0.31), auto_resize=False, min_width=560, min_height=320)
|
|
42
|
+
def draw_mode_test(input_value, draw_state):
|
|
43
|
+
imgui.text("Mode.TEXT — leaf style comes from the mode's child_kwargs")
|
|
44
|
+
draw_any(mode_test_text, name="mode_test_body", mode=Modes.TEXT)
|
|
45
|
+
# Uncomment to give the leaves a SECOND, non-mode child_kwargs setter (this
|
|
46
|
+
# call site) - the inputs tab then shows both rows side by side, the mode
|
|
47
|
+
# one still winning at runtime:
|
|
48
|
+
# draw_any(mode_test_text, name="mode_test_body_caller", mode=Modes.TEXT,
|
|
49
|
+
# child_kwargs={"line_height": 2.0})
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import inspect
|
|
2
|
+
import types
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
|
|
5
|
+
import meltygui_imgui as imgui
|
|
6
|
+
|
|
7
|
+
from meltygui.core.rendering.modes import Modes
|
|
8
|
+
from meltygui.core.rendering.render_funcs import RenderFuncs
|
|
9
|
+
from meltygui.core.runtime.toggles import Toggles
|
|
10
|
+
from meltygui.code.new_converters import code_file_io
|
|
11
|
+
from meltygui.code.new_converters import convert_in_and_out_value
|
|
12
|
+
from meltygui.code.new_converters import string_to_cst_module
|
|
13
|
+
from meltygui.code.new_converters import cst_module_to_string
|
|
14
|
+
from meltygui.code.new_converters import cst_module_to_dict
|
|
15
|
+
from meltygui.code.new_converters import dict_to_cst_module
|
|
16
|
+
from meltygui.core.conversion.render_host import RenderHost
|
|
17
|
+
from meltygui.core.core_render import render_func
|
|
18
|
+
from meltygui.core.rendering.window_decoration import window
|
|
19
|
+
from meltygui.core.rendering.render_dispatch import draw_any
|
|
20
|
+
from meltygui.view.text_view import draw_text
|
|
21
|
+
from meltygui.core.cache.invalidation_tracker import Note
|
|
22
|
+
from meltygui.core.rendering.mode import Mode
|
|
23
|
+
|
|
24
|
+
class ModifiesPlayground:
|
|
25
|
+
|
|
26
|
+
def __init__(self, playground):
|
|
27
|
+
self.playground = playground
|
|
28
|
+
|
|
29
|
+
def modify(self, modification):
|
|
30
|
+
self.playground.modify(modification)
|
|
31
|
+
|
|
32
|
+
class InCode:
|
|
33
|
+
value = 949
|
|
34
|
+
is_tree = False
|
|
35
|
+
name = "Unset"
|
|
36
|
+
show_bg = True
|
|
37
|
+
use_cache = False
|
|
38
|
+
some_val = 0
|
|
39
|
+
some_list = [-152,69,45,-22]
|
|
40
|
+
om_val2 =0
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
# [tint=(0.0923043042421341, 0.041103292256593704, 0.23255813121795654)]
|
|
44
|
+
class Nested:
|
|
45
|
+
inner_value = [110,172,28]
|
|
46
|
+
|
|
47
|
+
# Two chained proxies. Each WRAPS a stateful func (stateful_work → view_func(value) →
|
|
48
|
+
# stateful_work) and HOLDS the value that func hands its view_func - so each is "just a
|
|
49
|
+
# dict with one value inside", at its own representation level:
|
|
50
|
+
#
|
|
51
|
+
# string_proxy wraps code_file_io holds {value: <source string>}\
|
|
52
|
+
# dict_proxy wraps convert_in_and_out_value holds {value: <GeneralParse dict>}
|
|
53
|
+
#
|
|
54
|
+
# code_file_io hands its view_func the source string; convert_in_and_out_value hands its
|
|
55
|
+
# view_func the chain_in OUTPUT (the new string) directly - so neither one needs a
|
|
56
|
+
# routed side-channel or materialize_from. Chaining is data-flow: dict_proxy.input_value
|
|
57
|
+
# IS string_proxy, so it reads string_proxy's held source ("just like a dict"); every
|
|
58
|
+
# edit to the tree flows back → convert's new source string → written onto string_proxy
|
|
59
|
+
# → code_file_io saves one frame later.
|
|
60
|
+
#
|
|
61
|
+
# Both are standalone, so draw_main calls draw() on each and renders it in its own
|
|
62
|
+
# window (string_proxy first, so its source is fresh when dict_proxy reads it).
|
|
63
|
+
|
|
64
|
+
# string_proxy = RenderHost(io_function=code_file_io, input_value=draw_text, name="String Proxy File",
|
|
65
|
+
#
|
|
66
|
+
# child_kwargs={"auto_load_edits": False, "auto_load":True}) # auto-reload on external file change
|
|
67
|
+
#
|
|
68
|
+
# dict_proxy = RenderHost(
|
|
69
|
+
# io_function=convert_in_and_out_value, input_value=string_proxy, name="Tree Proxy",
|
|
70
|
+
# child_kwargs={
|
|
71
|
+
# "chain_in": [string_to_cst_module, cst_module_to_dict],
|
|
72
|
+
# "chain_out": [dict_to_cst_module, cst_module_to_string],
|
|
73
|
+
# "route": {cst_module_to_dict: ("code_dict", "jump_to", "run_jedi", "drive")},
|
|
74
|
+
# })
|
|
75
|
+
|
|
76
|
+
# draw_text_static_file_load = inspect.getsource(draw_text)
|
|
77
|
+
|
|
78
|
+
# The shared framework pair, NOT a private copy. This module used to carry its
|
|
79
|
+
# own copy of code_hosts_for and its own cache, so this window passed draw_text
|
|
80
|
+
# through a second, independent pipeline while the editor route parsed the same
|
|
81
|
+
# span through the framework pair: two full 102KB str→cst→dict conversions per
|
|
82
|
+
# session (~430ms of duplicated background work, visible in the perf-trace
|
|
83
|
+
# timeline). One cache, one pair, one parse.
|
|
84
|
+
from meltygui.code.new_converters import code_hosts_for
|
|
85
|
+
|
|
86
|
+
string_proxy, dict_proxy = code_hosts_for(draw_text)
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
# @window(disable_scroll=False, use_cache=True)
|
|
90
|
+
# @render_func(tint=(0.043, 0.11, 0.20), auto_resize=True)
|
|
91
|
+
# def test_code_hosts(_, draw_state):
|
|
92
|
+
# Both proxies show themselves in their own windows (draw_main → draw()). This
|
|
93
|
+
# window just inspects them AS ordinary dicts - the framework has no idea they're
|
|
94
|
+
# proxies; it's rendering ordinary dicts whose single value was materialized by
|
|
95
|
+
# their wrappers. Editing here bubbles back exactly the same way.
|
|
96
|
+
|
|
97
|
+
#
|
|
98
|
+
# changed, value = draw_collection(string_proxy, name="String Proxy", disable_scroll=False, child_kwargs={"view_func": draw_text, "code_dict": dict_proxy})
|
|
99
|
+
# changed, value = draw_collection(dict_proxy, name="Dict Proxy", disable_scroll=False)
|
|
100
|
+
|
|
101
|
+
# draw_columns({"text":string_proxy, "dict":dict_proxy})
|
|
102
|
+
|
|
103
|
+
# global draw_text_static_file_load
|
|
104
|
+
# changed, value = draw_text(draw_text_static_file_load, show_name=True, use_cache=True, name="static baseline")
|
|
105
|
+
# if changed:
|
|
106
|
+
# draw_text_static_file_load = value
|
|
107
|
+
|
|
108
|
+
# changed, value = draw_collection(string_proxy, name="String Proxy Dict", child_kwargs={"view_func":draw_text})
|
|
109
|
+
|
|
110
|
+
# if changed:
|
|
111
|
+
# draw_state.invalidate_up_by_obj(obj=dict_proxy, time_delta=2, note=Note(name="String Proxy changed", tint=(1,1,1)), max_depth=10)
|
|
112
|
+
|
|
113
|
+
# request_render()
|
|
114
|
+
# New trick: `.deep.unwrap()` skips the redundant wrapper rungs (value / module /
|
|
115
|
+
# function name) and hands draw_collection the meaningful content dict with its keys
|
|
116
|
+
# intact - no manual ["value"][...] indexing or "if key in d" guards.
|
|
117
|
+
# tree = dict_proxy.deep.unwrap()
|
|
118
|
+
# if tree:
|
|
119
|
+
# changed, value = draw_collection(dict_proxy, name="Tree Proxy Dict", column=1, disable_scroll=False)
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"""One nested view under three font/shadow accumulation policies."""
|
|
2
|
+
import meltygui_imgui as imgui
|
|
3
|
+
|
|
4
|
+
from meltygui import Style
|
|
5
|
+
from meltygui import default_scalar_accumulation
|
|
6
|
+
from meltygui import glfw_window
|
|
7
|
+
from meltygui import pressed
|
|
8
|
+
from meltygui.examples.style_layouts import panel
|
|
9
|
+
from meltygui.core.styling.fonts import Font
|
|
10
|
+
from meltygui.core.core_render import render_func
|
|
11
|
+
from meltygui.view.header_view import draw_header
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def subtract(context, residual):
|
|
15
|
+
return context - residual
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def size_curve(context, residual):
|
|
19
|
+
return context * (1 + residual / 20)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def weight_curve(context, residual):
|
|
23
|
+
return context * (1 + residual / 400)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def shadow_curve(context, residual):
|
|
27
|
+
return context + residual / (1 + abs(context))
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def nested(depth=0):
|
|
31
|
+
content = {'text': [(.06, .08, f'Level {depth + 1} / Aa 012')]}
|
|
32
|
+
if depth < 3:
|
|
33
|
+
content['children'] = [('child', (.055, .24, .89, .70),
|
|
34
|
+
Style((.055, .04, .065), font_size=2,
|
|
35
|
+
font_weight=100, shadow_offset=2), nested(depth + 1))]
|
|
36
|
+
return content
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
@glfw_window(name='Font and shadow policies', width=1140, height=550,
|
|
40
|
+
show_name=True, with_header=draw_header, app_id='meltygui-gui-playground',
|
|
41
|
+
style=Style((.30, .32, .36), absolute=True))
|
|
42
|
+
@render_func(use_cache=False)
|
|
43
|
+
def scalar_policy_window(input_value, draw_state):
|
|
44
|
+
from meltygui.examples.gui_playground import toggle_styles
|
|
45
|
+
if pressed('ctrl+d'):
|
|
46
|
+
toggle_styles()
|
|
47
|
+
imgui.text('Same nested view: +2 size, +100 weight, +2 shadow at every child. Ctrl+D toggles styles.')
|
|
48
|
+
w = max(900, draw_state.content_width - 20)
|
|
49
|
+
policies = [('Add', default_scalar_accumulation, default_scalar_accumulation, default_scalar_accumulation),
|
|
50
|
+
('Subtract', subtract, subtract, subtract),
|
|
51
|
+
('Nonlinear', size_curve, weight_curve, shadow_curve)]
|
|
52
|
+
panel({'children': [(label, (i / 3 + .01, .02, .31, .96),
|
|
53
|
+
Style((.055, .04, .065), font_size_fn=size_fn,
|
|
54
|
+
font_weight_fn=weight_fn, shadow_fn=shadow_fn),
|
|
55
|
+
{'text': [(.06, .03, label)], 'children': [
|
|
56
|
+
('tree', (.02, .14, .96, .84), Style(), nested())]})
|
|
57
|
+
for i, (label, size_fn, weight_fn, shadow_fn) in enumerate(policies)]},
|
|
58
|
+
name='scalar-policies', style=Style(), font=Font.JETBRAINS_MONO_19,
|
|
59
|
+
width=w, height=450)
|
|
60
|
+
return False, input_value
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
"""Three composed layouts for exploring residual styles in the GUI playground."""
|
|
2
|
+
import meltygui_imgui as imgui
|
|
3
|
+
|
|
4
|
+
import meltygui
|
|
5
|
+
from meltygui import Style
|
|
6
|
+
from meltygui import glfw_window
|
|
7
|
+
from meltygui import pressed
|
|
8
|
+
from meltygui.hdr_color import pack_color
|
|
9
|
+
from meltygui.core.styling.fonts import Font
|
|
10
|
+
from meltygui.core.melty import Melty
|
|
11
|
+
from meltygui.core.runtime.toggles import Toggles
|
|
12
|
+
from meltygui.core.core_render import render_func
|
|
13
|
+
from meltygui.view.header_view import draw_header
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
strength = 0.22
|
|
17
|
+
type_size = 0
|
|
18
|
+
type_weight = 0
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def stronger():
|
|
22
|
+
global strength
|
|
23
|
+
strength = min(0.8, strength + 0.1)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def softer():
|
|
27
|
+
global strength
|
|
28
|
+
strength = max(0.02, strength - 0.1)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def larger_type():
|
|
32
|
+
global type_size
|
|
33
|
+
type_size = min(10, type_size + 1)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def smaller_type():
|
|
37
|
+
global type_size
|
|
38
|
+
type_size = max(-6, type_size - 1)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def heavier_type():
|
|
42
|
+
global type_weight
|
|
43
|
+
type_weight = min(200, type_weight + 100)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def lighter_type():
|
|
47
|
+
global type_weight
|
|
48
|
+
type_weight = max(-300, type_weight - 100)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
@render_func(show_bg=False, show_header=False, use_cache=False, auto_resize=False)
|
|
52
|
+
def panel(input_value, draw_state, style=None):
|
|
53
|
+
"""A real Melty context for each rectangle; children inherit its background."""
|
|
54
|
+
if Toggles.dynamic_styles:
|
|
55
|
+
Melty.add_background(style)
|
|
56
|
+
else:
|
|
57
|
+
imgui.get_window_draw_list().add_rect_filled(
|
|
58
|
+
draw_state.abs_left, draw_state.abs_top,
|
|
59
|
+
draw_state.abs_left + draw_state.width, draw_state.abs_top + draw_state.height,
|
|
60
|
+
pack_color(0.2, 0.22, 0.25, 1), 8)
|
|
61
|
+
x, y = draw_state.abs_left, draw_state.abs_top
|
|
62
|
+
w, h = draw_state.width, draw_state.height
|
|
63
|
+
# Paint children first, then text: crossing glyphs sample the actual surface.
|
|
64
|
+
for key, rect, child_style, content in input_value.get('children', ()):
|
|
65
|
+
left, top, width, height = rect
|
|
66
|
+
imgui.set_cursor_screen_pos((x + left * w, y + top * h))
|
|
67
|
+
panel(content, name=key, style=child_style, width=width * w, height=height * h)
|
|
68
|
+
dl = imgui.get_window_draw_list()
|
|
69
|
+
for left, top, label in input_value.get('text', ()):
|
|
70
|
+
dl.add_text(x + left * w, y + top * h, pack_color(0.58, 0.58, 0.58, 1), label)
|
|
71
|
+
imgui.set_cursor_screen_pos((x, y))
|
|
72
|
+
imgui.dummy(w, h)
|
|
73
|
+
return False, input_value
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def terraces(delta, depth=0):
|
|
77
|
+
content = {'text': [(0.04, 0.06, f'Level {depth + 1}') ]}
|
|
78
|
+
if depth < 3:
|
|
79
|
+
content['children'] = [('inset', (0.07, 0.23, 0.86, 0.71), Style(delta, shadow_offset=2),
|
|
80
|
+
terraces(delta, depth + 1))]
|
|
81
|
+
return content
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def workspace():
|
|
85
|
+
tile = {'text': [(0.07, 0.15, 'Shared card'), (0.07, 0.39, 'Same residual'),
|
|
86
|
+
(0.07, 0.65, 'Same text suggestion')]}
|
|
87
|
+
def column(label, base):
|
|
88
|
+
return (label, base, {'text': [(0.06, 0.06, label)], 'children': [
|
|
89
|
+
('card', (0.06, 0.23, 0.88, 0.68), Style((strength, 0, strength)), tile)]})
|
|
90
|
+
columns = [column('Night', Style((0.07, 0.10, 0.16), absolute=True)),
|
|
91
|
+
column('Paper', Style((0.94, 0.91, 0.83), absolute=True)),
|
|
92
|
+
column('Ocean', Style((0.04, 0.43, 0.49), absolute=True))]
|
|
93
|
+
return {'children': [(label, (i / 3 + .012, .04, .309, .92), base, content)
|
|
94
|
+
for i, (label, base, content) in enumerate(columns)]}
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def crossing():
|
|
98
|
+
veil = Style((.15, .45, .95, .35), absolute=True)
|
|
99
|
+
return {'children': [
|
|
100
|
+
('night', (0, 0, .5, 1), Style((.035, .045, .07), absolute=True),
|
|
101
|
+
{'children': [('veil', (.16, .56, .84, .30), veil, {})]}),
|
|
102
|
+
('paper', (.5, 0, .5, 1), Style((.95, .92, .84), absolute=True),
|
|
103
|
+
{'children': [('veil', (0, .56, .84, .30), veil, {})]})],
|
|
104
|
+
'text': [(.30, .18, 'One text run crosses both surfaces'),
|
|
105
|
+
(.30, .36, 'The renderer chooses the contrast'),
|
|
106
|
+
(.12, .66, 'Same translucent blue / different inherited surfaces')]}
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
@glfw_window(name='Style compositions — GUI playground', width=1060, height=1000,
|
|
110
|
+
show_name=True, with_header=draw_header, app_id='meltygui-gui-playground',
|
|
111
|
+
style=Style(), disable_scroll=False)
|
|
112
|
+
@render_func(use_cache=False)
|
|
113
|
+
def style_compositions(input_value, draw_state):
|
|
114
|
+
from meltygui.examples.gui_playground import toggle_styles
|
|
115
|
+
from meltygui.examples.gui_playground import toggle_root
|
|
116
|
+
from meltygui.examples.gui_playground import reset
|
|
117
|
+
if pressed('ctrl+d'):
|
|
118
|
+
toggle_styles()
|
|
119
|
+
if pressed('ctrl+l'):
|
|
120
|
+
toggle_root()
|
|
121
|
+
meltygui.draw_menu_bar({
|
|
122
|
+
'Styles': {'Enable / disable (Ctrl+D)': toggle_styles,
|
|
123
|
+
'Light / dark root (Ctrl+L)': toggle_root, 'Reset': reset},
|
|
124
|
+
'Residual': {'Stronger': stronger, 'Softer': softer},
|
|
125
|
+
'Typography': {'Larger (+1)': larger_type, 'Smaller (-1)': smaller_type,
|
|
126
|
+
'Heavier (+100)': heavier_type, 'Lighter (-100)': lighter_type},
|
|
127
|
+
}, name='composition-menu')
|
|
128
|
+
imgui.text(f'Dynamic styles: {"ON" if Toggles.dynamic_styles else "OFF"} | Residual strength: {strength:.2f}')
|
|
129
|
+
w = max(520, draw_state.content_width - 20)
|
|
130
|
+
imgui.text('01 / TERRACES Nested colour + shadow depth residuals (+2 per level)')
|
|
131
|
+
panel({'children': [
|
|
132
|
+
('warm', (.01, .02, .32, .96), Style((strength, 0, 0)), terraces((strength, 0, 0))),
|
|
133
|
+
('cool', (.34, .02, .32, .96), Style((0, strength / 2, strength)), terraces((0, strength / 2, strength))),
|
|
134
|
+
('shade', (.67, .02, .32, .96), Style((-strength,) * 3), terraces((-strength,) * 3))]},
|
|
135
|
+
name='terraces', style=Style(), width=w, height=300)
|
|
136
|
+
imgui.text('02 / CONTEXT CARDS The same component on three absolute surfaces')
|
|
137
|
+
panel(workspace(), name='workspace', style=Style(), width=w, height=240)
|
|
138
|
+
imgui.text('03 / CROSSING Text adapts per pixel; the inset composites translucent blue')
|
|
139
|
+
panel(crossing(), name='crossing', style=Style(), width=w, height=220)
|
|
140
|
+
imgui.text('04 / TYPE Native-size hinted fonts; children add +3 pixels and +100 weight')
|
|
141
|
+
panel({'text': [(.03, .05, f'Parent / size {18.5 + type_size:g}, weight {400 + type_weight}')], 'children': [
|
|
142
|
+
('medium', (.03, .23, .94, .70), Style((.08, .04, .10), font_size=3, font_weight=100),
|
|
143
|
+
{'text': [(.03, .07, f'Child / +3 pixels, weight {500 + type_weight}')], 'children': [
|
|
144
|
+
('semibold', (.04, .35, .92, .55),
|
|
145
|
+
Style((.08, .04, .10), font_size=3, font_weight=100),
|
|
146
|
+
{'text': [(.03, .22, f'Grandchild / +6 pixels, weight {600 + type_weight} | Il1 0O')]})]})]},
|
|
147
|
+
name='typography', font=Font.JETBRAINS_MONO_19,
|
|
148
|
+
style=Style(font_size=type_size, font_weight=type_weight), width=w, height=300)
|
|
149
|
+
return False, input_value
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"""Demo for the tiled window manager (core/layout/tile_manager_core.py).
|
|
2
|
+
|
|
3
|
+
A Blender-style area layout drawn flat on one draw_state: every divider —
|
|
4
|
+
the window's frame edges, the column edges of the root split, the row
|
|
5
|
+
edges inside each column — is a shared edge object in the window's
|
|
6
|
+
collision solve, so dragging any of them pushes and pulls the rest and
|
|
7
|
+
out through the window frame, exactly like the columns playground.
|
|
8
|
+
"""
|
|
9
|
+
from meltygui.core.conversion.dict_conversion import DictConversion
|
|
10
|
+
from meltygui.core.core_render import render_func
|
|
11
|
+
from meltygui.core.rendering.window_decoration import window
|
|
12
|
+
from meltygui.model.tile_model import Split
|
|
13
|
+
from meltygui.model.tile_model import Tile
|
|
14
|
+
from meltygui.core.layout.tile_manager_core import TileManagerState
|
|
15
|
+
from meltygui.core.layout.tile_manager_core import draw_tiles
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class CounterState(DictConversion):
|
|
19
|
+
def __init__(self):
|
|
20
|
+
super().__init__()
|
|
21
|
+
self.count = 0
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@render_func(multi_instance=True, tint=(0.20, 0.36, 0.52))
|
|
25
|
+
def draw_tile_counter(input_value: object, draw_state,
|
|
26
|
+
counter_state: CounterState = None, style_manager=None):
|
|
27
|
+
"""Choose in two tiles to exercise independent, persisted view state."""
|
|
28
|
+
from meltygui.view.header_view import flat_button
|
|
29
|
+
clicked = flat_button(f"Count: {counter_state.count} — add one", draw_state,
|
|
30
|
+
"increment", width=180, style_manager=style_manager)
|
|
31
|
+
if clicked:
|
|
32
|
+
counter_state.count += 1
|
|
33
|
+
return clicked, input_value
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
@render_func(multi_instance=True, tint=(0.22, 0.44, 0.30))
|
|
37
|
+
def draw_tile_notes(input_value: object):
|
|
38
|
+
from meltygui.view.text_view import draw_text
|
|
39
|
+
changed, value = draw_text("" if input_value is None else input_value)
|
|
40
|
+
return changed, value if changed else input_value
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class TileManagerDemoModel(DictConversion):
|
|
44
|
+
"""The demo app owns the layout, including each tile's selected function."""
|
|
45
|
+
|
|
46
|
+
def __init__(self):
|
|
47
|
+
super().__init__()
|
|
48
|
+
self.tree = Split("x", [
|
|
49
|
+
Tile("outliner", tint=(0.20, 0.36, 0.52), render_func=draw_tile_counter),
|
|
50
|
+
Split("y", [
|
|
51
|
+
Tile("viewport", tint=(0.28, 0.28, 0.30), render_func=draw_tile_counter),
|
|
52
|
+
Tile("timeline", tint=(0.42, 0.30, 0.18)),
|
|
53
|
+
]),
|
|
54
|
+
Split("y", [
|
|
55
|
+
Tile("properties", tint=(0.22, 0.44, 0.30)),
|
|
56
|
+
Tile("modifiers", tint=(0.36, 0.24, 0.44)),
|
|
57
|
+
Tile("materials", tint=(0.50, 0.22, 0.24)),
|
|
58
|
+
]),
|
|
59
|
+
])
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
# auto_resize=False: a fixed-size window gives the tree a stable frame;
|
|
63
|
+
# the tiles inside it and every edge moves independently of the rest.
|
|
64
|
+
@window
|
|
65
|
+
@render_func(tint=(0.24, 0.30, 0.20), auto_resize=False, min_width=720,
|
|
66
|
+
min_height=420, show_bg=True)
|
|
67
|
+
def draw_tiled_window_manager_demo(input_value: object, draw_state,
|
|
68
|
+
tile_state: TileManagerState = None,
|
|
69
|
+
app_model: TileManagerDemoModel = None,
|
|
70
|
+
multi_instance_renderers=()):
|
|
71
|
+
tree = app_model.tree if input_value is None else input_value
|
|
72
|
+
changed = draw_tiles(tree, draw_state, tile_state=tile_state,
|
|
73
|
+
multi_instance_renderers=multi_instance_renderers)
|
|
74
|
+
return changed, input_value
|