Copy disabled (too large)
Download .txt
Showing preview only (11,764K chars total). Download the full file to get everything.
Repository: GraphiteEditor/Graphite
Branch: master
Commit: 0c7b5cd534f1
Files: 862
Total size: 11.1 MB
Directory structure:
gitextract_ahenmele/
├── .branding
├── .cargo/
│ └── config.toml
├── .devcontainer/
│ └── devcontainer.json
├── .editorconfig
├── .envrc
├── .gitattributes
├── .github/
│ ├── FUNDING.yml
│ ├── pull_request_template.md
│ └── workflows/
│ ├── build.yml
│ ├── cargo-deny.yml
│ ├── check.yml
│ ├── comment-!build-commands.yml
│ ├── comment-clippy-warnings.yaml
│ ├── comment-profiling-changes.yaml
│ ├── library-rawkit.yml
│ ├── provide-shaders.yml
│ ├── scripts/
│ │ └── artifact-upload.bash
│ └── website.yml
├── .gitignore
├── .nix/
│ ├── default.nix
│ ├── deps/
│ │ ├── cef.nix
│ │ ├── crane.nix
│ │ └── rust-gpu.nix
│ ├── dev.nix
│ └── pkgs/
│ ├── graphite-branding.nix
│ ├── graphite-bundle.nix
│ ├── graphite-flatpak-manifest.nix
│ ├── graphite-raster-nodes-shaders.nix
│ ├── graphite.nix
│ └── tools/
│ └── third-party-licenses.nix
├── .nvmrc
├── .prettierrc
├── .vscode/
│ ├── extensions.json
│ ├── launch.json
│ └── settings.json
├── Cargo.toml
├── LICENSE.txt
├── README.md
├── about.toml
├── demo-artwork/
│ ├── changing-seasons.graphite
│ ├── isometric-fountain.graphite
│ ├── marbled-mandelbrot.graphite
│ ├── painted-dreams.graphite
│ ├── parametric-dunescape.graphite
│ ├── procedural-string-lights.graphite
│ ├── red-dress.graphite
│ └── valley-of-spires.graphite
├── deny.toml
├── desktop/
│ ├── Cargo.toml
│ ├── assets/
│ │ └── art.graphite.Graphite.desktop
│ ├── bundle/
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ └── src/
│ │ ├── common.rs
│ │ ├── linux.rs
│ │ ├── mac.rs
│ │ ├── main.rs
│ │ └── win.rs
│ ├── embedded-resources/
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ └── src/
│ │ └── lib.rs
│ ├── platform/
│ │ ├── linux/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ └── main.rs
│ │ ├── mac/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── helper.rs
│ │ │ └── main.rs
│ │ └── win/
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ └── src/
│ │ └── main.rs
│ ├── src/
│ │ ├── app.rs
│ │ ├── cef/
│ │ │ ├── consts.rs
│ │ │ ├── context/
│ │ │ │ ├── builder.rs
│ │ │ │ ├── multithreaded.rs
│ │ │ │ └── singlethreaded.rs
│ │ │ ├── context.rs
│ │ │ ├── dirs.rs
│ │ │ ├── input/
│ │ │ │ ├── keymap.rs
│ │ │ │ └── state.rs
│ │ │ ├── input.rs
│ │ │ ├── internal/
│ │ │ │ ├── browser_process_app.rs
│ │ │ │ ├── browser_process_client.rs
│ │ │ │ ├── browser_process_handler.rs
│ │ │ │ ├── context_menu_handler.rs
│ │ │ │ ├── display_handler.rs
│ │ │ │ ├── life_span_handler.rs
│ │ │ │ ├── load_handler.rs
│ │ │ │ ├── render_handler.rs
│ │ │ │ ├── render_process_app.rs
│ │ │ │ ├── render_process_handler.rs
│ │ │ │ ├── render_process_v8_handler.rs
│ │ │ │ ├── resource_handler.rs
│ │ │ │ ├── scheme_handler_factory.rs
│ │ │ │ └── task.rs
│ │ │ ├── internal.rs
│ │ │ ├── ipc.rs
│ │ │ ├── platform.rs
│ │ │ └── utility.rs
│ │ ├── cef.rs
│ │ ├── cli.rs
│ │ ├── consts.rs
│ │ ├── dirs.rs
│ │ ├── event.rs
│ │ ├── gpu_context.rs
│ │ ├── lib.rs
│ │ ├── main.rs
│ │ ├── persist.rs
│ │ ├── preferences.rs
│ │ ├── render/
│ │ │ ├── composite_shader.wgsl
│ │ │ ├── frame_buffer_ref.rs
│ │ │ └── state.rs
│ │ ├── render.rs
│ │ ├── window/
│ │ │ ├── linux.rs
│ │ │ ├── mac/
│ │ │ │ ├── app.rs
│ │ │ │ └── menu.rs
│ │ │ ├── mac.rs
│ │ │ ├── win/
│ │ │ │ └── native_handle.rs
│ │ │ └── win.rs
│ │ └── window.rs
│ └── wrapper/
│ ├── Cargo.toml
│ └── src/
│ ├── handle_desktop_wrapper_message.rs
│ ├── intercept_editor_message.rs
│ ├── intercept_frontend_message.rs
│ ├── lib.rs
│ ├── message_dispatcher.rs
│ ├── messages.rs
│ └── utils.rs
├── editor/
│ ├── Cargo.toml
│ ├── build.rs
│ └── src/
│ ├── application.rs
│ ├── consts.rs
│ ├── dispatcher.rs
│ ├── lib.rs
│ ├── macros.rs
│ ├── messages/
│ │ ├── animation/
│ │ │ ├── animation_message.rs
│ │ │ ├── animation_message_handler.rs
│ │ │ └── mod.rs
│ │ ├── app_window/
│ │ │ ├── app_window_message.rs
│ │ │ ├── app_window_message_handler.rs
│ │ │ └── mod.rs
│ │ ├── broadcast/
│ │ │ ├── broadcast_message.rs
│ │ │ ├── broadcast_message_handler.rs
│ │ │ ├── event/
│ │ │ │ ├── event_message.rs
│ │ │ │ ├── event_message_handler.rs
│ │ │ │ └── mod.rs
│ │ │ └── mod.rs
│ │ ├── clipboard/
│ │ │ ├── clipboard_message.rs
│ │ │ ├── clipboard_message_handler.rs
│ │ │ ├── mod.rs
│ │ │ └── utility_types.rs
│ │ ├── debug/
│ │ │ ├── debug_message.rs
│ │ │ ├── debug_message_handler.rs
│ │ │ ├── mod.rs
│ │ │ └── utility_types.rs
│ │ ├── defer/
│ │ │ ├── defer_message.rs
│ │ │ ├── defer_message_handler.rs
│ │ │ └── mod.rs
│ │ ├── dialog/
│ │ │ ├── dialog_message.rs
│ │ │ ├── dialog_message_handler.rs
│ │ │ ├── export_dialog/
│ │ │ │ ├── export_dialog_message.rs
│ │ │ │ ├── export_dialog_message_handler.rs
│ │ │ │ └── mod.rs
│ │ │ ├── mod.rs
│ │ │ ├── new_document_dialog/
│ │ │ │ ├── mod.rs
│ │ │ │ ├── new_document_dialog_message.rs
│ │ │ │ └── new_document_dialog_message_handler.rs
│ │ │ ├── preferences_dialog/
│ │ │ │ ├── mod.rs
│ │ │ │ ├── preferences_dialog_message.rs
│ │ │ │ └── preferences_dialog_message_handler.rs
│ │ │ └── simple_dialogs/
│ │ │ ├── about_graphite_dialog.rs
│ │ │ ├── close_all_documents_dialog.rs
│ │ │ ├── close_document_dialog.rs
│ │ │ ├── confirm_restart_dialog.rs
│ │ │ ├── demo_artwork_dialog.rs
│ │ │ ├── error_dialog.rs
│ │ │ ├── licenses_dialog.rs
│ │ │ ├── licenses_third_party_dialog.rs
│ │ │ └── mod.rs
│ │ ├── frontend/
│ │ │ ├── frontend_message.rs
│ │ │ ├── mod.rs
│ │ │ └── utility_types.rs
│ │ ├── input_mapper/
│ │ │ ├── input_mapper_message.rs
│ │ │ ├── input_mapper_message_handler.rs
│ │ │ ├── input_mappings.rs
│ │ │ ├── key_mapping/
│ │ │ │ ├── key_mapping_message.rs
│ │ │ │ ├── key_mapping_message_handler.rs
│ │ │ │ └── mod.rs
│ │ │ ├── mod.rs
│ │ │ └── utility_types/
│ │ │ ├── input_keyboard.rs
│ │ │ ├── input_mouse.rs
│ │ │ ├── macros.rs
│ │ │ ├── misc.rs
│ │ │ └── mod.rs
│ │ ├── input_preprocessor/
│ │ │ ├── input_preprocessor_message.rs
│ │ │ ├── input_preprocessor_message_handler.rs
│ │ │ └── mod.rs
│ │ ├── layout/
│ │ │ ├── layout_message.rs
│ │ │ ├── layout_message_handler.rs
│ │ │ ├── mod.rs
│ │ │ └── utility_types/
│ │ │ ├── layout_widget.rs
│ │ │ ├── mod.rs
│ │ │ └── widgets/
│ │ │ ├── button_widgets.rs
│ │ │ ├── input_widgets.rs
│ │ │ ├── label_widgets.rs
│ │ │ └── mod.rs
│ │ ├── menu_bar/
│ │ │ ├── menu_bar_message.rs
│ │ │ ├── menu_bar_message_handler.rs
│ │ │ └── mod.rs
│ │ ├── message.rs
│ │ ├── mod.rs
│ │ ├── portfolio/
│ │ │ ├── document/
│ │ │ │ ├── data_panel/
│ │ │ │ │ ├── data_panel_message.rs
│ │ │ │ │ ├── data_panel_message_handler.rs
│ │ │ │ │ └── mod.rs
│ │ │ │ ├── document_message.rs
│ │ │ │ ├── document_message_handler.rs
│ │ │ │ ├── graph_operation/
│ │ │ │ │ ├── graph_operation_message.rs
│ │ │ │ │ ├── graph_operation_message_handler.rs
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── transform_utils.rs
│ │ │ │ │ └── utility_types.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── navigation/
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── navigation_message.rs
│ │ │ │ │ ├── navigation_message_handler.rs
│ │ │ │ │ └── utility_types.rs
│ │ │ │ ├── node_graph/
│ │ │ │ │ ├── document_node_definitions/
│ │ │ │ │ │ └── document_node_derive.rs
│ │ │ │ │ ├── document_node_definitions.rs
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── node_graph_message.rs
│ │ │ │ │ ├── node_graph_message_handler.rs
│ │ │ │ │ ├── node_properties.rs
│ │ │ │ │ └── utility_types.rs
│ │ │ │ ├── overlays/
│ │ │ │ │ ├── grid_overlays.rs
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── overlays_message.rs
│ │ │ │ │ ├── overlays_message_handler.rs
│ │ │ │ │ ├── utility_functions.rs
│ │ │ │ │ ├── utility_types_native.rs
│ │ │ │ │ └── utility_types_web.rs
│ │ │ │ ├── properties_panel/
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── properties_panel_message.rs
│ │ │ │ │ └── properties_panel_message_handler.rs
│ │ │ │ └── utility_types/
│ │ │ │ ├── clipboards.rs
│ │ │ │ ├── document_metadata.rs
│ │ │ │ ├── error.rs
│ │ │ │ ├── misc.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── network_interface/
│ │ │ │ │ ├── deserialization.rs
│ │ │ │ │ ├── memo_network.rs
│ │ │ │ │ └── resolved_types.rs
│ │ │ │ ├── network_interface.rs
│ │ │ │ ├── nodes.rs
│ │ │ │ ├── transformation.rs
│ │ │ │ └── wires.rs
│ │ │ ├── document_migration.rs
│ │ │ ├── mod.rs
│ │ │ ├── portfolio_message.rs
│ │ │ ├── portfolio_message_handler.rs
│ │ │ └── utility_types.rs
│ │ ├── preferences/
│ │ │ ├── mod.rs
│ │ │ ├── preferences_message.rs
│ │ │ ├── preferences_message_handler.rs
│ │ │ └── utility_types.rs
│ │ ├── prelude.rs
│ │ ├── tool/
│ │ │ ├── common_functionality/
│ │ │ │ ├── auto_panning.rs
│ │ │ │ ├── color_selector.rs
│ │ │ │ ├── compass_rose.rs
│ │ │ │ ├── gizmos/
│ │ │ │ │ ├── gizmo_manager.rs
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ └── shape_gizmos/
│ │ │ │ │ ├── circle_arc_radius_handle.rs
│ │ │ │ │ ├── grid_rows_columns_gizmo.rs
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── number_of_points_dial.rs
│ │ │ │ │ ├── point_radius_handle.rs
│ │ │ │ │ ├── spiral_turns_handle.rs
│ │ │ │ │ └── sweep_angle_gizmo.rs
│ │ │ │ ├── graph_modification_utils.rs
│ │ │ │ ├── layer_origin_cross.rs
│ │ │ │ ├── measure.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── pivot.rs
│ │ │ │ ├── resize.rs
│ │ │ │ ├── shape_editor.rs
│ │ │ │ ├── shapes/
│ │ │ │ │ ├── arc_shape.rs
│ │ │ │ │ ├── arrow_shape.rs
│ │ │ │ │ ├── circle_shape.rs
│ │ │ │ │ ├── ellipse_shape.rs
│ │ │ │ │ ├── grid_shape.rs
│ │ │ │ │ ├── line_shape.rs
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── polygon_shape.rs
│ │ │ │ │ ├── rectangle_shape.rs
│ │ │ │ │ ├── shape_utility.rs
│ │ │ │ │ ├── spiral_shape.rs
│ │ │ │ │ └── star_shape.rs
│ │ │ │ ├── snapping/
│ │ │ │ │ ├── alignment_snapper.rs
│ │ │ │ │ ├── distribution_snapper.rs
│ │ │ │ │ ├── grid_snapper.rs
│ │ │ │ │ ├── layer_snapper.rs
│ │ │ │ │ └── snap_results.rs
│ │ │ │ ├── snapping.rs
│ │ │ │ ├── transformation_cage.rs
│ │ │ │ └── utility_functions.rs
│ │ │ ├── mod.rs
│ │ │ ├── tool_message.rs
│ │ │ ├── tool_message_handler.rs
│ │ │ ├── tool_messages/
│ │ │ │ ├── artboard_tool.rs
│ │ │ │ ├── brush_tool.rs
│ │ │ │ ├── eyedropper_tool.rs
│ │ │ │ ├── fill_tool.rs
│ │ │ │ ├── freehand_tool.rs
│ │ │ │ ├── gradient_tool.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── navigate_tool.rs
│ │ │ │ ├── path_tool.rs
│ │ │ │ ├── pen_tool.rs
│ │ │ │ ├── select_tool.rs
│ │ │ │ ├── shape_tool.rs
│ │ │ │ ├── spline_tool.rs
│ │ │ │ └── text_tool.rs
│ │ │ ├── transform_layer/
│ │ │ │ ├── mod.rs
│ │ │ │ ├── transform_layer_message.rs
│ │ │ │ └── transform_layer_message_handler.rs
│ │ │ └── utility_types.rs
│ │ └── viewport/
│ │ ├── mod.rs
│ │ ├── viewport_message.rs
│ │ └── viewport_message_handler.rs
│ ├── node_graph_executor/
│ │ ├── runtime.rs
│ │ └── runtime_io.rs
│ ├── node_graph_executor.rs
│ ├── test_utils.rs
│ ├── utility_traits.rs
│ └── utility_types.rs
├── flake.nix
├── frontend/
│ ├── .gitignore
│ ├── .prettierrc
│ ├── README.md
│ ├── branding-installer.js
│ ├── eslint.config.js
│ ├── index.html
│ ├── package-installer.js
│ ├── package.json
│ ├── src/
│ │ ├── App.svelte
│ │ ├── README.md
│ │ ├── components/
│ │ │ ├── Editor.svelte
│ │ │ ├── README.md
│ │ │ ├── floating-menus/
│ │ │ │ ├── ColorPicker.svelte
│ │ │ │ ├── Dialog.svelte
│ │ │ │ ├── EyedropperPreview.svelte
│ │ │ │ ├── MenuList.svelte
│ │ │ │ ├── NodeCatalog.svelte
│ │ │ │ └── Tooltip.svelte
│ │ │ ├── layout/
│ │ │ │ ├── ConditionalWrapper.svelte
│ │ │ │ ├── FloatingMenu.svelte
│ │ │ │ ├── LayoutCol.svelte
│ │ │ │ └── LayoutRow.svelte
│ │ │ ├── panels/
│ │ │ │ ├── Data.svelte
│ │ │ │ ├── Document.svelte
│ │ │ │ ├── Layers.svelte
│ │ │ │ ├── Properties.svelte
│ │ │ │ └── Welcome.svelte
│ │ │ ├── views/
│ │ │ │ └── Graph.svelte
│ │ │ ├── widgets/
│ │ │ │ ├── WidgetLayout.svelte
│ │ │ │ ├── WidgetSection.svelte
│ │ │ │ ├── WidgetSpan.svelte
│ │ │ │ ├── WidgetTable.svelte
│ │ │ │ ├── buttons/
│ │ │ │ │ ├── BreadcrumbTrailButtons.svelte
│ │ │ │ │ ├── IconButton.svelte
│ │ │ │ │ ├── ImageButton.svelte
│ │ │ │ │ ├── ParameterExposeButton.svelte
│ │ │ │ │ ├── PopoverButton.svelte
│ │ │ │ │ └── TextButton.svelte
│ │ │ │ ├── inputs/
│ │ │ │ │ ├── CheckboxInput.svelte
│ │ │ │ │ ├── ColorInput.svelte
│ │ │ │ │ ├── CurveInput.svelte
│ │ │ │ │ ├── DropdownInput.svelte
│ │ │ │ │ ├── FieldInput.svelte
│ │ │ │ │ ├── NumberInput.svelte
│ │ │ │ │ ├── RadioInput.svelte
│ │ │ │ │ ├── ReferencePointInput.svelte
│ │ │ │ │ ├── RulerInput.svelte
│ │ │ │ │ ├── ScrollbarInput.svelte
│ │ │ │ │ ├── SpectrumInput.svelte
│ │ │ │ │ ├── TextAreaInput.svelte
│ │ │ │ │ ├── TextInput.svelte
│ │ │ │ │ └── WorkingColorsInput.svelte
│ │ │ │ └── labels/
│ │ │ │ ├── IconLabel.svelte
│ │ │ │ ├── ImageLabel.svelte
│ │ │ │ ├── Separator.svelte
│ │ │ │ ├── ShortcutLabel.svelte
│ │ │ │ └── TextLabel.svelte
│ │ │ └── window/
│ │ │ ├── MainWindow.svelte
│ │ │ ├── Panel.svelte
│ │ │ ├── StatusBar.svelte
│ │ │ ├── TitleBar.svelte
│ │ │ └── Workspace.svelte
│ │ ├── editor.ts
│ │ ├── global.d.ts
│ │ ├── icons.ts
│ │ ├── main.ts
│ │ ├── managers/
│ │ │ ├── clipboard.ts
│ │ │ ├── fonts.ts
│ │ │ ├── hyperlink.ts
│ │ │ ├── input.ts
│ │ │ ├── localization.ts
│ │ │ ├── panic.ts
│ │ │ └── persistence.ts
│ │ ├── stores/
│ │ │ ├── app-window.ts
│ │ │ ├── dialog.ts
│ │ │ ├── document.ts
│ │ │ ├── fullscreen.ts
│ │ │ ├── node-graph.ts
│ │ │ ├── portfolio.ts
│ │ │ └── tooltip.ts
│ │ ├── subscription-router.ts
│ │ ├── utility-functions/
│ │ │ ├── colors.ts
│ │ │ ├── crash-report.ts
│ │ │ ├── escape.ts
│ │ │ ├── files.ts
│ │ │ ├── images.ts
│ │ │ ├── keyboard-entry.ts
│ │ │ ├── network.ts
│ │ │ ├── panic-proxy.ts
│ │ │ ├── platform.ts
│ │ │ ├── rasterization.ts
│ │ │ ├── strip-indents.ts
│ │ │ ├── viewports.ts
│ │ │ └── widgets.ts
│ │ ├── vite-env-override.d.ts
│ │ └── vite-env.d.ts
│ ├── svelte.config.js
│ ├── tsconfig.json
│ ├── vite.config.ts
│ └── wasm/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── editor_api.rs
│ ├── helpers.rs
│ ├── lib.rs
│ └── native_communication.rs
├── libraries/
│ ├── dyn-any/
│ │ ├── Cargo.toml
│ │ ├── LICENSE-APACHE
│ │ ├── LICENSE-MIT
│ │ ├── README.md
│ │ ├── derive/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ └── lib.rs
│ │ └── src/
│ │ └── lib.rs
│ ├── math-parser/
│ │ ├── Cargo.toml
│ │ ├── benches/
│ │ │ └── bench.rs
│ │ └── src/
│ │ ├── ast.rs
│ │ ├── constants.rs
│ │ ├── context.rs
│ │ ├── executer.rs
│ │ ├── grammer.pest
│ │ ├── lib.rs
│ │ ├── parser.rs
│ │ └── value.rs
│ └── rawkit/
│ ├── .gitignore
│ ├── Cargo.toml
│ ├── LICENSE-APACHE
│ ├── LICENSE-MIT
│ ├── README.md
│ ├── camera_data/
│ │ └── Sony/
│ │ ├── DSLR-A100.toml
│ │ ├── DSLR-A200.toml
│ │ ├── DSLR-A300.toml
│ │ ├── DSLR-A330.toml
│ │ ├── DSLR-A350.toml
│ │ ├── DSLR-A550.toml
│ │ ├── DSLR-A700.toml
│ │ ├── DSLR-A850.toml
│ │ ├── DSLR-A900.toml
│ │ ├── ILCA-68.toml
│ │ ├── ILCA-99M2.toml
│ │ ├── ILCE-1.toml
│ │ ├── ILCE-5100.toml
│ │ ├── ILCE-6000.toml
│ │ ├── ILCE-6100.toml
│ │ ├── ILCE-6300.toml
│ │ ├── ILCE-6400.toml
│ │ ├── ILCE-6500.toml
│ │ ├── ILCE-6600.toml
│ │ ├── ILCE-6700.toml
│ │ ├── ILCE-7CM2.toml
│ │ ├── ILCE-7CR.toml
│ │ ├── ILCE-7M2.toml
│ │ ├── ILCE-7M3.toml
│ │ ├── ILCE-7RM3.toml
│ │ ├── ILCE-7RM4.toml
│ │ ├── ILCE-7RM5.toml
│ │ ├── ILCE-7SM2.toml
│ │ ├── ILCE-9.toml
│ │ ├── ILCE-9M2.toml
│ │ ├── ILCE-9M3.toml
│ │ ├── NEX-3.toml
│ │ ├── NEX-3N.toml
│ │ ├── NEX-5R.toml
│ │ ├── NEX-6.toml
│ │ ├── NEX-7.toml
│ │ ├── ZV-1.toml
│ │ ├── ZV-1M2.toml
│ │ ├── ZV-E1.toml
│ │ └── ZV-E10.toml
│ ├── rawkit-proc-macros/
│ │ ├── Cargo.toml
│ │ ├── LICENSE-APACHE
│ │ ├── LICENSE-MIT
│ │ ├── README.md
│ │ └── src/
│ │ ├── build_camera_data.rs
│ │ ├── lib.rs
│ │ └── tag_derive.rs
│ ├── src/
│ │ ├── decoder/
│ │ │ ├── arw1.rs
│ │ │ ├── arw2.rs
│ │ │ ├── mod.rs
│ │ │ └── uncompressed.rs
│ │ ├── demosaicing/
│ │ │ ├── linear_demosaicing.rs
│ │ │ └── mod.rs
│ │ ├── lib.rs
│ │ ├── metadata/
│ │ │ ├── camera_data.rs
│ │ │ ├── identify.rs
│ │ │ └── mod.rs
│ │ ├── postprocessing/
│ │ │ ├── convert_to_rgb.rs
│ │ │ ├── gamma_correction.rs
│ │ │ ├── mod.rs
│ │ │ ├── record_histogram.rs
│ │ │ └── transform.rs
│ │ ├── preprocessing/
│ │ │ ├── mod.rs
│ │ │ ├── scale_to_16bit.rs
│ │ │ ├── scale_white_balance.rs
│ │ │ └── subtract_black.rs
│ │ ├── processing.rs
│ │ └── tiff/
│ │ ├── file.rs
│ │ ├── mod.rs
│ │ ├── tags.rs
│ │ ├── types.rs
│ │ └── values.rs
│ └── tests/
│ ├── images/
│ │ └── .gitkeep
│ └── tests.rs
├── node-graph/
│ ├── LICENSE
│ ├── README.md
│ ├── graph-craft/
│ │ ├── Cargo.toml
│ │ ├── benches/
│ │ │ ├── compile_demo_art_criterion.rs
│ │ │ └── compile_demo_art_iai.rs
│ │ └── src/
│ │ ├── document/
│ │ │ └── value.rs
│ │ ├── document.rs
│ │ ├── graphene_compiler.rs
│ │ ├── lib.rs
│ │ ├── proto.rs
│ │ ├── util.rs
│ │ └── wasm_application_io.rs
│ ├── graphene-cli/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ ├── export.rs
│ │ └── main.rs
│ ├── interpreted-executor/
│ │ ├── Cargo.toml
│ │ ├── benches/
│ │ │ ├── benchmark_util.rs
│ │ │ ├── run_cached.rs
│ │ │ ├── run_cached_iai.rs
│ │ │ ├── run_demo_art_criterion.rs
│ │ │ ├── run_once.rs
│ │ │ ├── run_once_iai.rs
│ │ │ ├── update_executor.rs
│ │ │ └── update_executor_iai.rs
│ │ └── src/
│ │ ├── dynamic_executor.rs
│ │ ├── lib.rs
│ │ ├── node_registry.rs
│ │ └── util.rs
│ ├── libraries/
│ │ ├── application-io/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ └── lib.rs
│ │ ├── core-types/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── bounds.rs
│ │ │ ├── consts.rs
│ │ │ ├── context.rs
│ │ │ ├── generic.rs
│ │ │ ├── lib.rs
│ │ │ ├── math/
│ │ │ │ ├── bbox.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── polynomial.rs
│ │ │ │ ├── quad.rs
│ │ │ │ └── rect.rs
│ │ │ ├── memo.rs
│ │ │ ├── misc.rs
│ │ │ ├── ops.rs
│ │ │ ├── registry.rs
│ │ │ ├── render_complexity.rs
│ │ │ ├── table.rs
│ │ │ ├── text.rs
│ │ │ ├── transform.rs
│ │ │ ├── types.rs
│ │ │ ├── uuid.rs
│ │ │ └── value.rs
│ │ ├── graphic-types/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── artboard.rs
│ │ │ ├── graphic.rs
│ │ │ └── lib.rs
│ │ ├── no-std-types/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── blending.rs
│ │ │ ├── choice_type.rs
│ │ │ ├── color/
│ │ │ │ ├── color_traits.rs
│ │ │ │ ├── color_types.rs
│ │ │ │ ├── discrete_srgb.rs
│ │ │ │ └── mod.rs
│ │ │ ├── context.rs
│ │ │ ├── lib.rs
│ │ │ ├── registry.rs
│ │ │ └── shaders/
│ │ │ ├── buffer_struct/
│ │ │ │ ├── glam.rs
│ │ │ │ ├── mod.rs
│ │ │ │ └── primitive.rs
│ │ │ └── mod.rs
│ │ ├── raster-types/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── image.rs
│ │ │ ├── lib.rs
│ │ │ └── raster_types.rs
│ │ ├── rendering/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── convert_usvg_path.rs
│ │ │ ├── lib.rs
│ │ │ ├── render_ext.rs
│ │ │ ├── renderer.rs
│ │ │ └── to_peniko.rs
│ │ ├── vector-types/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── gradient.rs
│ │ │ ├── lib.rs
│ │ │ ├── math/
│ │ │ │ └── mod.rs
│ │ │ ├── subpath/
│ │ │ │ ├── consts.rs
│ │ │ │ ├── core.rs
│ │ │ │ ├── lookup.rs
│ │ │ │ ├── manipulators.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── solvers.rs
│ │ │ │ ├── structs.rs
│ │ │ │ └── transform.rs
│ │ │ └── vector/
│ │ │ ├── algorithms/
│ │ │ │ ├── bezpath_algorithms.rs
│ │ │ │ ├── contants.rs
│ │ │ │ ├── intersection.rs
│ │ │ │ ├── merge_by_distance.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── offset_subpath.rs
│ │ │ │ ├── poisson_disk.rs
│ │ │ │ ├── spline.rs
│ │ │ │ └── util.rs
│ │ │ ├── click_target.rs
│ │ │ ├── misc.rs
│ │ │ ├── mod.rs
│ │ │ ├── reference_point.rs
│ │ │ ├── style.rs
│ │ │ ├── vector_attributes.rs
│ │ │ ├── vector_modification.rs
│ │ │ └── vector_types.rs
│ │ └── wgpu-executor/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ ├── context.rs
│ │ ├── lib.rs
│ │ ├── resample.rs
│ │ ├── resample_shader.wgsl
│ │ ├── shader_runtime/
│ │ │ ├── mod.rs
│ │ │ └── per_pixel_adjust_runtime.rs
│ │ └── texture_conversion.rs
│ ├── node-macro/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ ├── buffer_struct.rs
│ │ ├── codegen.rs
│ │ ├── crate_ident.rs
│ │ ├── derive_choice_type.rs
│ │ ├── lib.rs
│ │ ├── parsing.rs
│ │ ├── shader_nodes/
│ │ │ ├── mod.rs
│ │ │ └── per_pixel_adjust.rs
│ │ └── validation.rs
│ ├── nodes/
│ │ ├── blending/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ └── lib.rs
│ │ ├── brush/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── brush.rs
│ │ │ ├── brush_cache.rs
│ │ │ ├── brush_stroke.rs
│ │ │ └── lib.rs
│ │ ├── gcore/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── animation.rs
│ │ │ ├── context.rs
│ │ │ ├── context_modification.rs
│ │ │ ├── debug.rs
│ │ │ ├── extract_xy.rs
│ │ │ ├── lib.rs
│ │ │ ├── logic.rs
│ │ │ ├── memo.rs
│ │ │ └── ops.rs
│ │ ├── graphic/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── artboard.rs
│ │ │ ├── graphic.rs
│ │ │ └── lib.rs
│ │ ├── gstd/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── any.rs
│ │ │ ├── lib.rs
│ │ │ ├── pixel_preview.rs
│ │ │ ├── render_cache.rs
│ │ │ ├── render_node.rs
│ │ │ ├── text.rs
│ │ │ └── wasm_application_io.rs
│ │ ├── math/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ └── lib.rs
│ │ ├── path-bool/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ └── lib.rs
│ │ ├── raster/
│ │ │ ├── Cargo.toml
│ │ │ ├── shaders/
│ │ │ │ ├── Cargo.toml
│ │ │ │ ├── build.rs
│ │ │ │ ├── entrypoint/
│ │ │ │ │ ├── Cargo.toml
│ │ │ │ │ └── src/
│ │ │ │ │ └── lib.rs
│ │ │ │ ├── spirv-unknown-naga-wgsl.json
│ │ │ │ └── src/
│ │ │ │ └── lib.rs
│ │ │ └── src/
│ │ │ ├── adjust.rs
│ │ │ ├── adjustments.rs
│ │ │ ├── blending_nodes.rs
│ │ │ ├── cubic_spline.rs
│ │ │ ├── curve.rs
│ │ │ ├── dehaze.rs
│ │ │ ├── filter.rs
│ │ │ ├── fullscreen_vertex.rs
│ │ │ ├── generate_curves.rs
│ │ │ ├── gradient_map.rs
│ │ │ ├── image_color_palette.rs
│ │ │ ├── lib.rs
│ │ │ └── std_nodes.rs
│ │ ├── repeat/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── lib.rs
│ │ │ └── repeat_nodes.rs
│ │ ├── text/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── font_cache.rs
│ │ │ ├── lib.rs
│ │ │ ├── path_builder.rs
│ │ │ ├── text_context.rs
│ │ │ └── to_path.rs
│ │ ├── transform/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── lib.rs
│ │ │ └── transform_nodes.rs
│ │ └── vector/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ ├── generator_nodes.rs
│ │ ├── lib.rs
│ │ ├── merge_qr_squares.rs
│ │ ├── vector_modification_nodes.rs
│ │ └── vector_nodes.rs
│ ├── preprocessor/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ └── lib.rs
│ └── rfcs/
│ └── fine-grained-context-caching.md
├── proc-macros/
│ ├── Cargo.toml
│ └── src/
│ ├── as_message.rs
│ ├── combined_message_attrs.rs
│ ├── discriminant.rs
│ ├── extract_fields.rs
│ ├── helper_structs.rs
│ ├── helpers.rs
│ ├── hierarchical_tree.rs
│ ├── hint.rs
│ ├── lib.rs
│ ├── message_handler_data_attr.rs
│ ├── transitive_child.rs
│ └── widget_builder.rs
├── rustfmt.toml
├── tools/
│ ├── cargo-run/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ ├── lib.rs
│ │ ├── main.rs
│ │ └── requirements.rs
│ ├── crate-hierarchy-viz/
│ │ ├── .gitignore
│ │ ├── Cargo.toml
│ │ └── src/
│ │ └── main.rs
│ ├── editor-message-tree/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ └── main.rs
│ ├── node-docs/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ ├── main.rs
│ │ ├── page_catalog.rs
│ │ ├── page_category.rs
│ │ ├── page_node.rs
│ │ └── utility.rs
│ └── third-party-licenses/
│ ├── .gitignore
│ ├── Cargo.toml
│ ├── build.rs
│ └── src/
│ ├── cargo.rs
│ ├── cef.rs
│ ├── main.rs
│ └── npm.rs
└── website/
├── .build-scripts/
│ └── install.ts
├── .gitignore
├── config.toml
├── content/
│ ├── _index.md
│ ├── about.md
│ ├── blog/
│ │ ├── 2022-02-12-announcing-graphite-alpha.md
│ │ ├── 2022-03-12-graphite-a-vision-for-the-future-of-2d-content-creation.md
│ │ ├── 2022-05-12-distributed-computing-in-the-graphene-runtime.md
│ │ ├── 2024-01-01-looking-back-on-2023-and-what's-next.md
│ │ ├── 2024-02-22-graphite-internships-announcing-participation-in-gsoc-2024.md
│ │ ├── 2024-05-09-graphite-progress-report-q1-2024.md
│ │ ├── 2024-07-31-graphite-progress-report-q2-2024.md
│ │ ├── 2024-10-15-graphite-progress-report-q3-2024.md
│ │ ├── 2025-01-16-year-in-review-2024-highlights-and-a-peek-at-2025.md
│ │ ├── 2025-03-31-graphite-progress-report-q4-2024.md
│ │ ├── 2025-04-02-internships-for-a-rust-graphics-engine-gsoc-2025.md
│ │ ├── 2025-09-19-graphite-community-meetup-in-germany.md
│ │ └── _index.md
│ ├── contact.md
│ ├── donate.md
│ ├── features.md
│ ├── learn/
│ │ ├── _index.md
│ │ ├── _outline_draft.md
│ │ ├── interface/
│ │ │ ├── _index.md
│ │ │ ├── document-panel.md
│ │ │ └── menu-bar.md
│ │ └── introduction/
│ │ ├── _index.md
│ │ └── features-and-limitations.md
│ ├── license.md
│ ├── logo.md
│ ├── press.md
│ ├── privacy-policy.md
│ └── volunteer/
│ ├── _index.md
│ └── guide/
│ ├── _index.md
│ ├── codebase-overview/
│ │ ├── _index.md
│ │ ├── debugging-tips.md
│ │ └── editor-structure.md
│ ├── graphene/
│ │ ├── _index.md
│ │ └── networks-and-nodes.md
│ ├── project-setup/
│ │ └── _index.md
│ ├── starting-a-task/
│ │ ├── _index.md
│ │ ├── ai-contribution-policy.md
│ │ ├── code-quality-guidelines.md
│ │ └── submitting-a-contribution.md
│ └── student-projects/
│ ├── _index.md
│ └── completed-projects.md
├── eslint.config.js
├── package.json
├── sass/
│ ├── base.scss
│ ├── component/
│ │ ├── carousel.scss
│ │ ├── code-snippet.scss
│ │ ├── demo-artwork.scss
│ │ ├── feature-box.scss
│ │ ├── feature-icons.scss
│ │ ├── image-comparison.scss
│ │ └── youtube-embed.scss
│ ├── layout/
│ │ └── reading-material.scss
│ ├── page/
│ │ ├── about.scss
│ │ ├── blog.scss
│ │ ├── contributor-guide/
│ │ │ ├── bisect-tool.scss
│ │ │ ├── crate-hierarchy.scss
│ │ │ └── editor-structure.scss
│ │ ├── donate.scss
│ │ ├── features.scss
│ │ ├── index.scss
│ │ ├── logo.scss
│ │ ├── user-manual/
│ │ │ ├── node-catalog.scss
│ │ │ ├── node-category.scss
│ │ │ └── node.scss
│ │ └── volunteer.scss
│ └── template/
│ ├── article.scss
│ └── book.scss
├── static/
│ └── js/
│ ├── component/
│ │ ├── carousel.js
│ │ ├── image-comparison.js
│ │ ├── video-autoplay.js
│ │ └── youtube-embed.js
│ ├── navbar.js
│ ├── page/
│ │ └── contributor-guide/
│ │ ├── bisect-tool.js
│ │ ├── crate-hierarchy.js
│ │ └── editor-structure.js
│ ├── template/
│ │ └── book.js
│ └── text-justification.js
├── templates/
│ ├── 404.html
│ ├── article.html
│ ├── base.html
│ ├── blog.html
│ ├── book.html
│ ├── macros/
│ │ ├── book-outline.html
│ │ └── replacements.html
│ ├── page.html
│ └── section.html
└── tsconfig.json
================================================
FILE CONTENTS
================================================
================================================
FILE: .branding
================================================
https://github.com/Keavon/graphite-branded-assets/archive/8ae15dc9c51a3855475d8cab1d0f29d9d9bc622c.tar.gz
c19abe4ac848f3c835e43dc065c59e20e60233ae023ea0a064c5fed442be2d3d
================================================
FILE: .cargo/config.toml
================================================
[target.wasm32-unknown-unknown]
rustflags = [
# Currently disabled because of https://github.com/GraphiteEditor/Graphite/issues/1262
# The current simd implementation leads to undefined behavior
#"-C",
#"target-feature=+simd128",
"-C",
"target-feature=+bulk-memory",
"-C",
"link-arg=--max-memory=4294967296",
"--cfg=web_sys_unstable_apis",
]
[env]
CARGO_WORKSPACE_DIR = { value = "", relative = true }
================================================
FILE: .devcontainer/devcontainer.json
================================================
{
"image": "mcr.microsoft.com/devcontainers/base:debian",
"features": {
"ghcr.io/devcontainers/features/rust:1": {
"profile": "default"
},
"ghcr.io/devcontainers/features/node:1": {}
},
"onCreateCommand": "cargo install cargo-watch wasm-pack cargo-about && cargo install -f wasm-bindgen-cli@0.2.100",
"customizations": {
"vscode": {
// NOTE: Keep this in sync with `.vscode/extensions.json`
"extensions": [
// Rust
"rust-lang.rust-analyzer",
"tamasfe.even-better-toml",
// Web
"dbaeumer.vscode-eslint",
"svelte.svelte-vscode",
"vitaliymaz.vscode-svg-previewer",
// Code quality
"wayou.vscode-todo-highlight",
"streetsidesoftware.code-spell-checker",
// Helpful
"mhutchie.git-graph",
"qezhu.gitlink",
"wmaurer.change-case"
]
}
}
}
================================================
FILE: .editorconfig
================================================
[*.{rs,js,ts,svelte,json,toml,svg,html,css,scss}]
indent_style = tab
indent_size = 4
end_of_line = lf
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 200
================================================
FILE: .envrc
================================================
use flake
================================================
FILE: .gitattributes
================================================
# Requires Git to check out files with the LF (not CRLF) line endings for files it automatically recognizes as being text-based
# The `*` targets all files
# The `text=auto` makes it apply a conversion only to files detected as text-based
# The `eol=lf` sets the conversion to an LF line ending
# https://git-scm.com/docs/gitattributes
* text=auto eol=lf
# Adds syntax highlighting to Graphite files on GitHub and minimizes diffs both locally and on GitHub
*.graphite binary linguist-generated linguist-language=JSON
/node-graph/graphene-cli/test_files/*.graphite text diff -linguist-generated
================================================
FILE: .github/FUNDING.yml
================================================
github: [GraphiteEditor]
================================================
FILE: .github/pull_request_template.md
================================================
<!--
Graphite has ZERO-TOLERANCE for contributing undisclosed AI-generated content.
If your PR involves AI, you must read our AI contribution policy (it's short):
https://graphite.art/volunteer/guide/starting-a-task/ai-contribution-policy
REMEMBER:
- You are responsible for thoroughly testing the successful implementation of your changes and ensuring no obvious regressions occur.
- Egregiously dysfunctional PRs may be assumed to be undisclosed AI slop. If in doubt, ask on Discord before attempting a PR.
- You are highly recommended to include a video showing the before-and-after behavior of your changes and screenshots of any new or modified UI.
- Remember that Graphite maintains high standards for quality and the project is not a classroom for inexperienced developers to gain industry experience.
- In this PR description, reference any relevant tasks by writing "Closes", "Resolves", or "Fixes" with the issue # or the URL of a Discord message documenting the task.
- To acknowledge that you've read this, you must delete these rules and fill in the (strictly human-written) PR description in its place.
-->
================================================
FILE: .github/workflows/build.yml
================================================
name: "Build"
on:
push:
branches:
- master
tags:
- latest-stable
workflow_dispatch:
inputs:
web:
description: "Web"
type: boolean
windows:
description: "Windows"
type: boolean
mac:
description: "Mac"
type: boolean
linux:
description: "Linux"
type: boolean
push_to_nix_cache:
description: "Linux: push to Nix cache"
type: boolean
debug:
description: "Debug build"
type: boolean
workflow_call:
inputs:
web:
type: boolean
windows:
type: boolean
mac:
type: boolean
linux:
type: boolean
push_to_nix_cache:
type: boolean
debug:
type: boolean
checkout_repo:
type: string
checkout_ref:
type: string
pr_number:
type: string
jobs:
web:
if: github.event_name == 'push' || inputs.web
runs-on: [self-hosted, target/wasm]
permissions:
contents: write
deployments: write
pull-requests: write
actions: write
env:
CARGO_TERM_COLOR: always
RUSTC_WRAPPER: /usr/bin/sccache
CARGO_INCREMENTAL: 0
SCCACHE_DIR: /var/lib/github-actions/.cache
steps:
- name: 📥 Clone repository
uses: actions/checkout@v6
with:
repository: ${{ inputs.checkout_repo || github.repository }}
ref: ${{ inputs.checkout_ref || '' }}
- name: 🗑 Clear wasm-bindgen cache
run: rm -r ~/.cache/.wasm-pack || true
- name: 🟢 Install Node.js
uses: actions/setup-node@v6
with:
node-version-file: .nvmrc
- name: 🚧 Install build dependencies
run: |
cd frontend
npm run setup
- name: 🦀 Install Rust
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
toolchain: stable
override: true
cache: false
rustflags: ""
target: wasm32-unknown-unknown
- name: 🔀 Choose production deployment environment and insert template
id: production-env
if: github.event_name == 'push'
run: |
if [[ "${{ github.ref }}" == "refs/tags/latest-stable" ]]; then
echo "cf_project=graphite-editor" >> $GITHUB_OUTPUT
DOMAIN="editor.graphite.art"
else
echo "cf_project=graphite-dev" >> $GITHUB_OUTPUT
DOMAIN="dev.graphite.art"
fi
TEMPLATE="<script defer data-domain=\"$DOMAIN\" data-api=\"https://graphite.art/visit/event\" src=\"https://graphite.art/visit/script.hash.js\"></script>"
echo "template=$TEMPLATE" >> $GITHUB_OUTPUT
sed -i "s|<!-- INDEX_HTML_HEAD_REPLACEMENT -->|$TEMPLATE|" frontend/index.html
- name: 🌐 Build Graphite web code
env:
NODE_ENV: production
run: mold -run cargo run build web${{ inputs.debug && ' debug' || '' }}
- name: 📤 Publish to Cloudflare Pages
id: cloudflare
continue-on-error: ${{ github.event_name != 'push' }}
env:
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
run: |
if [ -z "$CLOUDFLARE_API_TOKEN" ]; then
echo "No Cloudflare API token available (fork PR), skipping deploy."
exit 0
fi
MAX_ATTEMPTS=8
DELAY=15
for ATTEMPT in $(seq 1 $MAX_ATTEMPTS); do
echo "Attempt $ATTEMPT of $MAX_ATTEMPTS..."
npx wrangler@3 pages deploy "frontend/dist" --project-name="${{ steps.production-env.outputs.cf_project || 'graphite-dev' }}" --commit-dirty=true 2>&1 | tee /tmp/wrangler_output
if [ ${PIPESTATUS[0]} -eq 0 ]; then
URL=$(grep -oP 'https://[^\s]+\.pages\.dev' /tmp/wrangler_output | head -1)
echo "url=$URL" >> "$GITHUB_OUTPUT"
echo "Published successfully: $URL"
exit 0
fi
echo "Attempt $ATTEMPT failed."
if [ "$ATTEMPT" -lt "$MAX_ATTEMPTS" ]; then
echo "Retrying in ${DELAY}s..."
sleep $DELAY
DELAY=$((DELAY * 2))
fi
done
echo "All $MAX_ATTEMPTS Cloudflare Pages publish attempts failed."
exit 1
- name: 🚀 Create a GitHub environment deployment
if: inputs.checkout_repo == '' || inputs.checkout_repo == github.repository
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
CF_URL: ${{ steps.cloudflare.outputs.url }}
run: |
if [ -z "$CF_URL" ]; then
echo "No Cloudflare URL available, skipping deployment."
exit 0
fi
if [ "${{ github.ref }}" = "refs/tags/latest-stable" ]; then
REF="latest-stable"
ENVIRONMENT="graphite-editor (Production)"
elif [ "${{ github.event_name }}" = "push" ]; then
REF="master"
ENVIRONMENT="graphite-dev (Production)"
else
REF="${{ inputs.checkout_ref || github.head_ref || github.ref_name }}"
ENVIRONMENT="graphite-dev (Preview)"
fi
DEPLOY_ID=$(gh api \
-X POST \
-H "Accept: application/vnd.github+json" \
repos/${{ github.repository }}/deployments \
--input - \
--jq '.id' <<EOF
{"ref":"$REF","environment":"$ENVIRONMENT","auto_merge":false,"required_contexts":[]}
EOF
)
gh api \
-X POST \
-H "Accept: application/vnd.github+json" \
repos/${{ github.repository }}/deployments/$DEPLOY_ID/statuses \
-f state=success \
-f environment_url="$CF_URL" \
-f log_url="https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"
- name: 💬 Comment with the build link
if: github.event_name != 'pull_request' && github.event_name != 'merge_group'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
CF_URL: ${{ steps.cloudflare.outputs.url }}
run: |
if [ -z "$CF_URL" ]; then
echo "No Cloudflare URL available, skipping comment."
exit 0
fi
COMMENT_BODY="| 📦 **Web Build Complete for** $(git rev-parse HEAD) |
|-|
| $CF_URL |"
if [ "${{ github.ref }}" = "refs/tags/latest-stable" ]; then
# Push tag: skip commenting (commit was already commented on master merge)
echo "Tag push, skipping comment."
elif [ "${{ github.event_name }}" = "push" ]; then
# Push master: comment on the commit hash page
gh api \
-X POST \
-H "Accept: application/vnd.github+json" \
repos/${{ github.repository }}/commits/$(git rev-parse HEAD)/comments \
-f body="$COMMENT_BODY"
elif [ "${{ github.event_name }}" != "pull_request" ] && [ "${{ github.event_name }}" != "merge_group" ]; then
# Manual trigger (workflow_dispatch, !build): comment on the PR
PR_NUMBER="${{ inputs.pr_number }}"
if [ -z "$PR_NUMBER" ]; then
BRANCH=$(git rev-parse --abbrev-ref HEAD)
PR_NUMBER=$(gh pr list --repo ${{ github.repository }} --head "$BRANCH" --json number --jq '.[0].number' 2>/dev/null || true)
fi
if [ -n "$PR_NUMBER" ]; then
gh pr comment "$PR_NUMBER" --repo ${{ github.repository }} --body "$COMMENT_BODY"
else
echo "No open PR found, skipping comment."
fi
fi
- name: ✂ Strip template from completed build for a clean artifact
if: github.event_name == 'push'
env:
TEMPLATE: ${{ steps.production-env.outputs.template }}
run: sed -i "s|$TEMPLATE||" frontend/dist/index.html
- name: 📦 Upload web bundle artifact
if: github.event_name != 'pull_request'
uses: actions/upload-artifact@v6
with:
name: graphite-web-bundle
path: frontend/dist
- name: 👕 Lint Graphite web formatting
env:
NODE_ENV: production
run: |
cd frontend
npm run check
- name: 📃 Trigger website rebuild if auto-generated code docs are stale
if: github.event_name == 'push' && github.ref != 'refs/tags/latest-stable'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
cargo run -p editor-message-tree -- website/generated
TREE=volunteer/guide/codebase-overview/hierarchical-message-system-tree
curl -sf "https://graphite.art/$TREE.txt" -o "website/static/$TREE.live.txt" \
&& diff -q "website/static/$TREE.txt" "website/static/$TREE.live.txt" > /dev/null \
|| gh workflow run website.yml --ref master
windows:
if: (github.event_name == 'push' && github.ref != 'refs/tags/latest-stable') || inputs.windows
runs-on: windows-latest
permissions:
contents: read
id-token: write
pull-requests: write
env:
WASM_BINDGEN_CLI_VERSION: "0.2.100"
steps:
- name: 📥 Clone repository
uses: actions/checkout@v6
with:
repository: ${{ inputs.checkout_repo || github.repository }}
ref: ${{ inputs.checkout_ref || '' }}
- name: 🦀 Install Rust
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
toolchain: stable
override: true
cache: false
rustflags: ""
target: wasm32-unknown-unknown
- name: 💾 Set up Cargo cache
uses: actions/cache@v5
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: cargo-${{ runner.os }}-${{ hashFiles('**/Cargo.lock') }}
- name: 🟢 Install Node.js
uses: actions/setup-node@v6
with:
node-version-file: .nvmrc
cache: npm
cache-dependency-path: |
package-lock.json
frontend/package-lock.json
- name: 📦 Install Cargo-binstall
uses: cargo-bins/cargo-binstall@main
- name: 🚧 Install native dependencies
shell: pwsh
env:
GITHUB_TOKEN: ${{ github.token }}
BINSTALL_DISABLE_TELEMETRY: "true"
run: |
winget install --id LLVM.LLVM -e --accept-package-agreements --accept-source-agreements
winget install --id Kitware.CMake -e --accept-package-agreements --accept-source-agreements
winget install --id OpenSSL.OpenSSL -e --accept-package-agreements --accept-source-agreements
winget install --id WebAssembly.Binaryen -e --accept-package-agreements --accept-source-agreements
winget install --id GnuWin32.PkgConfig -e --accept-package-agreements --accept-source-agreements
"OPENSSL_DIR=C:\Program Files\OpenSSL-Win64" | Out-File -FilePath $env:GITHUB_ENV -Append
"PKG_CONFIG_PATH=C:\Program Files\OpenSSL-Win64\lib\pkgconfig" | Out-File -FilePath $env:GITHUB_ENV -Append
cargo binstall --no-confirm --force wasm-pack
cargo binstall --no-confirm --force cargo-about
cargo binstall --no-confirm --force "wasm-bindgen-cli@$env:WASM_BINDGEN_CLI_VERSION"
- name: 🏗 Build Windows bundle
shell: bash # `cargo-about` refuses to run in powershell
env:
CARGO_TERM_COLOR: always
run: cargo run build desktop${{ inputs.debug && ' debug' || '' }}
- name: 📁 Stage artifacts
shell: bash
run: |
PROFILE=${{ inputs.debug && 'debug' || 'release' }}
rm -rf target/artifacts
mkdir -p target/artifacts
cp -R target/$PROFILE/Graphite target/artifacts/Graphite
- name: 📦 Upload Windows bundle
if: github.event_name != 'push'
uses: actions/upload-artifact@v6
with:
name: graphite-windows-bundle
path: target/artifacts
- name: 💬 Comment artifact link on PR
if: github.event_name != 'push'
shell: bash
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
ARTIFACT_ID=$(gh api repos/${{ github.repository }}/actions/runs/${{ github.run_id }}/artifacts --jq '.artifacts[] | select(.name == "graphite-windows-bundle") | .id')
ARTIFACT_URL="https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}/artifacts/$ARTIFACT_ID"
PR_NUMBER="${{ inputs.pr_number }}"
if [ -z "$PR_NUMBER" ]; then
BRANCH=$(git rev-parse --abbrev-ref HEAD)
PR_NUMBER=$(gh pr list --repo ${{ github.repository }} --head "$BRANCH" --json number --jq '.[0].number' 2>/dev/null || true)
fi
if [ -n "$PR_NUMBER" ] && [ -n "$ARTIFACT_ID" ]; then
BODY="| 📦 **Windows Build Complete for** $(git rev-parse HEAD) |"$'\n'
BODY+="|-|"$'\n'
BODY+="| [Download binary]($ARTIFACT_URL) |"
gh pr comment "$PR_NUMBER" --repo ${{ github.repository }} --body "$BODY"
fi
- name: 🔑 Azure login
if: github.event_name == 'push'
uses: azure/login@v1
with:
client-id: ${{ secrets.AZURE_CLIENT_ID }}
tenant-id: ${{ secrets.AZURE_TENANT_ID }}
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
enable-AzPSSession: true
- name: 🔏 Sign
if: github.event_name == 'push'
uses: azure/artifact-signing-action@v1
with:
endpoint: https://eus.codesigning.azure.net/
signing-account-name: Graphite
certificate-profile-name: Graphite
files: |
${{ github.workspace }}\target\artifacts\Graphite\Graphite.exe
${{ github.workspace }}\target\artifacts\Graphite\libcef.dll
${{ github.workspace }}\target\artifacts\Graphite\chrome_elf.dll
${{ github.workspace }}\target\artifacts\Graphite\vulkan-1.dll
${{ github.workspace }}\target\artifacts\Graphite\dxcompiler.dll
${{ github.workspace }}\target\artifacts\Graphite\libEGL.dll
${{ github.workspace }}\target\artifacts\Graphite\libGLESv2.dll
${{ github.workspace }}\target\artifacts\Graphite\vk_swiftshader.dll
file-digest: SHA256
timestamp-rfc3161: http://timestamp.acs.microsoft.com
timestamp-digest: SHA256
correlation-id: ${{ github.sha }}
- name: ✅ Verify signatures
if: github.event_name == 'push'
shell: pwsh
run: |
$ErrorActionPreference = "Stop"
$TargetDir = "target\artifacts\Graphite"
if (-not (Test-Path $TargetDir)) {
throw "TargetDir not found: $TargetDir"
}
$UnsignedOrBad = @()
Get-ChildItem -Path $TargetDir -Recurse -File -Include *.exe,*.dll | ForEach-Object {
$sig = Get-AuthenticodeSignature -FilePath $_.FullName
if ($sig.Status -ne 'Valid') {
$UnsignedOrBad += "$($_.FullName) (Status=$($sig.Status))"
}
}
if ($UnsignedOrBad.Count -gt 0) {
Write-Host "Unsigned or invalid binaries detected:"
$UnsignedOrBad | ForEach-Object {
Write-Host "::error::$_"
}
if ($env:GITHUB_STEP_SUMMARY) {
"### ❌ Unsigned or invalid binaries detected" |
Out-File $env:GITHUB_STEP_SUMMARY -Append -Encoding utf8
"" | Out-File $env:GITHUB_STEP_SUMMARY -Append -Encoding utf8
$UnsignedOrBad | ForEach-Object {
"* `$_" | Out-File $env:GITHUB_STEP_SUMMARY -Append -Encoding utf8
}
}
exit 1
}
Write-Host "All binaries are signed and valid."
if ($env:GITHUB_STEP_SUMMARY) {
"### ✅ All binaries are signed and valid" |
Out-File $env:GITHUB_STEP_SUMMARY -Append -Encoding utf8
}
- name: 📦 Upload signed Windows bundle
if: github.event_name == 'push'
uses: actions/upload-artifact@v6
with:
name: graphite-windows-bundle-signed
path: target/artifacts
mac:
if: (github.event_name == 'push' && github.ref != 'refs/tags/latest-stable') || inputs.mac
runs-on: macos-latest
permissions:
contents: read
pull-requests: write
env:
WASM_BINDGEN_CLI_VERSION: "0.2.100"
steps:
- name: 📥 Clone repository
uses: actions/checkout@v6
with:
repository: ${{ inputs.checkout_repo || github.repository }}
ref: ${{ inputs.checkout_ref || '' }}
- name: 🦀 Install Rust
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
toolchain: stable
override: true
cache: false
rustflags: ""
target: wasm32-unknown-unknown
- name: 💾 Set up Cargo cache
uses: actions/cache@v5
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: cargo-${{ runner.os }}-${{ hashFiles('**/Cargo.lock') }}
- name: 🟢 Install Node.js
uses: actions/setup-node@v6
with:
node-version-file: .nvmrc
cache: npm
cache-dependency-path: |
package-lock.json
frontend/package-lock.json
- name: 🚧 Install native dependencies
env:
GITHUB_TOKEN: ${{ github.token }}
BINSTALL_DISABLE_TELEMETRY: "true"
run: |
brew update
brew install \
pkg-config \
openssl@3 \
binaryen \
llvm \
cargo-binstall
echo "OPENSSL_DIR=$(brew --prefix openssl@3)" >> $GITHUB_ENV
echo "PKG_CONFIG_PATH=$(brew --prefix openssl@3)/lib/pkgconfig" >> $GITHUB_ENV
echo "$(brew --prefix llvm)/bin" >> $GITHUB_PATH
cargo binstall --no-confirm --force wasm-pack
cargo binstall --no-confirm --force cargo-about
cargo binstall --no-confirm --force "wasm-bindgen-cli@${WASM_BINDGEN_CLI_VERSION}"
- name: 🏗 Build Mac bundle
env:
CARGO_TERM_COLOR: always
run: cargo run build desktop${{ inputs.debug && ' debug' || '' }}
- name: 📁 Stage artifacts
shell: bash
run: |
PROFILE=${{ inputs.debug && 'debug' || 'release' }}
rm -rf target/artifacts
mkdir -p target/artifacts
cp -R target/$PROFILE/Graphite.app target/artifacts/Graphite.app
- name: 📦 Upload Mac bundle
if: github.event_name != 'push'
uses: actions/upload-artifact@v6
with:
name: graphite-mac-bundle
path: target/artifacts
- name: 💬 Comment artifact link on PR
if: github.event_name != 'push'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
ARTIFACT_ID=$(gh api repos/${{ github.repository }}/actions/runs/${{ github.run_id }}/artifacts --jq '.artifacts[] | select(.name == "graphite-mac-bundle") | .id')
ARTIFACT_URL="https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}/artifacts/$ARTIFACT_ID"
PR_NUMBER="${{ inputs.pr_number }}"
if [ -z "$PR_NUMBER" ]; then
BRANCH=$(git rev-parse --abbrev-ref HEAD)
PR_NUMBER=$(gh pr list --repo ${{ github.repository }} --head "$BRANCH" --json number --jq '.[0].number' 2>/dev/null || true)
fi
if [ -n "$PR_NUMBER" ] && [ -n "$ARTIFACT_ID" ]; then
BODY="| 📦 **Mac Build Complete for** $(git rev-parse HEAD) |"$'\n'
BODY+="|-|"$'\n'
BODY+="| [Download binary]($ARTIFACT_URL) |"
gh pr comment "$PR_NUMBER" --repo ${{ github.repository }} --body "$BODY"
fi
- name: 🔏 Sign and notarize (preparation)
if: github.event_name == 'push'
env:
APPLE_CERT_BASE64: ${{ secrets.APPLE_CERT_BASE64 }}
APPLE_CERT_PASSWORD: ${{ secrets.APPLE_CERT_PASSWORD }}
run: |
mkdir -p .sign
echo "$APPLE_CERT_BASE64" | base64 --decode > .sign/certificate.p12
security create-keychain -p "" .sign/main.keychain
security default-keychain -s .sign/main.keychain
security unlock-keychain -p "" .sign/main.keychain
security set-keychain-settings -t 3600 -u .sign/main.keychain
security import .sign/certificate.p12 -k .sign/main.keychain -P "$APPLE_CERT_PASSWORD" -T /usr/bin/codesign -T /usr/bin/productsign
security set-key-partition-list -S apple-tool:,apple: -s -k "" .sign/main.keychain
cat > .sign/entitlements.plist <<'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.cs.allow-jit</key>
<true/>
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
<true/>
<key>com.apple.security.cs.disable-executable-page-protection</key>
<true/>
<key>com.apple.security.cs.disable-library-validation</key>
<true/>
</dict>
</plist>
EOF
- name: 🔏 Sign and notarize
if: github.event_name == 'push'
env:
APPLE_EMAIL: ${{ secrets.APPLE_EMAIL }}
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
APPLE_CERT_NAME: ${{ secrets.APPLE_CERT_NAME }}
run: |
CERTIFICATE="$APPLE_CERT_NAME"
ENTITLEMENTS=".sign/entitlements.plist"
APP_PATH="target/artifacts/Graphite.app"
ZIP_PATH=".sign/Graphite.zip"
codesign --force --options runtime --entitlements "$ENTITLEMENTS" --sign "$CERTIFICATE" "$APP_PATH/Contents/Frameworks/Graphite Helper.app"
codesign --force --options runtime --entitlements "$ENTITLEMENTS" --sign "$CERTIFICATE" "$APP_PATH/Contents/Frameworks/Graphite Helper (GPU).app"
codesign --force --options runtime --entitlements "$ENTITLEMENTS" --sign "$CERTIFICATE" "$APP_PATH/Contents/Frameworks/Graphite Helper (Renderer).app"
codesign --force --options runtime --entitlements "$ENTITLEMENTS" --sign "$CERTIFICATE" "$APP_PATH/Contents/Frameworks/Chromium Embedded Framework.framework"
codesign --force --options runtime --entitlements "$ENTITLEMENTS" --sign "$CERTIFICATE" "$APP_PATH/Contents/Frameworks/Chromium Embedded Framework.framework/Libraries/libcef_sandbox.dylib"
codesign --force --options runtime --entitlements "$ENTITLEMENTS" --sign "$CERTIFICATE" "$APP_PATH/Contents/Frameworks/Chromium Embedded Framework.framework/Libraries/libEGL.dylib"
codesign --force --options runtime --entitlements "$ENTITLEMENTS" --sign "$CERTIFICATE" "$APP_PATH/Contents/Frameworks/Chromium Embedded Framework.framework/Libraries/libGLESv2.dylib"
codesign --force --options runtime --entitlements "$ENTITLEMENTS" --sign "$CERTIFICATE" "$APP_PATH/Contents/Frameworks/Chromium Embedded Framework.framework/Libraries/libvk_swiftshader.dylib"
codesign --force --options runtime --entitlements "$ENTITLEMENTS" --sign "$CERTIFICATE" "$APP_PATH" --deep
codesign --verify --deep --strict --verbose=4 "$APP_PATH"
ditto -c -k --keepParent "$APP_PATH" "$ZIP_PATH"
xcrun notarytool submit "$ZIP_PATH" --wait --apple-id "$APPLE_EMAIL" --team-id "$APPLE_TEAM_ID" --password "$APPLE_PASSWORD"
rm "$ZIP_PATH"
xcrun stapler staple -v "$APP_PATH"
spctl -a -vv "$APP_PATH"
- name: 📦 Upload signed Mac bundle
if: github.event_name == 'push'
uses: actions/upload-artifact@v6
with:
name: graphite-mac-bundle-signed
path: target/artifacts
linux:
if: (github.event_name == 'push' && github.ref != 'refs/tags/latest-stable') || inputs.linux
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
steps:
- name: 📥 Clone repository
uses: actions/checkout@v6
with:
repository: ${{ inputs.checkout_repo || github.repository }}
ref: ${{ inputs.checkout_ref || '' }}
- name: ❄ Install Nix
uses: DeterminateSystems/nix-installer-action@main
- name: 🗑 Free disk space
run: sudo rm -rf /usr/share/dotnet /usr/local/lib/android /opt/ghc /opt/hostedtoolcache
- name: 📦 Build Nix package
run: nix build .#graphite${{ inputs.debug && '-dev' || '' }} --no-link --print-out-paths
- name: 📤 Push to Nix cache
if: (github.event_name == 'push' || inputs.push_to_nix_cache) && !inputs.debug
env:
NIX_CACHE_AUTH_TOKEN: ${{ secrets.NIX_CACHE_AUTH_TOKEN }}
run: |
nix run nixpkgs#cachix -- authtoken $NIX_CACHE_AUTH_TOKEN
nix build --no-link --print-out-paths | nix run nixpkgs#cachix -- push graphite
- name: 🏗 Build Linux bundle
run: nix build .#graphite${{ inputs.debug && '-dev' || '' }}-bundle.tar.xz && cp ./result ./graphite-linux-bundle.tar.xz
- name: 📦 Upload Linux bundle
uses: actions/upload-artifact@v6
with:
name: graphite-linux-bundle
path: graphite-linux-bundle.tar.xz
compression-level: 0
- name: 💬 Comment artifact link on PR
id: linux-comment
if: github.event_name != 'push'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
ARTIFACT_ID=$(gh api repos/${{ github.repository }}/actions/runs/${{ github.run_id }}/artifacts --jq '.artifacts[] | select(.name == "graphite-linux-bundle") | .id')
ARTIFACT_URL="https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}/artifacts/$ARTIFACT_ID"
PR_NUMBER="${{ inputs.pr_number }}"
if [ -z "$PR_NUMBER" ]; then
BRANCH=$(git rev-parse --abbrev-ref HEAD)
PR_NUMBER=$(gh pr list --repo ${{ github.repository }} --head "$BRANCH" --json number --jq '.[0].number' 2>/dev/null || true)
fi
if [ -n "$PR_NUMBER" ] && [ -n "$ARTIFACT_ID" ]; then
BODY="| 📦 **Linux Build Complete for** $(git rev-parse HEAD) |"$'\n'
BODY+="|-|"$'\n'
BODY+="| [Download binary]($ARTIFACT_URL) |"
COMMENT_ID=$(gh api repos/${{ github.repository }}/issues/$PR_NUMBER/comments -f body="$BODY" --jq '.id')
echo "comment_id=$COMMENT_ID" >> "$GITHUB_OUTPUT"
fi
- name: 🔧 Install Flatpak tooling
run: |
sudo apt-get update
sudo apt-get install -y flatpak flatpak-builder
flatpak --user remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
- name: 🏗 Build Flatpak
run: |
nix build .#graphite${{ inputs.debug && '-dev' || '' }}-flatpak-manifest
rm -rf .flatpak
mkdir -p .flatpak
cp ./result .flatpak/manifest.json
cd .flatpak
mkdir -p repo
flatpak-builder --user --force-clean --install-deps-from=flathub --repo=repo build ./manifest.json
flatpak build-bundle repo Graphite.flatpak art.graphite.Graphite --runtime-repo=https://flathub.org/repo/flathub.flatpakrepo
- name: 📦 Upload Flatpak package
uses: actions/upload-artifact@v6
with:
name: graphite-flatpak
path: .flatpak/Graphite.flatpak
compression-level: 0
- name: 💬 Update PR comment with Flatpak artifact link
if: github.event_name != 'push' && steps.linux-comment.outputs.comment_id
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
ARTIFACT_ID=$(gh api repos/${{ github.repository }}/actions/runs/${{ github.run_id }}/artifacts --jq '.artifacts[] | select(.name == "graphite-flatpak") | .id')
ARTIFACT_URL="https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}/artifacts/$ARTIFACT_ID"
COMMENT_ID="${{ steps.linux-comment.outputs.comment_id }}"
if [ -n "$ARTIFACT_ID" ]; then
EXISTING_BODY=$(gh api repos/${{ github.repository }}/issues/comments/$COMMENT_ID --jq '.body')
BODY="$EXISTING_BODY"$'\n'
BODY+="| [Download Flatpak]($ARTIFACT_URL) |"
gh api repos/${{ github.repository }}/issues/comments/$COMMENT_ID -X PATCH -f body="$BODY"
fi
================================================
FILE: .github/workflows/cargo-deny.yml
================================================
name: "Audit Security Advisories"
on:
# Run once each week
schedule:
- cron: "0 0 * * 0"
jobs:
cargo-deny:
if: github.repository == 'GraphiteEditor/Graphite' # Don't run on forks by default
runs-on: ubuntu-latest
steps:
- name: 📥 Clone repository
uses: actions/checkout@v6
- name: 🔒 Check crate security advisories for root workspace
uses: EmbarkStudios/cargo-deny-action@v2
with:
command: check advisories
- name: 🔒 Check crate security advisories for /libraries/rawkit
uses: EmbarkStudios/cargo-deny-action@v2
with:
command: check advisories
manifest-path: libraries/rawkit/Cargo.toml
================================================
FILE: .github/workflows/check.yml
================================================
name: "Check"
on:
pull_request: {}
merge_group: {}
env:
CARGO_TERM_COLOR: always
jobs:
# Check if CI can be skipped (for merge queue deduplication)
skip-check:
runs-on: ubuntu-latest
outputs:
skip: ${{ steps.check.outputs.skip-check }}
steps:
- name: 📥 Clone repository
uses: actions/checkout@v6
- name: 🚦 Check if CI can be skipped
id: check
uses: cariad-tech/merge-queue-ci-skipper@cf80db21fc70244e36487acc531b3f1118889b0a
# Build the web app via the shared build workflow
build:
needs: skip-check
if: needs.skip-check.outputs.skip != 'true'
uses: ./.github/workflows/build.yml
secrets: inherit
with:
web: true
# Run the Rust tests on the self-hosted native runner
test:
needs: skip-check
if: needs.skip-check.outputs.skip != 'true'
runs-on: [self-hosted, target/native]
env:
RUSTC_WRAPPER: /usr/bin/sccache
CARGO_INCREMENTAL: 0
SCCACHE_DIR: /var/lib/github-actions/.cache
steps:
- name: 📥 Clone repository
uses: actions/checkout@v6
- name: 🦀 Install Rust
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
toolchain: stable
override: true
cache: false
rustflags: ""
- name: 🦀 Fetch Rust dependencies
run: cargo fetch --locked
- name: 🧪 Run Rust tests
env:
RUSTFLAGS: -Dwarnings
run: mold -run cargo test --all-features
# Rust format check on GitHub runner
rust-fmt:
needs: skip-check
if: needs.skip-check.outputs.skip != 'true'
runs-on: ubuntu-latest
steps:
- name: 📥 Clone repository
uses: actions/checkout@v6
- name: 🦀 Install Rust
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
toolchain: stable
override: true
cache: false
rustflags: ""
components: rustfmt
- name: 🔬 Check Rust formatting
run: cargo fmt --all -- --check
# License compatibility check on GitHub runner
check-licenses:
needs: skip-check
if: needs.skip-check.outputs.skip != 'true'
runs-on: ubuntu-latest
steps:
- name: 📥 Clone repository
uses: actions/checkout@v6
- name: 📜 Check crate license compatibility for root workspace
uses: EmbarkStudios/cargo-deny-action@v2
with:
command: check bans licenses sources
- name: 📜 Check crate license compatibility for /libraries/rawkit
uses: EmbarkStudios/cargo-deny-action@v2
with:
command: check bans licenses sources
manifest-path: libraries/rawkit/Cargo.toml
================================================
FILE: .github/workflows/comment-!build-commands.yml
================================================
# USAGE:
# After reviewing the code, core team members may comment on a PR with `!build` followed by optional `<target>` and `<profile>` arguments.
# This matches the syntax of the `cargo run build` CLI command, but allows platforms to be specified.
#
# `<target>`: `web` (default), `desktop` (all platforms), or `desktop:<platforms>` (subset of `windows+mac+linux`)
# `<profile>`: `release` (default) or `debug`
#
# Examples:
# - !build
# - !build debug
# - !build desktop
# - !build desktop:windows+mac
# - !build desktop:linux debug
name: "!build PR Command"
on:
issue_comment:
types:
- created
jobs:
setup:
# Command should be limited to core team members (those in the organization) for security.
# From the GitHub Actions docs:
# author_association = 'MEMBER': Author is a member of the organization that owns the repository.
if: >
github.event.issue.pull_request &&
github.event.comment.author_association == 'MEMBER' &&
startsWith(github.event.comment.body, '!build')
runs-on: ubuntu-latest
permissions:
pull-requests: write
outputs:
repo: ${{ steps.pr_info.outputs.repo }}
ref: ${{ steps.pr_info.outputs.ref }}
web: ${{ steps.pr_info.outputs.web }}
windows: ${{ steps.pr_info.outputs.windows }}
mac: ${{ steps.pr_info.outputs.mac }}
linux: ${{ steps.pr_info.outputs.linux }}
debug: ${{ steps.pr_info.outputs.debug }}
steps:
- name: 🔎 Parse command, find branch, and set build flags
id: pr_info
run: |
COMMENT="${{ github.event.comment.body }}"
# Split into space-separated words
read -ra WORDS <<< "$COMMENT"
# First word must be "!build"
if [[ "${WORDS[0]}" != "!build" ]]; then
echo "::error::Expected comment to start with !build"
exit 1
fi
# Initialize build flags (web defaults to true, matching the CLI default target)
WEB="true"
WINDOWS="false"
MAC="false"
LINUX="false"
DEBUG="false"
# Parse target (optional, defaults to `web` if omitted)
IDX=1
case "${WORDS[$IDX]:-}" in
# Target: `web` enables just the web build (already the default, but accepted explicitly)
"web")
((IDX++)) ;;
# Target: `desktop` enables all three desktop platforms
"desktop")
WEB="false"; WINDOWS="true"; MAC="true"; LINUX="true"; ((IDX++)) ;;
# Target: `desktop:<platforms>` enables a subset of desktop platforms, split by `+`
desktop:*)
WEB="false"
PLATFORMS="${WORDS[$IDX]#desktop:}"
IFS='+' read -ra PARTS <<< "$PLATFORMS"
for PART in "${PARTS[@]}"; do
case "$PART" in
"windows") WINDOWS="true" ;;
"mac") MAC="true" ;;
"linux") LINUX="true" ;;
*) echo "::error::Unrecognized platform: $PART"; exit 1 ;;
esac
done
((IDX++))
;;
esac
# Parse profile (optional, defaults to `release` if omitted)
case "${WORDS[$IDX]:-}" in
"debug") DEBUG="true"; ((IDX++)) ;;
"release") ((IDX++)) ;;
esac
# Reject any unexpected trailing words
if [[ $IDX -lt ${#WORDS[@]} ]]; then
echo "::error::Unexpected argument: ${WORDS[$IDX]}"
exit 1
fi
# Write parsed build flags to job outputs
echo "web=$WEB" >> $GITHUB_OUTPUT
echo "windows=$WINDOWS" >> $GITHUB_OUTPUT
echo "mac=$MAC" >> $GITHUB_OUTPUT
echo "linux=$LINUX" >> $GITHUB_OUTPUT
echo "debug=$DEBUG" >> $GITHUB_OUTPUT
# Fetch the PR's head branch and repo (needed for forked PRs where the code lives in another repo)
RESPONSE=$(curl -L -H 'Accept: application/vnd.github+json' -H 'X-GitHub-Api-Version: 2022-11-28' https://api.github.com/repos/${{ github.repository }}/pulls/${{ github.event.issue.number }})
echo "repo=$(echo $RESPONSE | jq -r '.head.repo.full_name')" >> $GITHUB_OUTPUT
echo "ref=$(echo $RESPONSE | jq -r '.head.ref')" >> $GITHUB_OUTPUT
- name: 💬 Edit comment with workflow run link
uses: actions/github-script@v8
with:
script: |
github.rest.issues.updateComment({
comment_id: ${{ github.event.comment.id }},
owner: context.repo.owner,
repo: context.repo.repo,
body: '${{ github.event.comment.body }} ([Run ID ' + context.runId + '](https://github.com/GraphiteEditor/Graphite/actions/runs/' + context.runId + '))'
});
invoke-build:
needs: setup
uses: ./.github/workflows/build.yml
secrets: inherit
with:
web: ${{ needs.setup.outputs.web == 'true' }}
windows: ${{ needs.setup.outputs.windows == 'true' }}
mac: ${{ needs.setup.outputs.mac == 'true' }}
linux: ${{ needs.setup.outputs.linux == 'true' }}
debug: ${{ needs.setup.outputs.debug == 'true' }}
checkout_repo: ${{ needs.setup.outputs.repo }}
checkout_ref: ${{ needs.setup.outputs.ref }}
pr_number: ${{ github.event.issue.number }}
================================================
FILE: .github/workflows/comment-clippy-warnings.yaml
================================================
name: "Clippy Check"
on:
pull_request:
types: [opened, reopened, synchronize, ready_for_review]
jobs:
clippy:
name: Run Clippy
runs-on: ubuntu-latest
# TODO(Keavon): Find a workaround (passing the output text to a separate action with permission to read the secrets?) that allows this to work on fork PRs
if: false
# if: ${{ !github.event.pull_request.draft && !github.event.pull_request.head.repo.fork }}
permissions:
contents: read
pull-requests: write
steps:
- uses: actions/checkout@v6
- name: Install Rust
uses: actions-rs/toolchain@v1
with:
profile: minimal
toolchain: stable
override: true
components: clippy
- name: Install deps
run: |
sudo apt update
sudo apt install libgtk-3-dev libsoup2.4-dev libjavascriptcoregtk-4.0-dev libwebkit2gtk-4.0-dev
- name: Run Clippy
id: clippy
run: |
# Run Clippy and filter output for the root workspace
CLIPPY_OUTPUT=$(cargo clippy --all-targets --all-features -- -W clippy::all 2>&1 | grep -vE "^(\s*Updating|\s*Download|\s*Compiling|\s*Checking|Finished)")
# Run Clippy and filter output for /libraries/rawkit
cd libraries/rawkit
CLIPPY_OUTPUT+=$'\n\n'
CLIPPY_OUTPUT+=$(cargo clippy --all-targets --all-features -- -W clippy::all 2>&1 | grep -vE "^(\s*Updating|\s*Download|\s*Compiling|\s*Checking|Finished)")
cd ../..
# Escape special characters for JSON
ESCAPED_OUTPUT=$(echo "$CLIPPY_OUTPUT" | jq -sR .)
echo "CLIPPY_OUTPUT=$ESCAPED_OUTPUT" >> $GITHUB_OUTPUT
if echo "$CLIPPY_OUTPUT" | grep -qE "^(warning|error)"; then
echo "CLIPPY_ISSUES_FOUND=true" >> $GITHUB_OUTPUT
else
echo "CLIPPY_ISSUES_FOUND=false" >> $GITHUB_OUTPUT
fi
- name: Delete previous comments
uses: actions/github-script@v8
with:
github-token: ${{secrets.GITHUB_TOKEN}}
script: |
const { data: comments } = await github.rest.issues.listComments({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
});
const botComments = comments.filter((comment) =>
comment.user.type === 'Bot' && comment.body.includes('Clippy Warnings/Errors')
);
for (const comment of botComments) {
await github.rest.issues.deleteComment({
owner: context.repo.owner,
repo: context.repo.repo,
comment_id: comment.id,
});
}
- name: Comment PR
if: steps.clippy.outputs.CLIPPY_ISSUES_FOUND == 'true'
uses: actions/github-script@v8
with:
github-token: ${{secrets.GITHUB_TOKEN}}
script: |
const clippy_output = ${{ steps.clippy.outputs.CLIPPY_OUTPUT }};
const output = `
<details open>
<summary>Found Clippy warnings</summary>
#### Clippy Warnings/Errors
\`\`\`
${clippy_output}
\`\`\`
</details>
`;
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: output
})
================================================
FILE: .github/workflows/comment-profiling-changes.yaml
================================================
name: "Profiling Changes"
on:
pull_request:
paths:
- "node-graph/**"
- "Cargo.toml"
- "Cargo.lock"
env:
CARGO_TERM_COLOR: always
jobs:
profile:
runs-on: ubuntu-latest
continue-on-error: true
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
- name: Install Valgrind
run: |
sudo apt update
sudo apt install -y valgrind
- name: Cache Rust dependencies
uses: Swatinem/rust-cache@v2
with:
# Cache on Cargo.lock file
cache-on-failure: true
- name: Cache iai-callgrind binary
id: cache-iai
uses: actions/cache@v5
with:
path: ~/.cargo/bin/iai-callgrind-runner
key: ${{ runner.os }}-iai-callgrind-runner-0.16.1
- name: Install iai-callgrind
if: steps.cache-iai.outputs.cache-hit != 'true'
run: cargo install iai-callgrind-runner@0.16.1
- name: Checkout master branch
run: |
git fetch origin master:master
git checkout master
- name: Get master commit SHA
id: master-sha
run: echo "sha=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT
- name: Get CPU info
id: cpu-info
run: |
# Get CPU model and create a short hash for cache key
CPU_MODEL=$(cat /proc/cpuinfo | grep "model name" | head -1 | cut -d: -f2 | xargs)
CPU_HASH=$(echo "$CPU_MODEL" | sha256sum | cut -c1-8)
echo "cpu-hash=$CPU_HASH" >> $GITHUB_OUTPUT
echo "CPU: $CPU_MODEL (hash: $CPU_HASH)"
- name: Cache benchmark baselines
id: cache-benchmark-baselines
uses: actions/cache@v5
with:
path: target/iai
key: ${{ runner.os }}-${{ runner.arch }}-${{ steps.cpu-info.outputs.cpu-hash }}-benchmark-baselines-master-${{ steps.master-sha.outputs.sha }}
restore-keys: |
${{ runner.os }}-${{ runner.arch }}-${{ steps.cpu-info.outputs.cpu-hash }}-benchmark-baselines-master-
- name: Run baseline benchmarks
if: steps.cache-benchmark-baselines.outputs.cache-hit != 'true'
run: |
# Compile benchmarks
cargo bench --bench compile_demo_art_iai -- --save-baseline=master
# Runtime benchmarks
cargo bench --bench update_executor_iai -- --save-baseline=master
cargo bench --bench run_once_iai -- --save-baseline=master
cargo bench --bench run_cached_iai -- --save-baseline=master
- name: Checkout PR branch
run: git checkout ${{ github.event.pull_request.head.sha }}
- name: Run PR benchmarks
run: |
# Compile benchmarks
cargo bench --bench compile_demo_art_iai -- --baseline=master --output-format=json | jq -sc | sed 's/\\"//g' > /tmp/compile_output.json
# Runtime benchmarks
cargo bench --bench update_executor_iai -- --baseline=master --output-format=json | jq -sc | sed 's/\\"//g' > /tmp/update_output.json
cargo bench --bench run_once_iai -- --baseline=master --output-format=json | jq -sc | sed 's/\\"//g' > /tmp/run_once_output.json
cargo bench --bench run_cached_iai -- --baseline=master --output-format=json | jq -sc | sed 's/\\"//g' > /tmp/run_cached_output.json
- name: Make old comments collapsed by default
# Only run if we have write permissions (not a fork)
if: github.event.pull_request.head.repo.full_name == github.repository
uses: actions/github-script@v8
with:
github-token: ${{secrets.GITHUB_TOKEN}}
script: |
const { data: comments } = await github.rest.issues.listComments({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
});
const botComments = comments.filter((comment) =>
comment.user.type === 'Bot' && comment.body.includes('Performance Benchmark Results') && comment.body.includes('<details open>')
);
for (const comment of botComments) {
// Edit the comment to remove the "open" attribute from the <details> tag
await github.rest.issues.updateComment({
owner: context.repo.owner,
repo: context.repo.repo,
comment_id: comment.id,
body: comment.body.replace('<details open>', '<details>')
});
}
- name: Analyze profiling changes
id: analyze
uses: actions/github-script@v8
with:
script: |
const fs = require('fs');
function isSignificantChange(diffPct, absoluteChange, benchmarkType) {
const meetsPercentageThreshold = Math.abs(diffPct) > 5;
const meetsAbsoluteThreshold = absoluteChange > 200000;
const isCachedExecution = benchmarkType === 'run_cached' ||
benchmarkType.includes('Cached Execution');
return isCachedExecution
? (meetsPercentageThreshold && meetsAbsoluteThreshold)
: meetsPercentageThreshold;
}
const allOutputs = [
JSON.parse(fs.readFileSync('/tmp/compile_output.json', 'utf8')),
JSON.parse(fs.readFileSync('/tmp/update_output.json', 'utf8')),
JSON.parse(fs.readFileSync('/tmp/run_once_output.json', 'utf8')),
JSON.parse(fs.readFileSync('/tmp/run_cached_output.json', 'utf8'))
];
const outputNames = ['compile', 'update', 'run_once', 'run_cached'];
const sectionTitles = ['Compilation', 'Update', 'Run Once', 'Cached Execution'];
let hasSignificantChanges = false;
let regressionDetails = [];
for (let i = 0; i < allOutputs.length; i++) {
const benchmarkOutput = allOutputs[i];
const outputName = outputNames[i];
const sectionTitle = sectionTitles[i];
for (const benchmark of benchmarkOutput) {
if (benchmark.profiles?.[0]?.summaries?.parts?.[0]?.metrics_summary?.Callgrind?.Ir?.diffs?.diff_pct) {
const diffPct = parseFloat(benchmark.profiles[0].summaries.parts[0].metrics_summary.Callgrind.Ir.diffs.diff_pct);
const oldValue = benchmark.profiles[0].summaries.parts[0].metrics_summary.Callgrind.Ir.metrics.Both[1].Int;
const newValue = benchmark.profiles[0].summaries.parts[0].metrics_summary.Callgrind.Ir.metrics.Both[0].Int;
const absoluteChange = Math.abs(newValue - oldValue);
if (isSignificantChange(diffPct, absoluteChange, outputName)) {
hasSignificantChanges = true;
regressionDetails.push({
module_path: benchmark.module_path,
id: benchmark.id,
diffPct,
absoluteChange,
sectionTitle
});
}
}
}
}
core.setOutput('has-significant-changes', hasSignificantChanges);
core.setOutput('regression-details', JSON.stringify(regressionDetails));
- name: Comment PR
if: github.event.pull_request.head.repo.full_name == github.repository
uses: actions/github-script@v8
with:
github-token: ${{secrets.GITHUB_TOKEN}}
script: |
const fs = require('fs');
const compileOutput = JSON.parse(fs.readFileSync('/tmp/compile_output.json', 'utf8'));
const updateOutput = JSON.parse(fs.readFileSync('/tmp/update_output.json', 'utf8'));
const runOnceOutput = JSON.parse(fs.readFileSync('/tmp/run_once_output.json', 'utf8'));
const runCachedOutput = JSON.parse(fs.readFileSync('/tmp/run_cached_output.json', 'utf8'));
const hasSignificantChanges = '${{ steps.analyze.outputs.has-significant-changes }}' === 'true';
let commentBody = "";
function formatNumber(num) {
return String(num).replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}
function formatPercentage(pct) {
const sign = pct >= 0 ? '+' : '';
return `${sign}${pct.toFixed(2)}%`;
}
function padRight(str, len) {
return str.padEnd(len);
}
function padLeft(str, len) {
return str.padStart(len);
}
function processBenchmarkOutput(benchmarkOutput, sectionTitle, isLast = false) {
let sectionBody = "";
let hasResults = false;
let hasSignificantChanges = false;
function isSignificantChange(diffPct, absoluteChange, benchmarkType) {
const meetsPercentageThreshold = Math.abs(diffPct) > 5;
const meetsAbsoluteThreshold = absoluteChange > 200000;
const isCachedExecution = benchmarkType === 'run_cached' ||
benchmarkType.includes('Cached Execution');
return isCachedExecution
? (meetsPercentageThreshold && meetsAbsoluteThreshold)
: meetsPercentageThreshold;
}
for (const benchmark of benchmarkOutput) {
if (benchmark.profiles && benchmark.profiles.length > 0) {
const profile = benchmark.profiles[0];
if (profile.summaries && profile.summaries.parts && profile.summaries.parts.length > 0) {
const part = profile.summaries.parts[0];
if (part.metrics_summary && part.metrics_summary.Callgrind && part.metrics_summary.Callgrind.Ir) {
const irData = part.metrics_summary.Callgrind.Ir;
if (irData.diffs && irData.diffs.diff_pct !== null) {
const irDiff = {
diff_pct: parseFloat(irData.diffs.diff_pct),
old: irData.metrics.Both[1].Int,
new: irData.metrics.Both[0].Int
};
hasResults = true;
const changePercentage = formatPercentage(irDiff.diff_pct);
const color = irDiff.diff_pct > 0 ? "red" : "lime";
sectionBody += `**${benchmark.module_path} ${benchmark.id}:${benchmark.details}**\n`;
sectionBody += `Instructions: \`${formatNumber(irDiff.old)}\` (master) → \`${formatNumber(irDiff.new)}\` (HEAD) : `;
sectionBody += `$$\\color{${color}}${changePercentage.replace("%", "\\\\%")}$$\n\n`;
sectionBody += "<details>\n<summary>Detailed metrics</summary>\n\n```\n";
sectionBody += `Baselines: master| HEAD\n`;
for (const [metricName, metricData] of Object.entries(part.metrics_summary.Callgrind)) {
if (metricData.diffs && metricData.diffs.diff_pct !== null) {
const changePercentage = formatPercentage(parseFloat(metricData.diffs.diff_pct));
const oldValue = metricData.metrics.Both[1].Int || metricData.metrics.Both[1].Float;
const newValue = metricData.metrics.Both[0].Int || metricData.metrics.Both[0].Float;
const line = `${padRight(metricName, 20)} ${padLeft(formatNumber(Math.round(oldValue)), 11)}|${padLeft(formatNumber(Math.round(newValue)), 11)} ${padLeft(changePercentage, 15)}`;
sectionBody += `${line}\n`;
}
}
sectionBody += "```\n</details>\n\n";
if (isSignificantChange(irDiff.diff_pct, Math.abs(irDiff.new - irDiff.old), sectionTitle)) {
significantChanges = true;
hasSignificantChanges = true;
}
}
}
}
}
}
if (hasResults) {
// Wrap section in collapsible details, open only if there are significant changes
const openAttribute = hasSignificantChanges ? " open" : "";
const ruler = isLast ? "" : "\n\n---";
return `<details${openAttribute}>\n<summary><h2>${sectionTitle}</h2></summary>\n\n${sectionBody}${ruler}\n</details>`;
}
return "";
}
// Process each benchmark category
const sections = [
{ output: compileOutput, title: "🔧 Graph Compilation" },
{ output: updateOutput, title: "🔄 Executor Update" },
{ output: runOnceOutput, title: "🚀 Render: Cold Execution" },
{ output: runCachedOutput, title: "⚡ Render: Cached Execution" }
];
// Generate sections and determine which ones have results
const generatedSections = sections.map(({ output, title }) =>
processBenchmarkOutput(output, title, true) // temporarily mark all as last
).filter(section => section.length > 0);
// Re-generate with correct isLast flags
let sectionIndex = 0;
const finalSections = sections.map(({ output, title }) => {
const section = processBenchmarkOutput(output, title, true); // check if it has results
if (section.length > 0) {
const isLast = sectionIndex === generatedSections.length - 1;
sectionIndex++;
return processBenchmarkOutput(output, title, isLast);
}
return "";
}).filter(section => section.length > 0);
// Combine all sections
commentBody = finalSections.join("\n\n");
if (commentBody.length > 0) {
const output = `<details open>\n<summary>Performance Benchmark Results</summary>\n\n${commentBody}\n</details>`;
if (hasSignificantChanges) {
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: output
});
} else {
console.log("No significant performance changes detected. Skipping comment.");
console.log(output);
}
} else {
console.log("No benchmark results to display.");
}
- name: Fail on significant regressions
if: steps.analyze.outputs.has-significant-changes == 'true'
uses: actions/github-script@v8
with:
script: |
const regressionDetails = JSON.parse('${{ steps.analyze.outputs.regression-details }}');
const firstRegression = regressionDetails[0];
core.setFailed(`Significant performance regression detected: ${firstRegression.module_path} ${firstRegression.id} increased by ${firstRegression.absoluteChange.toLocaleString()} instructions (${firstRegression.diffPct.toFixed(2)}%)`);
================================================
FILE: .github/workflows/library-rawkit.yml
================================================
name: "Library: Rawkit"
on:
push:
branches:
- master
paths:
- "libraries/rawkit/**"
pull_request:
paths:
- "libraries/rawkit/**"
env:
CARGO_TERM_COLOR: always
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: read
env:
SCCACHE_GHA_ENABLED: "true"
RUSTC_WRAPPER: "sccache"
CARGO_INCREMENTAL: 0
SCCACHE_DIR: /var/lib/github-actions/.cache
steps:
- name: 📥 Clone repository
uses: actions/checkout@v6
- name: 🦀 Install Rust
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
toolchain: stable
override: true
cache: false
rustflags: ""
- name: 📦 Run sccache-cache
uses: mozilla-actions/sccache-action@v0.0.6
continue-on-error: true
- name: 🔧 Fallback if sccache fails
if: failure()
run: |
echo "sccache failed, disabling it"
echo "RUSTC_WRAPPER=" >> $GITHUB_ENV
- name: 🔬 Check Rust formatting
run: |
cd libraries/rawkit
cargo fmt --all -- --check
- name: 🦀 Build Rust code
run: |
cd libraries/rawkit
cargo build --release --all-features
- name: 🧪 Run Rust tests
run: |
cd libraries/rawkit
cargo test --release --all-features
- name: 📈 Run sccache stat for check
shell: bash
run: sccache --show-stats || echo "sccache stats unavailable"
================================================
FILE: .github/workflows/provide-shaders.yml
================================================
name: "Provide Shaders"
on:
push:
branches:
- master
workflow_dispatch: {}
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- name: 📥 Clone repository
uses: actions/checkout@v6
- name: ❄ Install Nix
uses: DeterminateSystems/nix-installer-action@main
- name: 💾 Set up Nix cache
uses: DeterminateSystems/magic-nix-cache-action@main
- name: 🏗 Build graphene raster nodes shaders
run: nix build .#graphite-raster-nodes-shaders && cp result raster_nodes_shaders_entrypoint.wgsl
- name: 📤 Upload graphene raster nodes shaders to artifacts repository
run: |
bash .github/workflows/scripts/artifact-upload.bash \
${{ vars.ARTIFACTS_REPO_OWNER }} \
${{ vars.ARTIFACTS_REPO_NAME }} \
${{ vars.ARTIFACTS_REPO_BRANCH }} \
rev/${{ github.sha }}/raster_nodes_shaders_entrypoint.wgsl \
raster_nodes_shaders_entrypoint.wgsl \
"${{ github.sha }} raster_nodes_shaders_entrypoint.wgsl" \
${{ secrets.ARTIFACTS_REPO_TOKEN }}
================================================
FILE: .github/workflows/scripts/artifact-upload.bash
================================================
#!/usr/bin/env bash
set -euo pipefail
usage() {
cat <<EOF
Usage: $0 <owner> <repo> <branch> <target-path> <artifact-file> <commit-message> <github-token>
Arguments:
owner : GitHub user or organization of the target repo
repo : Target repo name
branch : Branch name (e.g. main)
target-path : Full path (including folders + filename) in the target repo where to upload
artifact-file : Local file path to upload
commit-message : Commit message for creating/updating the file
github-token : GitHub token (PAT or equivalent) with write access to the target repo
This will perform a GitHub API PUT to /repos/{owner}/{repo}/contents/{target-path}.
If a file already exists at that path, it will auto-detect the SHA and update; otherwise it will create a new one.
EOF
exit 1
}
if [ $# -ne 7 ]; then
usage
fi
OWNER="$1"
REPO="$2"
BRANCH="$3"
TARGET_PATH="$4"
ARTIFACT_PATH="$5"
COMMIT_MSG="$6"
TOKEN="$7"
if [ ! -f "$ARTIFACT_PATH" ]; then
echo "Error: artifact file not found: $ARTIFACT_PATH" >&2
exit 1
fi
LOCAL_SHA=$(git hash-object "$ARTIFACT_PATH")
echo "Local blob SHA: $LOCAL_SHA"
GET_URL="https://api.github.com/repos/${OWNER}/${REPO}/contents/${TARGET_PATH}?ref=${BRANCH}"
GET_RESPONSE=$(curl -s -H "Authorization: token ${TOKEN}" "$GET_URL")
REMOTE_SHA=$(echo "$GET_RESPONSE" | jq -r .sha 2>/dev/null || echo "")
if [ "$REMOTE_SHA" != "null" ] && [ -n "$REMOTE_SHA" ]; then
echo "Remote blob SHA: $REMOTE_SHA"
if [ "$LOCAL_SHA" = "$REMOTE_SHA" ]; then
echo "The remote file is identical. Skipping upload."
exit 0
else
echo "Remote file differs. Preparing to upload."
fi
else
echo "No existing remote file or no SHA found. Creating."
fi
CONTENT_TMP_BASE64=$(mktemp)
if base64 --help 2>&1 | grep -q -- "-w"; then
base64 -w 0 "$ARTIFACT_PATH" > "$CONTENT_TMP_BASE64"
else
base64 "$ARTIFACT_PATH" | tr -d '\n' > "$CONTENT_TMP_BASE64"
fi
PAYLOAD_TMP=$(mktemp)
jq -n \
--arg message "$COMMIT_MSG" \
--arg branch "$BRANCH" \
--arg sha "$REMOTE_SHA" \
--rawfile content "$CONTENT_TMP_BASE64" \
'{
message: $message,
content: $content,
branch: $branch
} + (if ($sha != "" and $sha != "null") then { sha: $sha } else {} end)' \
> "$PAYLOAD_TMP"
UPLOAD_RESPONSE=$(curl -s -X PUT \
-H "Authorization: token ${TOKEN}" \
-H "Content-Type: application/json" \
-d @"$PAYLOAD_TMP" \
"https://api.github.com/repos/${OWNER}/${REPO}/contents/${TARGET_PATH}")
echo "Upload Response:"
echo "$UPLOAD_RESPONSE"
rm -f "$CONTENT_TMP_BASE64" "$PAYLOAD_TMP"
================================================
FILE: .github/workflows/website.yml
================================================
name: "Website"
on:
workflow_dispatch: {}
push:
branches:
- master
paths:
- website/**
pull_request:
paths:
- website/**
env:
CARGO_TERM_COLOR: always
INDEX_HTML_HEAD_INCLUSION: <script defer data-domain="graphite.art" data-api="/visit/event" src="/visit/script.hash.js"></script>
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: read
deployments: write
pull-requests: write
steps:
- name: 📥 Clone repository
uses: actions/checkout@v6
- name: 🟢 Install Node.js
uses: actions/setup-node@v6
with:
node-version-file: .nvmrc
- name: 🕸 Install Zola
uses: taiki-e/install-action@v2
with:
tool: zola@0.22.0
- name: 🔍 Check if `website/other` directory changed
uses: dorny/paths-filter@v3
id: changes
with:
filters: |
website-other:
- "website/other/**"
- name: ✂ Replace template in <head> of index.html
run: |
# Remove the INDEX_HTML_HEAD_INCLUSION environment variable for build links (not master deploys)
git rev-parse --abbrev-ref HEAD | grep master > /dev/null || export INDEX_HTML_HEAD_INCLUSION=""
- name: 🦀 Produce auto-generated code docs data
run: |
rustup update stable
cargo run -p crate-hierarchy-viz -- website/generated
cargo run -p editor-message-tree -- website/generated
- name: 🔧 Install website npm dependencies
run: |
cd website
npm ci
- name: 📃 Generate node catalog documentation
run: cargo run -p node-docs -- website/content/learn/node-catalog
- name: 🌐 Build Graphite website with Zola
env:
MODE: prod
run: |
cd website
npm run check
zola --config config.toml build --minify
- name: 📤 Publish to Cloudflare Pages
continue-on-error: true
env:
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
run: npx wrangler@3 pages deploy "website/public" --project-name="graphite-website" --commit-dirty=true
================================================
FILE: .gitignore
================================================
branding/
target/
third-party-licenses.txt*
result/
.flatpak-builder/
*.spv
*.exrc
perf.data*
profile.json
profile.json.gz
flamegraph.svg
.idea/
.direnv
.DS_Store
================================================
FILE: .nix/default.nix
================================================
inputs:
let
systems = [
"x86_64-linux"
"aarch64-linux"
];
forAllSystems = f: inputs.nixpkgs.lib.genAttrs systems (system: f system);
args =
system:
(
let
lib = inputs.nixpkgs.lib // {
call = p: import p args;
};
pkgs = import inputs.nixpkgs {
inherit system;
overlays = [ (import inputs.rust-overlay) ];
};
info = {
pname = "graphite";
version = "unstable";
src = inputs.nixpkgs.lib.cleanSourceWith {
src = ./..;
filter = path: type: !(type == "directory" && builtins.baseNameOf path == ".nix");
};
cargoVendored = deps.crane.lib.vendorCargoDeps { inherit (info) src; };
};
deps = {
crane = lib.call ./deps/crane.nix;
cef = lib.call ./deps/cef.nix;
rustGPU = lib.call ./deps/rust-gpu.nix;
};
args = {
inherit system;
inherit (inputs) self;
inherit inputs;
inherit pkgs;
inherit lib;
inherit info;
inherit deps;
}
// inputs;
in
args
);
withArgs = f: forAllSystems (system: f (args system));
in
{
packages = withArgs (
{ lib, ... }:
rec {
default = graphite;
graphite = (lib.call ./pkgs/graphite.nix) { };
graphite-dev = (lib.call ./pkgs/graphite.nix) { dev = true; };
graphite-raster-nodes-shaders = lib.call ./pkgs/graphite-raster-nodes-shaders.nix;
graphite-branding = lib.call ./pkgs/graphite-branding.nix;
graphite-bundle = (lib.call ./pkgs/graphite-bundle.nix) { };
graphite-dev-bundle = (lib.call ./pkgs/graphite-bundle.nix) { graphite = graphite-dev; };
graphite-flatpak-manifest = (lib.call ./pkgs/graphite-flatpak-manifest.nix) { };
graphite-dev-flatpak-manifest = (lib.call ./pkgs/graphite-flatpak-manifest.nix) { graphite-bundle = graphite-dev-bundle; };
# TODO: graphene-cli = lib.call ./pkgs/graphene-cli.nix;
tools = {
third-party-licenses = lib.call ./pkgs/tools/third-party-licenses.nix;
};
}
);
devShells = withArgs (
{ lib, ... }:
{
default = lib.call ./dev.nix;
}
);
formatter = withArgs ({ pkgs, ... }: pkgs.nixfmt-tree);
}
================================================
FILE: .nix/deps/cef.nix
================================================
{ pkgs, ... }:
let
cefPath = pkgs.cef-binary.overrideAttrs (finalAttrs: {
postInstall = ''
rm -r $out/* $out/.* || true
strip ./Release/*.so*
mv ./Release/* $out/
find "./Resources/locales" -maxdepth 1 -type f ! -name 'en-US.pak' -delete
mv ./Resources/* $out/
mv ./include $out/
cat ./CREDITS.html | ${pkgs.xz}/bin/xz -9 -e -c > $out/CREDITS.html.xz
echo '${
builtins.toJSON {
type = "minimal";
name = builtins.baseNameOf finalAttrs.src.url;
sha1 = "";
}
}' > $out/archive.json
'';
});
in
{
env.CEF_PATH = cefPath;
}
================================================
FILE: .nix/deps/crane.nix
================================================
{ pkgs, inputs, ... }:
{
lib = inputs.crane.mkLib pkgs;
}
================================================
FILE: .nix/deps/rust-gpu.nix
================================================
{ pkgs, ... }:
let
extensions = [
"rust-src"
"rust-analyzer"
"clippy"
"cargo"
"rustc-dev"
"llvm-tools"
];
toolchain = pkgs.rust-bin.nightly."2025-06-23".default.override {
inherit extensions;
};
cargo = pkgs.writeShellScriptBin "cargo" ''
#!${pkgs.lib.getExe pkgs.bash}
filtered_args=()
for arg in "$@"; do
case "$arg" in
+nightly|+nightly-*) ;;
*) filtered_args+=("$arg") ;;
esac
done
exec ${toolchain}/bin/cargo ${"\${filtered_args[@]}"}
'';
rustc_codegen_spirv =
(pkgs.makeRustPlatform {
cargo = toolchain;
rustc = toolchain;
}).buildRustPackage
(finalAttrs: {
pname = "rustc_codegen_spirv";
version = "0-unstable-2025-08-04";
src = pkgs.fetchFromGitHub {
owner = "Firestar99";
repo = "rust-gpu-new";
rev = "c12f216121820580731440ee79ebc7403d6ea04f";
hash = "sha256-rG1cZvOV0vYb1dETOzzbJ0asYdE039UZImobXZfKIno=";
};
cargoHash = "sha256-AEigcEc5wiBd3zLqWN/2HSbkfOVFneAqNvg9HsouZf4=";
cargoBuildFlags = [
"-p"
"rustc_codegen_spirv"
"--features=use-compiled-tools"
"--no-default-features"
];
doCheck = false;
});
in
{
toolchain = toolchain;
env = {
RUST_GPU_PATH_OVERRIDE = "${cargo}/bin:${toolchain}/bin";
RUSTC_CODEGEN_SPIRV_PATH = "${rustc_codegen_spirv}/lib/librustc_codegen_spirv.so";
};
}
================================================
FILE: .nix/dev.nix
================================================
{ pkgs, deps, ... }:
let
libs = [
pkgs.wayland
pkgs.vulkan-loader
pkgs.libGL
pkgs.openssl
pkgs.libraw
# X11 Support
pkgs.libxkbcommon
pkgs.libXcursor
pkgs.libxcb
pkgs.libX11
];
in
pkgs.mkShell (
{
packages = libs ++ [
pkgs.pkg-config
pkgs.lld
pkgs.nodejs
pkgs.nodePackages.npm
pkgs.binaryen
pkgs.wasm-bindgen-cli_0_2_100
pkgs.wasm-pack
pkgs.cargo-about
pkgs.rustc
pkgs.cargo
pkgs.rust-analyzer
pkgs.clippy
pkgs.rustfmt
pkgs.git
pkgs.cargo-watch
pkgs.cargo-nextest
pkgs.cargo-expand
# Linker
pkgs.mold
# Profiling tools
pkgs.gnuplot
pkgs.samply
pkgs.cargo-flamegraph
# Plotting tools
pkgs.graphviz
];
LD_LIBRARY_PATH = "${pkgs.lib.makeLibraryPath libs}:${deps.cef.env.CEF_PATH}";
XDG_DATA_DIRS = "${pkgs.gsettings-desktop-schemas}/share/gsettings-schemas/${pkgs.gsettings-desktop-schemas.name}:${pkgs.gtk3}/share/gsettings-schemas/${pkgs.gtk3.name}:$XDG_DATA_DIRS";
shellHook = ''
alias cargo='mold --run cargo'
'';
}
// deps.cef.env
// deps.rustGPU.env
)
================================================
FILE: .nix/pkgs/graphite-branding.nix
================================================
{ info, pkgs, ... }:
let
brandingTar = pkgs.fetchurl (
let
lockContent = builtins.readFile "${info.src}/.branding";
lines = builtins.filter (s: s != [ ]) (builtins.split "\n" lockContent);
url = builtins.elemAt lines 0;
hash = builtins.elemAt lines 1;
in
{
url = url;
sha256 = hash;
}
);
in
pkgs.runCommand "${info.pname}-branding" { } ''
mkdir -p $out
tar -xvf ${brandingTar} -C $out --strip-components 1
''
================================================
FILE: .nix/pkgs/graphite-bundle.nix
================================================
{
pkgs,
self,
system,
...
}:
{
graphite ? self.packages.${system}.graphite,
}:
let
bundle =
{
archive ? false,
compression ? null,
passthru ? { },
}:
(
let
tar = if compression == null then archive else true;
nameArchiveSuffix = if tar then ".tar" else "";
nameCompressionSuffix = if compression == null then "" else "." + compression;
name = "graphite-bundle${nameArchiveSuffix}${nameCompressionSuffix}";
build = ''
mkdir -p out
mkdir -p out/bin
cp ${graphite}/bin/graphite out/bin/graphite
chmod -v +w out/bin/graphite
patchelf \
--set-rpath '$ORIGIN/../lib:$ORIGIN/../lib/cef' \
--set-interpreter '/lib64/ld-linux-x86-64.so.2' \
--remove-needed libGL.so \
out/bin/graphite
cp -r ${graphite}/share out/share
mkdir -p out/lib/cef
mkdir -p ./cef
tar -xvf ${pkgs.cef-binary.src} -C ./cef --strip-components=1
cp -r ./cef/Release/* out/lib/cef/
cp -r ./cef/Resources/* out/lib/cef/
find "out/lib/cef/locales" -type f ! -name 'en-US*' -delete
${pkgs.bintools}/bin/strip out/lib/cef/*.so*
'';
install =
if tar then
''
cd out
tar -c \
--sort=name \
--mtime='@1' --clamp-mtime \
--owner=0 --group=0 --numeric-owner \
--mode='u=rwX,go=rX' \
--format=posix \
--pax-option=delete=atime,delete=ctime \
--no-acls --no-xattrs --no-selinux \
* ${
if compression == "xz" then
"| xz "
else if compression == "gz" then
"| gzip -n "
else
""
}> $out
''
else
''
mkdir -p $out
cp -r out/* $out/
'';
in
pkgs.runCommand name
{
inherit passthru;
}
''
${build}
${install}
''
);
in
bundle {
passthru = {
tar = bundle {
archive = true;
passthru = {
gz = bundle {
compression = "gz";
};
xz = bundle {
compression = "xz";
};
};
};
};
}
================================================
FILE: .nix/pkgs/graphite-flatpak-manifest.nix
================================================
{
pkgs,
self,
system,
...
}:
{
graphite-bundle ? self.packages.${system}.graphite-bundle,
}:
(pkgs.formats.json { }).generate "art.graphite.Graphite.json" {
app-id = "art.graphite.Graphite";
runtime = "org.freedesktop.Platform";
runtime-version = "25.08";
sdk = "org.freedesktop.Sdk";
command = "graphite";
finish-args = [
"--device=dri"
"--share=ipc"
"--socket=wayland"
"--socket=fallback-x11"
"--share=network"
];
modules = [
{
name = "app";
buildsystem = "simple";
build-commands = [
"mkdir -p /app"
"cp -r ./* /app/"
"chmod +x /app/bin/*"
];
sources = [
{
type = "archive";
path = graphite-bundle.tar;
strip-components = 0;
}
];
}
];
}
================================================
FILE: .nix/pkgs/graphite-raster-nodes-shaders.nix
================================================
{ info, deps, ... }:
(deps.crane.lib.overrideToolchain (_: deps.rustGPU.toolchain)).buildPackage {
pname = "raster-nodes-shaders";
inherit (info) version src;
cargoVendorDir = deps.crane.lib.vendorMultipleCargoDeps {
inherit (deps.crane.lib.findCargoFiles (deps.crane.lib.cleanCargoSource info.src)) cargoConfigs;
cargoLockList = [
"${info.src}/Cargo.lock"
"${deps.rustGPU.toolchain.availableComponents.rust-src}/lib/rustlib/src/rust/library/Cargo.lock"
];
};
strictDeps = true;
env = deps.rustGPU.env;
buildPhase = ''
cargo build -r -p raster-nodes-shaders
'';
installPhase = ''
cp target/spirv-builder/spirv-unknown-naga-wgsl/release/deps/raster_nodes_shaders_entrypoint.wgsl $out
'';
doCheck = false;
}
================================================
FILE: .nix/pkgs/graphite.nix
================================================
{
info,
pkgs,
self,
deps,
system,
lib,
...
}:
{
dev ? false,
}:
let
branding = self.packages.${system}.graphite-branding;
cargoVendorDir = deps.crane.lib.vendorCargoDeps { inherit (info) src; };
resourcesCommon = {
pname = "${info.pname}-resources";
inherit (info) version src;
inherit cargoVendorDir;
strictDeps = true;
nativeBuildInputs = [
pkgs.pkg-config
pkgs.lld
pkgs.nodejs
pkgs.nodePackages.npm
pkgs.binaryen
pkgs.wasm-bindgen-cli_0_2_100
pkgs.wasm-pack
pkgs.cargo-about
];
buildInputs = [ pkgs.openssl ];
env.CARGO_PROFILE = if dev then "dev" else "release";
cargoExtraArgs = "--target wasm32-unknown-unknown -p graphite-wasm --no-default-features --features native";
doCheck = false;
};
resources = deps.crane.lib.buildPackage (
resourcesCommon
// {
cargoArtifacts = deps.crane.lib.buildDepsOnly resourcesCommon;
npmDeps = pkgs.importNpmLock {
npmRoot = "${info.src}/frontend";
};
npmRoot = "frontend";
npmConfigScript = "setup";
makeCacheWritable = true;
nativeBuildInputs = [
pkgs.importNpmLock.npmConfigHook
pkgs.removeReferencesTo
]
++ resourcesCommon.nativeBuildInputs;
prePatch = ''
mkdir branding
cp -r ${branding}/* branding
cp ${info.src}/.branding branding/.branding
'';
buildPhase = ''
export HOME="$TMPDIR"
pushd frontend
npm run native:build-${if dev then "dev" else "production"}
popd
'';
installPhase = ''
mkdir -p $out
cp -r frontend/dist/* $out/
'';
postFixup = ''
find "$out" -type f -exec remove-references-to -t "${cargoVendorDir}" '{}' +
'';
}
);
libs = [
pkgs.wayland
pkgs.vulkan-loader
pkgs.libGL
pkgs.openssl
pkgs.libraw
# X11 Support
pkgs.libxkbcommon
pkgs.libXcursor
pkgs.libxcb
pkgs.libX11
];
common = {
inherit (info) pname version src;
inherit cargoVendorDir;
strictDeps = true;
buildInputs = libs;
nativeBuildInputs = [
pkgs.pkg-config
pkgs.cargo-about
pkgs.removeReferencesTo
];
env = deps.cef.env // {
CARGO_PROFILE = if dev then "dev" else "release";
};
cargoExtraArgs = "-p graphite-desktop";
doCheck = false;
};
in
deps.crane.lib.buildPackage (
common
// {
cargoArtifacts = deps.crane.lib.buildDepsOnly common;
env = common.env // {
RASTER_NODES_SHADER_PATH = self.packages.${system}.graphite-raster-nodes-shaders;
EMBEDDED_RESOURCES = resources;
GRAPHITE_GIT_COMMIT_HASH = self.rev or "unknown";
GRAPHITE_GIT_COMMIT_DATE = self.lastModified or "unknown";
};
npmDeps = pkgs.importNpmLock {
npmRoot = "${info.src}/frontend";
};
npmRoot = "frontend";
nativeBuildInputs = [
pkgs.importNpmLock.npmConfigHook
pkgs.nodePackages.npm
]
++ common.nativeBuildInputs;
preBuild = ''
${lib.getExe self.packages.${system}.tools.third-party-licenses}
''
+ (
if self ? rev then
''
export GRAPHITE_GIT_COMMIT_DATE="$(date -u -d "@$GRAPHITE_GIT_COMMIT_DATE" +"%Y-%m-%dT%H:%M:%SZ")"
''
else
""
);
installPhase = ''
mkdir -p $out/bin
cp target/${if dev then "debug" else "release"}/graphite $out/bin/graphite
mkdir -p $out/share/applications
cp $src/desktop/assets/*.desktop $out/share/applications/
mkdir -p $out/share/icons/hicolor/scalable/apps
cp ${branding}/app-icons/graphite.svg $out/share/icons/hicolor/scalable/apps/art.graphite.Graphite.svg
mkdir -p $out/share/icons/hicolor/512x512/apps
cp ${branding}/app-icons/graphite-512.png $out/share/icons/hicolor/512x512/apps/art.graphite.Graphite.png
mkdir -p $out/share/icons/hicolor/256x256/apps
cp ${branding}/app-icons/graphite-256.png $out/share/icons/hicolor/256x256/apps/art.graphite.Graphite.png
mkdir -p $out/share/icons/hicolor/128x128/apps
cp ${branding}/app-icons/graphite-128.png $out/share/icons/hicolor/128x128/apps/art.graphite.Graphite.png
'';
postFixup = ''
remove-references-to -t "${cargoVendorDir}" $out/bin/graphite
patchelf \
--set-rpath "${pkgs.lib.makeLibraryPath libs}:${deps.cef.env.CEF_PATH}" \
--add-needed libGL.so \
$out/bin/graphite
'';
}
)
================================================
FILE: .nix/pkgs/tools/third-party-licenses.nix
================================================
{
info,
deps,
pkgs,
...
}:
let
cargoVendorDir = deps.crane.lib.vendorCargoDeps { inherit (info) src; };
common = {
pname = "third-party-licenses";
inherit (info) version src;
inherit cargoVendorDir;
nativeBuildInputs = [ pkgs.pkg-config ];
buildInputs = [ pkgs.openssl ];
strictDeps = true;
env = deps.cef.env // {
CARGO_PROFILE = "dev";
};
cargoExtraArgs = "-p third-party-licenses --features desktop";
doCheck = false;
};
in
deps.crane.lib.buildPackage (
common
// {
inherit cargoVendorDir;
cargoArtifacts = deps.crane.lib.buildDepsOnly common;
meta.mainProgram = "third-party-licenses";
}
)
================================================
FILE: .nvmrc
================================================
24
================================================
FILE: .prettierrc
================================================
{
"singleQuote": false,
"useTabs": true,
"tabWidth": 4,
"printWidth": 200,
"overrides": [
{
"files": [
"*.yml",
"*.yaml"
],
"options": {
"useTabs": false,
"tabWidth": 2
}
}
]
}
================================================
FILE: .vscode/extensions.json
================================================
{
// NOTE: Keep this in sync with `.devcontainer/devcontainer.json`
"recommendations": [
// Rust
"rust-lang.rust-analyzer",
"tamasfe.even-better-toml",
// Web
"dbaeumer.vscode-eslint",
"svelte.svelte-vscode",
"vitaliymaz.vscode-svg-previewer",
// Code quality
"wayou.vscode-todo-highlight",
"streetsidesoftware.code-spell-checker",
// Git
"mhutchie.git-graph",
"qezhu.gitlink",
// Helpful
"wmaurer.change-case"
]
}
================================================
FILE: .vscode/launch.json
================================================
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "lldb",
"request": "launch",
"name": "Graphite debug executable",
"cargo": {
"args": [
"build",
"--bin=graphite",
"--package=graphite",
],
"filter": {
"name": "graphite",
"kind": "bin",
},
},
"args": [],
"cwd": "${workspaceFolder}",
"env": {
"RUST_LOG": "error",
},
},
{
"type": "lldb",
"request": "launch",
"name": "Debug unit tests in executable 'graphite'",
"cargo": {
"args": [
"test",
"--no-run",
"--bin=graphite",
"--package=graphite",
],
"filter": {
"name": "graphite",
"kind": "bin",
},
},
"args": [],
"cwd": "${workspaceFolder}",
},
],
}
================================================
FILE: .vscode/settings.json
================================================
{
// Rust: save on format
"[rust]": {
"editor.formatOnSave": true,
"editor.formatOnPaste": true,
"editor.defaultFormatter": "rust-lang.rust-analyzer"
},
// Web: save on format
"[javascript][typescript][svelte]": {
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit"
},
"editor.formatOnSave": true,
"editor.defaultFormatter": "dbaeumer.vscode-eslint"
},
"[scss]": {
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit"
},
"editor.formatOnSave": true,
// Configured in `.prettierrc`
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[json][jsonc][yaml][github-actions-workflow]": {
"editor.formatOnSave": true,
// Configured in `.prettierrc`
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
// Website: don't format Zola/Tera-templated HTML on save
"[html]": {
"editor.formatOnSave": false
},
// Handlebars: don't save on format
// (`about.hbs` is used by Cargo About to encode license information)
"[handlebars]": {
"editor.formatOnSave": false
},
// Rust Analyzer config
"rust-analyzer.check.command": "clippy",
"rust-analyzer.cargo.allTargets": false,
"rust-analyzer.procMacro.ignored": {
"serde_derive": ["Serialize", "Deserialize"]
},
// ESLint config
"eslint.format.enable": true,
"eslint.workingDirectories": ["./frontend", "./website"],
"eslint.validate": ["javascript", "typescript", "svelte"],
// Git Graph config
"git-graph.repository.fetchAndPrune": true,
"git-graph.repository.showRemoteHeads": false,
"git-graph.repository.commits.fetchAvatars": true,
// VS Code Git config
"git.autofetch": true,
"git.enableStatusBarSync": false,
"git.showActionButton": {
"sync": false
},
// CSpell config
"cSpell.language": "en-US",
"cSpell.logLevel": "Information",
"cSpell.allowCompoundWords": true,
// Other extensions config
"evenBetterToml.formatter.alignComments": false,
"package-json-upgrade.ignorePatterns": ["source-sans-pro"],
// VS Code config
"html.format.wrapLineLength": 200,
"files.eol": "\n",
"files.insertFinalNewline": true,
"files.associations": {
"*.graphite": "json"
},
"editor.renderWhitespace": "boundary",
"editor.minimap.markSectionHeaderRegex": "// ===+\\n\\s*//\\s*(?<label>[^\\n]{1,18})[^\\n]*(\\n\\s*//[^\\n]*)*\\n\\s*// ===+"
}
================================================
FILE: Cargo.toml
================================================
[workspace]
members = [
"desktop",
"desktop/wrapper",
"desktop/embedded-resources",
"desktop/bundle",
"desktop/platform/linux",
"desktop/platform/mac",
"desktop/platform/win",
"editor",
"frontend/wasm",
"libraries/dyn-any",
"libraries/math-parser",
"node-graph/libraries/*",
"node-graph/nodes/*",
"node-graph/nodes/raster/shaders",
"node-graph/nodes/raster/shaders/entrypoint",
"node-graph/graph-craft",
"node-graph/graphene-cli",
"node-graph/nodes/gstd",
"node-graph/interpreted-executor",
"node-graph/node-macro",
"node-graph/preprocessor",
"proc-macros",
"tools/cargo-run",
"tools/crate-hierarchy-viz",
"tools/third-party-licenses",
"tools/editor-message-tree",
"tools/node-docs",
]
default-members = [
"editor",
"frontend/wasm",
"libraries/dyn-any",
"libraries/math-parser",
"node-graph/graph-craft",
"node-graph/interpreted-executor",
"node-graph/node-macro",
"node-graph/preprocessor",
# blocked by https://github.com/rust-lang/cargo/issues/16000
# "proc-macros",
"tools/cargo-run",
]
resolver = "2"
[workspace.package]
rust-version = "1.88"
edition = "2024"
authors = ["Graphite Authors <contact@graphite.art>"]
homepage = "https://graphite.art"
repository = "https://github.com/GraphiteEditor/Graphite"
license = "Apache-2.0"
version = "0.0.0"
readme = "README.md"
publish = false
[workspace.dependencies]
# Local dependencies
dyn-any = { path = "libraries/dyn-any", features = [
"derive",
"glam",
"reqwest",
"log-bad-types",
"rc",
] }
preprocessor = { path = "node-graph/preprocessor" }
math-parser = { path = "libraries/math-parser" }
graphene-application-io = { path = "node-graph/libraries/application-io" }
core-types = { path = "node-graph/libraries/core-types" }
no-std-types = { path = "node-graph/libraries/no-std-types" }
raster-types = { path = "node-graph/libraries/raster-types" }
vector-types = { path = "node-graph/libraries/vector-types" }
graphic-types = { path = "node-graph/libraries/graphic-types" }
rendering = { path = "node-graph/libraries/rendering" }
brush-nodes = { path = "node-graph/nodes/brush" }
blending-nodes = { path = "node-graph/nodes/blending" }
graphene-core = { path = "node-graph/nodes/gcore" }
graphic-nodes = { path = "node-graph/nodes/graphic" }
text-nodes = { path = "node-graph/nodes/text" }
transform-nodes = { path = "node-graph/nodes/transform" }
vector-nodes = { path = "node-graph/nodes/vector" }
repeat-nodes = { path = "node-graph/nodes/repeat" }
math-nodes = { path = "node-graph/nodes/math" }
path-bool-nodes = { path = "node-graph/nodes/path-bool" }
graph-craft = { path = "node-graph/graph-craft" }
raster-nodes = { path = "node-graph/nodes/raster" }
graphene-std = { path = "node-graph/nodes/gstd" }
interpreted-executor = { path = "node-graph/interpreted-executor" }
node-macro = { path = "node-graph/node-macro" }
wgpu-executor = { path = "node-graph/libraries/wgpu-executor" }
graphite-proc-macros = { path = "proc-macros" }
# Workspace dependencies
rustc-hash = "2.0"
bytemuck = { version = "1.13", features = ["derive", "min_const_generics"] }
serde = { version = "1.0", features = ["derive", "rc"] }
serde_json = "1.0"
serde_bytes = "0.11"
serde-wasm-bindgen = "0.6"
reqwest = { version = "0.13", features = ["blocking", "json"] }
futures = "0.3"
env_logger = "0.11"
log = "0.4"
bitflags = { version = "2.4", features = ["serde"] }
ctor = "0.2"
convert_case = "0.8"
indoc = "2.0.5"
derivative = "2.2"
thiserror = "2"
anyhow = "1.0"
proc-macro2 = { version = "1", features = ["span-locations"] }
quote = "1.0"
chrono = "0.4"
ron = "0.12"
fastnoise-lite = "1.1"
wgpu = { version = "27.0", features = [
# We don't have wgpu on multiple threads (yet) https://github.com/gfx-rs/wgpu/blob/trunk/CHANGELOG.md#wgpu-types-now-send-sync-on-wasm
"fragile-send-sync-non-atomic-wasm",
"spirv",
"strict_asserts",
] }
once_cell = "1.13" # Remove and replace with `core::cell::LazyCell` (<https://doc.rust-lang.org/core/cell/struct.LazyCell.html>)
wasm-bindgen = "=0.2.100" # NOTICE: ensure this stays in sync with the `wasm-bindgen-cli` version in `website/content/volunteer/guide/project-setup/_index.md`. We pin this version because wasm-bindgen upgrades may break various things.
wasm-bindgen-futures = "0.4"
js-sys = "=0.3.77"
web-sys = { version = "=0.3.77", features = [
"Document",
"DomRect",
"Element",
"HtmlCanvasElement",
"CanvasRenderingContext2d",
"CanvasPattern",
"OffscreenCanvas",
"OffscreenCanvasRenderingContext2d",
"TextMetrics",
"Window",
"IdleRequestOptions",
"ImageData",
"Navigator",
"Gpu",
"HtmlImageElement",
"ImageBitmapRenderingContext",
] }
winit = { git = "https://github.com/rust-windowing/winit.git" }
keyboard-types = "0.8"
url = "2.5"
tokio = { version = "1.29", features = ["fs", "macros", "io-std", "rt", "rt-multi-thread"] }
# Linebender ecosystem (BEGIN)
kurbo = { version = "0.13", features = ["serde"] }
vello = "0.7"
vello_encoding = "0.7"
resvg = "0.47"
usvg = "0.47"
parley = "0.6"
skrifa = "0.40"
polycool = "0.4"
# Linebender ecosystem (END)
rand = { version = "0.9", default-features = false, features = ["std_rng"] }
rand_chacha = "0.9"
glam = { version = "0.29", default-features = false, features = [
"nostd-libm",
"scalar-math",
"bytemuck",
] }
base64 = "0.22"
image = { version = "0.25", default-features = false, features = [
"png",
"jpeg",
"bmp",
"gif",
] }
pretty_assertions = "1.4"
fern = { version = "0.7", features = ["colored"] }
num_enum = { version = "0.7", default-features = false }
num-derive = "0.4"
num-traits = { version = "0.2", default-features = false, features = ["libm"] }
tsify = { version = "0.5", default-features = false, features = ["js"] }
syn = { version = "2.0", default-features = false, features = [
"full",
"derive",
"parsing",
"printing",
"visit-mut",
"visit",
"clone-impls",
"extra-traits",
"proc-macro",
] }
lyon_geom = "1.0"
petgraph = { version = "0.7", default-features = false, features = ["graphmap"] }
half = { version = "2.4", default-features = false, features = ["bytemuck"] }
tinyvec = { version = "1", features = ["std"] }
criterion = { version = "0.7", features = ["html_reports"] }
iai-callgrind = { version = "0.16" }
ndarray = "0.16"
strum = { version = "0.27", features = ["derive"] }
dirs = "6.0"
cef = "142"
cef-dll-sys = "142"
include_dir = "0.7"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
tracing = "0.1"
rfd = "0.15"
open = "5.3"
spin = "0.10"
clap = "4.5"
spirv-std = { git = "https://github.com/Firestar99/rust-gpu-new", rev = "c12f216121820580731440ee79ebc7403d6ea04f", features = ["bytemuck"] }
cargo-gpu = { git = "https://github.com/Firestar99/cargo-gpu", rev = "3952a22d16edbd38689f3a876e417899f21e1fe7", default-features = false }
qrcodegen = "1.8"
lzma-rust2 = { version = "0.16", default-features = false, features = ["std", "encoder", "optimization", "xz"] }
scraper = "0.25"
linesweeper = "0.3"
smallvec = "1.13.2"
[workspace.lints.rust]
unexpected_cfgs = { level = "allow", check-cfg = ['cfg(target_arch, values("spirv"))'] }
[profile.dev]
opt-level = 1
[profile.dev.package]
no-std-types = { opt-level = 1 }
core-types= { opt-level = 1 }
interpreted-executor = { opt-level = 1 } # This is a mitigation for https://github.com/rustwasm/wasm-pack/issues/981 which is needed because the node_registry function is too large
graphite-proc-macros = { opt-level = 1 }
image = { opt-level = 2 }
rustc-hash = { opt-level = 3 }
serde_derive = { opt-level = 1 }
syn = { opt-level = 1 }
node-macro = { opt-level = 2 }
[profile.release]
lto = "thin"
debug = true
[patch.crates-io]
# Force cargo to use only one version of the dpi crate (vendoring breaks without this)
dpi = { git = "https://github.com/rust-windowing/winit.git" }
download-cef = { git = "https://github.com/timon-schelling/cef-rs.git", branch = "graphite" }
vello = { git = "https://github.com/Keavon/vello.git", branch = "0.7.0-fix-images-rendering-blurry" }
vello_encoding = { git = "https://github.com/Keavon/vello.git", branch = "0.7.0-fix-images-rendering-blurry" }
================================================
FILE: LICENSE.txt
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================
FILE: README.md
================================================
<a href="https://graphite.art/">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://github.com/user-attachments/assets/9366c148-4405-484f-909a-9a3526eb9209">
<source media="(prefers-color-scheme: light)" srcset="https://github.com/user-attachments/assets/791508ab-bcd5-4e31-a3b9-1187cfd7a2f6">
<img alt="Graphite logo" src="https://github.com/user-attachments/assets/791508ab-bcd5-4e31-a3b9-1187cfd7a2f6">
</picture>
</a>
# Your procedural toolbox for 2D content creation
**Graphite is a free, open source vector and raster graphics engine, [available now](https://editor.graphite.art) in alpha. Get creative with a fully nondestructive editing workflow that combines layer-based compositing with node-based generative design.**
Having begun life as a vector editor, Graphite continues evolving into a generalized, all-in-one graphics toolbox that's built more like a game engine than a conventional creative app. The editor's tools wrap its node graph core, providing user-friendly workflows for vector, raster, and beyond. Photo editing, motion graphics, digital painting, desktop publishing, and VFX compositing are additional competencies on the planned [roadmap](https://graphite.art/features/#roadmap) making Graphite into a highly versatile content creation tool.
Learn more from the [website](https://graphite.art/), subscribe to the [newsletter](https://graphite.art/#newsletter), consider [volunteering](https://graphite.art/volunteer/) or [donating](https://graphite.art/donate/), and remember to give this repository a ⭐!
<br />
<a href="https://discord.graphite.art/">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://github.com/user-attachments/assets/ad185fac-3b48-446d-863c-2bcb0724abee">
<source media="(prefers-color-scheme: light)" srcset="https://github.com/user-attachments/assets/aa23f503-f3bf-444a-9080-8eaa19fa2fa8">
<img alt="Discord" src="https://github.com/user-attachments/assets/aa23f503-f3bf-444a-9080-8eaa19fa2fa8" width="48" height="48">
</picture>
</a>
<a href="https://www.reddit.com/r/graphite/">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://github.com/user-attachments/assets/d8c05686-2eb9-4ac1-8149-728c12b4e71a">
<source media="(prefers-color-scheme: light)" srcset="https://github.com/user-attachments/assets/6f32329a-4d6f-42d8-9a2f-42977c0b3c05">
<img alt="Reddit" src="https://github.com/user-attachments/assets/6f32329a-4d6f-42d8-9a2f-42977c0b3c05" width="48" height="48">
</picture>
</a>
<a href="https://bsky.app/profile/graphiteeditor.bsky.social">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://github.com/user-attachments/assets/c736d80c-e9bf-4591-a7e0-a7723057a906">
<source media="(prefers-color-scheme: light)" srcset="https://github.com/user-attachments/assets/3db9b0a1-5ab7-4bff-bfd3-8a4ade7b98bd">
<img alt="Bluesky" src="https://github.com/user-attachments/assets/3db9b0a1-5ab7-4bff-bfd3-8a4ade7b98bd" width="48" height="48">
</picture>
</a>
<a href="https://twitter.com/graphiteeditor">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://github.com/user-attachments/assets/115f04cc-e3c2-4f90-ac35-eb9edd3ca9be">
<source media="(prefers-color-scheme: light)" srcset="https://github.com/user-attachments/assets/4ed4185d-a622-418c-bbf4-a0419e690ca9">
<img alt="Twitter" src="https://github.com/user-attachments/assets/4ed4185d-a622-418c-bbf4-a0419e690ca9" width="48" height="48">
</picture>
</a>
<a href="https://www.youtube.com/@GraphiteEditor">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://github.com/user-attachments/assets/cbc02fad-5cbc-4715-a8e5-860198e989c7">
<source media="(prefers-color-scheme: light)" srcset="https://github.com/user-attachments/assets/d13b484d-97a8-4d9e-bbe4-c60348b3f676">
<img alt="YouTube" src="https://github.com/user-attachments/assets/d13b484d-97a8-4d9e-bbe4-c60348b3f676" width="48" height="48">
</picture>
</a>
<br /><br />
https://github.com/user-attachments/assets/f4604aea-e8f1-45ce-9218-46ddc666f11d
## Support our mission ❤️
Graphite is 100% community built and funded. Please become a part of keeping the project alive and thriving with a [donation](https://graphite.art/donate/) if you share a belief in our **mission**:
> Graphite strives to unshackle the creativity of every budding artist and seasoned professional by building the best comprehensive art and design tool that's accessible to all.
>
> Mission success will come when Graphite is an industry standard. A cohesive product vision and focus on innovation over imitation is the strategy that will make that possible.
## Screenshots



## Contributing/building the code
Are you a graphics programmer or Rust developer? Graphite aims to be one of the most approachable projects for putting your engineering skills to use in the world of open source. See [instructions here](https://graphite.art/volunteer/guide/) for setting up the project and getting started.
*By submitting code for inclusion in the project, you are agreeing to license your changes under the Apache 2.0 license, and that you have the authority to do so. Some directories may have other licenses, like dual-licensed MIT/Apache 2.0, and code submissions to those directories mean you agree to the applicable license(s).*
================================================
FILE: about.toml
================================================
accepted = [
"Apache-2.0 WITH LLVM-exception", # Keep this list in sync with those in `/deny.toml`
"Apache-2.0", # Keep this list in sync with those in `/deny.toml`
"BSD-2-Clause", # Keep this list in sync with those in `/deny.toml`
"BSD-3-Clause", # Keep this list in sync with those in `/deny.toml`
"BSL-1.0", # Keep this list in sync with those in `/deny.toml`
"CC0-1.0", # Keep this list in sync with those in `/deny.toml`
"CDLA-Permissive-2.0", # Keep this list in sync with those in `/deny.toml`
"ISC", # Keep this list in sync with those in `/deny.toml`
"MIT-0", # Keep this list in sync with those in `/deny.toml`
"MIT", # Keep this list in sync with those in `/deny.toml`
"MPL-2.0", # Keep this list in sync with those in `/deny.toml`
"OpenSSL", # Keep this list in sync with those in `/deny.toml`
"Unicode-3.0", # Keep this list in sync with those in `/deny.toml`
"Unicode-DFS-2016", # Keep this list in sync with those in `/deny.toml`
"Zlib", # Keep this list in sync with those in `/deny.toml`
"NCSA", # Keep this list in sync with those in `/deny.toml`
"bzip2-1.0.6", # Keep this list in sync with those in `/deny.toml`
"OFL-1.1", # Keep this list in sync with those in `/deny.toml`
]
workarounds = ["ring"]
ignore-build-dependencies = true
ignore-dev-dependencies = true
# Clearly Defined's API would occasionally (every few months) return errors for at least a full day (maybe some weird rate limiting?), but we can just disable to perform local checking (see #1653)
no-clearly-defined = true
# https://raw.githubusercontent.com/briansmith/webpki/main/LICENSE
# is the ISC license but test code within the repo is BSD-3-Clause, but is not compiled into the crate when we use it
[webpki.clarify]
license = "ISC"
[[webpki.clarify.files]]
path = "LICENSE"
checksum = "5b698ca13897be3afdb7174256fa1574f8c6892b8bea1a66dd6469d3fe27885a"
[rustls-webpki.clarify]
license = "ISC"
[[rustls-webpki.clarify.files]]
path = "LICENSE"
checksum = "5b698ca13897be3afdb7174256fa1574f8c6892b8bea1a66dd6469d3fe27885a"
================================================
FILE: demo-artwork/changing-seasons.graphite
================================================
{"network_interface":{"network":{"exports":[{"Node":{"node_id":3143874172491239000,"output_index":0}}],"nodes":[[10316247453530667000,{"inputs":[{"Node":{"node_id":9079109751490757000,"output_index":0}},{"Node":{"node_id":1250460246919467000,"output_index":0}}],"call_argument":{"Generic":"T"},"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0}}],"nodes":[[0,{"inputs":[{"Import":{"import_type":{"Generic":"T"},"import_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::ToGraphicNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[4,{"inputs":[{"Node":{"node_id":0,"output_index":0}},{"Node":{"node_id":3,"output_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::ExtendNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true,"context_features":{"extract":"","inject":""}}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0}},{"Reflection":"DocumentNodePath"}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::SourceNodeIdNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[1,{"inputs":[{"Import":{"import_type":{"Generic":"T"},"import_index":1}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::WrapGraphicNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}]],"scope_injections":[]}},"visible":false,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[7954638344846060000,{"inputs":[{"Node":{"node_id":5991296268862790000,"output_index":0}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.1875,"green":0.0,"blue":0.0,"alpha":0.203125}}},"exposed":false}},{"Value":{"tagged_value":{"Color":{"element":[{"red":0.19140625,"green":0.0,"blue":0.0,"alpha":0.203125}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":{"position":[0.0,1.0],"midpoint":[0.5,0.5],"color":[{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]},"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5]}},"exposed":false}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[17021405646895729000,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"GradientTable":{"element":[{"position":[0.0,0.5,1.0],"midpoint":[0.5,0.5,0.5],"color":[{"red":1.0,"green":0.31764707,"blue":0.15686275,"alpha":1.0},{"red":1.0,"green":0.5686275,"blue":0.25490198,"alpha":1.0},{"red":1.0,"green":0.7294118,"blue":0.16078432,"alpha":1.0}]}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":false}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"math_nodes::GradientValueNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[8366826746721323000,{"inputs":[{"Node":{"node_id":5591755359500854000,"output_index":0}},{"Node":{"node_id":13846904447064916285,"output_index":0}}],"call_argument":{"Generic":"T"},"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0}}],"nodes":[[0,{"inputs":[{"Import":{"import_type":{"Generic":"T"},"import_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::ToGraphicNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[4,{"inputs":[{"Node":{"node_id":0,"output_index":0}},{"Node":{"node_id":3,"output_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::ExtendNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true,"context_features":{"extract":"","inject":""}}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0}},{"Reflection":"DocumentNodePath"}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::SourceNodeIdNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[1,{"inputs":[{"Import":{"import_type":{"Generic":"T"},"import_index":1}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::WrapGraphicNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[1250460246919467000,{"inputs":[{"Node":{"node_id":4742778578215475000,"output_index":0}},{"Value":{"tagged_value":{"BooleanOperation":"Union"},"exposed":false}}],"call_argument":{"Generic":"T"},"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0}}],"nodes":[[0,{"inputs":[{"Import":{"import_type":{"Concrete":{"name":"graphene_core::table::Table<graphene_core::vector::vector_types::Vector>","alias":null}},"import_index":0}},{"Import":{"import_type":{"Concrete":{"name":"graphene_core::vector::style::Fill","alias":null}},"import_index":1}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"path_bool_nodes::BooleanOperationNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[8876924567444570473,{"inputs":[{"Node":{"node_id":26023588519449590,"output_index":0}},{"Value":{"tagged_value":{"ReferencePoint":"CenterLeft"},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":true},"exposed":false}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::MirrorNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[14253625255053304000,{"inputs":[{"Node":{"node_id":1924303400883620400,"output_index":0}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.9765625,"green":0.7715821,"blue":0.2861023,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"Color":{"element":[{"red":0.9765625,"green":0.7715821,"blue":0.2861023,"alpha":1.0}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":{"position":[0.0,1.0],"midpoint":[0.5,0.5],"color":[{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0},{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}]},"gradient_type":"Linear","start":[0.09778450863315612,0.7264556766766779],"end":[0.09778450863315612,0.3634234796342139]}},"exposed":false}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[3143874172491239000,{"inputs":[{"Value":{"tagged_value":{"Artboard":{"element":[],"transform":[],"alpha_blending":[],"source_node_id":[]}},"exposed":true}},{"Node":{"node_id":18233215297647862000,"output_index":0}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[2000.0,1000.0]},"exposed":false}},{"Value":{"tagged_value":{"Color":{"element":[{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":false}},{"Value":{"tagged_value":{"Bool":true},"exposed":false}}],"call_argument":{"Generic":"T"},"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0}}],"nodes":[[0,{"inputs":[{"Import":{"import_type":{"Concrete":{"name":"graph_craft::document::value::TaggedValue","alias":null}},"import_index":1}},{"Value":{"tagged_value":{"String":"Artboard"},"exposed":false}},{"Import":{"import_type":{"Concrete":{"name":"graph_craft::document::value::TaggedValue","alias":null}},"import_index":2}},{"Import":{"import_type":{"Concrete":{"name":"graph_craft::document::value::TaggedValue","alias":null}},"import_index":3}},{"Import":{"import_type":{"Concrete":{"name":"graph_craft::document::value::TaggedValue","alias":null}},"import_index":4}},{"Import":{"import_type":{"Concrete":{"name":"graph_craft::document::value::TaggedValue","alias":null}},"import_index":5}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::artboard::CreateArtboardNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[3,{"inputs":[{"Import":{"import_type":{"Fn":[{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},{"Concrete":{"name":"graphene_core::table::Table<graphene_core::artboard::Artboard>","alias":null}}]},"import_index":0}},{"Node":{"node_id":2,"output_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::ExtendNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true,"context_features":{"extract":"","inject":""}}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0}},{"Reflection":"DocumentNodePath"}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::SourceNodeIdNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[15908863353600836000,{"inputs":[{"Node":{"node_id":7094974507355892337,"output_index":0}},{"Value":{"tagged_value":{"F64":350.0},"exposed":false}},{"Node":{"node_id":4373650744391914031,"output_index":0}}],"call_argument":{"Generic":"T"},"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0}}],"nodes":[[0,{"inputs":[{"Import":{"import_type":{"Concrete":{"name":"graphene_core::table::Table<graphene_core::vector::vector_types::Vector>","alias":null}},"import_index":0}},{"Import":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Import":{"import_type":{"Concrete":{"name":"u32","alias":null}},"import_index":2}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"core_types::vector::PoissonDiskPointsNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[8895289679682140000,{"inputs":[{"Node":{"node_id":213744308682803360,"output_index":0}},{"Node":{"node_id":7954638344846060000,"output_index":0}}],"call_argument":{"Generic":"T"},"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0}}],"nodes":[[0,{"inputs":[{"Import":{"import_type":{"Generic":"T"},"import_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::ToGraphicNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[4,{"inputs":[{"Node":{"node_id":0,"output_index":0}},{"Node":{"node_id":3,"output_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::ExtendNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true,"context_features":{"extract":"","inject":""}}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0}},{"Reflection":"DocumentNodePath"}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::SourceNodeIdNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[1,{"inputs":[{"Import":{"import_type":{"Generic":"T"},"import_index":1}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::WrapGraphicNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[17725188707009528000,{"inputs":[{"Node":{"node_id":10316247453530667000,"output_index":0}},{"Node":{"node_id":17025512774010843000,"output_index":0}}],"call_argument":{"Generic":"T"},"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0}}],"nodes":[[0,{"inputs":[{"Import":{"import_type":{"Generic":"T"},"import_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::ToGraphicNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[4,{"inputs":[{"Node":{"node_id":0,"output_index":0}},{"Node":{"node_id":3,"output_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::ExtendNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true,"context_features":{"extract":"","inject":""}}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0}},{"Reflection":"DocumentNodePath"}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::SourceNodeIdNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[1,{"inputs":[{"Import":{"import_type":{"Generic":"T"},"import_index":1}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::WrapGraphicNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}]],"scope_injections":[]}},"visible":false,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[5591755359500854000,{"inputs":[{"Value":{"tagged_value":{"Graphic":{"element":[],"transform":[],"alpha_blending":[],"source_node_id":[]}},"exposed":true}},{"Node":{"node_id":1789832635968548900,"output_index":0}}],"call_argument":{"Generic":"T"},"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0}}],"nodes":[[0,{"inputs":[{"Import":{"import_type":{"Generic":"T"},"import_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::ToGraphicNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[4,{"inputs":[{"Node":{"node_id":0,"output_index":0}},{"Node":{"node_id":3,"output_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::ExtendNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true,"context_features":{"extract":"","inject":""}}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0}},{"Reflection":"DocumentNodePath"}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::SourceNodeIdNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[1,{"inputs":[{"Import":{"import_type":{"Generic":"T"},"import_index":1}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::WrapGraphicNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[3223387122603246085,{"inputs":[{"Node":{"node_id":3405958409855358559,"output_index":0}},{"Value":{"tagged_value":{"String":"2 - 0.2A"},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"math_nodes::MathNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[1789832635968548900,{"inputs":[{"Node":{"node_id":1924303400883620400,"output_index":0}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.99215686,"green":0.49019608,"blue":0.11764706,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"Color":{"element":[{"red":1.0,"green":1.0,"blue":1.0,"alpha":0.25}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":{"position":[0.0,1.0],"midpoint":[0.5,0.5],"color":[{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]},"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5]}},"exposed":false}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[17855766443650990000,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"GradientTable":{"element":[{"position":[0.0,0.5,1.0],"midpoint":[0.5,0.5,0.5],"color":[{"red":0.1764706,"green":0.44313726,"blue":0.05882353,"alpha":1.0},{"red":0.45490196,"green":0.627451,"blue":0.3254902,"alpha":1.0},{"red":1.0,"green":0.5529412,"blue":0.16078432,"alpha":1.0}]}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":false}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"math_nodes::GradientValueNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[16084834641749443000,{"inputs":[{"Node":{"node_id":16141281339223525000,"output_index":0}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.99215686,"green":0.49019608,"blue":0.11764706,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"Color":{"element":[{"red":1.0,"green":1.0,"blue":1.0,"alpha":0.25}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":{"position":[0.0,1.0],"midpoint":[0.5,0.5],"color":[{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]},"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5]}},"exposed":false}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[1924303400883620400,{"inputs":[{"Value":{"tagged_value":{"Vector":{"element":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_data":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[12399235852192450000,16255990754021933000,15620668684239604000,5432878891027338000],"remove":[5992115648840007000],"delta":[[16255990754021933000,[3.423868312757215,60.83950617283953]],[15620668684239604000,[-7.105427357601002e-15,61.89300411522633]],[12399235852192450000,[3.4492455418381667,-6.252914951989055]],[5432878891027338000,[-0.8525377229081244,-6.779663923182397]]]},"segments":{"add":[1366074222973177300,9911415907547690000,3820594103877681000,5933636287523951000],"remove":[16939395239973712000],"start_point":[[1366074222973177300,12399235852192450000],[5933636287523951000,5432878891027338000],[3820594103877681000,15620668684239604000],[9911415907547690000,16255990754021933000]],"end_point":[[9911415907547690000,15620668684239604000],[5933636287523951000,12399235852192450000],[1366074222973177300,16255990754021933000],[3820594103877681000,5432878891027338000]],"handle_primary":[[9911415907547690000,[-0.6380090646381761,1.00935799390129]],[3820594103877681000,[-1.2746024488136916,-0.5300005080526233]],[5933636287523951000,[0.0,0.0]],[1366074222973177300,[-12.729766803840905,34.6776406035666]]],"handle_end":[[3820594103877681000,[-11.281207133058956,31.692729766803836]],[1366074222973177300,[1.0502464055275982,-1.6615353350607336]],[9911415907547690000,[1.1025726645520375,0.4584677151070898]],[5933636287523951000,[0.0,0.0]]],"stroke":[[1366074222973177300,0],[5933636287523951000,0],[3820594103877681000,0],[9911415907547690000,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[[{"ty":"Primary","segment":9911415907547690000},{"ty":"End","segment":1366074222973177300}],[{"ty":"Primary","segment":3820594103877681000},{"ty":"End","segment":9911415907547690000}]],"remove_g1_continuous":[[{"ty":"End","segment":3820594103877681000},{"ty":"Primary","segment":16939395239973712000}],[{"ty":"Primary","segment":1366074222973177300},{"ty":"End","segment":5933636287523951000}]]}},"exposed":false}}],"call_argument":{"Generic":"T"},"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0}}],"nodes":[[0,{"inputs":[{"Import":{"import_type":{"Concrete":{"name":"graphene_core::table::Table<graphene_core::vector::vector_types::Vector>","alias":null}},"import_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true,"context_features":{"extract":"","inject":""}}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0}},{"Import":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_modification::VectorModification","alias":null}},"import_index":1}},{"Reflection":"DocumentNodePath"}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"vector_nodes::vector_modification_nodes::PathModifyNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[4040070953711778000,{"inputs":[{"Node":{"node_id":15908863353600836000,"output_index":0}},{"Node":{"node_id":2166474486859326700,"output_index":0}},{"Node":{"node_id":10690271318666670633,"output_index":0}},{"Node":{"node_id":12004715210677400127,"output_index":0}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":360.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"core_types::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[17025512774010843000,{"inputs":[{"Node":{"node_id":13712392741217151405,"output_index":0}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.9490196,"green":0.38039216,"blue":0.10980392,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"Color":{"element":[{"red":0.9490196,"green":0.38039216,"blue":0.10980392,"alpha":1.0}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":{"position":[0.3155737704918033,1.0],"midpoint":[0.5,0.5],"color":[{"red":0.0,"green":0.0,"blue":0.0,"alpha":0.0},{"red":0.0,"green":0.0,"blue":0.0,"alpha":0.203125}]},"gradient_type":"Radial","start":[0.5024847204000202,0.41434795196968177],"end":[0.9633481630366972,0.41434795196968194]}},"exposed":false}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[4742778578215475000,{"inputs":[{"Node":{"node_id":6102164880094062000,"output_index":0}},{"Node":{"node_id":8876924567444570473,"output_index":0}}],"call_argument":{"Generic":"T"},"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0}}],"nodes":[[0,{"inputs":[{"Import":{"import_type":{"Generic":"T"},"import_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::ToGraphicNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[4,{"inputs":[{"Node":{"node_id":0,"output_index":0}},{"Node":{"node_id":3,"output_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::ExtendNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true,"context_features":{"extract":"","inject":""}}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0}},{"Reflection":"DocumentNodePath"}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::SourceNodeIdNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[1,{"inputs":[{"Import":{"import_type":{"Generic":"T"},"import_index":1}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::WrapGraphicNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[10463288500489480000,{"inputs":[{"Node":{"node_id":4600332392291315000,"output_index":0}},{"Node":{"node_id":4040070953711778000,"output_index":0}}],"call_argument":{"Generic":"T"},"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0}}],"nodes":[[0,{"inputs":[{"Import":{"import_type":{"Generic":"T"},"import_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::ToGraphicNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[4,{"inputs":[{"Node":{"node_id":0,"output_index":0}},{"Node":{"node_id":3,"output_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::ExtendNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true,"context_features":{"extract":"","inject":""}}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0}},{"Reflection":"DocumentNodePath"}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::SourceNodeIdNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[1,{"inputs":[{"Import":{"import_type":{"Generic":"T"},"import_index":1}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::WrapGraphicNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[3602127523880426500,{"inputs":[{"Value":{"tagged_value":{"Raster":{"element":[{"width":0,"height":0,"data":[0,""]}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Node":{"node_id":17725188707009528000,"output_index":0}}],"call_argument":{"Generic":"T"},"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0}}],"nodes":[[0,{"inputs":[{"Import":{"import_type":{"Generic":"T"},"import_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::ToGraphicNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[4,{"inputs":[{"Node":{"node_id":0,"output_index":0}},{"Node":{"node_id":3,"output_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::ExtendNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true,"context_features":{"extract":"","inject":""}}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0}},{"Reflection":"DocumentNodePath"}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::SourceNodeIdNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[1,{"inputs":[{"Import":{"import_type":{"Generic":"T"},"import_index":1}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::WrapGraphicNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}]],"scope_injections":[]}},"visible":false,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[6102164880094062000,{"inputs":[{"Value":{"tagged_value":{"Graphic":{"element":[],"transform":[],"alpha_blending":[],"source_node_id":[]}},"exposed":true}},{"Node":{"node_id":14253625255053304000,"output_index":0}}],"call_argument":{"Generic":"T"},"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0}}],"nodes":[[0,{"inputs":[{"Import":{"import_type":{"Generic":"T"},"import_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::ToGraphicNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[4,{"inputs":[{"Node":{"node_id":0,"output_index":0}},{"Node":{"node_id":3,"output_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::ExtendNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true,"context_features":{"extract":"","inject":""}}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0}},{"Reflection":"DocumentNodePath"}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::SourceNodeIdNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[1,{"inputs":[{"Import":{"import_type":{"Generic":"T"},"import_index":1}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::WrapGraphicNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[4002029424845293600,{"inputs":[{"Node":{"node_id":16141281339223525000,"output_index":0}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[],"remove":[],"delta":[[353992768245212100,[-42.27413685969588,-41.62581710194484]],[16211201987812043000,[-7.105427357601002e-15,-23.90123456790124]],[12582713598977278000,[9.333333333333268,-66.33333333333327]],[11874978858302702000,[5.843621399176955,-10.914951989026145]],[15620564416450861000,[-47.66529492455423,-18.042524005486992]],[4839542169175255000,[-127.45378793812174,-12.06205126188287]],[9664410344080632000,[-35.276890617605005,-25.55103086414088]],[10418348123687606000,[-61.3893894663837,-52.000301612710835]],[6358127410693457000,[-37.72290809327849,-10.54183813443079]],[5755835744378529000,[-17.333333333333343,-33.1358024691358]],[891169987742051100,[-4.148148148148122,-38.03703703703696]],[4570709177617499000,[-62.76543209876538,-6.827160493827164]],[7888691908524886000,[4.351165980795637,-8.105624142661181]],[4305429814263425000,[-22.598416051654286,-32.71009758017498]],[16594203120813726000,[-62.53607037678802,-36.02218510909459]],[9934671969500465000,[-43.209876543209866,-14.975308641975468]],[753144493519442600,[-50.013717421124845,21.17283950617286]],[11897064075526275000,[-61.65765794556601,-32.902083082000814]]]},"segments":{"add":[],"remove":[],"start_point":[],"end_point":[],"handle_primary":[[3359087961315235300,[-0.2881601545358876,-1.8891182956799923]],[8119312711427333000,[0.0,0.0]],[5680639457836474000,[0.0,0.0]],[2092445122112560000,[-7.308641975308667,2.9629629629629903]],[3138315255762406000,[4.038408779149492,-14.5733882030178]],[12441313998107066000,[-4.938271604938336,6.518518518518476]],[9552874240071498000,[-5.53086419753086,-0.9657064471879552]],[1562499453192082400,[-0.08779149519892826,-1.6680384087791111]],[4590600976245504500,[-6.49657064471878,1.2290809327846404]],[3270826560526153000,[-10.966434817733528,4.317749647005792]],[16362428386097514000,[-23.70370370370371,19.950617283950606]],[15866454419016458000,[-9.913311783442964,6.121455371873111]],[18320159308706247000,[0.0,0.0]],[2416974091592514600,[0.0,0.0]],[4183498485018509000,[-37.13580246913581,14.485596707818928]],[14351209823603001000,[0.0,0.0]],[17948338937502876000,[0.0,0.0]]],"handle_end":[[12441313998107066000,[5.171144805176233,13.506721506057374]],[4183498485018509000,[-21.94787379972564,36.565157750342905]],[7709585677887591000,[-8.603566529492472,0.8779149519890552]],[5680639457836474000,[0.2881601545359018,1.8891182956799923]],[2092445122112560000,[-9.086419753086416,21.135802469135797]],[9552874240071498000,[-7.286694101508885,7.55006858710567]],[14351209823603001000,[-7.374485596707803,5.70644718792866]],[15866454419016458000,[2.458161865569238,7.637860082304542]],[8119312711427333000,[-16.241426611796967,5.355281207133061]],[2416974091592514600,[37.06995884773662,-14.595336076817532]],[4590600976245504500,[14.222222222222207,7.989026063100134]],[3359087961315235300,[-7.813443072702299,7.725651577503442]],[16362428386097514000,[-6.962962962962983,53.17283950617292]],[18320159308706247000,[-41.26200274348419,15.978052126200277]],[3270826560526153000,[-49.33882030178324,27.10562414266127]],[17948338937502876000,[-50.30452674897121,26.776406035665325]],[3138315255762406000,[-8.098765432098759,2.947337553780912]],[1562499453192082400,[-0.6668238551234532,2.406364346749864]]],"stroke":[]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"call_argument":{"Generic":"T"},"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0}}],"nodes":[[0,{"inputs":[{"Import":{"import_type":{"Concrete":{"name":"graphene_core::table::Table<graphene_core::vector::vector_types::Vector>","alias":null}},"import_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true,"context_features":{"extract":"","inject":""}}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0}},{"Import":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_modification::VectorModification","alias":null}},"import_index":1}},{"Reflection":"DocumentNodePath"}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"vector_nodes::vector_modification_nodes::PathModifyNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[366962978353611840,{"inputs":[{"Node":{"node_id":8366826746721323000,"output_index":0}},{"Value":{"tagged_value":{"BooleanOperation":"Union"},"exposed":false}}],"call_argument":{"Generic":"T"},"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0}}],"nodes":[[0,{"inputs":[{"Import":{"import_type":{"Concrete":{"name":"graphene_core::table::Table<graphene_core::vector::vector_types::Vector>","alias":null}},"import_index":0}},{"Import":{"import_type":{"Concrete":{"name":"graphene_core::vector::style::Fill","alias":null}},"import_index":1}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"path_bool_nodes::BooleanOperationNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[13314559752611565452,{"inputs":[{"Node":{"node_id":1250460246919467000,"output_index":0}},{"Node":{"node_id":366962978353611840,"output_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0}}],"nodes":[[0,{"inputs":[{"Import":{"import_type":{"Generic":"T"},"import_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::ToGraphicNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[4,{"inputs":[{"Node":{"node_id":0,"output_index":0}},{"Node":{"node_id":3,"output_index":0}}],"call_argument":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::ExtendNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true,"context_features":{"extract":"","inject":""}}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0}},{"Reflection":"DocumentNodePath"}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::SourceNodeIdNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[1,{"inputs":[{"Import":{"import_type":{"Generic":"T"},"import_index":1}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::WrapGraphicNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[16379524086934900000,{"inputs":[{"Node":{"node_id":9609388203059839318,"output_index":0}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.41796875,"green":0.1028595,"blue":0.1028595,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"Color":{"element":[{"red":0.421875,"green":0.1038208,"blue":0.1038208,"alpha":1.0}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":{"position":[0.0,1.0],"midpoint":[0.5,0.5],"color":[{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]},"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5]}},"exposed":false}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[4600332392291315000,{"inputs":[{"Node":{"node_id":4040070953711778000,"output_index":0}},{"Value":{"tagged_value":{"Bool":true},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}},{"Node":{"node_id":11677958249556146000,"output_index":0}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}},{"Value":{"tagged_value":{"Bool":true},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::AssignColorsNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[7386572856931342000,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"math_nodes::PercentageValueNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[4373650744391914031,{"inputs":[{"Node":{"node_id":3405958409855358559,"output_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"math_nodes::ToU32Node"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[16141281339223525000,{"inputs":[{"Value":{"tagged_value":{"Vector":{"element":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_data":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[8940743774820468000,11897064075526275000,9664410344080632000,10418348123687606000,16594203120813726000,4839542169175255000,353992768245212100,4305429814263425000,15620564416450861000,4570709177617499000,9934671969500465000,6358127410693457000,753144493519442600,11874978858302702000,7888691908524886000,12582713598977278000,891169987742051100,5755835744378529000,16211201987812043000],"remove":[],"delta":[[9934671969500465000,[125.38271604938268,-124.67901234567891]],[7888691908524886000,[66.32098765432096,-154.30864197530863]],[15620564416450861000,[141.77777777777777,-86.60493827160491]],[11897064075526275000,[72.71938634062775,26.932261408475423]],[4839542169175255000,[157.56627079134535,-37.10118604950259]],[9664410344080632000,[64.51145851883956,11.32880864191867]],[11874978858302702000,[92.39506172839504,-161.41975308641972]],[6358127410693457000,[115.50617283950618,-132.38271604938265]],[4570709177617499000,[114.716049382716,-90.16049382716052]],[353992768245212100,[114.87770338918835,-41.33714586101814]],[5755835744378529000,[28.444444444444457,-210.4567901234568]],[16594203120813726000,[126.09711290079348,-8.575894451947931]],[16211201987812043000,[0.0,-231.0]],[4305429814263425000,[91.25136529719612,-51.92090379156713]],[12582713598977278000,[49.135802469135854,-136.33333333333334]],[753144493519442600,[136.8395061728395,-177.6172839506173]],[8940743774820468000,[0.0,0.0]],[891169987742051100,[63.802469135802426,-190.90123456790127]],[10418348123687606000,[112.8352056529406,14.952290638773944]]]},"segments":{"add":[7709585677887591000,14351209823603001000,18320159308706247000,8119312711427333000,4590600976245504500,17948338937502876000,1562499453192082400,3138315255762406000,2416974091592514600,3270826560526153000,5680639457836474000,3359087961315235300,9552874240071498000,15866454419016458000,4183498485018509000,2092445122112560000,16362428386097514000,12441313998107066000],"remove":[],"start_point":[[2092445122112560000,12582713598977278000],[3270826560526153000,4570709177617499000],[4590600976245504500,16594203120813726000],[8119312711427333000,10418348123687606000],[3138315255762406000,4305429814263425000],[4183498485018509000,7888691908524886000],[2416974091592514600,15620564416450861000],[9552874240071498000,753144493519442600],[18320159308706247000,9664410344080632000],[1562499453192082400,353992768245212100],[15866454419016458000,11874978858302702000],[5680639457836474000,9934671969500465000],[17948338937502876000,4839542169175255000],[7709585677887591000,8940743774820468000],[14351209823603001000,11897064075526275000],[3359087961315235300,6358127410693457000],[12441313998107066000,5755835744378529000],[16362428386097514000,891169987742051100]],"end_point":[[4590600976245504500,4839542169175255000],[5680639457836474000,6358127410693457000],[3270826560526153000,9934671969500465000],[18320159308706247000,10418348123687606000],[1562499453192082400,4305429814263425000],[3138315255762406000,15620564416450861000],[12441313998107066000,16211201987812043000],[7709585677887591000,11897064075526275000],[4183498485018509000,12582713598977278000],[9552874240071498000,11874978858302702000],[16362428386097514000,5755835744378529000],[2092445122112560000,891169987742051100],[14351209823603001000,9664410344080632000],[8119312711427333000,16594203120813726000],[15866454419016458000,7888691908524886000],[2416974091592514600,4570709177617499000],[3359087961315235300,753144493519442600],[17948338937502876000,353992768245212100]],"handle_primary":[[4590600976245504500,[-7.759646437163781,-18.695929243596197]],[14351209823603001000,[0.0,0.0]],[7709585677887591000,[0.0,0.0]],[3138315255762406000,[-2.469006630399008,-5.902063388586043]],[5680639457836474000,[0.0,0.0]],[4183498485018509000,[-6.617283950617207,15.308641975308689]],[9552874240071498000,[-21.33333333333331,12.049382716049422]],[8119312711427333000,[0.0,0.0]],[1562499453192082400,[-15.34246181071461,-3.7168967220297873]],[2092445122112560000,[-1.5802469135804245,-5.5308641975308035]],[12441313998107066000,[-4.938271604938336,6.518518518518533]],[17948338937502876000,[0.0,0.0]],[3359087961315235300,[2.7654320987655296,-14.419753086419746]],[16362428386097514000,[-14.913580246913511,12.641975308642031]],[2416974091592514600,[0.0,0.0]],[18320159308706247000,[0.0,0.0]],[15866454419016458000,[-10.469135802469168,13.432098765432102]],[3270826560526153000,[-9.086419753086432,-7.506172839506121]]],"handle_end":[[5680639457836474000,[-2.7654320987655296,14.419753086419746]],[12441313998107066000,[13.234567901234527,34.5679012345679]],[7709585677887591000,[-42.51530058403631,-10.382498109968708]],[2416974091592514600,[9.086419753086377,7.506172839506235]],[16362428386097514000,[-8.0,38.419753086419746]],[8119312711427333000,[-40.68684029964413,7.631779585305026]],[14351209823603001000,[5.742854988208705,6.327636391047918]],[2092445122112560000,[-20.345679012345613,18.5679012345679]],[3138315255762406000,[-21.33333333333337,3.753086419753061]],[17948338937502876000,[25.51458639999055,20.651563178633637]],[15866454419016458000,[0.19753086419757435,13.827160493827137]],[18320159308706247000,[-24.983271918092953,-7.776766653003392]],[1562499453192082400,[2.0974057383288596,5.01376604938514]],[3359087961315235300,[-27.099224819820336,19.753086419753146]],[9552874240071498000,[4.938271604938279,11.061728395061806]],[4183498485018509000,[4.938271604938336,-1.1851851851851052]],[4590600976245504500,[-5.92501398131742,10.665547436428083]],[3270826560526153000,[-13.03703703703701,9.679012345678984]]],"stroke":[[16362428386097514000,0],[1562499453192082400,0],[14351209823603001000,0],[3270826560526153000,0],[2092445122112560000,0],[7709585677887591000,0],[17948338937502876000,0],[12441313998107066000,0],[3138315255762406000,0],[4590600976245504500,0],[15866454419016458000,0],[4183498485018509000,0],[5680639457836474000,0],[3359087961315235300,0],[18320159308706247000,0],[2416974091592514600,0],[8119312711427333000,0],[9552874240071498000,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[[{"ty":"End","segment":1562499453192082400},{"ty":"Primary","segment":3138315255762406000}],[{"ty":"End","segment":5680639457836474000},{"ty":"Primary","segment":3359087961315235300}],[{"ty":"End","segment":2416974091592514600},{"ty":"Primary","segment":3270826560526153000}]],"remove_g1_continuous":[[{"ty":"End","segment":4183498485018509000},{"ty":"Primary","segment":2092445122112560000}]]}},"exposed":false}}],"call_argument":{"Generic":"T"},"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0}}],"nodes":[[0,{"inputs":[{"Import":{"import_type":{"Concrete":{"name":"graphene_core::table::Table<graphene_core::vector::vector_types::Vector>","alias":null}},"import_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true,"context_features":{"extract":"","inject":""}}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0}},{"Import":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_modification::VectorModification","alias":null}},"import_index":1}},{"Reflection":"DocumentNodePath"}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"vector_nodes::vector_modification_nodes::PathModifyNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[9609388203059839318,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":2000.0},"exposed":false}},{"Value":{"tagged_value":{"F64":1000.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":true},"exposed":false}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"vector_nodes::generator_nodes::RectangleNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[9079109751490757000,{"inputs":[{"Value":{"tagged_value":{"Raster":{"element":[{"width":0,"height":0,"data":[0,""]}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Node":{"node_id":366962978353611840,"output_index":0}}],"call_argument":{"Generic":"T"},"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0}}],"nodes":[[0,{"inputs":[{"Import":{"import_type":{"Generic":"T"},"import_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::ToGraphicNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[4,{"inputs":[{"Node":{"node_id":0,"output_index":0}},{"Node":{"node_id":3,"output_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::ExtendNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true,"context_features":{"extract":"","inject":""}}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0}},{"Reflection":"DocumentNodePath"}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::SourceNodeIdNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[1,{"inputs":[{"Import":{"import_type":{"Generic":"T"},"import_index":1}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::WrapGraphicNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}]],"scope_injections":[]}},"visible":false,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[799182088624980700,{"inputs":[{"Node":{"node_id":7386572856931342000,"output_index":0}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"math_nodes::DivideNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[11677958249556146000,{"inputs":[{"Node":{"node_id":17021405646895729000,"output_index":0}},{"Node":{"node_id":17855766443650990000,"output_index":0}},{"Value":{"tagged_value":{"BlendMode":"Normal"},"exposed":false}},{"Node":{"node_id":7386572856931342000,"output_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"raster_nodes::blending_nodes::BlendNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[13846904447064916285,{"inputs":[{"Node":{"node_id":16084834641749443000,"output_index":0}},{"Value":{"tagged_value":{"ReferencePoint":"CenterLeft"},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":true},"exposed":false}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::MirrorNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[7094974507355892337,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":2000.0},"exposed":false}},{"Value":{"tagged_value":{"F64":1000.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":true},"exposed":false}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"vector_nodes::generator_nodes::RectangleNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[10690271318666670633,{"inputs":[{"Node":{"node_id":12004715210677400127,"output_index":0}},{"Value":{"tagged_value":{"F64":0.2},"exposed":false}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"math_nodes::SubtractNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[2166474486859326700,{"inputs":[{"Node":{"node_id":13712392741217151405,"output_index":0}},{"Value":{"tagged_value":{"Fill":{"Gradient":{"stops":{"position":[0.0,0.6885245901639344,1.0],"midpoint":[0.5,0.5,0.5],"color":[{"red":1.0,"green":1.0,"blue":1.0,"alpha":0.0},{"red":0.08984375,"green":0.08984375,"blue":0.08984375,"alpha":0.08775313},{"red":0.0,"green":0.0,"blue":0.0,"alpha":0.20392157}]},"gradient_type":"Radial","start":[0.5024847204000202,0.41434795196968177],"end":[0.9633481630366972,0.41434795196968194]}}},"exposed":false}},{"Value":{"tagged_value":{"Color":{"element":[{"red":0.9490196,"green":0.38039216,"blue":0.10980392,"alpha":1.0}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":{"position":[0.0,0.6885245901639344,1.0],"midpoint":[0.5,0.5,0.5],"color":[{"red":1.0,"green":1.0,"blue":1.0,"alpha":0.0},{"red":0.08984375,"green":0.08984375,"blue":0.08984375,"alpha":0.08775313},{"red":0.0,"green":0.0,"blue":0.0,"alpha":0.20392157}]},"gradient_type":"Radial","start":[0.5024847204000202,0.41434795196968177],"end":[0.9633481630366972,0.41434795196968194]}},"exposed":false}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[3405958409855358559,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"core_types::vector::ReadIndexNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"INDEX","inject":""}}],[5348726859432207000,{"inputs":[{"Node":{"node_id":13314559752611565452,"output_index":0}},{"Node":{"node_id":799182088624980700,"output_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"core_types::vector::MorphNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[3430686124240113700,{"inputs":[{"Node":{"node_id":3602127523880426500,"output_index":0}},{"Node":{"node_id":16379524086934900000,"output_index":0}}],"call_argument":{"Generic":"T"},"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0}}],"nodes":[[0,{"inputs":[{"Import":{"import_type":{"Generic":"T"},"import_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::ToGraphicNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[4,{"inputs":[{"Node":{"node_id":0,"output_index":0}},{"Node":{"node_id":3,"output_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::ExtendNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true,"context_features":{"extract":"","inject":""}}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0}},{"Reflection":"DocumentNodePath"}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::SourceNodeIdNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[1,{"inputs":[{"Import":{"import_type":{"Generic":"T"},"import_index":1}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::WrapGraphicNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[12004715210677400127,{"inputs":[{"Node":{"node_id":3223387122603246085,"output_index":0}},{"Value":{"tagged_value":{"F64":1.1},"exposed":false}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"math_nodes::MaxNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[14337610765966946000,{"inputs":[{"Node":{"node_id":14250786159408925409,"output_index":0}},{"Value":{"tagged_value":{"Graphic":{"element":[],"transform":[],"alpha_blending":[],"source_node_id":[]}},"exposed":true}}],"call_argument":{"Generic":"T"},"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0}}],"nodes":[[0,{"inputs":[{"Import":{"import_type":{"Generic":"T"},"import_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::ToGraphicNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[4,{"inputs":[{"Node":{"node_id":0,"output_index":0}},{"Node":{"node_id":3,"output_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::ExtendNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true,"context_features":{"extract":"","inject":""}}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0}},{"Reflection":"DocumentNodePath"}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::SourceNodeIdNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[1,{"inputs":[{"Import":{"import_type":{"Generic":"T"},"import_index":1}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::WrapGraphicNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[18233215297647862000,{"inputs":[{"Node":{"node_id":14337610765966946000,"output_index":0}},{"Value":{"tagged_value":{"DVec2":[1000.0,500.0]},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[1.0,1.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"Bool":true},"exposed":false}}],"call_argument":{"Generic":"T"},"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0}}],"nodes":[[0,{"inputs":[{"Import":{"import_type":{"Generic":"T"},"import_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true,"context_features":{"extract":"","inject":""}}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0}},{"Import":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Import":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Import":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Import":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"transform_nodes::transform_nodes::TransformNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[13712392741217151405,{"inputs":[{"Node":{"node_id":5348726859432207000,"output_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[5991296268862790000,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":2000.0},"exposed":false}},{"Value":{"tagged_value":{"F64":1000.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":true},"exposed":false}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"vector_nodes::generator_nodes::RectangleNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[13735151800058122834,{"inputs":[{"Node":{"node_id":8895289679682140000,"output_index":0}},{"Value":{"tagged_value":{"U64":8},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"repeat_nodes::repeat_nodes::RepeatNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[213744308682803360,{"inputs":[{"Value":{"tagged_value":{"Graphic":{"element":[],"transform":[],"alpha_blending":[],"source_node_id":[]}},"exposed":true}},{"Node":{"node_id":10463288500489480000,"output_index":0}}],"call_argument":{"Generic":"T"},"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0}}],"nodes":[[0,{"inputs":[{"Import":{"import_type":{"Generic":"T"},"import_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::ToGraphicNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[4,{"inputs":[{"Node":{"node_id":0,"output_index":0}},{"Node":{"node_id":3,"output_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::ExtendNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true,"context_features":{"extract":"","inject":""}}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0}},{"Reflection":"DocumentNodePath"}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::SourceNodeIdNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[1,{"inputs":[{"Import":{"import_type":{"Generic":"T"},"import_index":1}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::WrapGraphicNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[26023588519449590,{"inputs":[{"Node":{"node_id":4002029424845293600,"output_index":0}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.9765625,"green":0.7715821,"blue":0.2861023,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"Color":{"element":[{"red":0.9765625,"green":0.7715821,"blue":0.2861023,"alpha":1.0}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":{"position":[0.0,1.0],"midpoint":[0.5,0.5],"color":[{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0},{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}]},"gradient_type":"Linear","start":[0.09778450863315612,0.7264556766766779],"end":[0.09778450863315612,0.3634234796342139]}},"exposed":false}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[14250786159408925409,{"inputs":[{"Node":{"node_id":3430686124240113700,"output_index":0}},{"Node":{"node_id":13735151800058122834,"output_index":0}}],"call_argument":{"Generic":"T"},"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0}}],"nodes":[[0,{"inputs":[{"Import":{"import_type":{"Generic":"T"},"import_index":0}}],"call_argument":{"Concrete":{"name":"core::option::Option<alloc::sync::Arc<core_types::context::OwnedContextImpl>>","alias":null}},"implementation":{"ProtoNode":{"name":"graphic_nodes::graphic::ToGraphicNode"}},"visible":true,"skip_deduplication":false,"context_features":{"extract":"","inject":""}}],[4,{"inputs":[{"Node":{"node_id":0,"output_index"
gitextract_ahenmele/
├── .branding
├── .cargo/
│ └── config.toml
├── .devcontainer/
│ └── devcontainer.json
├── .editorconfig
├── .envrc
├── .gitattributes
├── .github/
│ ├── FUNDING.yml
│ ├── pull_request_template.md
│ └── workflows/
│ ├── build.yml
│ ├── cargo-deny.yml
│ ├── check.yml
│ ├── comment-!build-commands.yml
│ ├── comment-clippy-warnings.yaml
│ ├── comment-profiling-changes.yaml
│ ├── library-rawkit.yml
│ ├── provide-shaders.yml
│ ├── scripts/
│ │ └── artifact-upload.bash
│ └── website.yml
├── .gitignore
├── .nix/
│ ├── default.nix
│ ├── deps/
│ │ ├── cef.nix
│ │ ├── crane.nix
│ │ └── rust-gpu.nix
│ ├── dev.nix
│ └── pkgs/
│ ├── graphite-branding.nix
│ ├── graphite-bundle.nix
│ ├── graphite-flatpak-manifest.nix
│ ├── graphite-raster-nodes-shaders.nix
│ ├── graphite.nix
│ └── tools/
│ └── third-party-licenses.nix
├── .nvmrc
├── .prettierrc
├── .vscode/
│ ├── extensions.json
│ ├── launch.json
│ └── settings.json
├── Cargo.toml
├── LICENSE.txt
├── README.md
├── about.toml
├── demo-artwork/
│ ├── changing-seasons.graphite
│ ├── isometric-fountain.graphite
│ ├── marbled-mandelbrot.graphite
│ ├── painted-dreams.graphite
│ ├── parametric-dunescape.graphite
│ ├── procedural-string-lights.graphite
│ ├── red-dress.graphite
│ └── valley-of-spires.graphite
├── deny.toml
├── desktop/
│ ├── Cargo.toml
│ ├── assets/
│ │ └── art.graphite.Graphite.desktop
│ ├── bundle/
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ └── src/
│ │ ├── common.rs
│ │ ├── linux.rs
│ │ ├── mac.rs
│ │ ├── main.rs
│ │ └── win.rs
│ ├── embedded-resources/
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ └── src/
│ │ └── lib.rs
│ ├── platform/
│ │ ├── linux/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ └── main.rs
│ │ ├── mac/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── helper.rs
│ │ │ └── main.rs
│ │ └── win/
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ └── src/
│ │ └── main.rs
│ ├── src/
│ │ ├── app.rs
│ │ ├── cef/
│ │ │ ├── consts.rs
│ │ │ ├── context/
│ │ │ │ ├── builder.rs
│ │ │ │ ├── multithreaded.rs
│ │ │ │ └── singlethreaded.rs
│ │ │ ├── context.rs
│ │ │ ├── dirs.rs
│ │ │ ├── input/
│ │ │ │ ├── keymap.rs
│ │ │ │ └── state.rs
│ │ │ ├── input.rs
│ │ │ ├── internal/
│ │ │ │ ├── browser_process_app.rs
│ │ │ │ ├── browser_process_client.rs
│ │ │ │ ├── browser_process_handler.rs
│ │ │ │ ├── context_menu_handler.rs
│ │ │ │ ├── display_handler.rs
│ │ │ │ ├── life_span_handler.rs
│ │ │ │ ├── load_handler.rs
│ │ │ │ ├── render_handler.rs
│ │ │ │ ├── render_process_app.rs
│ │ │ │ ├── render_process_handler.rs
│ │ │ │ ├── render_process_v8_handler.rs
│ │ │ │ ├── resource_handler.rs
│ │ │ │ ├── scheme_handler_factory.rs
│ │ │ │ └── task.rs
│ │ │ ├── internal.rs
│ │ │ ├── ipc.rs
│ │ │ ├── platform.rs
│ │ │ └── utility.rs
│ │ ├── cef.rs
│ │ ├── cli.rs
│ │ ├── consts.rs
│ │ ├── dirs.rs
│ │ ├── event.rs
│ │ ├── gpu_context.rs
│ │ ├── lib.rs
│ │ ├── main.rs
│ │ ├── persist.rs
│ │ ├── preferences.rs
│ │ ├── render/
│ │ │ ├── composite_shader.wgsl
│ │ │ ├── frame_buffer_ref.rs
│ │ │ └── state.rs
│ │ ├── render.rs
│ │ ├── window/
│ │ │ ├── linux.rs
│ │ │ ├── mac/
│ │ │ │ ├── app.rs
│ │ │ │ └── menu.rs
│ │ │ ├── mac.rs
│ │ │ ├── win/
│ │ │ │ └── native_handle.rs
│ │ │ └── win.rs
│ │ └── window.rs
│ └── wrapper/
│ ├── Cargo.toml
│ └── src/
│ ├── handle_desktop_wrapper_message.rs
│ ├── intercept_editor_message.rs
│ ├── intercept_frontend_message.rs
│ ├── lib.rs
│ ├── message_dispatcher.rs
│ ├── messages.rs
│ └── utils.rs
├── editor/
│ ├── Cargo.toml
│ ├── build.rs
│ └── src/
│ ├── application.rs
│ ├── consts.rs
│ ├── dispatcher.rs
│ ├── lib.rs
│ ├── macros.rs
│ ├── messages/
│ │ ├── animation/
│ │ │ ├── animation_message.rs
│ │ │ ├── animation_message_handler.rs
│ │ │ └── mod.rs
│ │ ├── app_window/
│ │ │ ├── app_window_message.rs
│ │ │ ├── app_window_message_handler.rs
│ │ │ └── mod.rs
│ │ ├── broadcast/
│ │ │ ├── broadcast_message.rs
│ │ │ ├── broadcast_message_handler.rs
│ │ │ ├── event/
│ │ │ │ ├── event_message.rs
│ │ │ │ ├── event_message_handler.rs
│ │ │ │ └── mod.rs
│ │ │ └── mod.rs
│ │ ├── clipboard/
│ │ │ ├── clipboard_message.rs
│ │ │ ├── clipboard_message_handler.rs
│ │ │ ├── mod.rs
│ │ │ └── utility_types.rs
│ │ ├── debug/
│ │ │ ├── debug_message.rs
│ │ │ ├── debug_message_handler.rs
│ │ │ ├── mod.rs
│ │ │ └── utility_types.rs
│ │ ├── defer/
│ │ │ ├── defer_message.rs
│ │ │ ├── defer_message_handler.rs
│ │ │ └── mod.rs
│ │ ├── dialog/
│ │ │ ├── dialog_message.rs
│ │ │ ├── dialog_message_handler.rs
│ │ │ ├── export_dialog/
│ │ │ │ ├── export_dialog_message.rs
│ │ │ │ ├── export_dialog_message_handler.rs
│ │ │ │ └── mod.rs
│ │ │ ├── mod.rs
│ │ │ ├── new_document_dialog/
│ │ │ │ ├── mod.rs
│ │ │ │ ├── new_document_dialog_message.rs
│ │ │ │ └── new_document_dialog_message_handler.rs
│ │ │ ├── preferences_dialog/
│ │ │ │ ├── mod.rs
│ │ │ │ ├── preferences_dialog_message.rs
│ │ │ │ └── preferences_dialog_message_handler.rs
│ │ │ └── simple_dialogs/
│ │ │ ├── about_graphite_dialog.rs
│ │ │ ├── close_all_documents_dialog.rs
│ │ │ ├── close_document_dialog.rs
│ │ │ ├── confirm_restart_dialog.rs
│ │ │ ├── demo_artwork_dialog.rs
│ │ │ ├── error_dialog.rs
│ │ │ ├── licenses_dialog.rs
│ │ │ ├── licenses_third_party_dialog.rs
│ │ │ └── mod.rs
│ │ ├── frontend/
│ │ │ ├── frontend_message.rs
│ │ │ ├── mod.rs
│ │ │ └── utility_types.rs
│ │ ├── input_mapper/
│ │ │ ├── input_mapper_message.rs
│ │ │ ├── input_mapper_message_handler.rs
│ │ │ ├── input_mappings.rs
│ │ │ ├── key_mapping/
│ │ │ │ ├── key_mapping_message.rs
│ │ │ │ ├── key_mapping_message_handler.rs
│ │ │ │ └── mod.rs
│ │ │ ├── mod.rs
│ │ │ └── utility_types/
│ │ │ ├── input_keyboard.rs
│ │ │ ├── input_mouse.rs
│ │ │ ├── macros.rs
│ │ │ ├── misc.rs
│ │ │ └── mod.rs
│ │ ├── input_preprocessor/
│ │ │ ├── input_preprocessor_message.rs
│ │ │ ├── input_preprocessor_message_handler.rs
│ │ │ └── mod.rs
│ │ ├── layout/
│ │ │ ├── layout_message.rs
│ │ │ ├── layout_message_handler.rs
│ │ │ ├── mod.rs
│ │ │ └── utility_types/
│ │ │ ├── layout_widget.rs
│ │ │ ├── mod.rs
│ │ │ └── widgets/
│ │ │ ├── button_widgets.rs
│ │ │ ├── input_widgets.rs
│ │ │ ├── label_widgets.rs
│ │ │ └── mod.rs
│ │ ├── menu_bar/
│ │ │ ├── menu_bar_message.rs
│ │ │ ├── menu_bar_message_handler.rs
│ │ │ └── mod.rs
│ │ ├── message.rs
│ │ ├── mod.rs
│ │ ├── portfolio/
│ │ │ ├── document/
│ │ │ │ ├── data_panel/
│ │ │ │ │ ├── data_panel_message.rs
│ │ │ │ │ ├── data_panel_message_handler.rs
│ │ │ │ │ └── mod.rs
│ │ │ │ ├── document_message.rs
│ │ │ │ ├── document_message_handler.rs
│ │ │ │ ├── graph_operation/
│ │ │ │ │ ├── graph_operation_message.rs
│ │ │ │ │ ├── graph_operation_message_handler.rs
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── transform_utils.rs
│ │ │ │ │ └── utility_types.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── navigation/
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── navigation_message.rs
│ │ │ │ │ ├── navigation_message_handler.rs
│ │ │ │ │ └── utility_types.rs
│ │ │ │ ├── node_graph/
│ │ │ │ │ ├── document_node_definitions/
│ │ │ │ │ │ └── document_node_derive.rs
│ │ │ │ │ ├── document_node_definitions.rs
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── node_graph_message.rs
│ │ │ │ │ ├── node_graph_message_handler.rs
│ │ │ │ │ ├── node_properties.rs
│ │ │ │ │ └── utility_types.rs
│ │ │ │ ├── overlays/
│ │ │ │ │ ├── grid_overlays.rs
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── overlays_message.rs
│ │ │ │ │ ├── overlays_message_handler.rs
│ │ │ │ │ ├── utility_functions.rs
│ │ │ │ │ ├── utility_types_native.rs
│ │ │ │ │ └── utility_types_web.rs
│ │ │ │ ├── properties_panel/
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── properties_panel_message.rs
│ │ │ │ │ └── properties_panel_message_handler.rs
│ │ │ │ └── utility_types/
│ │ │ │ ├── clipboards.rs
│ │ │ │ ├── document_metadata.rs
│ │ │ │ ├── error.rs
│ │ │ │ ├── misc.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── network_interface/
│ │ │ │ │ ├── deserialization.rs
│ │ │ │ │ ├── memo_network.rs
│ │ │ │ │ └── resolved_types.rs
│ │ │ │ ├── network_interface.rs
│ │ │ │ ├── nodes.rs
│ │ │ │ ├── transformation.rs
│ │ │ │ └── wires.rs
│ │ │ ├── document_migration.rs
│ │ │ ├── mod.rs
│ │ │ ├── portfolio_message.rs
│ │ │ ├── portfolio_message_handler.rs
│ │ │ └── utility_types.rs
│ │ ├── preferences/
│ │ │ ├── mod.rs
│ │ │ ├── preferences_message.rs
│ │ │ ├── preferences_message_handler.rs
│ │ │ └── utility_types.rs
│ │ ├── prelude.rs
│ │ ├── tool/
│ │ │ ├── common_functionality/
│ │ │ │ ├── auto_panning.rs
│ │ │ │ ├── color_selector.rs
│ │ │ │ ├── compass_rose.rs
│ │ │ │ ├── gizmos/
│ │ │ │ │ ├── gizmo_manager.rs
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ └── shape_gizmos/
│ │ │ │ │ ├── circle_arc_radius_handle.rs
│ │ │ │ │ ├── grid_rows_columns_gizmo.rs
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── number_of_points_dial.rs
│ │ │ │ │ ├── point_radius_handle.rs
│ │ │ │ │ ├── spiral_turns_handle.rs
│ │ │ │ │ └── sweep_angle_gizmo.rs
│ │ │ │ ├── graph_modification_utils.rs
│ │ │ │ ├── layer_origin_cross.rs
│ │ │ │ ├── measure.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── pivot.rs
│ │ │ │ ├── resize.rs
│ │ │ │ ├── shape_editor.rs
│ │ │ │ ├── shapes/
│ │ │ │ │ ├── arc_shape.rs
│ │ │ │ │ ├── arrow_shape.rs
│ │ │ │ │ ├── circle_shape.rs
│ │ │ │ │ ├── ellipse_shape.rs
│ │ │ │ │ ├── grid_shape.rs
│ │ │ │ │ ├── line_shape.rs
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── polygon_shape.rs
│ │ │ │ │ ├── rectangle_shape.rs
│ │ │ │ │ ├── shape_utility.rs
│ │ │ │ │ ├── spiral_shape.rs
│ │ │ │ │ └── star_shape.rs
│ │ │ │ ├── snapping/
│ │ │ │ │ ├── alignment_snapper.rs
│ │ │ │ │ ├── distribution_snapper.rs
│ │ │ │ │ ├── grid_snapper.rs
│ │ │ │ │ ├── layer_snapper.rs
│ │ │ │ │ └── snap_results.rs
│ │ │ │ ├── snapping.rs
│ │ │ │ ├── transformation_cage.rs
│ │ │ │ └── utility_functions.rs
│ │ │ ├── mod.rs
│ │ │ ├── tool_message.rs
│ │ │ ├── tool_message_handler.rs
│ │ │ ├── tool_messages/
│ │ │ │ ├── artboard_tool.rs
│ │ │ │ ├── brush_tool.rs
│ │ │ │ ├── eyedropper_tool.rs
│ │ │ │ ├── fill_tool.rs
│ │ │ │ ├── freehand_tool.rs
│ │ │ │ ├── gradient_tool.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── navigate_tool.rs
│ │ │ │ ├── path_tool.rs
│ │ │ │ ├── pen_tool.rs
│ │ │ │ ├── select_tool.rs
│ │ │ │ ├── shape_tool.rs
│ │ │ │ ├── spline_tool.rs
│ │ │ │ └── text_tool.rs
│ │ │ ├── transform_layer/
│ │ │ │ ├── mod.rs
│ │ │ │ ├── transform_layer_message.rs
│ │ │ │ └── transform_layer_message_handler.rs
│ │ │ └── utility_types.rs
│ │ └── viewport/
│ │ ├── mod.rs
│ │ ├── viewport_message.rs
│ │ └── viewport_message_handler.rs
│ ├── node_graph_executor/
│ │ ├── runtime.rs
│ │ └── runtime_io.rs
│ ├── node_graph_executor.rs
│ ├── test_utils.rs
│ ├── utility_traits.rs
│ └── utility_types.rs
├── flake.nix
├── frontend/
│ ├── .gitignore
│ ├── .prettierrc
│ ├── README.md
│ ├── branding-installer.js
│ ├── eslint.config.js
│ ├── index.html
│ ├── package-installer.js
│ ├── package.json
│ ├── src/
│ │ ├── App.svelte
│ │ ├── README.md
│ │ ├── components/
│ │ │ ├── Editor.svelte
│ │ │ ├── README.md
│ │ │ ├── floating-menus/
│ │ │ │ ├── ColorPicker.svelte
│ │ │ │ ├── Dialog.svelte
│ │ │ │ ├── EyedropperPreview.svelte
│ │ │ │ ├── MenuList.svelte
│ │ │ │ ├── NodeCatalog.svelte
│ │ │ │ └── Tooltip.svelte
│ │ │ ├── layout/
│ │ │ │ ├── ConditionalWrapper.svelte
│ │ │ │ ├── FloatingMenu.svelte
│ │ │ │ ├── LayoutCol.svelte
│ │ │ │ └── LayoutRow.svelte
│ │ │ ├── panels/
│ │ │ │ ├── Data.svelte
│ │ │ │ ├── Document.svelte
│ │ │ │ ├── Layers.svelte
│ │ │ │ ├── Properties.svelte
│ │ │ │ └── Welcome.svelte
│ │ │ ├── views/
│ │ │ │ └── Graph.svelte
│ │ │ ├── widgets/
│ │ │ │ ├── WidgetLayout.svelte
│ │ │ │ ├── WidgetSection.svelte
│ │ │ │ ├── WidgetSpan.svelte
│ │ │ │ ├── WidgetTable.svelte
│ │ │ │ ├── buttons/
│ │ │ │ │ ├── BreadcrumbTrailButtons.svelte
│ │ │ │ │ ├── IconButton.svelte
│ │ │ │ │ ├── ImageButton.svelte
│ │ │ │ │ ├── ParameterExposeButton.svelte
│ │ │ │ │ ├── PopoverButton.svelte
│ │ │ │ │ └── TextButton.svelte
│ │ │ │ ├── inputs/
│ │ │ │ │ ├── CheckboxInput.svelte
│ │ │ │ │ ├── ColorInput.svelte
│ │ │ │ │ ├── CurveInput.svelte
│ │ │ │ │ ├── DropdownInput.svelte
│ │ │ │ │ ├── FieldInput.svelte
│ │ │ │ │ ├── NumberInput.svelte
│ │ │ │ │ ├── RadioInput.svelte
│ │ │ │ │ ├── ReferencePointInput.svelte
│ │ │ │ │ ├── RulerInput.svelte
│ │ │ │ │ ├── ScrollbarInput.svelte
│ │ │ │ │ ├── SpectrumInput.svelte
│ │ │ │ │ ├── TextAreaInput.svelte
│ │ │ │ │ ├── TextInput.svelte
│ │ │ │ │ └── WorkingColorsInput.svelte
│ │ │ │ └── labels/
│ │ │ │ ├── IconLabel.svelte
│ │ │ │ ├── ImageLabel.svelte
│ │ │ │ ├── Separator.svelte
│ │ │ │ ├── ShortcutLabel.svelte
│ │ │ │ └── TextLabel.svelte
│ │ │ └── window/
│ │ │ ├── MainWindow.svelte
│ │ │ ├── Panel.svelte
│ │ │ ├── StatusBar.svelte
│ │ │ ├── TitleBar.svelte
│ │ │ └── Workspace.svelte
│ │ ├── editor.ts
│ │ ├── global.d.ts
│ │ ├── icons.ts
│ │ ├── main.ts
│ │ ├── managers/
│ │ │ ├── clipboard.ts
│ │ │ ├── fonts.ts
│ │ │ ├── hyperlink.ts
│ │ │ ├── input.ts
│ │ │ ├── localization.ts
│ │ │ ├── panic.ts
│ │ │ └── persistence.ts
│ │ ├── stores/
│ │ │ ├── app-window.ts
│ │ │ ├── dialog.ts
│ │ │ ├── document.ts
│ │ │ ├── fullscreen.ts
│ │ │ ├── node-graph.ts
│ │ │ ├── portfolio.ts
│ │ │ └── tooltip.ts
│ │ ├── subscription-router.ts
│ │ ├── utility-functions/
│ │ │ ├── colors.ts
│ │ │ ├── crash-report.ts
│ │ │ ├── escape.ts
│ │ │ ├── files.ts
│ │ │ ├── images.ts
│ │ │ ├── keyboard-entry.ts
│ │ │ ├── network.ts
│ │ │ ├── panic-proxy.ts
│ │ │ ├── platform.ts
│ │ │ ├── rasterization.ts
│ │ │ ├── strip-indents.ts
│ │ │ ├── viewports.ts
│ │ │ └── widgets.ts
│ │ ├── vite-env-override.d.ts
│ │ └── vite-env.d.ts
│ ├── svelte.config.js
│ ├── tsconfig.json
│ ├── vite.config.ts
│ └── wasm/
│ ├── Cargo.toml
│ ├── README.md
│ └── src/
│ ├── editor_api.rs
│ ├── helpers.rs
│ ├── lib.rs
│ └── native_communication.rs
├── libraries/
│ ├── dyn-any/
│ │ ├── Cargo.toml
│ │ ├── LICENSE-APACHE
│ │ ├── LICENSE-MIT
│ │ ├── README.md
│ │ ├── derive/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ └── lib.rs
│ │ └── src/
│ │ └── lib.rs
│ ├── math-parser/
│ │ ├── Cargo.toml
│ │ ├── benches/
│ │ │ └── bench.rs
│ │ └── src/
│ │ ├── ast.rs
│ │ ├── constants.rs
│ │ ├── context.rs
│ │ ├── executer.rs
│ │ ├── grammer.pest
│ │ ├── lib.rs
│ │ ├── parser.rs
│ │ └── value.rs
│ └── rawkit/
│ ├── .gitignore
│ ├── Cargo.toml
│ ├── LICENSE-APACHE
│ ├── LICENSE-MIT
│ ├── README.md
│ ├── camera_data/
│ │ └── Sony/
│ │ ├── DSLR-A100.toml
│ │ ├── DSLR-A200.toml
│ │ ├── DSLR-A300.toml
│ │ ├── DSLR-A330.toml
│ │ ├── DSLR-A350.toml
│ │ ├── DSLR-A550.toml
│ │ ├── DSLR-A700.toml
│ │ ├── DSLR-A850.toml
│ │ ├── DSLR-A900.toml
│ │ ├── ILCA-68.toml
│ │ ├── ILCA-99M2.toml
│ │ ├── ILCE-1.toml
│ │ ├── ILCE-5100.toml
│ │ ├── ILCE-6000.toml
│ │ ├── ILCE-6100.toml
│ │ ├── ILCE-6300.toml
│ │ ├── ILCE-6400.toml
│ │ ├── ILCE-6500.toml
│ │ ├── ILCE-6600.toml
│ │ ├── ILCE-6700.toml
│ │ ├── ILCE-7CM2.toml
│ │ ├── ILCE-7CR.toml
│ │ ├── ILCE-7M2.toml
│ │ ├── ILCE-7M3.toml
│ │ ├── ILCE-7RM3.toml
│ │ ├── ILCE-7RM4.toml
│ │ ├── ILCE-7RM5.toml
│ │ ├── ILCE-7SM2.toml
│ │ ├── ILCE-9.toml
│ │ ├── ILCE-9M2.toml
│ │ ├── ILCE-9M3.toml
│ │ ├── NEX-3.toml
│ │ ├── NEX-3N.toml
│ │ ├── NEX-5R.toml
│ │ ├── NEX-6.toml
│ │ ├── NEX-7.toml
│ │ ├── ZV-1.toml
│ │ ├── ZV-1M2.toml
│ │ ├── ZV-E1.toml
│ │ └── ZV-E10.toml
│ ├── rawkit-proc-macros/
│ │ ├── Cargo.toml
│ │ ├── LICENSE-APACHE
│ │ ├── LICENSE-MIT
│ │ ├── README.md
│ │ └── src/
│ │ ├── build_camera_data.rs
│ │ ├── lib.rs
│ │ └── tag_derive.rs
│ ├── src/
│ │ ├── decoder/
│ │ │ ├── arw1.rs
│ │ │ ├── arw2.rs
│ │ │ ├── mod.rs
│ │ │ └── uncompressed.rs
│ │ ├── demosaicing/
│ │ │ ├── linear_demosaicing.rs
│ │ │ └── mod.rs
│ │ ├── lib.rs
│ │ ├── metadata/
│ │ │ ├── camera_data.rs
│ │ │ ├── identify.rs
│ │ │ └── mod.rs
│ │ ├── postprocessing/
│ │ │ ├── convert_to_rgb.rs
│ │ │ ├── gamma_correction.rs
│ │ │ ├── mod.rs
│ │ │ ├── record_histogram.rs
│ │ │ └── transform.rs
│ │ ├── preprocessing/
│ │ │ ├── mod.rs
│ │ │ ├── scale_to_16bit.rs
│ │ │ ├── scale_white_balance.rs
│ │ │ └── subtract_black.rs
│ │ ├── processing.rs
│ │ └── tiff/
│ │ ├── file.rs
│ │ ├── mod.rs
│ │ ├── tags.rs
│ │ ├── types.rs
│ │ └── values.rs
│ └── tests/
│ ├── images/
│ │ └── .gitkeep
│ └── tests.rs
├── node-graph/
│ ├── LICENSE
│ ├── README.md
│ ├── graph-craft/
│ │ ├── Cargo.toml
│ │ ├── benches/
│ │ │ ├── compile_demo_art_criterion.rs
│ │ │ └── compile_demo_art_iai.rs
│ │ └── src/
│ │ ├── document/
│ │ │ └── value.rs
│ │ ├── document.rs
│ │ ├── graphene_compiler.rs
│ │ ├── lib.rs
│ │ ├── proto.rs
│ │ ├── util.rs
│ │ └── wasm_application_io.rs
│ ├── graphene-cli/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ ├── export.rs
│ │ └── main.rs
│ ├── interpreted-executor/
│ │ ├── Cargo.toml
│ │ ├── benches/
│ │ │ ├── benchmark_util.rs
│ │ │ ├── run_cached.rs
│ │ │ ├── run_cached_iai.rs
│ │ │ ├── run_demo_art_criterion.rs
│ │ │ ├── run_once.rs
│ │ │ ├── run_once_iai.rs
│ │ │ ├── update_executor.rs
│ │ │ └── update_executor_iai.rs
│ │ └── src/
│ │ ├── dynamic_executor.rs
│ │ ├── lib.rs
│ │ ├── node_registry.rs
│ │ └── util.rs
│ ├── libraries/
│ │ ├── application-io/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ └── lib.rs
│ │ ├── core-types/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── bounds.rs
│ │ │ ├── consts.rs
│ │ │ ├── context.rs
│ │ │ ├── generic.rs
│ │ │ ├── lib.rs
│ │ │ ├── math/
│ │ │ │ ├── bbox.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── polynomial.rs
│ │ │ │ ├── quad.rs
│ │ │ │ └── rect.rs
│ │ │ ├── memo.rs
│ │ │ ├── misc.rs
│ │ │ ├── ops.rs
│ │ │ ├── registry.rs
│ │ │ ├── render_complexity.rs
│ │ │ ├── table.rs
│ │ │ ├── text.rs
│ │ │ ├── transform.rs
│ │ │ ├── types.rs
│ │ │ ├── uuid.rs
│ │ │ └── value.rs
│ │ ├── graphic-types/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── artboard.rs
│ │ │ ├── graphic.rs
│ │ │ └── lib.rs
│ │ ├── no-std-types/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── blending.rs
│ │ │ ├── choice_type.rs
│ │ │ ├── color/
│ │ │ │ ├── color_traits.rs
│ │ │ │ ├── color_types.rs
│ │ │ │ ├── discrete_srgb.rs
│ │ │ │ └── mod.rs
│ │ │ ├── context.rs
│ │ │ ├── lib.rs
│ │ │ ├── registry.rs
│ │ │ └── shaders/
│ │ │ ├── buffer_struct/
│ │ │ │ ├── glam.rs
│ │ │ │ ├── mod.rs
│ │ │ │ └── primitive.rs
│ │ │ └── mod.rs
│ │ ├── raster-types/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── image.rs
│ │ │ ├── lib.rs
│ │ │ └── raster_types.rs
│ │ ├── rendering/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── convert_usvg_path.rs
│ │ │ ├── lib.rs
│ │ │ ├── render_ext.rs
│ │ │ ├── renderer.rs
│ │ │ └── to_peniko.rs
│ │ ├── vector-types/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── gradient.rs
│ │ │ ├── lib.rs
│ │ │ ├── math/
│ │ │ │ └── mod.rs
│ │ │ ├── subpath/
│ │ │ │ ├── consts.rs
│ │ │ │ ├── core.rs
│ │ │ │ ├── lookup.rs
│ │ │ │ ├── manipulators.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── solvers.rs
│ │ │ │ ├── structs.rs
│ │ │ │ └── transform.rs
│ │ │ └── vector/
│ │ │ ├── algorithms/
│ │ │ │ ├── bezpath_algorithms.rs
│ │ │ │ ├── contants.rs
│ │ │ │ ├── intersection.rs
│ │ │ │ ├── merge_by_distance.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── offset_subpath.rs
│ │ │ │ ├── poisson_disk.rs
│ │ │ │ ├── spline.rs
│ │ │ │ └── util.rs
│ │ │ ├── click_target.rs
│ │ │ ├── misc.rs
│ │ │ ├── mod.rs
│ │ │ ├── reference_point.rs
│ │ │ ├── style.rs
│ │ │ ├── vector_attributes.rs
│ │ │ ├── vector_modification.rs
│ │ │ └── vector_types.rs
│ │ └── wgpu-executor/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ ├── context.rs
│ │ ├── lib.rs
│ │ ├── resample.rs
│ │ ├── resample_shader.wgsl
│ │ ├── shader_runtime/
│ │ │ ├── mod.rs
│ │ │ └── per_pixel_adjust_runtime.rs
│ │ └── texture_conversion.rs
│ ├── node-macro/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ ├── buffer_struct.rs
│ │ ├── codegen.rs
│ │ ├── crate_ident.rs
│ │ ├── derive_choice_type.rs
│ │ ├── lib.rs
│ │ ├── parsing.rs
│ │ ├── shader_nodes/
│ │ │ ├── mod.rs
│ │ │ └── per_pixel_adjust.rs
│ │ └── validation.rs
│ ├── nodes/
│ │ ├── blending/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ └── lib.rs
│ │ ├── brush/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── brush.rs
│ │ │ ├── brush_cache.rs
│ │ │ ├── brush_stroke.rs
│ │ │ └── lib.rs
│ │ ├── gcore/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── animation.rs
│ │ │ ├── context.rs
│ │ │ ├── context_modification.rs
│ │ │ ├── debug.rs
│ │ │ ├── extract_xy.rs
│ │ │ ├── lib.rs
│ │ │ ├── logic.rs
│ │ │ ├── memo.rs
│ │ │ └── ops.rs
│ │ ├── graphic/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── artboard.rs
│ │ │ ├── graphic.rs
│ │ │ └── lib.rs
│ │ ├── gstd/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── any.rs
│ │ │ ├── lib.rs
│ │ │ ├── pixel_preview.rs
│ │ │ ├── render_cache.rs
│ │ │ ├── render_node.rs
│ │ │ ├── text.rs
│ │ │ └── wasm_application_io.rs
│ │ ├── math/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ └── lib.rs
│ │ ├── path-bool/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ └── lib.rs
│ │ ├── raster/
│ │ │ ├── Cargo.toml
│ │ │ ├── shaders/
│ │ │ │ ├── Cargo.toml
│ │ │ │ ├── build.rs
│ │ │ │ ├── entrypoint/
│ │ │ │ │ ├── Cargo.toml
│ │ │ │ │ └── src/
│ │ │ │ │ └── lib.rs
│ │ │ │ ├── spirv-unknown-naga-wgsl.json
│ │ │ │ └── src/
│ │ │ │ └── lib.rs
│ │ │ └── src/
│ │ │ ├── adjust.rs
│ │ │ ├── adjustments.rs
│ │ │ ├── blending_nodes.rs
│ │ │ ├── cubic_spline.rs
│ │ │ ├── curve.rs
│ │ │ ├── dehaze.rs
│ │ │ ├── filter.rs
│ │ │ ├── fullscreen_vertex.rs
│ │ │ ├── generate_curves.rs
│ │ │ ├── gradient_map.rs
│ │ │ ├── image_color_palette.rs
│ │ │ ├── lib.rs
│ │ │ └── std_nodes.rs
│ │ ├── repeat/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── lib.rs
│ │ │ └── repeat_nodes.rs
│ │ ├── text/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── font_cache.rs
│ │ │ ├── lib.rs
│ │ │ ├── path_builder.rs
│ │ │ ├── text_context.rs
│ │ │ └── to_path.rs
│ │ ├── transform/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── lib.rs
│ │ │ └── transform_nodes.rs
│ │ └── vector/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ ├── generator_nodes.rs
│ │ ├── lib.rs
│ │ ├── merge_qr_squares.rs
│ │ ├── vector_modification_nodes.rs
│ │ └── vector_nodes.rs
│ ├── preprocessor/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ └── lib.rs
│ └── rfcs/
│ └── fine-grained-context-caching.md
├── proc-macros/
│ ├── Cargo.toml
│ └── src/
│ ├── as_message.rs
│ ├── combined_message_attrs.rs
│ ├── discriminant.rs
│ ├── extract_fields.rs
│ ├── helper_structs.rs
│ ├── helpers.rs
│ ├── hierarchical_tree.rs
│ ├── hint.rs
│ ├── lib.rs
│ ├── message_handler_data_attr.rs
│ ├── transitive_child.rs
│ └── widget_builder.rs
├── rustfmt.toml
├── tools/
│ ├── cargo-run/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ ├── lib.rs
│ │ ├── main.rs
│ │ └── requirements.rs
│ ├── crate-hierarchy-viz/
│ │ ├── .gitignore
│ │ ├── Cargo.toml
│ │ └── src/
│ │ └── main.rs
│ ├── editor-message-tree/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ └── main.rs
│ ├── node-docs/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ ├── main.rs
│ │ ├── page_catalog.rs
│ │ ├── page_category.rs
│ │ ├── page_node.rs
│ │ └── utility.rs
│ └── third-party-licenses/
│ ├── .gitignore
│ ├── Cargo.toml
│ ├── build.rs
│ └── src/
│ ├── cargo.rs
│ ├── cef.rs
│ ├── main.rs
│ └── npm.rs
└── website/
├── .build-scripts/
│ └── install.ts
├── .gitignore
├── config.toml
├── content/
│ ├── _index.md
│ ├── about.md
│ ├── blog/
│ │ ├── 2022-02-12-announcing-graphite-alpha.md
│ │ ├── 2022-03-12-graphite-a-vision-for-the-future-of-2d-content-creation.md
│ │ ├── 2022-05-12-distributed-computing-in-the-graphene-runtime.md
│ │ ├── 2024-01-01-looking-back-on-2023-and-what's-next.md
│ │ ├── 2024-02-22-graphite-internships-announcing-participation-in-gsoc-2024.md
│ │ ├── 2024-05-09-graphite-progress-report-q1-2024.md
│ │ ├── 2024-07-31-graphite-progress-report-q2-2024.md
│ │ ├── 2024-10-15-graphite-progress-report-q3-2024.md
│ │ ├── 2025-01-16-year-in-review-2024-highlights-and-a-peek-at-2025.md
│ │ ├── 2025-03-31-graphite-progress-report-q4-2024.md
│ │ ├── 2025-04-02-internships-for-a-rust-graphics-engine-gsoc-2025.md
│ │ ├── 2025-09-19-graphite-community-meetup-in-germany.md
│ │ └── _index.md
│ ├── contact.md
│ ├── donate.md
│ ├── features.md
│ ├── learn/
│ │ ├── _index.md
│ │ ├── _outline_draft.md
│ │ ├── interface/
│ │ │ ├── _index.md
│ │ │ ├── document-panel.md
│ │ │ └── menu-bar.md
│ │ └── introduction/
│ │ ├── _index.md
│ │ └── features-and-limitations.md
│ ├── license.md
│ ├── logo.md
│ ├── press.md
│ ├── privacy-policy.md
│ └── volunteer/
│ ├── _index.md
│ └── guide/
│ ├── _index.md
│ ├── codebase-overview/
│ │ ├── _index.md
│ │ ├── debugging-tips.md
│ │ └── editor-structure.md
│ ├── graphene/
│ │ ├── _index.md
│ │ └── networks-and-nodes.md
│ ├── project-setup/
│ │ └── _index.md
│ ├── starting-a-task/
│ │ ├── _index.md
│ │ ├── ai-contribution-policy.md
│ │ ├── code-quality-guidelines.md
│ │ └── submitting-a-contribution.md
│ └── student-projects/
│ ├── _index.md
│ └── completed-projects.md
├── eslint.config.js
├── package.json
├── sass/
│ ├── base.scss
│ ├── component/
│ │ ├── carousel.scss
│ │ ├── code-snippet.scss
│ │ ├── demo-artwork.scss
│ │ ├── feature-box.scss
│ │ ├── feature-icons.scss
│ │ ├── image-comparison.scss
│ │ └── youtube-embed.scss
│ ├── layout/
│ │ └── reading-material.scss
│ ├── page/
│ │ ├── about.scss
│ │ ├── blog.scss
│ │ ├── contributor-guide/
│ │ │ ├── bisect-tool.scss
│ │ │ ├── crate-hierarchy.scss
│ │ │ └── editor-structure.scss
│ │ ├── donate.scss
│ │ ├── features.scss
│ │ ├── index.scss
│ │ ├── logo.scss
│ │ ├── user-manual/
│ │ │ ├── node-catalog.scss
│ │ │ ├── node-category.scss
│ │ │ └── node.scss
│ │ └── volunteer.scss
│ └── template/
│ ├── article.scss
│ └── book.scss
├── static/
│ └── js/
│ ├── component/
│ │ ├── carousel.js
│ │ ├── image-comparison.js
│ │ ├── video-autoplay.js
│ │ └── youtube-embed.js
│ ├── navbar.js
│ ├── page/
│ │ └── contributor-guide/
│ │ ├── bisect-tool.js
│ │ ├── crate-hierarchy.js
│ │ └── editor-structure.js
│ ├── template/
│ │ └── book.js
│ └── text-justification.js
├── templates/
│ ├── 404.html
│ ├── article.html
│ ├── base.html
│ ├── blog.html
│ ├── book.html
│ ├── macros/
│ │ ├── book-outline.html
│ │ └── replacements.html
│ ├── page.html
│ └── section.html
└── tsconfig.json
Showing preview only (666K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (7371 symbols across 486 files)
FILE: desktop/bundle/build.rs
function main (line 1) | fn main() {
FILE: desktop/bundle/src/common.rs
constant APP_NAME (line 8) | pub(crate) const APP_NAME: &str = "Graphite";
constant APP_BIN (line 9) | pub(crate) const APP_BIN: &str = "graphite";
function workspace_path (line 11) | pub(crate) fn workspace_path() -> PathBuf {
function profile_name (line 15) | fn profile_name() -> &'static str {
function profile_path (line 23) | pub(crate) fn profile_path() -> PathBuf {
function cef_path (line 27) | pub(crate) fn cef_path() -> PathBuf {
function build_bin (line 31) | pub(crate) fn build_bin(package: &str, bin: Option<&str>) -> Result<Path...
function run_command (line 46) | pub(crate) fn run_command(program: &str, args: &[&str]) -> Result<(), Bo...
function clean_dir (line 54) | pub(crate) fn clean_dir(dir: &Path) {
function copy_dir (line 61) | pub(crate) fn copy_dir(src: &Path, dst: &Path) {
FILE: desktop/bundle/src/linux.rs
function main (line 3) | pub fn main() -> Result<(), Box<dyn std::error::Error>> {
FILE: desktop/bundle/src/mac.rs
constant APP_ID (line 8) | const APP_ID: &str = "art.graphite.Graphite";
constant ICONS_FILE_NAME (line 10) | const ICONS_FILE_NAME: &str = "graphite.icns";
constant EXEC_PATH (line 12) | const EXEC_PATH: &str = "Contents/MacOS";
constant FRAMEWORKS_PATH (line 13) | const FRAMEWORKS_PATH: &str = "Contents/Frameworks";
constant RESOURCES_PATH (line 14) | const RESOURCES_PATH: &str = "Contents/Resources";
constant CEF_FRAMEWORK (line 15) | const CEF_FRAMEWORK: &str = "Chromium Embedded Framework.framework";
function main (line 17) | pub fn main() -> Result<(), Box<dyn Error>> {
function bundle (line 35) | fn bundle(out_dir: &Path, app_bin: &Path, helper_bin: &Path) -> PathBuf {
function create_app (line 62) | fn create_app(app_dir: &Path, id: &str, name: &str, bin: &Path, is_helpe...
function create_info_plist (line 70) | fn create_info_plist(dir: &Path, id: &str, exec_name: &str, is_helper: b...
type InfoPlist (line 96) | struct InfoPlist {
FILE: desktop/bundle/src/main.rs
function main (line 10) | fn main() {
FILE: desktop/bundle/src/win.rs
constant EXECUTABLE (line 7) | const EXECUTABLE: &str = "Graphite.exe";
function main (line 9) | pub fn main() -> Result<(), Box<dyn Error>> {
function bundle (line 24) | fn bundle(out_dir: &Path, app_bin: &Path) -> PathBuf {
function remove_unnecessary_cef_files (line 41) | fn remove_unnecessary_cef_files(app_dir: &Path) -> Result<(), Box<dyn Er...
FILE: desktop/embedded-resources/build.rs
constant EMBEDDED_RESOURCES_ENV (line 1) | const EMBEDDED_RESOURCES_ENV: &str = "EMBEDDED_RESOURCES";
constant DEFAULT_RESOURCES_DIR (line 2) | const DEFAULT_RESOURCES_DIR: &str = "../../frontend/dist";
function main (line 4) | fn main() {
FILE: desktop/platform/linux/src/main.rs
function main (line 1) | fn main() {
FILE: desktop/platform/mac/src/helper.rs
function main (line 1) | fn main() {
FILE: desktop/platform/mac/src/main.rs
function main (line 1) | fn main() {
FILE: desktop/platform/win/build.rs
function main (line 1) | fn main() {
FILE: desktop/platform/win/src/main.rs
function main (line 2) | fn main() {
FILE: desktop/src/app.rs
type App (line 27) | pub(crate) struct App {
method init (line 58) | pub(crate) fn init() {
method new (line 62) | pub(crate) fn new(
method run (line 130) | pub(crate) fn run(mut self, event_loop: EventLoop) -> ExitReason {
method exit (line 135) | fn exit(&mut self, reason: Option<ExitReason>) {
method resize (line 146) | fn resize(&mut self) {
method handle_desktop_frontend_message (line 196) | fn handle_desktop_frontend_message(&mut self, message: DesktopFrontend...
method handle_desktop_frontend_messages (line 439) | fn handle_desktop_frontend_messages(&mut self, messages: Vec<DesktopFr...
method dispatch_desktop_wrapper_message (line 449) | fn dispatch_desktop_wrapper_message(&mut self, message: DesktopWrapper...
method send_or_queue_web_message (line 454) | fn send_or_queue_web_message(&mut self, message: Vec<u8>) {
method user_event (line 462) | fn user_event(&mut self, event_loop: &dyn ActiveEventLoop, event: AppE...
method can_create_surfaces (line 519) | fn can_create_surfaces(&mut self, event_loop: &dyn ActiveEventLoop) {
method proxy_wake_up (line 542) | fn proxy_wake_up(&mut self, event_loop: &dyn ActiveEventLoop) {
method window_event (line 548) | fn window_event(&mut self, _event_loop: &dyn ActiveEventLoop, _window_id...
method device_event (line 669) | fn device_event(&mut self, _event_loop: &dyn ActiveEventLoop, _device_id...
method new_events (line 678) | fn new_events(&mut self, _event_loop: &dyn ActiveEventLoop, cause: winit...
method about_to_wait (line 686) | fn about_to_wait(&mut self, event_loop: &dyn ActiveEventLoop) {
type ExitReason (line 704) | pub(crate) enum ExitReason {
FILE: desktop/src/cef.rs
type CefEventHandler (line 42) | pub(crate) trait CefEventHandler: Send + Sync + 'static {
method view_info (line 43) | fn view_info(&self) -> ViewInfo;
method draw (line 44) | fn draw<'a>(&self, frame_buffer: FrameBufferRef<'a>);
method draw_gpu (line 46) | fn draw_gpu(&self, shared_texture: SharedTextureHandle);
method load_resource (line 47) | fn load_resource(&self, path: PathBuf) -> Option<Resource>;
method cursor_change (line 48) | fn cursor_change(&self, cursor: Cursor);
method schedule_cef_message_loop_work (line 51) | fn schedule_cef_message_loop_work(&self, scheduled_time: Instant);
method initialized_web_communication (line 52) | fn initialized_web_communication(&self);
method receive_web_message (line 53) | fn receive_web_message(&self, message: &[u8]);
method duplicate (line 54) | fn duplicate(&self) -> Self
method view_info (line 140) | fn view_info(&self) -> ViewInfo {
method draw (line 151) | fn draw<'a>(&self, frame_buffer: FrameBufferRef<'a>) {
method draw_gpu (line 192) | fn draw_gpu(&self, shared_texture: SharedTextureHandle) {
method load_resource (line 203) | fn load_resource(&self, path: PathBuf) -> Option<Resource> {
method cursor_change (line 258) | fn cursor_change(&self, cursor: Cursor) {
method schedule_cef_message_loop_work (line 262) | fn schedule_cef_message_loop_work(&self, scheduled_time: std::time::In...
method initialized_web_communication (line 266) | fn initialized_web_communication(&self) {
method receive_web_message (line 270) | fn receive_web_message(&self, message: &[u8]) {
method duplicate (line 278) | fn duplicate(&self) -> Self
type ViewInfo (line 60) | pub(crate) struct ViewInfo {
method new (line 66) | pub(crate) fn new() -> Self {
method apply_update (line 69) | pub(crate) fn apply_update(&mut self, update: ViewInfoUpdate) {
method zoom (line 81) | pub(crate) fn zoom(&self) -> f64 {
method width (line 84) | pub(crate) fn width(&self) -> u32 {
method height (line 87) | pub(crate) fn height(&self) -> u32 {
method default (line 92) | fn default() -> Self {
type ViewInfoUpdate (line 97) | pub(crate) enum ViewInfoUpdate {
type Resource (line 103) | pub(crate) struct Resource {
type ResourceReader (line 110) | pub(crate) enum ResourceReader {
method read (line 115) | fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
type CefHandler (line 123) | pub(crate) struct CefHandler {
method new (line 130) | pub(crate) fn new(wgpu_context: WgpuContext, app_event_scheduler: AppE...
type ViewInfoReceiver (line 290) | struct ViewInfoReceiver {
method new (line 295) | fn new(receiver: Receiver<ViewInfoUpdate>) -> Self {
FILE: desktop/src/cef/consts.rs
constant RESOURCE_SCHEME (line 3) | pub(crate) const RESOURCE_SCHEME: &str = "resources";
constant RESOURCE_DOMAIN (line 4) | pub(crate) const RESOURCE_DOMAIN: &str = "resources";
constant SCROLL_LINE_HEIGHT (line 6) | pub(crate) const SCROLL_LINE_HEIGHT: usize = 40;
constant SCROLL_LINE_WIDTH (line 7) | pub(crate) const SCROLL_LINE_WIDTH: usize = 40;
constant SCROLL_SPEED_X (line 10) | pub(crate) const SCROLL_SPEED_X: f32 = 3.0;
constant SCROLL_SPEED_Y (line 12) | pub(crate) const SCROLL_SPEED_Y: f32 = 3.0;
constant SCROLL_SPEED_X (line 15) | pub(crate) const SCROLL_SPEED_X: f32 = 1.0;
constant SCROLL_SPEED_Y (line 17) | pub(crate) const SCROLL_SPEED_Y: f32 = 1.0;
constant PINCH_ZOOM_SPEED (line 19) | pub(crate) const PINCH_ZOOM_SPEED: f64 = 300.0;
constant MULTICLICK_TIMEOUT (line 21) | pub(crate) const MULTICLICK_TIMEOUT: Duration = Duration::from_millis(500);
constant MULTICLICK_ALLOWED_TRAVEL (line 22) | pub(crate) const MULTICLICK_ALLOWED_TRAVEL: usize = 4;
FILE: desktop/src/cef/context.rs
type CefContext (line 8) | pub(crate) trait CefContext {
method work (line 9) | fn work(&mut self);
method handle_window_event (line 11) | fn handle_window_event(&mut self, event: &winit::event::WindowEvent);
method notify_view_info_changed (line 13) | fn notify_view_info_changed(&self);
method send_web_message (line 15) | fn send_web_message(&self, message: Vec<u8>);
FILE: desktop/src/cef/context/builder.rs
type CefContextBuilder (line 17) | pub(crate) struct CefContextBuilder<H: CefEventHandler> {
function new (line 26) | pub(crate) fn new() -> Self {
function new_helper (line 30) | pub(crate) fn new_helper() -> Self {
function new_inner (line 34) | fn new_inner(helper: bool) -> Self {
function is_sub_process (line 58) | pub(crate) fn is_sub_process(&self) -> bool {
function execute_sub_process (line 62) | pub(crate) fn execute_sub_process(&self) -> SetupError {
function common_settings (line 75) | fn common_settings(instance_dir: &Path) -> Settings {
function initialize (line 99) | pub(crate) fn initialize(self, event_handler: H, disable_gpu_acceleratio...
function initialize (line 120) | pub(crate) fn initialize(self, event_handler: H, disable_gpu_acceleratio...
function initialize_inner (line 147) | fn initialize_inner(self, event_handler: &H, settings: Settings) -> Resu...
function create_browser (line 160) | fn create_browser<H: CefEventHandler>(event_handler: H, instance_dir: Pa...
type SetupError (line 223) | pub(crate) enum SetupError {
type InitError (line 231) | pub(crate) enum InitError {
FILE: desktop/src/cef/context/multithreaded.rs
type MultiThreadedCefContextProxy (line 15) | pub(super) struct MultiThreadedCefContextProxy;
method work (line 18) | fn work(&mut self) {
method handle_window_event (line 22) | fn handle_window_event(&mut self, event: &WindowEvent) {
method notify_view_info_changed (line 33) | fn notify_view_info_changed(&self) {
method send_web_message (line 43) | fn send_web_message(&self, message: Vec<u8>) {
method drop (line 55) | fn drop(&mut self) {
function run_on_ui_thread (line 61) | pub(super) fn run_on_ui_thread<F>(closure: F)
FILE: desktop/src/cef/context/singlethreaded.rs
type SingleThreadedCefContext (line 10) | pub(super) struct SingleThreadedCefContext {
method work (line 18) | fn work(&mut self) {
method handle_window_event (line 22) | fn handle_window_event(&mut self, event: &WindowEvent) {
method notify_view_info_changed (line 26) | fn notify_view_info_changed(&self) {
method send_web_message (line 37) | fn send_web_message(&self, message: Vec<u8>) {
method drop (line 43) | fn drop(&mut self) {
method send_message (line 66) | fn send_message(&self, message_type: MessageType, message: &[u8]) {
FILE: desktop/src/cef/dirs.rs
function delete_instance_dirs (line 7) | pub(crate) fn delete_instance_dirs() {
function create_instance_dir (line 19) | pub(crate) fn create_instance_dir() -> PathBuf {
FILE: desktop/src/cef/input.rs
function handle_window_event (line 13) | pub(crate) fn handle_window_event(browser: &Browser, input_state: &mut I...
FILE: desktop/src/cef/input/keymap.rs
type ToCharRepresentation (line 3) | pub(crate) trait ToCharRepresentation {
method to_char_representation (line 4) | fn to_char_representation(&self) -> char;
method to_char_representation (line 8) | fn to_char_representation(&self) -> char {
type ToNativeKeycode (line 23) | pub(crate) trait ToNativeKeycode {
method to_native_keycode (line 24) | fn to_native_keycode(&self) -> i32;
method to_native_keycode (line 28) | fn to_native_keycode(&self) -> i32 {
type ToVKBits (line 42) | pub(crate) trait ToVKBits {
method to_vk_bits (line 43) | fn to_vk_bits(&self) -> i32;
method to_vk_bits (line 57) | fn to_vk_bits(&self) -> i32 {
method to_vk_bits (line 175) | fn to_vk_bits(&self) -> i32 {
FILE: desktop/src/cef/input/state.rs
type InputState (line 11) | pub(crate) struct InputState {
method modifiers_changed (line 18) | pub(crate) fn modifiers_changed(&mut self, modifiers: &ModifiersState) {
method modifiers_apply_key_event (line 22) | pub(crate) fn modifiers_apply_key_event(&mut self, key: &Key, state: &...
method cursor_move (line 34) | pub(crate) fn cursor_move(&mut self, position: &PhysicalPosition<f64>)...
method mouse_input (line 43) | pub(crate) fn mouse_input(&mut self, button: &MouseButton, state: &Ele...
method cef_modifiers (line 48) | pub(crate) fn cef_modifiers(&self, location: &KeyLocation, is_repeat: ...
method cef_mouse_modifiers (line 52) | pub(crate) fn cef_mouse_modifiers(&self) -> CefModifiers {
method from (line 63) | fn from(val: &InputState) -> Self {
method from (line 72) | fn from(val: &mut InputState) -> Self {
type MousePosition (line 82) | pub(crate) struct MousePosition {
method from (line 87) | fn from(position: &PhysicalPosition<f64>) -> Self {
type MouseState (line 96) | pub(crate) struct MouseState {
method update (line 102) | pub(crate) fn update(&mut self, button: &MouseButton, state: &ElementS...
type ClickTracker (line 121) | struct ClickTracker {
method input (line 127) | fn input(&mut self, button: &MouseButton, state: &ElementState, positi...
type ClickCount (line 186) | pub(crate) enum ClickCount {
function from (line 193) | fn from(count: ClickCount) -> i32 {
type ClickRecord (line 203) | struct ClickRecord {
method default (line 211) | fn default() -> Self {
type CefModifiers (line 221) | pub(crate) struct CefModifiers(cef_event_flags_t);
method from (line 58) | fn from(val: InputState) -> Self {
method new (line 223) | fn new(input_state: &InputState, location: &KeyLocation, is_repeat: bo...
constant PINCH_MODIFIERS (line 263) | pub(super) const PINCH_MODIFIERS: Self = Self(cef_event_flags_t(
function from (line 269) | fn from(val: CefModifiers) -> Self {
FILE: desktop/src/cef/internal/browser_process_app.rs
type BrowserProcessAppImpl (line 12) | pub(crate) struct BrowserProcessAppImpl<H: CefEventHandler> {
function new (line 17) | pub(crate) fn new(event_handler: H) -> Self {
method browser_process_handler (line 26) | fn browser_process_handler(&self) -> Option<BrowserProcessHandler> {
method on_register_custom_schemes (line 30) | fn on_register_custom_schemes(&self, registrar: Option<&mut SchemeRegist...
method on_before_command_line_processing (line 34) | fn on_before_command_line_processing(&self, _process_type: Option<&cef::...
method get_raw (line 115) | fn get_raw(&self) -> *mut _cef_app_t {
method clone (line 121) | fn clone(&self) -> Self {
method as_base (line 133) | fn as_base(&self) -> &cef_base_ref_counted_t {
method wrap_rc (line 141) | fn wrap_rc(&mut self, object: *mut RcImpl<_cef_app_t, Self>) {
FILE: desktop/src/cef/internal/browser_process_client.rs
type BrowserProcessClientImpl (line 14) | pub(crate) struct BrowserProcessClientImpl<H: CefEventHandler> {
function new (line 22) | pub(crate) fn new(event_handler: &H) -> Self {
method on_process_message_received (line 34) | fn on_process_message_received(
method load_handler (line 60) | fn load_handler(&self) -> Option<cef::LoadHandler> {
method render_handler (line 64) | fn render_handler(&self) -> Option<RenderHandler> {
method life_span_handler (line 68) | fn life_span_handler(&self) -> Option<cef::LifeSpanHandler> {
method display_handler (line 72) | fn display_handler(&self) -> Option<cef::DisplayHandler> {
method context_menu_handler (line 76) | fn context_menu_handler(&self) -> Option<cef::ContextMenuHandler> {
method get_raw (line 80) | fn get_raw(&self) -> *mut _cef_client_t {
method clone (line 86) | fn clone(&self) -> Self {
method as_base (line 101) | fn as_base(&self) -> &cef_base_ref_counted_t {
method wrap_rc (line 109) | fn wrap_rc(&mut self, object: *mut RcImpl<_cef_client_t, Self>) {
FILE: desktop/src/cef/internal/browser_process_handler.rs
type BrowserProcessHandlerImpl (line 9) | pub(crate) struct BrowserProcessHandlerImpl<H: CefEventHandler> {
function new (line 14) | pub(crate) fn new(event_handler: H) -> Self {
method on_schedule_message_pump_work (line 23) | fn on_schedule_message_pump_work(&self, delay_ms: i64) {
method on_already_running_app_relaunch (line 27) | fn on_already_running_app_relaunch(&self, _command_line: Option<&mut cef...
method get_raw (line 31) | fn get_raw(&self) -> *mut _cef_browser_process_handler_t {
method clone (line 37) | fn clone(&self) -> Self {
method as_base (line 49) | fn as_base(&self) -> &cef_base_ref_counted_t {
method wrap_rc (line 57) | fn wrap_rc(&mut self, object: *mut RcImpl<_cef_browser_process_handler_t...
FILE: desktop/src/cef/internal/context_menu_handler.rs
type ContextMenuHandlerImpl (line 5) | pub(crate) struct ContextMenuHandlerImpl {
method new (line 9) | pub(crate) fn new() -> Self {
method run_context_menu (line 15) | fn run_context_menu(
method run_quick_menu (line 27) | fn run_quick_menu(
method get_raw (line 40) | fn get_raw(&self) -> *mut _cef_context_menu_handler_t {
method clone (line 46) | fn clone(&self) -> Self {
method as_base (line 55) | fn as_base(&self) -> &cef_base_ref_counted_t {
method wrap_rc (line 63) | fn wrap_rc(&mut self, object: *mut RcImpl<_cef_context_menu_handler_t, S...
FILE: desktop/src/cef/internal/display_handler.rs
type DisplayHandlerImpl (line 8) | pub(crate) struct DisplayHandlerImpl<H: CefEventHandler> {
function new (line 14) | pub fn new(event_handler: H) -> Self {
type CefCursorHandle (line 23) | type CefCursorHandle = cef::CursorHandle;
type CefCursorHandle (line 25) | type CefCursorHandle = *mut u8;
method on_cursor_change (line 28) | fn on_cursor_change(&self, _browser: Option<&mut cef::Browser>, _cursor:...
method on_console_message (line 105) | fn on_console_message(&self, _browser: Option<&mut cef::Browser>, level:...
method get_raw (line 121) | fn get_raw(&self) -> *mut _cef_display_handler_t {
method clone (line 127) | fn clone(&self) -> Self {
method as_base (line 139) | fn as_base(&self) -> &cef_base_ref_counted_t {
method wrap_rc (line 147) | fn wrap_rc(&mut self, object: *mut RcImpl<_cef_display_handler_t, Self>) {
FILE: desktop/src/cef/internal/life_span_handler.rs
type LifeSpanHandlerImpl (line 5) | pub(crate) struct LifeSpanHandlerImpl {
method new (line 9) | pub(crate) fn new() -> Self {
method on_before_popup (line 15) | fn on_before_popup(
method get_raw (line 38) | fn get_raw(&self) -> *mut _cef_life_span_handler_t {
method clone (line 44) | fn clone(&self) -> Self {
method as_base (line 53) | fn as_base(&self) -> &cef_base_ref_counted_t {
method wrap_rc (line 61) | fn wrap_rc(&mut self, object: *mut RcImpl<_cef_life_span_handler_t, Self...
FILE: desktop/src/cef/internal/load_handler.rs
type LoadHandlerImpl (line 7) | pub(crate) struct LoadHandlerImpl<H: CefEventHandler> {
function new (line 12) | pub(crate) fn new(event_handler: H) -> Self {
method on_loading_state_change (line 21) | fn on_loading_state_change(&self, browser: Option<&mut cef::Browser>, is...
method get_raw (line 31) | fn get_raw(&self) -> *mut _cef_load_handler_t {
method clone (line 37) | fn clone(&self) -> Self {
method as_base (line 49) | fn as_base(&self) -> &cef_base_ref_counted_t {
method wrap_rc (line 57) | fn wrap_rc(&mut self, object: *mut RcImpl<_cef_load_handler_t, Self>) {
FILE: desktop/src/cef/internal/render_handler.rs
type RenderHandlerImpl (line 8) | pub(crate) struct RenderHandlerImpl<H: CefEventHandler> {
function new (line 13) | pub(crate) fn new(event_handler: H) -> Self {
method view_rect (line 22) | fn view_rect(&self, _browser: Option<&mut Browser>, rect: Option<&mut Re...
method on_paint (line 34) | fn on_paint(&self, _browser: Option<&mut Browser>, _type_: PaintElementT...
method on_accelerated_paint (line 43) | fn on_accelerated_paint(&self, _browser: Option<&mut Browser>, type_: Pa...
method get_raw (line 59) | fn get_raw(&self) -> *mut _cef_render_handler_t {
method clone (line 65) | fn clone(&self) -> Self {
method as_base (line 77) | fn as_base(&self) -> &cef_base_ref_counted_t {
method wrap_rc (line 85) | fn wrap_rc(&mut self, object: *mut RcImpl<_cef_render_handler_t, Self>) {
FILE: desktop/src/cef/internal/render_process_app.rs
type RenderProcessAppImpl (line 9) | pub(crate) struct RenderProcessAppImpl<H: CefEventHandler> {
function app (line 14) | pub(crate) fn app() -> App {
method on_register_custom_schemes (line 23) | fn on_register_custom_schemes(&self, registrar: Option<&mut SchemeRegist...
method render_process_handler (line 27) | fn render_process_handler(&self) -> Option<RenderProcessHandler> {
method get_raw (line 31) | fn get_raw(&self) -> *mut _cef_app_t {
method clone (line 37) | fn clone(&self) -> Self {
method as_base (line 49) | fn as_base(&self) -> &cef_base_ref_counted_t {
method wrap_rc (line 57) | fn wrap_rc(&mut self, object: *mut RcImpl<_cef_app_t, Self>) {
FILE: desktop/src/cef/internal/render_process_handler.rs
type RenderProcessHandlerImpl (line 9) | pub(crate) struct RenderProcessHandlerImpl {
method new (line 13) | pub(crate) fn new() -> Self {
method on_process_message_received (line 19) | fn on_process_message_received(
method on_context_created (line 78) | fn on_context_created(&self, _browser: Option<&mut cef::Browser>, _frame...
method get_raw (line 105) | fn get_raw(&self) -> *mut _cef_render_process_handler_t {
method clone (line 111) | fn clone(&self) -> Self {
method as_base (line 120) | fn as_base(&self) -> &cef_base_ref_counted_t {
method wrap_rc (line 128) | fn wrap_rc(&mut self, object: *mut RcImpl<_cef_render_process_handler_t,...
FILE: desktop/src/cef/internal/render_process_v8_handler.rs
type RenderProcessV8HandlerImpl (line 5) | pub struct RenderProcessV8HandlerImpl {
method new (line 9) | pub(crate) fn new() -> Self {
method execute (line 15) | fn execute(
method get_raw (line 60) | fn get_raw(&self) -> *mut cef::sys::_cef_v8_handler_t {
method clone (line 66) | fn clone(&self) -> Self {
method as_base (line 75) | fn as_base(&self) -> &cef::sys::cef_base_ref_counted_t {
method wrap_rc (line 83) | fn wrap_rc(&mut self, object: *mut cef::rc::RcImpl<cef::sys::_cef_v8_han...
FILE: desktop/src/cef/internal/resource_handler.rs
type ResourceHandlerImpl (line 10) | pub(crate) struct ResourceHandlerImpl {
method new (line 17) | pub fn new(resource: Option<Resource>) -> Self {
method open (line 35) | fn open(&self, _request: Option<&mut Request>, handle_request: Option<&m...
method response_headers (line 42) | fn response_headers(&self, response: Option<&mut Response>, response_len...
method read (line 62) | fn read(&self, data_out: *mut u8, bytes_to_read: c_int, bytes_read: Opti...
method get_raw (line 78) | fn get_raw(&self) -> *mut _cef_resource_handler_t {
method clone (line 84) | fn clone(&self) -> Self {
method as_base (line 97) | fn as_base(&self) -> &cef_base_ref_counted_t {
method wrap_rc (line 105) | fn wrap_rc(&mut self, object: *mut RcImpl<_cef_resource_handler_t, Self>) {
FILE: desktop/src/cef/internal/scheme_handler_factory.rs
type SchemeHandlerFactoryImpl (line 9) | pub(crate) struct SchemeHandlerFactoryImpl<H: CefEventHandler> {
function new (line 14) | pub(crate) fn new(event_handler: H) -> Self {
function register_schemes (line 21) | pub(crate) fn register_schemes(registrar: Option<&mut SchemeRegistrar>) {
method create (line 34) | fn create(&self, _browser: Option<&mut Browser>, _frame: Option<&mut Fra...
method get_raw (line 45) | fn get_raw(&self) -> *mut _cef_scheme_handler_factory_t {
method clone (line 51) | fn clone(&self) -> Self {
method as_base (line 63) | fn as_base(&self) -> &cef_base_ref_counted_t {
method wrap_rc (line 71) | fn wrap_rc(&mut self, object: *mut RcImpl<_cef_scheme_handler_factory_t,...
FILE: desktop/src/cef/internal/task.rs
type ClosureTask (line 7) | pub struct ClosureTask<F> {
function new (line 13) | pub fn new(closure: F) -> Self {
method execute (line 22) | fn execute(&self) {
method get_raw (line 28) | fn get_raw(&self) -> *mut _cef_task_t {
method clone (line 34) | fn clone(&self) -> Self {
method as_base (line 49) | fn as_base(&self) -> &cef_base_ref_counted_t {
method wrap_rc (line 58) | fn wrap_rc(&mut self, object: *mut RcImpl<_cef_task_t, Self>) {
FILE: desktop/src/cef/ipc.rs
type MessageType (line 3) | pub(crate) enum MessageType {
type Error (line 27) | type Error = ();
method try_from (line 28) | fn try_from(value: String) -> Result<Self, Self::Error> {
type MessageInfo (line 38) | pub(crate) struct MessageInfo {
method from (line 9) | fn from(val: MessageType) -> Self {
type SendMessage (line 43) | pub(crate) trait SendMessage {
method send_message (line 44) | fn send_message(&self, message_type: MessageType, message: &[u8]);
method send_message (line 47) | fn send_message(&self, message_type: MessageType, message: &[u8]) {
method send_message (line 57) | fn send_message(&self, message_type: MessageType, message: &[u8]) {
method send_message (line 67) | fn send_message(&self, message_type: MessageType, message: &[u8]) {
type UnpackedMessage (line 82) | pub(crate) struct UnpackedMessage<'a> {
type Sealed (line 87) | trait Sealed {}
type UnpackMessage (line 90) | pub(crate) trait UnpackMessage: Sealed {
method unpack (line 95) | unsafe fn unpack(&self) -> Option<UnpackedMessage<'_>>;
method unpack (line 98) | unsafe fn unpack(&self) -> Option<UnpackedMessage<'_>> {
FILE: desktop/src/cef/platform.rs
function should_enable_hardware_acceleration (line 2) | pub fn should_enable_hardware_acceleration() -> bool {
FILE: desktop/src/cef/utility.rs
function pointer_to_string (line 1) | pub unsafe fn pointer_to_string(pointer: *mut cef::sys::_cef_string_utf1...
FILE: desktop/src/cli.rs
type Cli (line 3) | pub struct Cli {
FILE: desktop/src/consts.rs
constant APP_NAME (line 1) | pub(crate) const APP_NAME: &str = "Graphite";
constant APP_ID (line 3) | pub(crate) const APP_ID: &str = "art.graphite.Graphite";
constant APP_DIRECTORY_NAME (line 6) | pub(crate) const APP_DIRECTORY_NAME: &str = "graphite";
constant APP_DIRECTORY_NAME (line 8) | pub(crate) const APP_DIRECTORY_NAME: &str = "Graphite";
constant APP_LOCK_FILE_NAME (line 9) | pub(crate) const APP_LOCK_FILE_NAME: &str = "instance.lock";
constant APP_STATE_FILE_NAME (line 10) | pub(crate) const APP_STATE_FILE_NAME: &str = "state.ron";
constant APP_PREFERENCES_FILE_NAME (line 11) | pub(crate) const APP_PREFERENCES_FILE_NAME: &str = "preferences.ron";
constant APP_DOCUMENTS_DIRECTORY_NAME (line 12) | pub(crate) const APP_DOCUMENTS_DIRECTORY_NAME: &str = "documents";
constant CEF_WINDOWLESS_FRAME_RATE (line 15) | pub(crate) const CEF_WINDOWLESS_FRAME_RATE: i32 = 60;
constant CEF_MESSAGE_LOOP_MAX_ITERATIONS (line 16) | pub(crate) const CEF_MESSAGE_LOOP_MAX_ITERATIONS: usize = 10;
FILE: desktop/src/dirs.rs
function ensure_dir_exists (line 6) | pub(crate) fn ensure_dir_exists(path: &PathBuf) {
function app_data_dir (line 12) | pub(crate) fn app_data_dir() -> PathBuf {
function app_autosave_documents_dir (line 18) | pub(crate) fn app_autosave_documents_dir() -> PathBuf {
FILE: desktop/src/event.rs
type AppEvent (line 4) | pub(crate) enum AppEvent {
type AppEventScheduler (line 19) | pub(crate) struct AppEventScheduler {
method schedule (line 25) | pub(crate) fn schedule(&self, event: AppEvent) {
type CreateAppEventSchedulerEventLoopExt (line 31) | pub(crate) trait CreateAppEventSchedulerEventLoopExt {
method create_app_event_scheduler (line 32) | fn create_app_event_scheduler(&self, sender: std::sync::mpsc::Sender<A...
method create_app_event_scheduler (line 36) | fn create_app_event_scheduler(&self, sender: std::sync::mpsc::Sender<A...
FILE: desktop/src/gpu_context.rs
function create_wgpu_context (line 3) | pub(super) async fn create_wgpu_context() -> WgpuContext {
FILE: desktop/src/lib.rs
function start (line 26) | pub fn start() {
function start_helper (line 138) | pub fn start_helper() {
FILE: desktop/src/main.rs
function main (line 1) | fn main() {
FILE: desktop/src/persist.rs
type PersistentData (line 4) | pub(crate) struct PersistentData {
method write_document (line 12) | pub(crate) fn write_document(&mut self, id: DocumentId, document: Docu...
method delete_document (line 20) | pub(crate) fn delete_document(&mut self, id: &DocumentId) {
method current_document_id (line 28) | pub(crate) fn current_document_id(&self) -> Option<DocumentId> {
method current_document (line 35) | pub(crate) fn current_document(&self) -> Option<(DocumentId, Document)> {
method documents_before_current (line 40) | pub(crate) fn documents_before_current(&self) -> Vec<(DocumentId, Docu...
method documents_after_current (line 52) | pub(crate) fn documents_after_current(&self) -> Vec<(DocumentId, Docum...
method set_current_document (line 65) | pub(crate) fn set_current_document(&mut self, id: DocumentId) {
method set_document_order (line 70) | pub(crate) fn set_document_order(&mut self, order: Vec<DocumentId>) {
method flush (line 75) | fn flush(&self) {
method load_from_disk (line 88) | pub(crate) fn load_from_disk(&mut self) {
method state_file_path (line 111) | fn state_file_path() -> std::path::PathBuf {
type DocumentStore (line 119) | struct DocumentStore(Vec<DocumentInfo>);
method write (line 121) | fn write(&mut self, id: DocumentId, document: Document) {
method delete (line 133) | fn delete(&mut self, id: &DocumentId) {
method read (line 140) | fn read(&self, id: &DocumentId) -> Option<Document> {
method force_order (line 151) | fn force_order(&mut self, desired_order: &Vec<DocumentId>) {
method document_ids (line 165) | fn document_ids(&self) -> Vec<DocumentId> {
method document_path (line 169) | fn document_path(id: &DocumentId) -> std::path::PathBuf {
type DocumentInfo (line 177) | struct DocumentInfo {
method new (line 184) | fn new(id: DocumentId, Document { name, path, is_saved, .. }: &Documen...
FILE: desktop/src/preferences.rs
function write (line 3) | pub(crate) fn write(preferences: Preferences) {
function read (line 13) | pub(crate) fn read() -> Preferences {
function modify (line 23) | pub(crate) fn modify(f: impl FnOnce(&mut Preferences)) {
function file_path (line 29) | fn file_path() -> std::path::PathBuf {
FILE: desktop/src/render/frame_buffer_ref.rs
type FrameBufferRef (line 3) | pub(crate) struct FrameBufferRef<'a> {
function new (line 9) | pub(crate) fn new(buffer: &'a [u8], width: usize, height: usize) -> Resu...
function buffer (line 14) | pub(crate) fn buffer(&self) -> &[u8] {
function width (line 18) | pub(crate) fn width(&self) -> usize {
function height (line 22) | pub(crate) fn height(&self) -> usize {
function validate_size (line 26) | fn validate_size(&self) -> Result<(), FrameBufferError> {
function fmt (line 40) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
type FrameBufferError (line 50) | pub(crate) enum FrameBufferError {
FILE: desktop/src/render/state.rs
type RenderState (line 9) | pub(crate) struct RenderState {
method new (line 31) | pub(crate) fn new(window: &Window, context: WgpuContext, present_mode:...
method resize (line 192) | pub(crate) fn resize(&mut self, width: u32, height: u32) {
method bind_viewport_texture (line 208) | pub(crate) fn bind_viewport_texture(&mut self, viewport_texture: std::...
method bind_ui_texture (line 213) | pub(crate) fn bind_ui_texture(&mut self, bind_ui_texture: wgpu::Textur...
method set_viewport_scale (line 218) | pub(crate) fn set_viewport_scale(&mut self, scale: [f32; 2]) {
method set_viewport_offset (line 223) | pub(crate) fn set_viewport_offset(&mut self, offset: [f32; 2]) {
method set_overlays_scene (line 228) | pub(crate) fn set_overlays_scene(&mut self, scene: vello::Scene) {
method render_overlays (line 233) | fn render_overlays(&mut self, scene: vello::Scene) {
method render (line 247) | pub(crate) fn render(&mut self, window: &Window) -> Result<(), RenderE...
method update_bindgroup (line 317) | fn update_bindgroup(&mut self) {
type RenderError (line 354) | pub(crate) enum RenderError {
type Constants (line 361) | struct Constants {
FILE: desktop/src/window.rs
type NativeWindow (line 11) | pub(crate) trait NativeWindow {
method init (line 12) | fn init() {}
method configure (line 13) | fn configure(attributes: WindowAttributes, event_loop: &dyn ActiveEven...
method new (line 14) | fn new(window: &dyn WinitWindow, app_event_scheduler: AppEventSchedule...
method can_render (line 15) | fn can_render(&self) -> bool {
method update_menu (line 18) | fn update_menu(&self, _entries: Vec<MenuItem>) {}
method hide (line 19) | fn hide(&self) {}
method hide_others (line 20) | fn hide_others(&self) {}
method show_all (line 21) | fn show_all(&self) {}
type Window (line 39) | pub(crate) struct Window {
method init (line 54) | pub(crate) fn init() {
method new (line 58) | pub(crate) fn new(event_loop: &dyn ActiveEventLoop, app_event_schedule...
method show (line 80) | pub(crate) fn show(&self) {
method request_redraw (line 85) | pub(crate) fn request_redraw(&self) {
method create_surface (line 89) | pub(crate) fn create_surface(&self, instance: Arc<wgpu::Instance>) -> ...
method pre_present_notify (line 93) | pub(crate) fn pre_present_notify(&self) {
method can_render (line 97) | pub(crate) fn can_render(&self) -> bool {
method surface_size (line 101) | pub(crate) fn surface_size(&self) -> winit::dpi::PhysicalSize<u32> {
method scale_factor (line 105) | pub(crate) fn scale_factor(&self) -> f64 {
method minimize (line 109) | pub(crate) fn minimize(&self) {
method toggle_maximize (line 113) | pub(crate) fn toggle_maximize(&self) {
method is_maximized (line 120) | pub(crate) fn is_maximized(&self) -> bool {
method toggle_fullscreen (line 124) | pub(crate) fn toggle_fullscreen(&mut self) {
method is_fullscreen (line 132) | pub(crate) fn is_fullscreen(&self) -> bool {
method start_drag (line 136) | pub(crate) fn start_drag(&self) {
method hide (line 143) | pub(crate) fn hide(&self) {
method hide_others (line 147) | pub(crate) fn hide_others(&self) {
method show_all (line 151) | pub(crate) fn show_all(&self) {
method set_cursor (line 155) | pub(crate) fn set_cursor(&mut self, event_loop: &dyn ActiveEventLoop, ...
method start_pointer_lock (line 181) | pub(crate) fn start_pointer_lock(&self) {
method end_pointer_lock (line 186) | pub(crate) fn end_pointer_lock(&self) {
method update_menu (line 191) | pub(crate) fn update_menu(&self, entries: Vec<MenuItem>) {
method clipboard_read (line 195) | pub(crate) fn clipboard_read(&self) -> Option<String> {
method clipboard_write (line 209) | pub(crate) fn clipboard_write(&mut self, data: String) {
method drop (line 47) | fn drop(&mut self) {
type Cursor (line 220) | pub(crate) enum Cursor {
method from (line 226) | fn from(icon: CursorIcon) -> Self {
method from (line 231) | fn from(custom: CustomCursorSource) -> Self {
FILE: desktop/src/window/linux.rs
type NativeWindowImpl (line 10) | pub(super) struct NativeWindowImpl {}
method configure (line 13) | fn configure(attributes: WindowAttributes, event_loop: &dyn ActiveEven...
method new (line 23) | fn new(_window: &dyn Window, _app_event_scheduler: AppEventScheduler) ...
FILE: desktop/src/window/mac.rs
type NativeWindowImpl (line 11) | pub(super) struct NativeWindowImpl {
method init (line 16) | fn init() {
method configure (line 20) | fn configure(attributes: WindowAttributes, _event_loop: &dyn ActiveEve...
method new (line 28) | fn new(_window: &dyn Window, app_event_scheduler: AppEventScheduler) -...
method update_menu (line 34) | fn update_menu(&self, entries: Vec<MenuItem>) {
method hide (line 38) | fn hide(&self) {
method hide_others (line 42) | fn hide_others(&self) {
method show_all (line 46) | fn show_all(&self) {
FILE: desktop/src/window/mac/app.rs
function instance (line 23) | fn instance() -> objc2::rc::Retained<NSApplication> {
function init (line 27) | pub(super) fn init() {
function hide (line 31) | pub(super) fn hide() {
function hide_others (line 35) | pub(super) fn hide_others() {
function show_all (line 39) | pub(super) fn show_all() {
FILE: desktop/src/window/mac/menu.rs
type Menu (line 8) | pub(super) struct Menu {
method new (line 13) | pub(super) fn new(event_scheduler: AppEventScheduler) -> Self {
method update (line 40) | pub(super) fn update(&self, entries: Vec<WrapperMenuItem>) {
function menu_items_from_wrapper (line 64) | fn menu_items_from_wrapper(entries: Vec<WrapperMenuItem>) -> Vec<MenuIte...
function menu_item_kind_to_dyn (line 93) | fn menu_item_kind_to_dyn(item: &MenuItemKind) -> &dyn IsMenuItem {
function replace_children (line 103) | fn replace_children<'a, T: Into<MenuContainer<'a>>>(menu: T, new_items: ...
type MenuContainer (line 113) | enum MenuContainer<'a> {
function items (line 118) | fn items(&self) -> Vec<MenuItemKind> {
function remove (line 124) | fn remove(&self, item: &dyn IsMenuItem) -> Result<()> {
function append_items (line 130) | fn append_items(&self, items: &[&dyn IsMenuItem]) -> Result<()> {
function from (line 138) | fn from(menu: &'a MudaMenu) -> Self {
function from (line 143) | fn from(submenu: &'a Submenu) -> Self {
FILE: desktop/src/window/win.rs
type NativeWindowImpl (line 11) | pub(super) struct NativeWindowImpl {
method init (line 16) | fn init() {
method configure (line 30) | fn configure(attributes: WindowAttributes, _event_loop: &dyn ActiveEve...
method new (line 34) | fn new(window: &dyn Window, _app_event_scheduler: AppEventScheduler) -...
method can_render (line 39) | fn can_render(&self) -> bool {
method drop (line 45) | fn drop(&mut self) {
FILE: desktop/src/window/win/native_handle.rs
type NativeWindowState (line 26) | struct NativeWindowState {
type NativeWindowHandle (line 32) | pub(super) struct NativeWindowHandle {
method new (line 39) | pub(super) fn new(window: &dyn Window) -> NativeWindowHandle {
method destroy (line 126) | pub(super) fn destroy(&self) {
method can_render (line 140) | pub(super) fn can_render(&self) -> bool {
function find_by_main (line 173) | pub(super) fn find_by_main(main: HWND) -> Option<NativeWindowHandle> {
function remove_by_main (line 176) | pub(super) fn remove_by_main(main: HWND) {
function insert (line 181) | pub(super) fn insert(handle: &NativeWindowHandle) {
constant HELPER_CLASS_NAME (line 188) | const HELPER_CLASS_NAME: &str = "Helper\0";
function ensure_helper_class (line 191) | unsafe fn ensure_helper_class() {
function main_window_handle_message (line 211) | unsafe extern "system" fn main_window_handle_message(hwnd: HWND, msg: u3...
function helper_window_handle_message (line 268) | unsafe extern "system" fn helper_window_handle_message(hwnd: HWND, msg: ...
constant RESIZE_BAND_THICKNESS (line 316) | const RESIZE_BAND_THICKNESS: i32 = 8;
function position_helper (line 319) | unsafe fn position_helper(main: HWND, helper: HWND) {
function calculate_hit (line 331) | unsafe fn calculate_hit(helper: HWND, lparam: LPARAM) -> u32 {
function calculate_resize_direction (line 356) | unsafe fn calculate_resize_direction(helper: HWND, lparam: LPARAM) -> Op...
function is_effectively_fullscreen (line 372) | fn is_effectively_fullscreen(rect: RECT) -> bool {
FILE: desktop/wrapper/src/handle_desktop_wrapper_message.rs
function handle_desktop_wrapper_message (line 7) | pub(super) fn handle_desktop_wrapper_message(dispatcher: &mut DesktopWra...
FILE: desktop/wrapper/src/intercept_editor_message.rs
function intercept_editor_message (line 4) | pub(super) fn intercept_editor_message(_dispatcher: &mut DesktopWrapperM...
FILE: desktop/wrapper/src/intercept_frontend_message.rs
function intercept_frontend_message (line 9) | pub(super) fn intercept_frontend_message(dispatcher: &mut DesktopWrapper...
FILE: desktop/wrapper/src/lib.rs
type DesktopWrapper (line 21) | pub struct DesktopWrapper {
method new (line 26) | pub fn new(uuid_random_seed: u64) -> Self {
method init (line 40) | pub fn init(&self, wgpu_context: WgpuContext) {
method dispatch (line 45) | pub fn dispatch(&mut self, message: DesktopWrapperMessage) -> Vec<Desk...
method execute_node_graph (line 51) | pub async fn execute_node_graph() -> NodeGraphExecutionResult {
type NodeGraphExecutionResult (line 60) | pub enum NodeGraphExecutionResult {
function deserialize_editor_message (line 65) | pub fn deserialize_editor_message(data: &[u8]) -> Option<DesktopWrapperM...
function serialize_frontend_messages (line 77) | pub fn serialize_frontend_messages(messages: Vec<FrontendMessage>) -> Op...
FILE: desktop/wrapper/src/message_dispatcher.rs
type DesktopWrapperMessageDispatcher (line 9) | pub(crate) struct DesktopWrapperMessageDispatcher<'a> {
function new (line 17) | pub(crate) fn new(editor: &'a mut Editor) -> Self {
function execute (line 26) | pub(crate) fn execute(mut self) -> Vec<DesktopFrontendMessage> {
function queue_desktop_wrapper_message (line 31) | pub(crate) fn queue_desktop_wrapper_message(&mut self, message: DesktopW...
function queue_editor_message (line 35) | pub(super) fn queue_editor_message<T: Into<EditorMessage>>(&mut self, me...
function respond (line 41) | pub(super) fn respond(&mut self, response: DesktopFrontendMessage) {
function poll_node_graph_evaluation (line 45) | pub(super) fn poll_node_graph_evaluation(&mut self) {
function process_queue (line 57) | fn process_queue(&mut self) {
FILE: desktop/wrapper/src/messages.rs
type DesktopFrontendMessage (line 12) | pub enum DesktopFrontendMessage {
type DesktopWrapperMessage (line 81) | pub enum DesktopWrapperMessage {
type Document (line 136) | pub struct Document {
type FileFilter (line 143) | pub struct FileFilter {
type OpenFileDialogContext (line 148) | pub enum OpenFileDialogContext {
type SaveFileDialogContext (line 153) | pub enum SaveFileDialogContext {
type MenuItem (line 158) | pub enum MenuItem {
type Shortcut (line 182) | pub struct Shortcut {
FILE: desktop/wrapper/src/utils.rs
function convert_menu_bar_layout_to_menu_items (line 13) | pub(crate) fn convert_menu_bar_layout_to_menu_items(Layout(layout): &Lay...
function parse_item_path (line 39) | pub(crate) fn parse_item_path(id: String) -> Option<EditorMessage> {
function item_path_to_string (line 61) | fn item_path_to_string(widget_id: u64, path: Vec<String>) -> String {
function convert_menu_bar_layout_to_menu_item (line 66) | fn convert_menu_bar_layout_to_menu_item(entry: &MenuListEntry, root_widg...
function convert_menu_bar_entry_children_to_menu_items (line 116) | fn convert_menu_bar_entry_children_to_menu_items(children: &[Vec<MenuLis...
function convert_labeled_keys_to_shortcut (line 129) | fn convert_labeled_keys_to_shortcut(labeled_keys: &Vec<LabeledKeyOrMouse...
FILE: editor/build.rs
constant GRAPHITE_RELEASE_SERIES (line 4) | const GRAPHITE_RELEASE_SERIES: &str = "Alpha 4";
function main (line 6) | fn main() {
function env_or_else (line 36) | fn env_or_else(key: &str, fallback: impl FnOnce() -> String) -> String {
function git_or_unknown (line 44) | fn git_or_unknown(args: &[&str]) -> String {
function git (line 50) | fn git(args: &[&str]) -> Option<String> {
FILE: editor/src/application.rs
type Editor (line 6) | pub struct Editor {
method new (line 11) | pub fn new(environment: Environment, uuid_random_seed: u64) -> Self {
method new_local_executor (line 19) | pub(crate) fn new_local_executor() -> (Self, crate::node_graph_executo...
method handle_message (line 31) | pub fn handle_message<T: Into<Message>>(&mut self, message: T) -> Vec<...
method poll_node_graph_evaluation (line 37) | pub fn poll_node_graph_evaluation(&mut self, responses: &mut VecDeque<...
method environment (line 45) | pub fn environment() -> &'static Environment {
method environment (line 50) | pub fn environment() -> &'static Environment {
type Environment (line 59) | pub struct Environment {
method is_desktop (line 75) | pub fn is_desktop(&self) -> bool {
method is_web (line 78) | pub fn is_web(&self) -> bool {
method is_windows (line 81) | pub fn is_windows(&self) -> bool {
method is_mac (line 84) | pub fn is_mac(&self) -> bool {
method is_linux (line 87) | pub fn is_linux(&self) -> bool {
type Platform (line 64) | pub enum Platform {
type Host (line 69) | pub enum Host {
constant GRAPHITE_RELEASE_SERIES (line 92) | pub const GRAPHITE_RELEASE_SERIES: &str = env!("GRAPHITE_RELEASE_SERIES");
constant GRAPHITE_GIT_COMMIT_BRANCH (line 93) | pub const GRAPHITE_GIT_COMMIT_BRANCH: Option<&str> = option_env!("GRAPHI...
constant GRAPHITE_GIT_COMMIT_HASH (line 94) | pub const GRAPHITE_GIT_COMMIT_HASH: &str = env!("GRAPHITE_GIT_COMMIT_HAS...
constant GRAPHITE_GIT_COMMIT_DATE (line 95) | pub const GRAPHITE_GIT_COMMIT_DATE: &str = env!("GRAPHITE_GIT_COMMIT_DAT...
function commit_info_localized (line 97) | pub fn commit_info_localized(localized_commit_date: &str) -> String {
FILE: editor/src/consts.rs
constant GRID_SIZE (line 2) | pub const GRID_SIZE: u32 = 24;
constant EXPORTS_TO_TOP_EDGE_PIXEL_GAP (line 3) | pub const EXPORTS_TO_TOP_EDGE_PIXEL_GAP: u32 = 72;
constant EXPORTS_TO_RIGHT_EDGE_PIXEL_GAP (line 4) | pub const EXPORTS_TO_RIGHT_EDGE_PIXEL_GAP: u32 = 120;
constant IMPORTS_TO_TOP_EDGE_PIXEL_GAP (line 5) | pub const IMPORTS_TO_TOP_EDGE_PIXEL_GAP: u32 = 72;
constant IMPORTS_TO_LEFT_EDGE_PIXEL_GAP (line 6) | pub const IMPORTS_TO_LEFT_EDGE_PIXEL_GAP: u32 = 120;
constant VIEWPORT_ZOOM_WHEEL_RATE (line 9) | pub const VIEWPORT_ZOOM_WHEEL_RATE: f64 = (1. / 600.) * 3.;
constant VIEWPORT_ZOOM_MOUSE_RATE (line 10) | pub const VIEWPORT_ZOOM_MOUSE_RATE: f64 = 1. / 400.;
constant VIEWPORT_ZOOM_SCALE_MIN (line 11) | pub const VIEWPORT_ZOOM_SCALE_MIN: f64 = 0.000_000_1;
constant VIEWPORT_ZOOM_SCALE_MAX (line 12) | pub const VIEWPORT_ZOOM_SCALE_MAX: f64 = 10_000.;
constant VIEWPORT_ZOOM_MIN_FRACTION_COVER (line 13) | pub const VIEWPORT_ZOOM_MIN_FRACTION_COVER: f64 = 0.01;
constant VIEWPORT_ZOOM_LEVELS (line 14) | pub const VIEWPORT_ZOOM_LEVELS: [f64; 74] = [
constant VIEWPORT_ZOOM_WHEEL_RATE_CHANGE (line 20) | pub const VIEWPORT_ZOOM_WHEEL_RATE_CHANGE: f64 = 3.;
constant VIEWPORT_GRID_ROUNDING_BIAS (line 23) | pub const VIEWPORT_GRID_ROUNDING_BIAS: f64 = 0.002;
constant VIEWPORT_SCROLL_RATE (line 25) | pub const VIEWPORT_SCROLL_RATE: f64 = 0.6;
constant VIEWPORT_ROTATE_SNAP_INTERVAL (line 27) | pub const VIEWPORT_ROTATE_SNAP_INTERVAL: f64 = 15.;
constant VIEWPORT_ZOOM_TO_FIT_PADDING_SCALE_FACTOR (line 29) | pub const VIEWPORT_ZOOM_TO_FIT_PADDING_SCALE_FACTOR: f64 = 0.95;
constant DRAG_BEYOND_VIEWPORT_MAX_OVEREXTENSION_PIXELS (line 31) | pub const DRAG_BEYOND_VIEWPORT_MAX_OVEREXTENSION_PIXELS: f64 = 50.;
constant DRAG_BEYOND_VIEWPORT_SPEED_FACTOR (line 32) | pub const DRAG_BEYOND_VIEWPORT_SPEED_FACTOR: f64 = 20.;
constant SNAP_POINT_TOLERANCE (line 35) | pub const SNAP_POINT_TOLERANCE: f64 = 5.;
constant MAX_ALIGNMENT_CANDIDATES (line 37) | pub const MAX_ALIGNMENT_CANDIDATES: usize = 100;
constant MAX_SNAP_CANDIDATES (line 39) | pub const MAX_SNAP_CANDIDATES: usize = 10;
constant MAX_LAYER_SNAP_POINTS (line 41) | pub const MAX_LAYER_SNAP_POINTS: usize = 100;
constant DRAG_THRESHOLD (line 43) | pub const DRAG_THRESHOLD: f64 = 1.;
constant ROTATE_INCREMENT (line 46) | pub const ROTATE_INCREMENT: f64 = 15.;
constant SCALE_INCREMENT (line 47) | pub const SCALE_INCREMENT: f64 = 0.1;
constant SLOWING_DIVISOR (line 48) | pub const SLOWING_DIVISOR: f64 = 10.;
constant NUDGE_AMOUNT (line 49) | pub const NUDGE_AMOUNT: f64 = 1.;
constant BIG_NUDGE_AMOUNT (line 50) | pub const BIG_NUDGE_AMOUNT: f64 = 10.;
constant DEFAULT_STROKE_WIDTH (line 53) | pub const DEFAULT_STROKE_WIDTH: f64 = 2.;
constant SELECTION_TOLERANCE (line 56) | pub const SELECTION_TOLERANCE: f64 = 5.;
constant DRAG_DIRECTION_MODE_DETERMINATION_THRESHOLD (line 57) | pub const DRAG_DIRECTION_MODE_DETERMINATION_THRESHOLD: f64 = 15.;
constant SELECTION_DRAG_ANGLE (line 58) | pub const SELECTION_DRAG_ANGLE: f64 = 90.;
constant LAYER_ORIGIN_CROSS_DIAMETER (line 59) | pub const LAYER_ORIGIN_CROSS_DIAMETER: f64 = 10.;
constant LAYER_ORIGIN_CROSS_THICKNESS (line 60) | pub const LAYER_ORIGIN_CROSS_THICKNESS: f64 = 1.;
constant PIVOT_CROSSHAIR_THICKNESS (line 63) | pub const PIVOT_CROSSHAIR_THICKNESS: f64 = 1.;
constant PIVOT_CROSSHAIR_LENGTH (line 64) | pub const PIVOT_CROSSHAIR_LENGTH: f64 = 9.;
constant PIVOT_DIAMETER (line 65) | pub const PIVOT_DIAMETER: f64 = 5.;
constant DOWEL_PIN_RADIUS (line 66) | pub const DOWEL_PIN_RADIUS: f64 = 4.;
constant COMPASS_ROSE_RING_INNER_DIAMETER (line 69) | pub const COMPASS_ROSE_RING_INNER_DIAMETER: f64 = 13.;
constant COMPASS_ROSE_MAIN_RING_DIAMETER (line 70) | pub const COMPASS_ROSE_MAIN_RING_DIAMETER: f64 = 15.;
constant COMPASS_ROSE_HOVER_RING_DIAMETER (line 71) | pub const COMPASS_ROSE_HOVER_RING_DIAMETER: f64 = 23.;
constant COMPASS_ROSE_ARROW_SIZE (line 72) | pub const COMPASS_ROSE_ARROW_SIZE: f64 = 5.;
constant COMPASS_ROSE_ARROW_CLICK_TARGET_ANGLE (line 74) | pub const COMPASS_ROSE_ARROW_CLICK_TARGET_ANGLE: f64 = 20.;
constant ANGLE_MEASURE_RADIUS_FACTOR (line 77) | pub const ANGLE_MEASURE_RADIUS_FACTOR: f64 = 0.04;
constant ARC_MEASURE_RADIUS_FACTOR_RANGE (line 78) | pub const ARC_MEASURE_RADIUS_FACTOR_RANGE: (f64, f64) = (0.05, 0.15);
constant RESIZE_HANDLE_SIZE (line 81) | pub const RESIZE_HANDLE_SIZE: f64 = 6.;
constant BOUNDS_SELECT_THRESHOLD (line 82) | pub const BOUNDS_SELECT_THRESHOLD: f64 = 10.;
constant BOUNDS_ROTATE_THRESHOLD (line 83) | pub const BOUNDS_ROTATE_THRESHOLD: f64 = 20.;
constant MIN_LENGTH_FOR_MIDPOINT_VISIBILITY (line 84) | pub const MIN_LENGTH_FOR_MIDPOINT_VISIBILITY: f64 = 20.;
constant MIN_LENGTH_FOR_CORNERS_VISIBILITY (line 85) | pub const MIN_LENGTH_FOR_CORNERS_VISIBILITY: f64 = 12.;
constant MIN_LENGTH_FOR_EDGE_RESIZE_PRIORITY_OVER_CORNERS (line 87) | pub const MIN_LENGTH_FOR_EDGE_RESIZE_PRIORITY_OVER_CORNERS: f64 = 10.;
constant MIN_LENGTH_FOR_RESIZE_TO_INCLUDE_INTERIOR (line 89) | pub const MIN_LENGTH_FOR_RESIZE_TO_INCLUDE_INTERIOR: f64 = 40.;
constant MAXIMUM_ALT_SCALE_FACTOR (line 94) | pub const MAXIMUM_ALT_SCALE_FACTOR: f64 = 25.;
constant MAX_LENGTH_FOR_NO_WIDTH_OR_HEIGHT (line 96) | pub const MAX_LENGTH_FOR_NO_WIDTH_OR_HEIGHT: f64 = 1e-4;
constant SKEW_TRIANGLE_SIZE (line 99) | pub const SKEW_TRIANGLE_SIZE: f64 = 7.;
constant SKEW_TRIANGLE_OFFSET (line 100) | pub const SKEW_TRIANGLE_OFFSET: f64 = 4.;
constant MIN_LENGTH_FOR_SKEW_TRIANGLE_VISIBILITY (line 101) | pub const MIN_LENGTH_FOR_SKEW_TRIANGLE_VISIBILITY: f64 = 48.;
constant MANIPULATOR_GROUP_MARKER_SIZE (line 104) | pub const MANIPULATOR_GROUP_MARKER_SIZE: f64 = 6.;
constant SELECTION_THRESHOLD (line 105) | pub const SELECTION_THRESHOLD: f64 = 10.;
constant DRILL_THROUGH_THRESHOLD (line 106) | pub const DRILL_THROUGH_THRESHOLD: f64 = 10.;
constant HIDE_HANDLE_DISTANCE (line 107) | pub const HIDE_HANDLE_DISTANCE: f64 = 3.;
constant HANDLE_ROTATE_SNAP_ANGLE (line 108) | pub const HANDLE_ROTATE_SNAP_ANGLE: f64 = 15.;
constant SEGMENT_INSERTION_DISTANCE (line 109) | pub const SEGMENT_INSERTION_DISTANCE: f64 = 5.;
constant SEGMENT_OVERLAY_SIZE (line 110) | pub const SEGMENT_OVERLAY_SIZE: f64 = 10.;
constant SEGMENT_SELECTED_THICKNESS (line 111) | pub const SEGMENT_SELECTED_THICKNESS: f64 = 3.;
constant HANDLE_LENGTH_FACTOR (line 112) | pub const HANDLE_LENGTH_FACTOR: f64 = 0.5;
constant GRADIENT_MIDPOINT_DIAMOND_RADIUS (line 115) | pub const GRADIENT_MIDPOINT_DIAMOND_RADIUS: f64 = 4.;
constant GRADIENT_MIDPOINT_MIN (line 116) | pub const GRADIENT_MIDPOINT_MIN: f64 = 0.01;
constant GRADIENT_MIDPOINT_MAX (line 117) | pub const GRADIENT_MIDPOINT_MAX: f64 = 0.99;
constant GRADIENT_STOP_MIN_VIEWPORT_GAP (line 118) | pub const GRADIENT_STOP_MIN_VIEWPORT_GAP: f64 = 10.;
constant CREATE_CURVE_THRESHOLD (line 121) | pub const CREATE_CURVE_THRESHOLD: f64 = 5.;
constant PATH_JOIN_THRESHOLD (line 124) | pub const PATH_JOIN_THRESHOLD: f64 = 5.;
constant LINE_ROTATE_SNAP_ANGLE (line 127) | pub const LINE_ROTATE_SNAP_ANGLE: f64 = 15.;
constant BRUSH_SIZE_CHANGE_KEYBOARD (line 130) | pub const BRUSH_SIZE_CHANGE_KEYBOARD: f64 = 5.;
constant DEFAULT_BRUSH_SIZE (line 131) | pub const DEFAULT_BRUSH_SIZE: f64 = 20.;
constant EYEDROPPER_PREVIEW_AREA_RESOLUTION (line 134) | pub const EYEDROPPER_PREVIEW_AREA_RESOLUTION: u32 = 11;
constant POINT_RADIUS_HANDLE_SNAP_THRESHOLD (line 137) | pub const POINT_RADIUS_HANDLE_SNAP_THRESHOLD: f64 = 8.;
constant POINT_RADIUS_HANDLE_SEGMENT_THRESHOLD (line 138) | pub const POINT_RADIUS_HANDLE_SEGMENT_THRESHOLD: f64 = 7.9;
constant NUMBER_OF_POINTS_DIAL_SPOKE_EXTENSION (line 139) | pub const NUMBER_OF_POINTS_DIAL_SPOKE_EXTENSION: f64 = 1.2;
constant NUMBER_OF_POINTS_DIAL_SPOKE_LENGTH (line 140) | pub const NUMBER_OF_POINTS_DIAL_SPOKE_LENGTH: f64 = 10.;
constant ARC_SNAP_THRESHOLD (line 141) | pub const ARC_SNAP_THRESHOLD: f64 = 5.;
constant ARC_SWEEP_GIZMO_RADIUS (line 142) | pub const ARC_SWEEP_GIZMO_RADIUS: f64 = 14.;
constant ARC_SWEEP_GIZMO_TEXT_HEIGHT (line 143) | pub const ARC_SWEEP_GIZMO_TEXT_HEIGHT: f64 = 12.;
constant GIZMO_HIDE_THRESHOLD (line 144) | pub const GIZMO_HIDE_THRESHOLD: f64 = 20.;
constant GRID_ROW_COLUMN_GIZMO_OFFSET (line 145) | pub const GRID_ROW_COLUMN_GIZMO_OFFSET: f64 = 15.;
constant SCROLLBAR_SPACING (line 148) | pub const SCROLLBAR_SPACING: f64 = 0.1;
constant ASYMPTOTIC_EFFECT (line 149) | pub const ASYMPTOTIC_EFFECT: f64 = 0.5;
constant SCALE_EFFECT (line 150) | pub const SCALE_EFFECT: f64 = 0.5;
constant COLOR_OVERLAY_BLUE (line 153) | pub const COLOR_OVERLAY_BLUE: &str = "#00a8ff";
constant COLOR_OVERLAY_BLUE_50 (line 154) | pub const COLOR_OVERLAY_BLUE_50: &str = "#00a8ff80";
constant COLOR_OVERLAY_BLUE_25 (line 155) | pub const COLOR_OVERLAY_BLUE_25: &str = "#00a8ff40";
constant COLOR_OVERLAY_BLUE_05 (line 156) | pub const COLOR_OVERLAY_BLUE_05: &str = "#00a8ff0d";
constant COLOR_OVERLAY_YELLOW (line 157) | pub const COLOR_OVERLAY_YELLOW: &str = "#ffc848";
constant COLOR_OVERLAY_YELLOW_DULL (line 158) | pub const COLOR_OVERLAY_YELLOW_DULL: &str = "#d7ba8b";
constant COLOR_OVERLAY_GREEN (line 159) | pub const COLOR_OVERLAY_GREEN: &str = "#63ce63";
constant COLOR_OVERLAY_GREEN_25 (line 160) | pub const COLOR_OVERLAY_GREEN_25: &str = "#63ce6340";
constant COLOR_OVERLAY_RED (line 161) | pub const COLOR_OVERLAY_RED: &str = "#ef5454";
constant COLOR_OVERLAY_RED_25 (line 162) | pub const COLOR_OVERLAY_RED_25: &str = "#ef545440";
constant COLOR_OVERLAY_GRAY (line 163) | pub const COLOR_OVERLAY_GRAY: &str = "#cccccc";
constant COLOR_OVERLAY_GRAY_25 (line 164) | pub const COLOR_OVERLAY_GRAY_25: &str = "#cccccc40";
constant COLOR_OVERLAY_WHITE (line 165) | pub const COLOR_OVERLAY_WHITE: &str = "#ffffff";
constant COLOR_OVERLAY_WHITE_05 (line 166) | pub const COLOR_OVERLAY_WHITE_05: &str = "#ffffff0d";
constant COLOR_OVERLAY_BLACK (line 167) | pub const COLOR_OVERLAY_BLACK: &str = "#000000";
constant COLOR_OVERLAY_BLACK_75 (line 168) | pub const COLOR_OVERLAY_BLACK_75: &str = "#000000bf";
constant FILE_EXTENSION (line 171) | pub const FILE_EXTENSION: &str = "graphite";
constant DEFAULT_DOCUMENT_NAME (line 172) | pub const DEFAULT_DOCUMENT_NAME: &str = "Untitled Document";
constant MAX_UNDO_HISTORY_LEN (line 173) | pub const MAX_UNDO_HISTORY_LEN: usize = 100;
constant AUTO_SAVE_TIMEOUT_SECONDS (line 174) | pub const AUTO_SAVE_TIMEOUT_SECONDS: u64 = 1;
constant DOUBLE_CLICK_MILLISECONDS (line 177) | pub const DOUBLE_CLICK_MILLISECONDS: u64 = 500;
constant UI_SCALE_DEFAULT (line 180) | pub const UI_SCALE_DEFAULT: f64 = 1.;
constant UI_SCALE_MIN (line 181) | pub const UI_SCALE_MIN: f64 = 0.5;
constant UI_SCALE_MAX (line 182) | pub const UI_SCALE_MAX: f64 = 3.;
FILE: editor/src/dispatcher.rs
type Dispatcher (line 10) | pub struct Dispatcher {
method new (line 79) | pub fn new() -> Self {
method with_executor (line 83) | pub fn with_executor(executor: crate::node_graph_executor::NodeGraphEx...
method cleanup_queues (line 91) | fn cleanup_queues(&mut self, leave_last: bool) {
method schedule_execution (line 103) | pub fn schedule_execution(message_queues: &mut Vec<VecDeque<Message>>,...
method handle_message (line 112) | pub fn handle_message<T: Into<Message>>(&mut self, message: T, process...
method collect_actions (line 322) | pub fn collect_actions(&self) -> ActionList {
method poll_node_graph_evaluation (line 341) | pub fn poll_node_graph_evaluation(&mut self, responses: &mut VecDeque<...
method create_indents (line 346) | fn create_indents(queues: &[VecDeque<Message>]) -> String {
method log_message (line 360) | fn log_message(&self, message: &Message, queues: &[VecDeque<Message>],...
method log_deferred_message (line 386) | fn log_deferred_message(&self, message: &Message, queues: &[VecDeque<M...
type DispatcherMessageHandlers (line 18) | pub struct DispatcherMessageHandlers {
method with_executor (line 37) | pub fn with_executor(executor: crate::node_graph_executor::NodeGraphEx...
constant SIDE_EFFECT_FREE_MESSAGES (line 48) | const SIDE_EFFECT_FREE_MESSAGES: &[MessageDiscriminant] = &[
constant FRONTEND_UPDATE_MESSAGES (line 60) | const FRONTEND_UPDATE_MESSAGES: &[MessageDiscriminant] = &[
constant DEBUG_MESSAGE_BLOCK_LIST (line 70) | const DEBUG_MESSAGE_BLOCK_LIST: &[MessageDiscriminant] = &[
constant DEBUG_MESSAGE_ENDING_BLOCK_LIST (line 76) | const DEBUG_MESSAGE_ENDING_BLOCK_LIST: &[&str] = &["PointerMove", "Point...
function create_editor_with_three_layers (line 401) | async fn create_editor_with_three_layers() -> EditorTestUtils {
function copy_paste_single_layer (line 423) | async fn copy_paste_single_layer() {
function copy_paste_single_layer_from_middle (line 454) | async fn copy_paste_single_layer_from_middle() {
function copy_paste_deleted_layers (line 490) | async fn copy_paste_deleted_layers() {
function check_if_demo_art_opens (line 534) | async fn check_if_demo_art_opens() {
FILE: editor/src/messages/animation/animation_message.rs
type AnimationMessage (line 6) | pub enum AnimationMessage {
FILE: editor/src/messages/animation/animation_message_handler.rs
type AnimationTimeMode (line 8) | pub enum AnimationTimeMode {
type AnimationState (line 15) | enum AnimationState {
type AnimationMessageHandler (line 28) | pub struct AnimationMessageHandler {
method timing_information (line 38) | pub(crate) fn timing_information(&self) -> TimingInformation {
method animation_start (line 47) | pub(crate) fn animation_start(&self) -> f64 {
method is_playing (line 55) | pub fn is_playing(&self) -> bool {
method process_message (line 62) | fn process_message(&mut self, message: AnimationMessage, responses: &m...
FILE: editor/src/messages/app_window/app_window_message.rs
type AppWindowMessage (line 5) | pub enum AppWindowMessage {
FILE: editor/src/messages/app_window/app_window_message_handler.rs
type AppWindowMessageHandler (line 7) | pub struct AppWindowMessageHandler {}
method process_message (line 11) | fn process_message(&mut self, message: AppWindowMessage, responses: &m...
type AppWindowPlatform (line 71) | pub enum AppWindowPlatform {
method from (line 80) | fn from(environment: &Environment) -> Self {
FILE: editor/src/messages/broadcast/broadcast_message.rs
type BroadcastMessage (line 5) | pub enum BroadcastMessage {
FILE: editor/src/messages/broadcast/broadcast_message_handler.rs
type BroadcastMessageHandler (line 4) | pub struct BroadcastMessageHandler {
method process_message (line 11) | fn process_message(&mut self, message: BroadcastMessage, responses: &m...
method actions (line 22) | fn actions(&self) -> ActionList {
FILE: editor/src/messages/broadcast/event/event_message.rs
type EventMessage (line 5) | pub enum EventMessage {
FILE: editor/src/messages/broadcast/event/event_message_handler.rs
type EventMessageContext (line 4) | pub struct EventMessageContext<'a> {
type EventMessageHandler (line 9) | pub struct EventMessageHandler {}
method process_message (line 13) | fn process_message(&mut self, message: EventMessage, responses: &mut V...
method actions (line 19) | fn actions(&self) -> ActionList {
FILE: editor/src/messages/clipboard/clipboard_message.rs
type ClipboardMessage (line 6) | pub enum ClipboardMessage {
FILE: editor/src/messages/clipboard/clipboard_message_handler.rs
constant CLIPBOARD_PREFIX_LAYER (line 6) | const CLIPBOARD_PREFIX_LAYER: &str = "graphite/layer: ";
constant CLIPBOARD_PREFIX_NODES (line 7) | const CLIPBOARD_PREFIX_NODES: &str = "graphite/nodes: ";
constant CLIPBOARD_PREFIX_VECTOR (line 8) | const CLIPBOARD_PREFIX_VECTOR: &str = "graphite/vector: ";
type ClipboardMessageHandler (line 11) | pub struct ClipboardMessageHandler {}
method process_message (line 15) | fn process_message(&mut self, message: ClipboardMessage, responses: &m...
FILE: editor/src/messages/clipboard/utility_types.rs
type ClipboardContentRaw (line 2) | pub enum ClipboardContentRaw {
type ClipboardContent (line 9) | pub enum ClipboardContent {
FILE: editor/src/messages/debug/debug_message.rs
type DebugMessage (line 5) | pub enum DebugMessage {
FILE: editor/src/messages/debug/debug_message_handler.rs
type DebugMessageHandler (line 5) | pub struct DebugMessageHandler {
method process_message (line 11) | fn process_message(&mut self, message: DebugMessage, responses: &mut V...
FILE: editor/src/messages/debug/utility_types.rs
type MessageLoggingVerbosity (line 2) | pub enum MessageLoggingVerbosity {
FILE: editor/src/messages/defer/defer_message.rs
type DeferMessage (line 5) | pub enum DeferMessage {
FILE: editor/src/messages/defer/defer_message_handler.rs
type DeferMessageContext (line 4) | pub struct DeferMessageContext<'a> {
type DeferMessageHandler (line 9) | pub struct DeferMessageHandler {
method process_message (line 17) | fn process_message(&mut self, message: DeferMessage, responses: &mut V...
FILE: editor/src/messages/dialog/dialog_message.rs
type DialogMessage (line 5) | pub enum DialogMessage {
FILE: editor/src/messages/dialog/dialog_message_handler.rs
type DialogMessageContext (line 9) | pub struct DialogMessageContext<'a> {
type DialogMessageHandler (line 16) | pub struct DialogMessageHandler {
method process_message (line 25) | fn process_message(&mut self, message: DialogMessage, responses: &mut ...
FILE: editor/src/messages/dialog/export_dialog/export_dialog_message.rs
type ExportDialogMessage (line 6) | pub enum ExportDialogMessage {
FILE: editor/src/messages/dialog/export_dialog/export_dialog_message_handler.rs
type ExportDialogMessageContext (line 7) | pub struct ExportDialogMessageContext<'a> {
type ExportDialogMessageHandler (line 13) | pub struct ExportDialogMessageHandler {
method process_message (line 37) | fn process_message(&mut self, message: ExportDialogMessage, responses:...
method default (line 23) | fn default() -> Self {
constant ICON (line 71) | const ICON: &'static str = "File";
constant TITLE (line 72) | const TITLE: &'static str = "Export";
method layout_buttons (line 74) | fn layout_buttons(&self) -> Layout {
method layout (line 93) | fn layout(&self) -> Layout {
FILE: editor/src/messages/dialog/new_document_dialog/new_document_dialog_message.rs
type NewDocumentDialogMessage (line 5) | pub enum NewDocumentDialogMessage {
FILE: editor/src/messages/dialog/new_document_dialog/new_document_dialog_message_handler.rs
type NewDocumentDialogMessageHandler (line 8) | pub struct NewDocumentDialogMessageHandler {
method process_message (line 16) | fn process_message(&mut self, message: NewDocumentDialogMessage, respo...
constant ICON (line 57) | const ICON: &'static str = "File";
constant TITLE (line 58) | const TITLE: &'static str = "New Document";
method layout_buttons (line 60) | fn layout_buttons(&self) -> Layout {
method layout (line 79) | fn layout(&self) -> Layout {
FILE: editor/src/messages/dialog/preferences_dialog/preferences_dialog_message.rs
type PreferencesDialogMessage (line 5) | pub enum PreferencesDialogMessage {
FILE: editor/src/messages/dialog/preferences_dialog/preferences_dialog_message_handler.rs
type PreferencesDialogMessageContext (line 9) | pub struct PreferencesDialogMessageContext<'a> {
type PreferencesDialogMessageHandler (line 15) | pub struct PreferencesDialogMessageHandler {
method process_message (line 21) | fn process_message(&mut self, message: PreferencesDialogMessage, respo...
constant ICON (line 51) | const ICON: &'static str = "Settings";
constant TITLE (line 52) | const TITLE: &'static str = "Editor Preferences";
method layout (line 54) | fn layout(&self, preferences: &PreferencesMessageHandler) -> Layout {
method send_layout (line 431) | pub fn send_layout(&self, responses: &mut VecDeque<Message>, layout_ta...
method layout_column_2 (line 438) | fn layout_column_2(&self) -> Layout {
method send_layout_column_2 (line 442) | fn send_layout_column_2(&self, responses: &mut VecDeque<Message>, layo...
method layout_buttons (line 449) | fn layout_buttons(&self) -> Layout {
method send_layout_buttons (line 458) | fn send_layout_buttons(&self, responses: &mut VecDeque<Message>, layou...
method send_dialog_to_frontend (line 465) | pub fn send_dialog_to_frontend(&self, responses: &mut VecDeque<Message...
function map_display_to_zoom_rate (line 477) | fn map_display_to_zoom_rate(display: f64) -> f64 {
function map_zoom_rate_to_display (line 485) | fn map_zoom_rate_to_display(rate: f64) -> f64 {
function map_display_to_ui_scale (line 495) | fn map_display_to_ui_scale(display: f64) -> f64 {
function ui_scale_to_display (line 501) | fn ui_scale_to_display(scale: f64) -> f64 {
FILE: editor/src/messages/dialog/simple_dialogs/about_graphite_dialog.rs
type AboutGraphiteDialog (line 6) | pub struct AboutGraphiteDialog {
constant ICON (line 12) | const ICON: &'static str = "GraphiteLogo";
constant TITLE (line 13) | const TITLE: &'static str = "About Graphite";
method layout_buttons (line 15) | fn layout_buttons(&self) -> Layout {
method layout_column_2 (line 21) | fn layout_column_2(&self) -> Layout {
method layout (line 59) | fn layout(&self) -> Layout {
FILE: editor/src/messages/dialog/simple_dialogs/close_all_documents_dialog.rs
type CloseAllDocumentsDialog (line 5) | pub struct CloseAllDocumentsDialog {
constant ICON (line 10) | const ICON: &'static str = "Warning";
constant TITLE (line 11) | const TITLE: &'static str = "Closing All Documents";
method layout_buttons (line 13) | fn layout_buttons(&self) -> Layout {
method layout (line 32) | fn layout(&self) -> Layout {
FILE: editor/src/messages/dialog/simple_dialogs/close_document_dialog.rs
type CloseDocumentDialog (line 6) | pub struct CloseDocumentDialog {
constant ICON (line 12) | const ICON: &'static str = "Warning";
constant TITLE (line 13) | const TITLE: &'static str = "Closing Document";
method layout_buttons (line 15) | fn layout_buttons(&self) -> Layout {
method layout (line 43) | fn layout(&self) -> Layout {
FILE: editor/src/messages/dialog/simple_dialogs/confirm_restart_dialog.rs
type ConfirmRestartDialog (line 5) | pub struct ConfirmRestartDialog {
constant ICON (line 10) | const ICON: &'static str = "Warning";
constant TITLE (line 11) | const TITLE: &'static str = "Restart Required";
method layout_buttons (line 13) | fn layout_buttons(&self) -> Layout {
method layout (line 32) | fn layout(&self) -> Layout {
FILE: editor/src/messages/dialog/simple_dialogs/demo_artwork_dialog.rs
type DemoArtworkDialog (line 5) | pub struct DemoArtworkDialog;
constant ARTWORK (line 8) | pub const ARTWORK: [(&str, &str, &str); 7] = [
constant ICON (line 19) | const ICON: &'static str = "Image";
constant TITLE (line 20) | const TITLE: &'static str = "Demo Artwork";
method layout_buttons (line 22) | fn layout_buttons(&self) -> Layout {
method layout (line 30) | fn layout(&self) -> Layout {
FILE: editor/src/messages/dialog/simple_dialogs/error_dialog.rs
type ErrorDialog (line 5) | pub struct ErrorDialog {
constant ICON (line 11) | const ICON: &'static str = "Warning";
constant TITLE (line 12) | const TITLE: &'static str = "Error";
method layout_buttons (line 14) | fn layout_buttons(&self) -> Layout {
method layout (line 22) | fn layout(&self) -> Layout {
FILE: editor/src/messages/dialog/simple_dialogs/licenses_dialog.rs
type LicensesDialog (line 4) | pub struct LicensesDialog {
constant ICON (line 9) | const ICON: &'static str = "License12px";
constant TITLE (line 10) | const TITLE: &'static str = "Licenses";
method layout_buttons (line 12) | fn layout_buttons(&self) -> Layout {
method layout_column_2 (line 18) | fn layout_column_2(&self) -> Layout {
method layout (line 45) | fn layout(&self) -> Layout {
FILE: editor/src/messages/dialog/simple_dialogs/licenses_third_party_dialog.rs
type LicensesThirdPartyDialog (line 4) | pub struct LicensesThirdPartyDialog {
constant ICON (line 9) | const ICON: &'static str = "License12px";
constant TITLE (line 10) | const TITLE: &'static str = "Third-Party Software License Notices";
method layout_buttons (line 12) | fn layout_buttons(&self) -> Layout {
method layout (line 20) | fn layout(&self) -> Layout {
FILE: editor/src/messages/frontend/frontend_message.rs
type FrontendMessage (line 27) | pub enum FrontendMessage {
FILE: editor/src/messages/frontend/mod.rs
type IconName (line 10) | pub type IconName = String;
FILE: editor/src/messages/frontend/utility_types.rs
type OpenDocument (line 8) | pub struct OpenDocument {
type DocumentDetails (line 15) | pub struct DocumentDetails {
type MouseCursorIcon (line 26) | pub enum MouseCursorIcon {
type FileType (line 45) | pub enum FileType {
method to_mime (line 53) | pub fn to_mime(self) -> &'static str {
type ExportBounds (line 64) | pub enum ExportBounds {
type EyedropperPreviewImage (line 73) | pub struct EyedropperPreviewImage {
FILE: editor/src/messages/input_mapper/input_mapper_message.rs
type InputMapperMessage (line 7) | pub enum InputMapperMessage {
FILE: editor/src/messages/input_mapper/input_mapper_message_handler.rs
type InputMapperMessageContext (line 9) | pub struct InputMapperMessageContext<'a> {
type InputMapperMessageHandler (line 15) | pub struct InputMapperMessageHandler {
method process_message (line 21) | fn process_message(&mut self, message: InputMapperMessage, responses: ...
method set_mapping (line 32) | pub fn set_mapping(&mut self, mapping: Mapping) {
method action_input_mapping (line 36) | pub fn action_input_mapping(&self, action_to_find: &MessageDiscriminan...
FILE: editor/src/messages/input_mapper/input_mappings.rs
method from (line 18) | fn from(value: MappingVariant) -> Self {
function input_mappings (line 26) | pub fn input_mappings(zoom_with_scroll: bool) -> Mapping {
FILE: editor/src/messages/input_mapper/key_mapping/key_mapping_message.rs
type KeyMappingMessage (line 5) | pub enum KeyMappingMessage {
type MappingVariant (line 17) | pub enum MappingVariant {
FILE: editor/src/messages/input_mapper/key_mapping/key_mapping_message_handler.rs
type KeyMappingMessageContext (line 6) | pub struct KeyMappingMessageContext<'a> {
type KeyMappingMessageHandler (line 12) | pub struct KeyMappingMessageHandler {
method process_message (line 18) | fn process_message(&mut self, message: KeyMappingMessage, responses: &...
method action_input_mapping (line 33) | pub fn action_input_mapping(&self, action_to_find: &MessageDiscriminan...
FILE: editor/src/messages/input_mapper/utility_types/input_keyboard.rs
type StorageType (line 13) | pub type StorageType = u128;
constant STORAGE_SIZE (line 20) | const STORAGE_SIZE: u32 = (std::mem::size_of::<StorageType>() * 8).trail...
constant STORAGE_SIZE_BITS (line 21) | const STORAGE_SIZE_BITS: usize = 1 << STORAGE_SIZE;
constant KEY_MASK_STORAGE_LENGTH (line 22) | const KEY_MASK_STORAGE_LENGTH: usize = (NUMBER_OF_KEYS + STORAGE_SIZE_BI...
type KeyStates (line 24) | pub type KeyStates = BitVector<KEY_MASK_STORAGE_LENGTH>;
function all_required_modifiers_pressed (line 26) | pub fn all_required_modifiers_pressed(keyboard_state: &KeyStates, modifi...
type KeyPosition (line 38) | pub enum KeyPosition {
type Key (line 73) | pub enum Key {
method fmt (line 249) | fn fmt(&self, f: &mut fmt::Formatter) -> std::fmt::Result {
constant NUMBER_OF_KEYS (line 342) | pub const NUMBER_OF_KEYS: usize = Key::_KeysVariantCount as usize - 1;
type KeysGroup (line 350) | pub struct KeysGroup(pub Vec<Key>);
method fmt (line 353) | fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
type LabeledKey (line 385) | pub struct LabeledKey {
method key (line 391) | pub fn key(&self) -> Key {
type MouseMotion (line 402) | pub enum MouseMotion {
type LabeledKeyOrMouseMotion (line 424) | pub enum LabeledKeyOrMouseMotion {
method from (line 430) | fn from(key: Key) -> Self {
type LabeledShortcut (line 446) | pub struct LabeledShortcut(pub Vec<LabeledKeyOrMouseMotion>);
method from (line 449) | fn from(keys_group: KeysGroup) -> Self {
type BitVector (line 459) | pub struct BitVector<const LENGTH: usize>([StorageType; LENGTH]);
function convert_index (line 463) | fn convert_index(bitvector_index: usize) -> (usize, StorageType) {
function new (line 469) | pub const fn new() -> Self {
function set (line 473) | pub fn set(&mut self, bitvector_index: usize) {
function unset (line 478) | pub fn unset(&mut self, bitvector_index: usize) {
function toggle (line 483) | pub fn toggle(&mut self, bitvector_index: usize) {
function get (line 488) | pub fn get(&self, bitvector_index: usize) -> bool {
function key (line 493) | pub fn key(&self, key: Key) -> bool {
function is_empty (line 497) | pub fn is_empty(&self) -> bool {
function count_ones (line 507) | pub fn count_ones(&self) -> u32 {
function iter (line 517) | pub fn iter(&self) -> impl Iterator<Item = usize> + '_ {
method default (line 523) | fn default() -> Self {
type BitVectorIter (line 528) | struct BitVectorIter<'a, const LENGTH: usize> {
type Item (line 534) | type Item = usize;
method next (line 536) | fn next(&mut self) -> Option<Self::Item> {
method fmt (line 552) | fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
FILE: editor/src/messages/input_mapper/utility_types/input_mouse.rs
type DocumentPosition (line 9) | pub type DocumentPosition = DVec2;
type ViewportPosition (line 10) | pub type ViewportPosition = DVec2;
type EditorPosition (line 11) | pub type EditorPosition = DVec2;
type ScrollDelta (line 14) | pub struct ScrollDelta {
method new (line 39) | pub fn new(x: f64, y: f64, z: f64) -> Self {
method as_dvec2 (line 43) | pub fn as_dvec2(&self) -> DVec2 {
method scroll_delta (line 47) | pub fn scroll_delta(&self) -> f64 {
method eq (line 21) | fn eq(&self, other: &Self) -> bool {
method hash (line 29) | fn hash<H: Hasher>(&self, state: &mut H) {
type MouseState (line 55) | pub struct MouseState {
method finish_transaction (line 62) | pub fn finish_transaction(&self, drag_start: DVec2, responses: &mut Ve...
type EditorMouseState (line 71) | pub struct EditorMouseState {
method from_keys_and_editor_position (line 78) | pub fn from_keys_and_editor_position(keys: u8, editor_position: Editor...
method to_mouse_state (line 89) | pub fn to_mouse_state(&self, viewport: &ViewportMessageHandler) -> Mou...
type MouseButton (line 116) | pub enum MouseButton {
constant NUMBER_OF_MOUSE_BUTTONS (line 124) | pub const NUMBER_OF_MOUSE_BUTTONS: usize = 5;
FILE: editor/src/messages/input_mapper/utility_types/misc.rs
type Mapping (line 9) | pub struct Mapping {
method match_input_message (line 27) | pub fn match_input_message(&self, message: InputMapperMessage, keyboar...
method associated_entries (line 32) | fn associated_entries(&self, message: &InputMapperMessage) -> &KeyMapp...
method default (line 21) | fn default() -> Self {
type KeyMappingEntries (line 47) | pub struct KeyMappingEntries(pub Vec<MappingEntry>);
method match_mapping (line 50) | pub fn match_mapping(&self, keyboard_state: &KeyStates, actions: Actio...
method push (line 64) | pub fn push(&mut self, entry: MappingEntry) {
method remove (line 68) | pub fn remove(&mut self, target_entry: &MappingEntry) {
method new (line 72) | pub const fn new() -> Self {
method key_array (line 76) | pub fn key_array() -> [Self; NUMBER_OF_KEYS] {
method mouse_buttons_arrays (line 81) | pub fn mouse_buttons_arrays() -> [Self; NUMBER_OF_MOUSE_BUTTONS] {
method default (line 88) | fn default() -> Self {
type MappingEntry (line 94) | pub struct MappingEntry {
type ActionShortcut (line 111) | pub enum ActionShortcut {
method realize_shortcut (line 119) | pub fn realize_shortcut(&mut self, action_input_mapping: &impl Fn(&Mes...
type FrameTimeInfo (line 131) | pub struct FrameTimeInfo {
method frame_duration (line 137) | pub fn frame_duration(&self) -> Option<Duration> {
method advance_timestamp (line 141) | pub fn advance_timestamp(&mut self, next_timestamp: Duration) {
FILE: editor/src/messages/input_preprocessor/input_preprocessor_message.rs
type InputPreprocessorMessage (line 7) | pub enum InputPreprocessorMessage {
FILE: editor/src/messages/input_preprocessor/input_preprocessor_message_handler.rs
type InputPreprocessorMessageContext (line 9) | pub struct InputPreprocessorMessageContext<'a> {
type InputPreprocessorMessageHandler (line 14) | pub struct InputPreprocessorMessageHandler {
method process_message (line 23) | fn process_message(&mut self, message: InputPreprocessorMessage, respo...
method translate_mouse_event (line 119) | fn translate_mouse_event(&mut self, mut new_state: MouseState, allow_f...
method update_states_of_modifier_keys (line 150) | fn update_states_of_modifier_keys(&mut self, pressed_modifier_keys: Mo...
method update_modifier_key (line 173) | fn update_modifier_key(&mut self, key: Key, key_is_down: bool, respons...
function process_action_mouse_move_handle_modifier_keys (line 193) | fn process_action_mouse_move_handle_modifier_keys() {
function process_action_mouse_down_handle_modifier_keys (line 216) | fn process_action_mouse_down_handle_modifier_keys() {
function process_action_mouse_up_handle_modifier_keys (line 235) | fn process_action_mouse_up_handle_modifier_keys() {
function process_action_key_down_handle_modifier_keys (line 254) | fn process_action_key_down_handle_modifier_keys() {
function process_action_key_up_handle_modifier_keys (line 275) | fn process_action_key_up_handle_modifier_keys() {
FILE: editor/src/messages/layout/layout_message.rs
type LayoutMessage (line 6) | pub enum LayoutMessage {
FILE: editor/src/messages/layout/layout_message_handler.rs
type LayoutMessageContext (line 9) | pub struct LayoutMessageContext<'a> {
type LayoutMessageHandler (line 14) | pub struct LayoutMessageHandler {
method process_message (line 20) | fn process_message(&mut self, message: LayoutMessage, responses: &mut ...
method actions (line 67) | fn actions(&self) -> ActionList {
method get_widget_path (line 74) | fn get_widget_path(widget_layout: &Layout, widget_id: WidgetId) -> Opt...
method handle_widget_callback (line 131) | fn handle_widget_callback(&mut self, layout_target: LayoutTarget, widg...
method diff_and_send_layout_to_frontend (line 391) | fn diff_and_send_layout_to_frontend(
method send_diff (line 428) | fn send_diff(&self, mut diff: Vec<WidgetDiff>, layout_target: LayoutTa...
type WidgetValueAction (line 439) | enum WidgetValueAction {
FILE: editor/src/messages/layout/utility_types/layout_widget.rs
type WidgetId (line 15) | pub struct WidgetId(pub u64);
method fmt (line 18) | fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
type LayoutHolder (line 85) | pub trait LayoutHolder {
method layout (line 86) | fn layout(&self) -> Layout;
method send_layout (line 88) | fn send_layout(&self, responses: &mut VecDeque<Message>, layout_target...
type DialogLayoutHolder (line 94) | pub trait DialogLayoutHolder: LayoutHolder {
constant ICON (line 95) | const ICON: &'static str;
constant TITLE (line 96) | const TITLE: &'static str;
method layout_buttons (line 98) | fn layout_buttons(&self) -> Layout;
method send_layout_buttons (line 99) | fn send_layout_buttons(&self, responses: &mut VecDeque<Message>, layou...
method layout_column_2 (line 106) | fn layout_column_2(&self) -> Layout {
method send_layout_column_2 (line 109) | fn send_layout_column_2(&self, responses: &mut VecDeque<Message>, layo...
method send_dialog_to_frontend (line 116) | fn send_dialog_to_frontend(&self, responses: &mut VecDeque<Message>) {
type Diffable (line 131) | pub trait Diffable: Clone + PartialEq {
method into_diff_update (line 133) | fn into_diff_update(self) -> DiffUpdate;
method diff (line 136) | fn diff(&mut self, new: Self, widget_path: &mut Vec<usize>, widget_dif...
method collect_checkbox_ids (line 139) | fn collect_checkbox_ids(&self, layout_target: LayoutTarget, widget_pat...
method replace_widget_ids (line 143) | fn replace_widget_ids(&mut self, layout_target: LayoutTarget, widget_p...
method into_diff_update (line 193) | fn into_diff_update(self) -> DiffUpdate {
method diff (line 197) | fn diff(&mut self, new: Self, widget_path: &mut Vec<usize>, widget_dif...
method collect_checkbox_ids (line 219) | fn collect_checkbox_ids(&self, layout_target: LayoutTarget, widget_pat...
method replace_widget_ids (line 227) | fn replace_widget_ids(&mut self, layout_target: LayoutTarget, widget_p...
method into_diff_update (line 464) | fn into_diff_update(self) -> DiffUpdate {
method diff (line 468) | fn diff(&mut self, new: Self, widget_path: &mut Vec<usize>, widget_dif...
method collect_checkbox_ids (line 563) | fn collect_checkbox_ids(&self, layout_target: LayoutTarget, widget_pat...
method replace_widget_ids (line 589) | fn replace_widget_ids(&mut self, layout_target: LayoutTarget, widget_p...
method into_diff_update (line 641) | fn into_diff_update(self) -> DiffUpdate {
method diff (line 645) | fn diff(&mut self, new: Self, widget_path: &mut Vec<usize>, widget_dif...
method collect_checkbox_ids (line 682) | fn collect_checkbox_ids(&self, layout_target: LayoutTarget, widget_pat...
method replace_widget_ids (line 708) | fn replace_widget_ids(&mut self, layout_target: LayoutTarget, widget_p...
function compute_widget_id (line 147) | fn compute_widget_id(layout_target: LayoutTarget, widget_path: &[usize],...
function compute_checkbox_id (line 158) | fn compute_checkbox_id(layout_target: LayoutTarget, widget_path: &[usize...
type Layout (line 174) | pub struct Layout(pub Vec<LayoutGroup>);
method iter (line 177) | pub fn iter(&self) -> WidgetIter<'_> {
method iter_mut (line 184) | pub fn iter_mut(&mut self) -> WidgetIterMut<'_> {
type WidgetIter (line 237) | pub struct WidgetIter<'a> {
type Item (line 244) | type Item = &'a WidgetInstance;
method next (line 246) | fn next(&mut self) -> Option<Self::Item> {
type WidgetIterMut (line 287) | pub struct WidgetIterMut<'a> {
type Item (line 294) | type Item = &'a mut WidgetInstance;
method next (line 296) | fn next(&mut self) -> Option<Self::Item> {
type LayoutGroup (line 340) | pub enum LayoutGroup {
method from (line 386) | fn from(widgets: Vec<WidgetInstance>) -> LayoutGroup {
method row (line 392) | pub fn row(widgets: Vec<WidgetInstance>) -> Self {
method column (line 396) | pub fn column(widgets: Vec<WidgetInstance>) -> Self {
method table (line 400) | pub fn table(rows: Vec<Vec<WidgetInstance>>, unstyled: bool) -> Self {
method section (line 404) | pub fn section(name: impl Into<String>, description: impl Into<String>...
method with_tooltip_description (line 416) | pub fn with_tooltip_description(self, description: impl Into<String>) ...
method iter_mut (line 455) | pub fn iter_mut(&mut self) -> WidgetIterMut<'_> {
type WidgetColumn (line 349) | pub struct WidgetColumn {
type WidgetRow (line 356) | pub struct WidgetRow {
type WidgetTable (line 363) | pub struct WidgetTable {
type WidgetSection (line 371) | pub struct WidgetSection {
method default (line 381) | fn default() -> Self {
type WidgetInstance (line 618) | pub struct WidgetInstance {
method new (line 632) | pub fn new(widget: Widget) -> Self {
method eq (line 625) | fn eq(&self, other: &Self) -> bool {
type WidgetCallback (line 740) | pub struct WidgetCallback<T> {
function new (line 745) | pub fn new(callback: impl Fn(&T) -> Message + 'static + Send + Sync) -> ...
method default (line 751) | fn default() -> Self {
type Widget (line 758) | pub enum Widget {
type WidgetDiff (line 786) | pub struct WidgetDiff {
type DiffUpdate (line 800) | pub enum DiffUpdate {
method apply_keyboard_shortcut (line 811) | pub fn apply_keyboard_shortcut(&mut self, action_input_mapping: &impl ...
FILE: editor/src/messages/layout/utility_types/widgets/button_widgets.rs
type IconButton (line 13) | pub struct IconButton {
type PopoverButton (line 47) | pub struct PopoverButton {
type MenuDirection (line 73) | pub enum MenuDirection {
type ParameterExposeButton (line 89) | pub struct ParameterExposeButton {
type TextButton (line 115) | pub struct TextButton {
type ImageButton (line 161) | pub struct ImageButton {
type ColorInput (line 188) | pub struct ColorInput {
type BreadcrumbTrailButtons (line 224) | pub struct BreadcrumbTrailButtons {
FILE: editor/src/messages/layout/utility_types/widgets/input_widgets.rs
type CheckboxInput (line 14) | pub struct CheckboxInput {
type CheckboxId (line 43) | pub struct CheckboxId(pub u64);
method new (line 46) | pub fn new() -> Self {
method default (line 51) | fn default() -> Self {
type DropdownInput (line 59) | pub struct DropdownInput {
type MenuListEntrySections (line 101) | pub type MenuListEntrySections = Vec<Vec<MenuListEntry>>;
type MenuListEntry (line 107) | pub struct MenuListEntry {
method hash (line 143) | fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
type NumberInput (line 154) | pub struct NumberInput {
method int (line 219) | pub fn int(mut self) -> Self {
method min (line 223) | pub fn min(mut self, val: f64) -> Self {
method max (line 228) | pub fn max(mut self, val: f64) -> Self {
method mode_range (line 233) | pub fn mode_range(mut self) -> Self {
method mode_increment (line 237) | pub fn mode_increment(mut self) -> Self {
method increment_step (line 241) | pub fn increment_step(mut self, step: f64) -> Self {
method percentage (line 245) | pub fn percentage(self) -> Self {
type NumberInputIncrementBehavior (line 252) | pub enum NumberInputIncrementBehavior {
type NumberInputMode (line 266) | pub enum NumberInputMode {
type NodeCatalog (line 275) | pub struct NodeCatalog {
type RadioInput (line 295) | pub struct RadioInput {
type RadioEntryData (line 320) | pub struct RadioEntryData {
type WorkingColorsInput (line 348) | pub struct WorkingColorsInput {
type TextAreaInput (line 359) | pub struct TextAreaInput {
type TextInput (line 386) | pub struct TextInput {
type CurveInput (line 424) | pub struct CurveInput {
type ReferencePointInput (line 449) | pub struct ReferencePointInput {
FILE: editor/src/messages/layout/utility_types/widgets/label_widgets.rs
type IconLabel (line 8) | pub struct IconLabel {
type Separator (line 26) | pub struct Separator {
type SeparatorDirection (line 35) | pub enum SeparatorDirection {
type SeparatorStyle (line 43) | pub enum SeparatorStyle {
type TextLabel (line 53) | pub struct TextLabel {
type ImageLabel (line 90) | pub struct ImageLabel {
type ShortcutLabel (line 109) | pub struct ShortcutLabel {
FILE: editor/src/messages/menu_bar/menu_bar_message.rs
type MenuBarMessage (line 5) | pub enum MenuBarMessage {
FILE: editor/src/messages/menu_bar/menu_bar_message_handler.rs
type MenuBarMessageHandler (line 9) | pub struct MenuBarMessageHandler {
method process_message (line 29) | fn process_message(&mut self, message: MenuBarMessage, responses: &mut...
method actions (line 37) | fn actions(&self) -> ActionList {
method layout (line 43) | fn layout(&self) -> Layout {
FILE: editor/src/messages/message.rs
type Message (line 6) | pub enum Message {
method message_tree (line 49) | pub fn message_tree() -> DebugMessageTree {
FILE: editor/src/messages/portfolio/document/data_panel/data_panel_message.rs
type DataPanelMessage (line 7) | pub enum DataPanelMessage {
type VectorTableTab (line 27) | pub enum VectorTableTab {
FILE: editor/src/messages/portfolio/document/data_panel/data_panel_message_handler.rs
type DataPanelMessageContext (line 22) | pub struct DataPanelMessageContext<'a> {
type DataPanelMessageHandler (line 29) | pub struct DataPanelMessageHandler {
method process_message (line 38) | fn process_message(&mut self, message: DataPanelMessage, responses: &m...
method actions (line 69) | fn actions(&self) -> ActionList {
method update_layout (line 75) | fn update_layout(&mut self, responses: &mut VecDeque<Message>, context...
type LayoutData (line 141) | struct LayoutData<'a> {
function generate_layout (line 160) | fn generate_layout(introspected_data: &Arc<dyn std::any::Any + Send + Sy...
function column_headings (line 182) | fn column_headings(value: &[&str]) -> Vec<WidgetInstance> {
function label (line 186) | fn label(x: impl Into<String>) -> Vec<LayoutGroup> {
type TableRowLayout (line 191) | trait TableRowLayout {
method type_name (line 192) | fn type_name() -> &'static str;
method identifier (line 193) | fn identifier(&self) -> String;
method layout_with_breadcrumb (line 194) | fn layout_with_breadcrumb(&self, data: &mut LayoutData) -> Vec<LayoutG...
method element_widget (line 198) | fn element_widget(&self, index: usize) -> WidgetInstance {
method element_page (line 204) | fn element_page(&self, _data: &mut LayoutData) -> Vec<LayoutGroup> {
method type_name (line 210) | fn type_name() -> &'static str {
method identifier (line 213) | fn identifier(&self) -> String {
method element_page (line 216) | fn element_page(&self, data: &mut LayoutData) -> Vec<LayoutGroup> {
method type_name (line 242) | fn type_name() -> &'static str {
method identifier (line 245) | fn identifier(&self) -> String {
method element_page (line 248) | fn element_page(&self, data: &mut LayoutData) -> Vec<LayoutGroup> {
method type_name (line 284) | fn type_name() -> &'static str {
method identifier (line 287) | fn identifier(&self) -> String {
method element_page (line 290) | fn element_page(&self, data: &mut LayoutData) -> Vec<LayoutGroup> {
method type_name (line 296) | fn type_name() -> &'static str {
method identifier (line 299) | fn identifier(&self) -> String {
method layout_with_breadcrumb (line 310) | fn layout_with_breadcrumb(&self, data: &mut LayoutData) -> Vec<LayoutG...
method element_page (line 313) | fn element_page(&self, data: &mut LayoutData) -> Vec<LayoutGroup> {
method type_name (line 326) | fn type_name() -> &'static str {
method identifier (line 329) | fn identifier(&self) -> String {
method element_page (line 338) | fn element_page(&self, data: &mut LayoutData) -> Vec<LayoutGroup> {
method type_name (line 496) | fn type_name() -> &'static str {
method identifier (line 499) | fn identifier(&self) -> String {
method element_page (line 502) | fn element_page(&self, _data: &mut LayoutData) -> Vec<LayoutGroup> {
method type_name (line 527) | fn type_name() -> &'static str {
method identifier (line 530) | fn identifier(&self) -> String {
method element_page (line 533) | fn element_page(&self, _data: &mut LayoutData) -> Vec<LayoutGroup> {
method type_name (line 540) | fn type_name() -> &'static str {
method identifier (line 543) | fn identifier(&self) -> String {
method element_widget (line 546) | fn element_widget(&self, _index: usize) -> WidgetInstance {
method element_page (line 553) | fn element_page(&self, _data: &mut LayoutData) -> Vec<LayoutGroup> {
method type_name (line 560) | fn type_name() -> &'static str {
method identifier (line 563) | fn identifier(&self) -> String {
method element_widget (line 566) | fn element_widget(&self, _index: usize) -> WidgetInstance {
method element_page (line 573) | fn element_page(&self, _data: &mut LayoutData) -> Vec<LayoutGroup> {
method type_name (line 580) | fn type_name() -> &'static str {
method identifier (line 583) | fn identifier(&self) -> String {
method element_page (line 586) | fn element_page(&self, _data: &mut LayoutData) -> Vec<LayoutGroup> {
method type_name (line 593) | fn type_name() -> &'static str {
method identifier (line 596) | fn identifier(&self) -> String {
method element_page (line 599) | fn element_page(&self, _data: &mut LayoutData) -> Vec<LayoutGroup> {
method type_name (line 606) | fn type_name() -> &'static str {
method identifier (line 609) | fn identifier(&self) -> String {
method element_page (line 612) | fn element_page(&self, _data: &mut LayoutData) -> Vec<LayoutGroup> {
method type_name (line 619) | fn type_name() -> &'static str {
method identifier (line 622) | fn identifier(&self) -> String {
method element_page (line 625) | fn element_page(&self, _data: &mut LayoutData) -> Vec<LayoutGroup> {
method type_name (line 632) | fn type_name() -> &'static str {
method identifier (line 635) | fn identifier(&self) -> String {
method element_page (line 644) | fn element_page(&self, _data: &mut LayoutData) -> Vec<LayoutGroup> {
method type_name (line 651) | fn type_name() -> &'static str {
method identifier (line 654) | fn identifier(&self) -> String {
method element_page (line 657) | fn element_page(&self, _data: &mut LayoutData) -> Vec<LayoutGroup> {
method type_name (line 664) | fn type_name() -> &'static str {
method identifier (line 667) | fn identifier(&self) -> String {
method element_page (line 670) | fn element_page(&self, _data: &mut LayoutData) -> Vec<LayoutGroup> {
method type_name (line 677) | fn type_name() -> &'static str {
method identifier (line 680) | fn identifier(&self) -> String {
method element_page (line 683) | fn element_page(&self, _data: &mut LayoutData) -> Vec<LayoutGroup> {
method type_name (line 690) | fn type_name() -> &'static str {
method identifier (line 693) | fn identifier(&self) -> String {
method element_page (line 696) | fn element_page(&self, _data: &mut LayoutData) -> Vec<LayoutGroup> {
method type_name (line 703) | fn type_name() -> &'static str {
method identifier (line 706) | fn identifier(&self) -> String {
method element_page (line 709) | fn element_page(&self, _data: &mut LayoutData) -> Vec<LayoutGroup> {
function format_transform_matrix (line 716) | fn format_transform_matrix(transform: &DAffine2) -> String {
function format_dvec2 (line 746) | fn format_dvec2(value: DVec2) -> String {
FILE: editor/src/messages/portfolio/document/document_message.rs
type DocumentMessage (line 25) | pub enum DocumentMessage {
FILE: editor/src/messages/portfolio/document/document_message_handler.rs
type DocumentMessageContext (line 48) | pub struct DocumentMessageContext<'a> {
type DocumentMessageHandler (line 63) | pub struct DocumentMessageHandler {
method process_message (line 188) | fn process_message(&mut self, message: DocumentMessage, responses: &mu...
method actions (line 1412) | fn actions(&self) -> ActionList {
method intersect_quad (line 1476) | pub fn intersect_quad<'a>(&'a self, viewport_quad: graphene_std::rende...
method intersect_quad_no_artboards (line 1484) | pub fn intersect_quad_no_artboards<'a>(&'a self, viewport_quad: graphe...
method intersect_polygon (line 1489) | pub fn intersect_polygon<'a>(&'a self, mut viewport_polygon: Subpath<P...
method intersect_polygon_no_artboards (line 1497) | pub fn intersect_polygon_no_artboards<'a>(&'a self, viewport_polygon: ...
method is_layer_fully_inside (line 1502) | pub fn is_layer_fully_inside(&self, layer: &LayerNodeIdentifier, quad:...
method is_layer_fully_inside_polygon (line 1525) | pub fn is_layer_fully_inside_polygon(&self, layer: &LayerNodeIdentifie...
method click_xray (line 1549) | pub fn click_xray(&self, ipp: &InputPreprocessorMessageHandler, viewpo...
method find_deepest (line 1556) | pub fn find_deepest(&self, node_list: &[LayerNodeIdentifier]) -> Optio...
method click_list (line 1571) | pub fn click_list<'a>(&'a self, ipp: &InputPreprocessorMessageHandler,...
method click_list_with_artboards (line 1586) | pub fn click_list_with_artboards<'a>(&'a self, ipp: &InputPreprocessor...
method click_list_no_parents (line 1599) | pub fn click_list_no_parents<'a>(&'a self, ipp: &InputPreprocessorMess...
method click (line 1605) | pub fn click(&self, ipp: &InputPreprocessorMessageHandler, viewport: &...
method click_based_on_position (line 1609) | pub fn click_based_on_position(&self, mouse_snapped_positon: DVec2) ->...
method document_network (line 1624) | pub fn document_network(&self) -> &NodeNetwork {
method metadata (line 1628) | pub fn metadata(&self) -> &DocumentMetadata {
method serialize_document (line 1632) | pub fn serialize_document(&self) -> String {
method deserialize_document (line 1638) | pub fn deserialize_document(serialized_content: &str) -> Result<Self, ...
method build_layer_structure (line 1696) | fn build_layer_structure(&self, folder: LayerNodeIdentifier) -> Vec<La...
method undo_with_history (line 1713) | pub fn undo_with_history(&mut self, viewport: &ViewportMessageHandler,...
method undo (line 1722) | pub fn undo(&mut self, viewport: &ViewportMessageHandler, responses: &...
method redo_with_history (line 1749) | pub fn redo_with_history(&mut self, viewport: &ViewportMessageHandler,...
method redo (line 1759) | pub fn redo(&mut self, viewport: &ViewportMessageHandler, responses: &...
method current_hash (line 1781) | pub fn current_hash(&self) -> u64 {
method is_auto_saved (line 1785) | pub fn is_auto_saved(&self) -> bool {
method is_saved (line 1789) | pub fn is_saved(&self) -> bool {
method is_graph_overlay_open (line 1793) | pub fn is_graph_overlay_open(&self) -> bool {
method set_auto_save_state (line 1797) | pub fn set_auto_save_state(&mut self, is_saved: bool) {
method set_save_state (line 1805) | pub fn set_save_state(&mut self, is_saved: bool) {
method new_layer_bounding_artboard (line 1814) | pub fn new_layer_bounding_artboard(&self, ipp: &InputPreprocessorMessa...
method new_layer_parent (line 1830) | pub fn new_layer_parent(&self, include_self: bool) -> LayerNodeIdentif...
method get_calculated_insert_index (line 1841) | pub fn get_calculated_insert_index(metadata: &DocumentMetadata, select...
method group_layers (line 1861) | pub fn group_layers(
method handle_group_selected_layers (line 1932) | fn handle_group_selected_layers(&mut self, group_folder_type: GroupFol...
method handle_move_selected_layers_to (line 1983) | fn handle_move_selected_layers_to(&mut self, parent: LayerNodeIdentifi...
method handle_nudge_selected_layers (line 2079) | fn handle_nudge_selected_layers(
method load_layer_resources (line 2169) | pub fn load_layer_resources(&self, responses: &mut VecDeque<Message>) {
method update_document_widgets (line 2185) | pub fn update_document_widgets(&self, responses: &mut VecDeque<Message...
method update_layers_panel_control_bar_widgets (line 2606) | pub fn update_layers_panel_control_bar_widgets(&self, layers_panel_ope...
method update_layers_panel_bottom_bar_widgets (line 2768) | pub fn update_layers_panel_bottom_bar_widgets(&mut self, layers_panel_...
method selected_layers_reverse (line 2841) | pub fn selected_layers_reverse(&mut self, responses: &mut VecDeque<Mes...
method selected_layers_reorder (line 2933) | pub fn selected_layers_reorder(&mut self, relative_index_offset: isize...
method graph_view_overlay_open (line 2968) | pub fn graph_view_overlay_open(&self) -> bool {
method default (line 146) | fn default() -> Self {
function default_document_network_interface (line 2974) | fn default_document_network_interface() -> NodeNetworkInterface {
type XRayTarget (line 2982) | enum XRayTarget {
type XRayResult (line 2990) | struct XRayResult {
type ClickXRayIter (line 2997) | pub struct ClickXRayIter<'a> {
function quad_to_kurbo (line 3003) | fn quad_to_kurbo(quad: Quad) -> BezPath {
function click_targets_to_kurbo (line 3007) | fn click_targets_to_kurbo<'a>(click_targets: impl Iterator<Item = &'a Cl...
function new (line 3022) | fn new(network_interface: &'a NodeNetworkInterface, target: XRayTarget) ...
function check_layer_area_target (line 3039) | fn check_layer_area_target(&mut self, click_targets: Option<&[Arc<ClickT...
function check_layer (line 3063) | fn check_layer(&mut self, layer: LayerNodeIdentifier) -> XRayResult {
function navigation_controls (line 3094) | pub fn navigation_controls(ptz: &PTZ, navigation_handler: &NavigationMes...
type Item (line 3145) | type Item = LayerNodeIdentifier;
method next (line 3147) | fn next(&mut self) -> Option<Self::Item> {
function test_layer_selection_with_shift_and_ctrl (line 3182) | async fn test_layer_selection_with_shift_and_ctrl() {
function test_layer_rearrangement (line 3255) | async fn test_layer_rearrangement() {
function test_move_folder_into_itself_doesnt_crash (line 3302) | async fn test_move_folder_into_itself_doesnt_crash() {
function test_moving_folder_with_children (line 3330) | async fn test_moving_folder_with_children() {
function test_moving_layers_retains_transforms (line 3372) | async fn test_moving_layers_retains_transforms() {
FILE: editor/src/messages/portfolio/document/graph_operation/graph_operation_message.rs
type GraphOperationMessage (line 20) | pub enum GraphOperationMessage {
FILE: editor/src/messages/portfolio/document/graph_operation/graph_operation_message_handler.rs
type GraphOperationMessageContext (line 20) | pub struct GraphOperationMessageContext<'a> {
type GraphOperationMessageHandler (line 27) | pub struct GraphOperationMessageHandler {}
method process_message (line 33) | fn process_message(&mut self, message: GraphOperationMessage, response...
method actions (line 355) | fn actions(&self) -> ActionList {
type ArtboardInfo (line 361) | struct ArtboardInfo {
function usvg_color (line 367) | fn usvg_color(c: usvg::Color, a: f32) -> Color {
function usvg_transform (line 371) | fn usvg_transform(c: usvg::Transform) -> DAffine2 {
constant GRAPHITE_NAMESPACE (line 375) | const GRAPHITE_NAMESPACE: &str = "https://graphite.art";
function extract_graphite_gradient_stops (line 381) | fn extract_graphite_gradient_stops(svg: &str) -> HashMap<String, Gradien...
function parse_hex_stop_color (line 434) | fn parse_hex_stop_color(hex: &str, opacity: f32) -> Option<Color> {
function import_usvg_node (line 445) | fn import_usvg_node(
function apply_usvg_stroke (line 496) | fn apply_usvg_stroke(stroke: &usvg::Stroke, modify_inputs: &mut ModifyIn...
function apply_usvg_fill (line 522) | fn apply_usvg_fill(fill: &usvg::Fill, modify_inputs: &mut ModifyInputsCo...
FILE: editor/src/messages/portfolio/document/graph_operation/transform_utils.rs
function compute_scale_angle_translation_shear (line 9) | pub fn compute_scale_angle_translation_shear(transform: DAffine2) -> (DV...
function update_transform (line 34) | pub fn update_transform(network_interface: &mut NodeNetworkInterface, no...
type LayerBounds (line 47) | pub struct LayerBounds {
method new (line 55) | pub fn new(
method layerspace_pivot (line 66) | pub fn layerspace_pivot(&self, normalized_pivot: DVec2) -> DVec2 {
method local_pivot (line 70) | pub fn local_pivot(&self, normalized_pivot: DVec2) -> DVec2 {
function get_current_transform (line 76) | pub fn get_current_transform(inputs: &[NodeInput]) -> DAffine2 {
function get_current_normalized_pivot (line 93) | pub fn get_current_normalized_pivot(inputs: &[NodeInput]) -> DVec2 {
function clamp_bounds (line 98) | fn clamp_bounds(bounds_min: DVec2, mut bounds_max: DVec2) -> [DVec2; 2] {
function subpath_bounds (line 109) | fn subpath_bounds(subpaths: &[Subpath<PointId>]) -> [DVec2; 2] {
function nonzero_subpath_bounds (line 118) | pub fn nonzero_subpath_bounds(subpaths: &[Subpath<PointId>]) -> [DVec2; ...
function derive_transform (line 137) | fn derive_transform() {
FILE: editor/src/messages/portfolio/document/graph_operation/utility_types.rs
type TransformIn (line 23) | pub enum TransformIn {
type ModifyInputsContext (line 31) | pub struct ModifyInputsContext<'a> {
function new (line 40) | pub fn new(network_interface: &'a mut NodeNetworkInterface, responses: &...
function new_with_layer (line 48) | pub fn new_with_layer(layer: LayerNodeIdentifier, network_interface: &'a...
function get_post_node_with_index (line 70) | pub fn get_post_node_with_index(network_interface: &NodeNetworkInterface...
function create_layer (line 125) | pub fn create_layer(&mut self, new_id: NodeId) -> LayerNodeIdentifier {
function create_artboard (line 132) | pub fn create_artboard(&mut self, new_id: NodeId, artboard: Artboard) ->...
function insert_boolean_data (line 145) | pub fn insert_boolean_data(&mut self, operation: graphene_std::vector::m...
function insert_vector (line 156) | pub fn insert_vector(&mut self, subpaths: Vec<Subpath<PointId>>, layer: ...
function insert_text (line 192) | pub fn insert_text(&mut self, text: String, font: Font, typesetting: Typ...
function insert_image_data (line 234) | pub fn insert_image_data(&mut self, image_frame: Table<Raster<CPU>>, lay...
function get_output_layer (line 249) | fn get_output_layer(&self) -> Option<LayerNodeIdentifier> {
function existing_network_node_id (line 261) | pub fn existing_network_node_id(&mut self, reference: &str, create_if_no...
function existing_proto_node_id (line 266) | pub fn existing_proto_node_id(&mut self, reference: ProtoNodeIdentifier,...
function existing_node_id (line 271) | fn existing_node_id(&mut self, reference: &DefinitionIdentifier, create_...
function locate_node_in_layer_chain (line 288) | pub fn locate_node_in_layer_chain(reference: &DefinitionIdentifier, left...
function create_node (line 313) | pub fn create_node(&mut self, reference: &DefinitionIdentifier) -> Optio...
function fill_set (line 340) | pub fn fill_set(&mut self, fill: Fill) {
function blend_mode_set (line 366) | pub fn blend_mode_set(&mut self, blend_mode: BlendMode) {
function opacity_set (line 374) | pub fn opacity_set(&mut self, opacity: f64) {
function blending_fill_set (line 382) | pub fn blending_fill_set(&mut self, fill: f64) {
function clip_mode_toggle (line 390) | pub fn clip_mode_toggle(&mut self, clip_mode: Option<bool>) {
function stroke_set (line 399) | pub fn stroke_set(&mut self, stroke: Stroke) {
function transform_change_with_parent (line 428) | pub fn transform_change_with_parent(&mut self, transform: DAffine2, tran...
function transform_set (line 453) | pub fn transform_set(&mut self, transform: DAffine2, transform_in: Trans...
function transform_set_direct (line 470) | pub fn transform_set_direct(&mut self, transform: DAffine2, skip_rerende...
function vector_modify (line 495) | pub fn vector_modify(&mut self, modification_type: VectorModificationTyp...
function brush_modify (line 504) | pub fn brush_modify(&mut self, strokes: Vec<BrushStroke>) {
function resize_artboard (line 511) | pub fn resize_artboard(&mut self, location: IVec2, dimensions: IVec2) {
function set_input_with_refresh (line 532) | pub fn set_input_with_refresh(&mut self, input_connector: InputConnector...
FILE: editor/src/messages/portfolio/document/navigation/navigation_message.rs
type NavigationMessage (line 7) | pub enum NavigationMessage {
FILE: editor/src/messages/portfolio/document/navigation/navigation_message_handler.rs
type NavigationMessageContext (line 18) | pub struct NavigationMessageContext<'a> {
type NavigationMessageHandler (line 29) | pub struct NavigationMessageHandler {
method process_message (line 38) | fn process_message(&mut self, message: NavigationMessage, responses: &...
method actions (line 487) | fn actions(&self) -> ActionList {
method snapped_tilt (line 524) | pub fn snapped_tilt(&self, tilt: f64) -> f64 {
method snapped_zoom (line 533) | pub fn snapped_zoom(&self, zoom: f64) -> f64 {
method calculate_offset_transform (line 537) | pub fn calculate_offset_transform(&self, viewport_center: DVec2, ptz: ...
method center_zoom (line 557) | pub fn center_zoom(&self, viewport_bounds: DVec2, zoom_factor: f64, mo...
method clamp_zoom (line 565) | pub fn clamp_zoom(zoom: f64, document_bounds: Option<[DVec2; 2]>, old_...
function snapped_zoom (line 577) | pub fn snapped_zoom(navigation_operation: &NavigationOperation, zoom: f6...
FILE: editor/src/messages/portfolio/document/navigation/utility_types.rs
type NavigationOperation (line 4) | pub enum NavigationOperation {
FILE: editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs
type NodePropertiesContext (line 31) | pub struct NodePropertiesContext<'a> {
function call_widget_override (line 41) | pub fn call_widget_override(&mut self, node_id: &NodeId, index: usize) -...
type DefinitionIdentifier (line 63) | pub enum DefinitionIdentifier {
method implementation_name_from_identifier (line 69) | pub fn implementation_name_from_identifier(&self) -> String {
method serialized (line 85) | pub fn serialized(&self) -> String {
method from (line 94) | fn from(value: Value) -> Self {
type DocumentNodeDefinition (line 107) | pub struct DocumentNodeDefinition {
method node_template_input_override (line 2645) | pub fn node_template_input_override(&self, input_override: impl IntoIt...
method default_node_template (line 2717) | pub fn default_node_template(&self) -> NodeTemplate {
function document_node_definitions (line 134) | fn document_node_definitions() -> HashMap<DefinitionIdentifier, Document...
type NodeProperties (line 2079) | type NodeProperties = HashMap<String, Box<dyn Fn(NodeId, &mut NodeProper...
function static_node_properties (line 2085) | fn static_node_properties() -> NodeProperties {
type InputProperties (line 2106) | type InputProperties = HashMap<String, Box<dyn Fn(NodeId, usize, &mut No...
function static_input_properties (line 2112) | fn static_input_properties() -> InputProperties {
function resolve_network_node_type (line 2592) | pub fn resolve_network_node_type(identifier: &str) -> Option<&'static Do...
function resolve_proto_node_type (line 2596) | pub fn resolve_proto_node_type(identifier: ProtoNodeIdentifier) -> Optio...
function resolve_document_node_type (line 2600) | pub fn resolve_document_node_type(identifier: &DefinitionIdentifier) -> ...
function collect_node_types (line 2604) | pub fn collect_node_types() -> Vec<FrontendNodeType> {
function collect_node_descriptions (line 2630) | pub fn collect_node_descriptions() -> Vec<(String, String)> {
FILE: editor/src/messages/portfolio/document/node_graph/document_node_definitions/document_node_derive.rs
function post_process_nodes (line 9) | pub(super) fn post_process_nodes(custom: Vec<DocumentNodeDefinition>) ->...
function traverse_node (line 113) | fn traverse_node(node: &DocumentNode, node_metadata: &mut DocumentNodePe...
FILE: editor/src/messages/portfolio/document/node_graph/node_graph_message.rs
type NodeGraphMessage (line 15) | pub enum NodeGraphMessage {
FILE: editor/src/messages/portfolio/document/node_graph/node_graph_message_handler.rs
type NodeGraphMessageContext (line 38) | pub struct NodeGraphMessageContext<'a> {
type NodeGraphMessageHandler (line 54) | pub struct NodeGraphMessageHandler {
method process_message (line 108) | fn process_message(&mut self, message: NodeGraphMessage, responses: &m...
method actions (line 2112) | fn actions(&self) -> ActionList {
method actions_additional_if_node_graph_is_open (line 2120) | pub fn actions_additional_if_node_graph_is_open(&self) -> ActionList {
method send_node_bar_layout (line 2147) | fn send_node_bar_layout(&self, responses: &mut VecDeque<Message>) {
method update_graph_bar_left (line 2155) | fn update_graph_bar_left(&mut self, network_interface: &mut NodeNetwor...
method update_graph_bar_right (line 2329) | fn update_graph_bar_right(
method collate_properties (line 2372) | pub fn collate_properties(context: &mut NodePropertiesContext) -> Vec<...
method collect_wires (line 2550) | fn collect_wires(&mut self, network_interface: &mut NodeNetworkInterfa...
method collect_nodes (line 2585) | fn collect_nodes(&self, network_interface: &mut NodeNetworkInterface, ...
method collect_subgraph_names (line 2658) | fn collect_subgraph_names(network_interface: &mut NodeNetworkInterface...
method node_graph_error (line 2673) | fn node_graph_error(&self, network_interface: &mut NodeNetworkInterfac...
method update_layer_panel (line 2697) | fn update_layer_panel(network_interface: &NodeNetworkInterface, select...
method update_node_graph_hints (line 2786) | fn update_node_graph_hints(&self, responses: &mut VecDeque<Message>) {
method default (line 2835) | fn default() -> Self {
method eq (line 2867) | fn eq(&self, other: &Self) -> bool {
FILE: editor/src/messages/portfolio/document/node_graph/node_properties.rs
function string_properties (line 32) | pub(crate) fn string_properties(text: &str) -> Vec<LayoutGroup> {
function optionally_update_value (line 37) | fn optionally_update_value<T>(value: impl Fn(&T) -> Option<TaggedValue> ...
function update_value (line 44) | pub fn update_value<T>(value: impl Fn(&T) -> TaggedValue + 'static + Sen...
function commit_value (line 48) | pub fn commit_value<T>(_: &T) -> Message {
function expose_widget (line 52) | pub fn expose_widget(node_id: NodeId, index: usize, data_type: FrontendG...
function add_blank_assist (line 73) | pub fn add_blank_assist(widgets: &mut Vec<WidgetInstance>) {
function jump_to_source_widget (line 82) | pub fn jump_to_source_widget(input: &NodeInput, network_interface: &Node...
function start_widgets (line 105) | pub fn start_widgets(parameter_widgets_info: ParameterWidgetsInfo) -> Ve...
function property_from_type (line 152) | pub(crate) fn property_from_type(
function text_widget (line 301) | pub fn text_widget(parameter_widgets_info: ParameterWidgetsInfo) -> Vec<...
function text_area_widget (line 323) | pub fn text_area_widget(parameter_widgets_info: ParameterWidgetsInfo) ->...
function bool_widget (line 345) | pub fn bool_widget(parameter_widgets_info: ParameterWidgetsInfo, checkbo...
function reference_point_widget (line 368) | pub fn reference_point_widget(parameter_widgets_info: ParameterWidgetsIn...
function footprint_widget (line 399) | pub fn footprint_widget(parameter_widgets_info: ParameterWidgetsInfo, ex...
function transform_widget (line 547) | pub fn transform_widget(parameter_widgets_info: ParameterWidgetsInfo, ex...
function vec2_widget (line 663) | pub fn vec2_widget(parameter_widgets_info: ParameterWidgetsInfo, x: &str...
function array_of_number_widget (line 728) | pub fn array_of_number_widget(parameter_widgets_info: ParameterWidgetsIn...
function array_of_vec2_widget (line 760) | pub fn array_of_vec2_widget(parameter_widgets_info: ParameterWidgetsInfo...
function font_inputs (line 792) | pub fn font_inputs(parameter_widgets_info: ParameterWidgetsInfo) -> (Vec...
function progression_widget (line 935) | pub fn progression_widget(parameter_widgets_info: ParameterWidgetsInfo, ...
function optional_f64_widget (line 979) | pub fn optional_f64_widget(parameter_widgets_info: ParameterWidgetsInfo,...
function number_widget (line 1021) | pub fn number_widget(parameter_widgets_info: ParameterWidgetsInfo, numbe...
function blend_mode_widget (line 1089) | pub fn blend_mode_widget(parameter_widgets_info: ParameterWidgetsInfo) -...
function color_widget (line 1124) | pub fn color_widget(parameter_widgets_info: ParameterWidgetsInfo, color_...
function font_widget (line 1174) | pub fn font_widget(parameter_widgets_info: ParameterWidgetsInfo) -> Layo...
function curve_widget (line 1179) | pub fn curve_widget(parameter_widgets_info: ParameterWidgetsInfo) -> Lay...
function get_document_node (line 1201) | pub fn get_document_node<'a>(node_id: NodeId, context: &'a NodePropertie...
function query_node_and_input_info (line 1209) | pub fn query_node_and_input_info<'a>(node_id: NodeId, input_index: usize...
function query_noise_pattern_state (line 1216) | pub fn query_noise_pattern_state(node_id: NodeId, context: &NodeProperti...
function query_assign_colors_randomize (line 1248) | pub fn query_assign_colors_randomize(node_id: NodeId, context: &NodeProp...
function brightness_contrast_properties (line 1259) | pub(crate) fn brightness_contrast_properties(node_id: NodeId, context: &...
function channel_mixer_properties (line 1310) | pub(crate) fn channel_mixer_properties(node_id: NodeId, context: &mut No...
function selective_color_properties (line 1363) | pub(crate) fn selective_color_properties(node_id: NodeId, context: &mut ...
function grid_properties (line 1421) | pub(crate) fn grid_properties(node_id: NodeId, context: &mut NodePropert...
function spiral_properties (line 1466) | pub(crate) fn spiral_properties(node_id: NodeId, context: &mut NodePrope...
constant SAMPLE_POLYLINE_DESCRIPTION_SPACING (line 1530) | pub(crate) const SAMPLE_POLYLINE_DESCRIPTION_SPACING: &str = "Use a poin...
constant SAMPLE_POLYLINE_DESCRIPTION_SEPARATION (line 1531) | pub(crate) const SAMPLE_POLYLINE_DESCRIPTION_SEPARATION: &str = "Distanc...
constant SAMPLE_POLYLINE_DESCRIPTION_QUANTITY (line 1532) | pub(crate) const SAMPLE_POLYLINE_DESCRIPTION_QUANTITY: &str = "Number of...
constant SAMPLE_POLYLINE_DESCRIPTION_START_OFFSET (line 1533) | pub(crate) const SAMPLE_POLYLINE_DESCRIPTION_START_OFFSET: &str = "Exclu...
constant SAMPLE_POLYLINE_DESCRIPTION_STOP_OFFSET (line 1534) | pub(crate) const SAMPLE_POLYLINE_DESCRIPTION_STOP_OFFSET: &str = "Exclud...
constant SAMPLE_POLYLINE_DESCRIPTION_ADAPTIVE_SPACING (line 1535) | pub(crate) const SAMPLE_POLYLINE_DESCRIPTION_ADAPTIVE_SPACING: &str = "R...
function sample_polyline_properties (line 1537) | pub(crate) fn sample_polyline_properties(node_id: NodeId, context: &mut ...
function exposure_properties (line 1576) | pub(crate) fn exposure_properties(node_id: NodeId, context: &mut NodePro...
function rectangle_properties (line 1589) | pub(crate) fn rectangle_properties(node_id: NodeId, context: &mut NodePr...
function node_no_properties (line 1718) | pub(crate) fn node_no_properties(node_id: NodeId, context: &mut NodeProp...
function generate_node_properties (line 1727) | pub(crate) fn generate_node_properties(node_id: NodeId, context: &mut No...
function fill_properties (line 1817) | pub(crate) fn fill_properties(node_id: NodeId, context: &mut NodePropert...
function stroke_properties (line 1998) | pub fn stroke_properties(node_id: NodeId, context: &mut NodePropertiesCo...
function offset_path_properties (line 2061) | pub fn offset_path_properties(node_id: NodeId, context: &mut NodePropert...
function math_properties (line 2090) | pub fn math_properties(node_id: NodeId, context: &mut NodePropertiesCont...
type ParameterWidgetsInfo (line 2145) | pub struct ParameterWidgetsInfo<'a> {
function new (line 2160) | pub fn new(node_id: NodeId, index: usize, blank_assist: bool, context: &...
function is_exposed (line 2183) | pub fn is_exposed(&self) -> bool {
type WidgetFactory (line 2195) | pub trait WidgetFactory {
method disabled (line 2198) | fn disabled(self, disabled: bool) -> Self;
method build (line 2200) | fn build<U, C>(&self, current: Self::Value, updater_factory: impl Fn()...
method description (line 2205) | fn description(&self) -> Option<&str>;
type Value (line 2284) | type Value = E;
method disabled (line 2286) | fn disabled(self, disabled: bool) -> Self {
method description (line 2290) | fn description(&self) -> Option<&str> {
method build (line 2294) | fn build<U, C>(&self, current: Self::Value, updater_factory: impl Fn()...
function enum_choice (line 2208) | pub fn enum_choice<E: ChoiceTypeStatic>() -> EnumChoice<E> {
type EnumChoice (line 2215) | pub struct EnumChoice<E> {
function for_socket (line 2221) | pub fn for_socket(self, parameter_info: ParameterWidgetsInfo) -> ForSock...
function for_value (line 2226) | pub fn for_value(self, _current: E) -> ForValue<Self> {
function disabled (line 2230) | pub fn disabled(self, disabled: bool) -> Self {
function into_menu_entries (line 2235) | pub fn into_menu_entries(self, _action: impl Fn(E) -> Message + 'static ...
function dropdown_menu (line 2239) | fn dropdown_menu<U, C>(&self, current: E, updater_factory: impl Fn() -> ...
function radio_buttons (line 2260) | fn radio_buttons<U, C>(&self, current: E, updater_factory: impl Fn() -> ...
type ForSocket (line 2306) | pub struct ForSocket<'p, W> {
function disabled (line 2318) | pub fn disabled(self, disabled: bool) -> Self {
function property_row (line 2325) | pub fn property_row(self) -> LayoutGroup {
type ForValue (line 2356) | pub struct ForValue<W>(PhantomData<W>);
FILE: editor/src/messages/portfolio/document/node_graph/utility_types.rs
type FrontendGraphDataType (line 7) | pub enum FrontendGraphDataType {
method from_type (line 22) | pub fn from_type(input: &Type) -> Self {
type FrontendGraphInput (line 47) | pub struct FrontendGraphInput {
type FrontendGraphOutput (line 63) | pub struct FrontendGraphOutput {
type FrontendNode (line 78) | pub struct FrontendNode {
type FrontendNodeType (line 109) | pub struct FrontendNodeType {
type DragStart (line 119) | pub struct DragStart {
type BoxSelection (line 128) | pub struct BoxSelection {
type ContextMenuData (line 142) | pub enum ContextMenuData {
type ContextMenuInformation (line 163) | pub struct ContextMenuInformation {
type NodeGraphErrorDiagnostic (line 173) | pub struct NodeGraphErrorDiagnostic {
type FrontendClickTargets (line 180) | pub struct FrontendClickTargets {
type Direction (line 197) | pub enum Direction {
FILE: editor/src/messages/portfolio/document/overlays/grid_overlays.rs
function grid_overlay_rectangular (line 10) | fn grid_overlay_rectangular(document: &DocumentMessageHandler, overlay_c...
function grid_overlay_rectangular_dot (line 51) | fn grid_overlay_rectangular_dot(document: &DocumentMessageHandler, overl...
function grid_overlay_isometric (line 88) | fn grid_overlay_isometric(document: &DocumentMessageHandler, overlay_con...
function grid_overlay_isometric_dot (line 133) | fn grid_overlay_isometric_dot(document: &DocumentMessageHandler, overlay...
function grid_overlay (line 185) | pub fn grid_overlay(document: &DocumentMessageHandler, overlay_context: ...
function overlay_options (line 204) | pub fn overlay_options(grid: &GridSnapping) -> Vec<LayoutGroup> {
FILE: editor/src/messages/portfolio/document/overlays/overlays_message.rs
type OverlaysMessage (line 7) | pub enum OverlaysMessage {
FILE: editor/src/messages/portfolio/document/overlays/overlays_message_handler.rs
type OverlaysMessageContext (line 5) | pub struct OverlaysMessageContext<'a> {
type OverlaysMessageHandler (line 11) | pub struct OverlaysMessageHandler {
method process_message (line 21) | fn process_message(&mut self, message: OverlaysMessage, responses: &mu...
FILE: editor/src/messages/portfolio/document/overlays/utility_functions.rs
function overlay_canvas_element (line 16) | pub fn overlay_canvas_element() -> Option<web_sys::HtmlCanvasElement> {
function overlay_canvas_context (line 23) | pub fn overlay_canvas_context() -> web_sys::CanvasRenderingContext2d {
function selected_segments (line 31) | pub fn selected_segments(network_interface: &NodeNetworkInterface, shape...
function selected_segments_for_layer (line 44) | pub fn selected_segments_for_layer(vector: &Vector, state: &SelectedLaye...
function overlay_bezier_handles (line 68) | fn overlay_bezier_handles(bezier: Bezier, segment_id: SegmentId, transfo...
function overlay_bezier_handle_specific_point (line 92) | fn overlay_bezier_handle_specific_point(
function path_overlays (line 126) | pub fn path_overlays(document: &DocumentMessageHandler, draw_handles: Dr...
function path_endpoint_overlays (line 200) | pub fn path_endpoint_overlays(document: &DocumentMessageHandler, shape_e...
constant FONT_DATA (line 225) | const FONT_DATA: &[u8] = include_bytes!("source-sans-pro-regular.ttf");
function text_width (line 233) | pub fn text_width(text: &str, font_size: f64) -> f64 {
function hex_to_rgba_u8 (line 253) | pub fn hex_to_rgba_u8(hex: &str) -> [u8; 4] {
FILE: editor/src/messages/portfolio/document/overlays/utility_types_native.rs
type OverlayProvider (line 28) | pub type OverlayProvider = fn(OverlayContext) -> Message;
function empty_provider (line 31) | pub fn empty_provider() -> OverlayProvider {
type GizmoEmphasis (line 37) | pub enum GizmoEmphasis {
type OverlaysType (line 47) | pub enum OverlaysType {
type OverlaysVisibilitySettings (line 67) | pub struct OverlaysVisibilitySettings {
method all (line 108) | pub fn all(&self) -> bool {
method artboard_name (line 112) | pub fn artboard_name(&self) -> bool {
method compass_rose (line 116) | pub fn compass_rose(&self) -> bool {
method quick_measurement (line 120) | pub fn quick_measurement(&self) -> bool {
method transform_measurement (line 124) | pub fn transform_measurement(&self) -> bool {
method transform_cage (line 128) | pub fn transform_cage(&self) -> bool {
method hover_outline (line 132) | pub fn hover_outline(&self) -> bool {
method selection_outline (line 136) | pub fn selection_outline(&self) -> bool {
method layer_origin_cross (line 140) | pub fn layer_origin_cross(&self) -> bool {
method pivot (line 144) | pub fn pivot(&self) -> bool {
method origin (line 148) | pub fn origin(&self) -> bool {
method path (line 152) | pub fn path(&self) -> bool {
method anchors (line 156) | pub fn anchors(&self) -> bool {
method handles (line 160) | pub fn handles(&self) -> bool {
method default (line 86) | fn default() -> Self {
type OverlayContext (line 167) | pub struct OverlayContext {
method fmt (line 196) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
method hash (line 218) | fn hash<H: std::hash::Hasher>(&self, _state: &mut H) {}
method new (line 223) | pub(super) fn new(viewport: ViewportMessageHandler, visibility_setting...
method take_scene (line 231) | pub fn take_scene(self) -> Scene {
method internal (line 236) | fn internal(&'_ self) -> MutexGuard<'_, OverlayContextInternal> {
method quad (line 240) | pub fn quad(&mut self, quad: Quad, stroke_color: Option<&str>, color_f...
method draw_triangle (line 244) | pub fn draw_triangle(&mut self, base: DVec2, direction: DVec2, size: f...
method dashed_quad (line 248) | pub fn dashed_quad(&mut self, quad: Quad, stroke_color: Option<&str>, ...
method polygon (line 252) | pub fn polygon(&mut self, polygon: &[DVec2], stroke_color: Option<&str...
method dashed_polygon (line 256) | pub fn dashed_polygon(&mut self, polygon: &[DVec2], stroke_color: Opti...
method line (line 260) | pub fn line(&mut self, start: DVec2, end: DVec2, color: Option<&str>, ...
method dashed_line (line 265) | pub fn dashed_line(&mut self, start: DVec2, end: DVec2, color: Option<...
method hover_manipulator_handle (line 269) | pub fn hover_manipulator_handle(&mut self, position: DVec2, selected: ...
method hover_manipulator_anchor (line 273) | pub fn hover_manipulator_anchor(&mut self, position: DVec2, selected: ...
method manipulator_handle (line 277) | pub fn manipulator_handle(&mut self, position: DVec2, selected: bool, ...
method manipulator_anchor (line 281) | pub fn manipulator_anchor(&mut self, position: DVec2, selected: bool, ...
method gradient_color_stop (line 285) | pub fn gradient_color_stop(&mut self, position: DVec2, emphasis: Gizmo...
method gradient_midpoint (line 289) | pub fn gradient_midpoint(&mut self, position: DVec2, emphasis: GizmoEm...
method resize_handle (line 293) | pub fn resize_handle(&mut self, position: DVec2, rotation: f64) {
method skew_handles (line 297) | pub fn skew_handles(&mut self, edge_start: DVec2, edge_end: DVec2) {
method square (line 301) | pub fn square(&mut self, position: DVec2, size: Option<f64>, color_fil...
method pixel (line 305) | pub fn pixel(&mut self, position: DVec2, color: Option<&str>) {
method circle (line 309) | pub fn circle(&mut self, position: DVec2, radius: f64, color_fill: Opt...
method dashed_ellipse (line 314) | pub fn dashed_ellipse(
method draw_arc (line 345) | pub fn draw_arc(&mut self, center: DVec2, radius: f64, start_from: f64...
method draw_arc_gizmo_angle (line 349) | pub fn draw_arc_gizmo_angle(&mut self, pivot: DVec2, bold_radius: f64,...
method draw_angle (line 353) | pub fn draw_angle(&mut self, pivot: DVec2, radius: f64, arc_radius: f6...
method draw_scale (line 357) | pub fn draw_scale(&mut self, start: DVec2, scale: f64, radius: f64, te...
method compass_rose (line 361) | pub fn compass_rose(&mut self, compass_center: DVec2, angle: f64, show...
method pivot (line 365) | pub fn pivot(&mut self, position: DVec2, angle: f64) {
method dowel_pin (line 369) | pub fn dowel_pin(&mut self, position: DVec2, angle: f64, color: Option...
method arc_sweep_angle (line 374) | pub fn arc_sweep_angle(&mut self, offset_angle: f64, angle: f64, end_p...
method outline_vector (line 379) | pub fn outline_vector(&mut self, vector: &Vector, transform: DAffine2) {
method outline_bezier (line 384) | pub fn outline_bezier(&mut self, bezier: PathSeg, transform: DAffine2) {
method outline_select_bezier (line 389) | pub fn outline_select_bezier(&mut self, bezier: PathSeg, transform: DA...
method outline_overlay_bezier (line 393) | pub fn outline_overlay_bezier(&mut self, bezier: PathSeg, transform: D...
method outline (line 398) | pub fn outline(&mut self, target_types: impl Iterator<Item = impl Borr...
method fill_path (line 404) | pub fn fill_path(&mut self, subpaths: impl Iterator<Item = impl Borrow...
method fill_path_pattern (line 410) | pub fn fill_path_pattern(&mut self, subpaths: impl Iterator<Item = imp...
method text (line 414) | pub fn text(&self, text: &str, font_color: &str, background_color: Opt...
method translation_box (line 419) | pub fn translation_box(&mut self, translation: DVec2, quad: Quad, type...
method clone (line 176) | fn clone(&self) -> Self {
method eq (line 190) | fn eq(&self, other: &Self) -> bool {
method default (line 207) | fn default() -> Self {
type Pivot (line 425) | pub enum Pivot {
type DrawHandles (line 432) | pub enum DrawHandles {
type OverlayContextInternal (line 439) | pub(super) struct OverlayContextInternal {
method new (line 452) | pub(super) fn new(viewport: ViewportMessageHandler, visibility_setting...
method parse_color (line 460) | fn parse_color(color: &str) -> peniko::Color {
method quad (line 465) | fn quad(&mut self, quad: Quad, stroke_color: Option<&str>, color_fill:...
method draw_triangle (line 469) | fn draw_triangle(&mut self, base: DVec2, direction: DVec2, size: f64, ...
method dashed_quad (line 490) | fn dashed_quad(&mut self, quad: Quad, stroke_color: Option<&str>, colo...
method polygon (line 494) | fn polygon(&mut self, polygon: &[DVec2], stroke_color: Option<&str>, c...
method dashed_polygon (line 498) | fn dashed_polygon(&mut self, polygon: &[DVec2], stroke_color: Option<&...
method line (line 532) | fn line(&mut self, start: DVec2, end: DVec2, color: Option<&str>, thic...
method dashed_line (line 537) | fn dashed_line(&mut self, start: DVec2, end: DVec2, color: Option<&str...
method manipulator_handle (line 557) | fn manipulator_handle(&mut self, position: DVec2, selected: bool, colo...
method hover_manipulator_handle (line 570) | fn hover_manipulator_handle(&mut self, position: DVec2, selected: bool) {
method manipulator_anchor (line 587) | fn manipulator_anchor(&mut self, position: DVec2, selected: bool, colo...
method hover_manipulator_anchor (line 593) | fn hover_manipulator_anchor(&mut self, position: DVec2, selected: bool) {
method gradient_color_stop (line 599) | fn gradient_color_stop(&mut self, position: DVec2, emphasis: GizmoEmph...
method gradient_midpoint (line 627) | fn gradient_midpoint(&mut self, position: DVec2, emphasis: GizmoEmphas...
method resize_handle (line 656) | fn resize_handle(&mut self, position: DVec2, rotation: f64) {
method skew_handles (line 661) | fn skew_handles(&mut self, edge_start: DVec2, edge_end: DVec2) {
method get_transform (line 670) | fn get_transform(&self) -> kurbo::Affine {
method square (line 674) | fn square(&mut self, position: DVec2, size: Option<f64>, color_fill: O...
method pixel (line 690) | fn pixel(&mut self, position: DVec2, color: Option<&str>) {
method circle (line 703) | fn circle(&mut self, position: DVec2, radius: f64, color_fill: Option<...
method dashed_ellipse (line 717) | fn dashed_ellipse(
method draw_arc (line 734) | fn draw_arc(&mut self, center: DVec2, radius: f64, start_from: f64, en...
method draw_arc_gizmo_angle (line 768) | fn draw_arc_gizmo_angle(&mut self, pivot: DVec2, bold_radius: f64, arc...
method draw_angle (line 774) | fn draw_angle(&mut self, pivot: DVec2, radius: f64, arc_radius: f64, o...
method draw_scale (line 782) | pub fn draw_scale(&mut self, start: DVec2, scale: f64, radius: f64, te...
method compass_rose (line 798) | fn compass_rose(&mut self, compass_center: DVec2, angle: f64, show_com...
method pivot (line 851) | fn pivot(&mut self, position: DVec2, angle: f64) {
method dowel_pin (line 882) | fn dowel_pin(&mut self, position: DVec2, angle: f64, color: Option<&st...
method arc_sweep_angle (line 922) | fn arc_sweep_angle(&mut self, offset_angle: f64, angle: f64, end_point...
method outline_vector (line 929) | fn outline_vector(&mut self, vector: &Vector, transform: DAffine2) {
method outline_bezier (line 945) | fn outline_bezier(&mut self, bezier: PathSeg, transform: DAffine2) {
method outline_select_bezier (line 954) | fn outline_select_bezier(&mut self, bezier: PathSeg, transform: DAffin...
method outline_overlay_bezier (line 962) | fn outline_overlay_bezier(&mut self, bezier: PathSeg, transform: DAffi...
method bezier_to_path (line 970) | fn bezier_to_path(&self, bezier: PathSeg, transform: DAffine2, move_to...
method push_path (line 978) | fn push_path(&mut self, subpaths: impl Iterator<Item = impl Borrow<Sub...
method outline (line 1028) | fn outline(&mut self, target_types: impl Iterator<Item = impl Borrow<C...
method fill_path (line 1050) | fn fill_path(&mut self, subpaths: impl Iterator<Item = impl Borrow<Sub...
method fill_path_pattern (line 1058) | fn fill_path_pattern(&mut self, subpaths: impl Iterator<Item = impl Bo...
method text (line 1101) | fn text(&mut self, text: &str, font_color: &str, background_color: Opt...
method render_text_paths (line 1166) | fn render_text_paths(&mut self, text_table: &Table<Vector>, font_color...
method translation_box (line 1186) | fn translation_box(&mut self, translation: DVec2, quad: Quad, typed_st...
method snap_to_physical_pixel (line 1216) | fn snap_to_physical_pixel(&self, p: DVec2) -> DVec2 {
method snap_to_physical_pixel_center (line 1224) | fn snap_to_physical_pixel_center(&self, p: DVec2) -> DVec2 {
method default (line 446) | fn default() -> Self {
FILE: editor/src/messages/portfolio/document/overlays/utility_types_web.rs
type OverlayProvider (line 24) | pub type OverlayProvider = fn(OverlayContext) -> Message;
function empty_provider (line 26) | pub fn empty_provider() -> OverlayProvider {
type GizmoEmphasis (line 31) | pub enum GizmoEmphasis {
type OverlaysType (line 40) | pub enum OverlaysType {
type OverlaysVisibilitySettings (line 59) | pub struct OverlaysVisibilitySettings {
method all (line 98) | pub fn all(&self) -> bool {
method artboard_name (line 102) | pub fn artboard_name(&self) -> bool {
method compass_rose (line 106) | pub fn compass_rose(&self) -> bool {
method quick_measurement (line 110) | pub fn quick_measurement(&self) -> bool {
method transform_measurement (line 114) | pub fn transform_measurement(&self) -> bool {
method transform_cage (line 118) | pub fn transform_cage(&self) -> bool {
method hover_outline (line 122) | pub fn hover_outline(&self) -> bool {
method selection_outline (line 126) | pub fn selection_outline(&self) -> bool {
method layer_origin_cross (line 130) | pub fn layer_origin_cross(&self) -> bool {
method pivot (line 134) | pub fn pivot(&self) -> bool {
method origin (line 138) | pub fn origin(&self) -> bool {
method path (line 142) | pub fn path(&self) -> bool {
method anchors (line 146) | pub fn anchors(&self) -> bool {
method handles (line 150) | pub fn handles(&self) -> bool {
method default (line 77) | fn default() -> Self {
type OverlayContext (line 157) | pub struct OverlayContext {
method hash (line 166) | fn hash<H: std::hash::Hasher>(&self, _state: &mut H) {}
method quad (line 170) | pub fn quad(&mut self, quad: Quad, stroke_color: Option<&str>, color_f...
method draw_triangle (line 174) | pub fn draw_triangle(&mut self, base: DVec2, direction: DVec2, size: f...
method dashed_quad (line 198) | pub fn dashed_quad(&mut self, quad: Quad, stroke_color: Option<&str>, ...
method polygon (line 202) | pub fn polygon(&mut self, polygon: &[DVec2], stroke_color: Option<&str...
method dashed_polygon (line 206) | pub fn dashed_polygon(&mut self, polygon: &[DVec2], stroke_color: Opti...
method line (line 262) | pub fn line(&mut self, start: DVec2, end: DVec2, color: Option<&str>, ...
method dashed_line (line 267) | pub fn dashed_line(&mut self, start: DVec2, end: DVec2, color: Option<...
method dashed_ellipse (line 315) | pub fn dashed_ellipse(
method dashed_circle (line 388) | pub fn dashed_circle(
method circle (line 451) | pub fn circle(&mut self, position: DVec2, radius: f64, color_fill: Opt...
method manipulator_handle (line 455) | pub fn manipulator_handle(&mut self, position: DVec2, selected: bool, ...
method manipulator_anchor (line 474) | pub fn manipulator_anchor(&mut self, position: DVec2, selected: bool, ...
method gradient_color_stop (line 480) | pub fn gradient_color_stop(&mut self, position: DVec2, emphasis: Gizmo...
method gradient_midpoint (line 517) | pub fn gradient_midpoint(&mut self, position: DVec2, emphasis: GizmoEm...
method hover_manipulator_handle (line 553) | pub fn hover_manipulator_handle(&mut self, position: DVec2, selected: ...
method hover_manipulator_anchor (line 583) | pub fn hover_manipulator_anchor(&mut self, position: DVec2, selected: ...
method resize_handle (line 589) | pub fn resize_handle(&mut self, position: DVec2, rotation: f64) {
method skew_handles (line 594) | pub fn skew_handles(&mut self, edge_start: DVec2, edge_end: DVec2) {
method start_dpi_aware_transform (line 606) | fn start_dpi_aware_transform(&self) {
method end_dpi_aware_transform (line 616) | fn end_dpi_aware_transform(&self) {
method square (line 620) | pub fn square(&mut self, position: DVec2, size: Option<f64>, color_fil...
method pixel (line 641) | pub fn pixel(&mut self, position: DVec2, color: Option<&str>) {
method draw_arc (line 658) | pub fn draw_arc(&mut self, center: DVec2, radius: f64, start_from: f64...
method draw_arc_gizmo_angle (line 686) | pub fn draw_arc_gizmo_angle(&mut self, pivot: DVec2, bold_radius: f64,...
method draw_angle (line 692) | pub fn draw_angle(&mut self, pivot: DVec2, radius: f64, arc_radius: f6...
method draw_scale (line 700) | pub fn draw_scale(&mut self, start: DVec2, scale: f64, radius: f64, te...
method compass_rose (line 716) | pub fn compass_rose(&mut self, compass_center: DVec2, angle: f64, show...
method pivot (line 782) | pub fn pivot(&mut self, position: DVec2, angle: f64) {
method dowel_pin (line 818) | pub fn dowel_pin(&mut self, position: DVec2, angle: f64, color: Option...
method arc_sweep_angle (line 848) | pub fn arc_sweep_angle(&mut self, offset_angle: f64, angle: f64, end_p...
method outline_vector (line 855) | pub fn outline_vector(&mut self, vector: &Vector, transform: DAffine2) {
method outline_bezier (line 874) | pub fn outline_bezier(&mut self, bezier: PathSeg, transform: DAffine2) {
method outline_select_bezier (line 886) | pub fn outline_select_bezier(&mut self, bezier: PathSeg, transform: DA...
method outline_overlay_bezier (line 900) | pub fn outline_overlay_bezier(&mut self, bezier: PathSeg, transform: D...
method bezier_command (line 914) | fn bezier_command(&self, bezier: PathSeg, transform: DAffine2, move_to...
method push_path (line 931) | fn push_path(&mut self, subpaths: impl Iterator<Item = impl Borrow<Sub...
method outline (line 981) | pub fn outline(&mut self, target_types: impl Iterator<Item = impl Borr...
method fill_path (line 1003) | pub fn fill_path(&mut self, subpaths: impl Iterator<Item = impl Borrow...
method fill_path_pattern (line 1012) | pub fn fill_path_pattern(&mut self, subpaths: impl Iterator<Item = imp...
method text (line 1051) | pub fn text(&self, text: &str, font_color: &str, background_color: Opt...
method translation_box (line 1083) | pub fn translation_box(&mut self, translation: DVec2, quad: Quad, type...
type Pivot (line 1114) | pub enum Pivot {
type DrawHandles (line 1120) | pub enum DrawHandles {
FILE: editor/src/messages/portfolio/document/properties_panel/properties_panel_message.rs
type PropertiesPanelMessage (line 5) | pub enum PropertiesPanelMessage {
FILE: editor/src/messages/portfolio/document/properties_panel/properties_panel_message_handler.rs
type PropertiesPanelMessageContext (line 11) | pub struct PropertiesPanelMessageContext<'a> {
type PropertiesPanelMessageHandler (line 21) | pub struct PropertiesPanelMessageHandler {}
method process_message (line 25) | fn process_message(&mut self, message: PropertiesPanelMessage, respons...
method actions (line 66) | fn actions(&self) -> ActionList {
FILE: editor/src/messages/portfolio/document/utility_types/clipboards.rs
type Clipboard (line 7) | pub enum Clipboard {
constant INTERNAL_CLIPBOARD_COUNT (line 14) | pub const INTERNAL_CLIPBOARD_COUNT: u8 = Clipboard::_InternalClipboardCo...
type CopyBufferEntry (line 17) | pub struct CopyBufferEntry {
FILE: editor/src/messages/portfolio/document/utility_types/document_metadata.rs
type DocumentMetadata (line 25) | pub struct DocumentMetadata {
method all_layers (line 45) | pub fn all_layers(&self) -> DescendantsIter<'_> {
method layer_exists (line 49) | pub fn layer_exists(&self, layer: LayerNodeIdentifier) -> bool {
method click_targets (line 53) | pub fn click_targets(&self, layer: LayerNodeIdentifier) -> Option<&[Ar...
method get_relations (line 58) | fn get_relations(&self, node_identifier: LayerNodeIdentifier) -> Optio...
method get_structure_mut (line 63) | fn get_structure_mut(&mut self, node_identifier: LayerNodeIdentifier) ...
method transform_to_document (line 73) | pub fn transform_to_document(&self, layer: LayerNodeIdentifier) -> DAf...
method transform_to_viewport (line 77) | pub fn transform_to_viewport(&self, layer: LayerNodeIdentifier) -> DAf...
method transform_to_viewport_if_feeds (line 89) | pub fn transform_to_viewport_if_feeds(&self, layer: LayerNodeIdentifie...
method transform_to_document_if_feeds (line 114) | pub fn transform_to_document_if_feeds(&self, layer: LayerNodeIdentifie...
method transform_to_viewport_with_first_transform_node_if_group (line 118) | pub fn transform_to_viewport_with_first_transform_node_if_group(&self,...
method upstream_transform (line 131) | pub fn upstream_transform(&self, node_id: NodeId) -> DAffine2 {
method downstream_transform_to_document (line 135) | pub fn downstream_transform_to_document(&self, layer: LayerNodeIdentif...
method downstream_transform_to_viewport (line 139) | pub fn downstream_transform_to_viewport(&self, layer: LayerNodeIdentif...
method bounding_box_with_transform (line 158) | pub fn bounding_box_with_transform(&self, layer: LayerNodeIdentifier, ...
method loose_bounding_box_with_transform (line 166) | pub fn loose_bounding_box_with_transform(&self, layer: LayerNodeIdenti...
method nonzero_bounding_box (line 179) | pub fn nonzero_bounding_box(&self, layer: LayerNodeIdentifier) -> [DVe...
method bounding_box_document (line 198) | pub fn bounding_box_document(&self, layer: LayerNodeIdentifier) -> Opt...
method bounding_box_viewport (line 203) | pub fn bounding_box_viewport(&self, layer: LayerNodeIdentifier) -> Opt...
method document_bounds_viewport_space (line 208) | pub fn document_bounds_viewport_space(&self) -> Option<[DVec2; 2]> {
method layer_outline (line 212) | pub fn layer_outline(&self, layer: LayerNodeIdentifier) -> impl Iterat...
method layer_with_free_points_outline (line 221) | pub fn layer_with_free_points_outline(&self, layer: LayerNodeIdentifie...
method is_clip (line 227) | pub fn is_clip(&self, node: NodeId) -> bool {
type LayerNodeIdentifier (line 239) | pub struct LayerNodeIdentifier(NonZeroU64);
method fmt (line 242) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
constant ROOT_PARENT (line 257) | pub const ROOT_PARENT: Self = LayerNodeIdentifier::new_unchecked(NodeI...
method new_unchecked (line 260) | pub const fn new_unchecked(node_id: NodeId) -> Self {
method new (line 267) | pub fn new(node_id: NodeId, network_interface: &NodeNetworkInterface) ...
method to_node (line 273) | pub fn to_node(self) -> NodeId {
method parent (line 281) | pub fn parent(self, metadata: &DocumentMetadata) -> Option<LayerNodeId...
method previous_sibling (line 286) | pub fn previous_sibling(self, metadata: &DocumentMetadata) -> Option<L...
method next_sibling (line 291) | pub fn next_sibling(self, metadata: &DocumentMetadata) -> Option<Layer...
method first_child (line 296) | pub fn first_child(self, metadata: &DocumentMetadata) -> Option<LayerN...
method last_child (line 301) | pub fn last_child(self, metadata: &DocumentMetadata) -> Option<LayerNo...
method has_children (line 306) | pub fn has_children(self, metadata: &DocumentMetadata) -> bool {
method is_child_of (line 311) | pub fn is_child_of(self, metadata: &DocumentMetadata, parent: &LayerNo...
method is_ancestor_of (line 316) | pub fn is_ancestor_of(self, metadata: &DocumentMetadata, child: &Layer...
method can_be_clipped (line 321) | pub fn can_be_clipped(self, metadata: &DocumentMetadata) -> bool {
method children (line 327) | pub fn children(self, metadata: &DocumentMetadata) -> AxisIter<'_> {
method downstream_siblings (line 335) | pub fn downstream_siblings(self, metadata: &DocumentMetadata) -> AxisI...
method ancestors (line 344) | pub fn ancestors(self, metadata: &DocumentMetadata) -> AxisIter<'_> {
method last_children (line 353) | pub fn last_children(self, metadata: &DocumentMetadata) -> AxisIter<'_> {
method descendants (line 362) | pub fn descendants(self, metadata: &DocumentMetadata) -> DescendantsIt...
method push_front_child (line 371) | pub fn push_front_child(self, metadata: &mut DocumentMetadata, new: La...
method push_child (line 384) | pub fn push_child(self, metadata: &mut DocumentMetadata, new: LayerNod...
method add_before (line 397) | pub fn add_before(self, metadata: &mut DocumentMetadata, new: LayerNod...
method add_after (line 415) | pub fn add_after(self, metadata: &mut DocumentMetadata, new: LayerNode...
method delete (line 433) | pub fn delete(self, metadata: &mut DocumentMetadata) {
method exists (line 459) | pub fn exists(&self, metadata: &DocumentMetadata) -> bool {
method starts_with (line 463) | pub fn starts_with(&self, other: Self, metadata: &DocumentMetadata) ->...
method default (line 250) | fn default() -> Self {
type AxisIter (line 474) | pub struct AxisIter<'a> {
type Item (line 481) | type Item = LayerNodeIdentifier;
method next (line 483) | fn next(&mut self) -> Option<Self::Item> {
type DescendantsIter (line 495) | pub struct DescendantsIter<'a> {
type Item (line 502) | type Item = LayerNodeIdentifier;
method next (line 504) | fn next(&mut self) -> Option<Self::Item> {
method next_back (line 520) | fn next_back(&mut self) -> Option<Self::Item> {
type NodeRelations (line 543) | pub struct NodeRelations {
function test_tree (line 559) | fn test_tree() {
FILE: editor/src/messages/portfolio/document/utility_types/error.rs
type EditorError (line 6) | pub enum EditorError {
FILE: editor/src/messages/portfolio/document/utility_types/misc.rs
type DocumentId (line 8) | pub struct DocumentId(pub u64);
type FlipAxis (line 11) | pub enum FlipAxis {
type AlignAxis (line 18) | pub enum AlignAxis {
type AlignAggregate (line 25) | pub enum AlignAggregate {
type SnappingState (line 62) | pub struct SnappingState {
method target_enabled (line 87) | pub const fn target_enabled(&self, target: SnapTarget) -> bool {
method default (line 73) | fn default() -> Self {
type BoundingBoxSnapping (line 118) | pub struct BoundingBoxSnapping {
method default (line 127) | fn default() -> Self {
type PathSnapping (line 140) | pub struct PathSnapping {
method default (line 152) | fn default() -> Self {
type GridType (line 167) | pub enum GridType {
method rectangular_spacing (line 186) | pub fn rectangular_spacing(&mut self) -> Option<&mut DVec2> {
method isometric_y_spacing (line 192) | pub fn isometric_y_spacing(&mut self) -> Option<&mut f64> {
method angle_a (line 198) | pub fn angle_a(&mut self) -> Option<&mut f64> {
method angle_b (line 204) | pub fn angle_b(&mut self) -> Option<&mut f64> {
method default (line 180) | fn default() -> Self {
type GridSnapping (line 214) | pub struct GridSnapping {
method compute_rectangle_spacing (line 242) | pub fn compute_rectangle_spacing(mut size: DVec2, navigation: &PTZ) ->...
method compute_isometric_multiplier (line 256) | pub fn compute_isometric_multiplier(length: f64, divisor: f64, navigat...
method default (line 226) | fn default() -> Self {
type BoundingBoxSnapSource (line 272) | pub enum BoundingBoxSnapSource {
method fmt (line 279) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
type ArtboardSnapSource (line 289) | pub enum ArtboardSnapSource {
method fmt (line 295) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
type PathSnapSource (line 304) | pub enum PathSnapSource {
method fmt (line 326) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
type GradientSnapSource (line 313) | pub enum GradientSnapSource {
method fmt (line 318) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
type AlignmentSnapSource (line 337) | pub enum AlignmentSnapSource {
method fmt (line 346) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
type SnapSource (line 358) | pub enum SnapSource {
method is_some (line 369) | pub fn is_some(&self) -> bool {
method bounding_box (line 372) | pub fn bounding_box(&self) -> bool {
method align (line 375) | pub fn align(&self) -> bool {
method center (line 378) | pub fn center(&self) -> bool {
method fmt (line 389) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
type GetSnapState (line 401) | type GetSnapState = for<'a> fn(&'a mut SnappingState) -> &'a mut bool;
constant SNAP_FUNCTIONS_FOR_BOUNDING_BOXES (line 402) | pub const SNAP_FUNCTIONS_FOR_BOUNDING_BOXES: [(&str, GetSnapState, &str)...
constant SNAP_FUNCTIONS_FOR_PATHS (line 429) | pub const SNAP_FUNCTIONS_FOR_PATHS: [(&str, GetSnapState, &str); 7] = [
type BoundingBoxSnapTarget (line 475) | pub enum BoundingBoxSnapTarget {
method fmt (line 482) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
type PathSnapTarget (line 492) | pub enum PathSnapTarget {
method fmt (line 504) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
type ArtboardSnapTarget (line 518) | pub enum ArtboardSnapTarget {
method fmt (line 525) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
type GridSnapTarget (line 535) | pub enum GridSnapTarget {
method fmt (line 542) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
type AlignmentSnapTarget (line 552) | pub enum AlignmentSnapTarget {
method fmt (line 563) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
type DistributionSnapTarget (line 577) | pub enum DistributionSnapTarget {
method fmt (line 588) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
method is_x (line 602) | pub const fn is_x(&self) -> bool {
method is_y (line 605) | pub const fn is_y(&self) -> bool {
type SnapTarget (line 611) | pub enum SnapTarget {
method is_some (line 623) | pub fn is_some(&self) -> bool {
method bounding_box (line 626) | pub fn bounding_box(&self) -> bool {
method fmt (line 632) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
type SnappingOptions (line 646) | pub enum SnappingOptions {
method fmt (line 652) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
type PTZ (line 662) | pub struct PTZ {
method tilt (line 686) | pub fn tilt(&self) -> f64 {
method unmodified_tilt (line 690) | pub fn unmodified_tilt(&self) -> f64 {
method set_tilt (line 695) | pub fn set_tilt(&mut self, tilt: f64) {
method zoom (line 700) | pub fn zoom(&self) -> f64 {
method set_zoom (line 705) | pub fn set_zoom(&mut self, zoom: f64) {
method default (line 674) | fn default() -> Self {
type GroupFolderType (line 711) | pub enum GroupFolderType {
FILE: editor/src/messages/portfolio/document/utility_types/network_interface.rs
type NodeNetworkInterface (line 38) | pub struct NodeNetworkInterface {
method migrate_path_modify_node (line 75) | pub fn migrate_path_modify_node(&mut self) {
method document_network (line 96) | pub fn document_network(&self) -> &NodeNetwork {
method document_network_mut (line 99) | pub fn document_network_mut(&mut self) -> &mut NodeNetwork {
method nested_network (line 104) | pub fn nested_network(&self, network_path: &[NodeId]) -> Option<&NodeN...
method network_hash (line 112) | pub fn network_hash(&self) -> u64 {
method document_node (line 117) | pub fn document_node(&self, node_id: &NodeId, network_path: &[NodeId])...
method node_metadata (line 126) | pub fn node_metadata(&self, node_id: &NodeId, network_path: &[NodeId])...
method document_network_metadata (line 135) | pub fn document_network_metadata(&self) -> &NodeNetworkMetadata {
method network_metadata (line 140) | pub fn network_metadata(&self, network_path: &[NodeId]) -> Option<&Nod...
method document_metadata (line 148) | pub fn document_metadata(&self) -> &DocumentMetadata {
method transaction_status (line 152) | pub fn transaction_status(&self) -> TransactionStatus {
method selected_nodes (line 156) | pub fn selected_nodes(&self) -> SelectedNodes {
method selected_nodes_in_nested_network (line 161) | pub fn selected_nodes_in_nested_network(&self, network_path: &[NodeId]...
method encapsulating_network_metadata (line 179) | pub fn encapsulating_network_metadata(&self, network_path: &[NodeId]) ...
method encapsulating_node (line 190) | pub fn encapsulating_node(&self, network_path: &[NodeId]) -> Option<&D...
method encapsulating_node_metadata (line 201) | pub fn encapsulating_node_metadata(&self, network_path: &[NodeId]) -> ...
method downstream_layer_for_chain_node (line 216) | pub fn downstream_layer_for_chain_node(&mut self, node_id: &NodeId, ne...
method downstream_layers (line 225) | pub fn downstream_layers(&mut self, node_id: &NodeId, network_path: &[...
method chain_width (line 242) | pub fn chain_width(&self, node_id: &NodeId, network_path: &[NodeId]) -...
method connected_to_output (line 268) | pub fn connected_to_output(&self, target_node_id: &NodeId, network_pat...
method number_of_imports (line 320) | pub fn number_of_imports(&self, network_path: &[NodeId]) -> usize {
method number_of_exports (line 329) | pub fn number_of_exports(&self, network_path: &[NodeId]) -> usize {
method number_of_displayed_inputs (line 333) | fn number_of_displayed_inputs(&self, node_id: &NodeId, network_path: &...
method number_of_inputs (line 341) | pub fn number_of_inputs(&self, node_id: &NodeId, network_path: &[NodeI...
method number_of_outputs (line 349) | pub fn number_of_outputs(&self, node_id: &NodeId, network_path: &[Node...
method copy_nodes (line 363) | pub fn copy_nodes<'a>(&'a mut self, new_ids: &'a HashMap<NodeId, NodeI...
method create_node_template (line 436) | pub fn create_node_template(&self, node_id: &NodeId, network_path: &[N...
method map_ids (line 455) | pub fn map_ids(&mut self, mut node_template: NodeTemplate, node_id: &N...
method input_from_connector (line 474) | pub fn input_from_connector(&self, input_connector: &InputConnector, n...
method position (line 491) | pub fn position(&mut self, node_id: &NodeId, network_path: &[NodeId]) ...
method frontend_imports (line 510) | pub fn frontend_imports(&mut self, network_path: &[NodeId]) -> Vec<Opt...
method frontend_exports (line 530) | pub fn frontend_exports(&mut self, network_path: &[NodeId]) -> Vec<Opt...
method import_export_position (line 539) | pub fn import_export_position(&mut self, network_path: &[NodeId]) -> O...
method frontend_input_from_connector (line 617) | pub fn frontend_input_from_connector(&mut self, input_connector: &Inpu...
method frontend_output_from_connector (line 680) | pub fn frontend_output_from_connector(&mut self, output_connector: &Ou...
method height_from_click_target (line 748) | pub fn height_from_click_target(&mut self, node_id: &NodeId, network_p...
method upstream_nodes_below_layer (line 760) | pub fn upstream_nodes_below_layer(&mut self, node_id: &NodeId, network...
method previewing (line 888) | pub fn previewing(&self, network_path: &[NodeId]) -> Previewing {
method root_node (line 897) | pub fn root_node(&self, network_path: &[NodeId]) -> Option<RootNode> {
method reference (line 921) | pub fn reference(&self, node_id: &NodeId, network_path: &[NodeId]) -> ...
method implementation (line 947) | pub fn implementation(&self, node_id: &NodeId, network_path: &[NodeId]...
method input_data (line 955) | pub fn input_data(&self, node_id: &NodeId, index: usize, key: &str, ne...
method persistent_input_metadata (line 961) | pub fn persistent_input_metadata(&self, node_id: &NodeId, index: usize...
method transient_input_metadata (line 968) | fn transient_input_metadata(&self, node_id: &NodeId, index: usize, net...
method set_input_override (line 975) | pub fn set_input_override(&mut self, node_id: &NodeId, index: usize, w...
method displayed_input_name_and_description (line 987) | pub fn displayed_input_name_and_description(&mut self, node_id: &NodeI...
method display_name (line 1002) | pub fn display_name(&self, node_id: &NodeId, network_path: &[NodeId]) ...
method implementation_name (line 1025) | pub fn implementation_name(&self, node_id: &NodeId, network_path: &[No...
method is_locked (line 1031) | pub fn is_locked(&self, node_id: &NodeId, network_path: &[NodeId]) -> ...
method is_pinned (line 1039) | pub fn is_pinned(&self, node_id: &NodeId, network_path: &[NodeId]) -> ...
method is_visible (line 1047) | pub fn is_visible(&self, node_id: &NodeId, network_path: &[NodeId]) ->...
method is_layer (line 1055) | pub fn is_layer(&self, node_id: &NodeId, network_path: &[NodeId]) -> b...
method primary_output_connected_to_layer (line 1063) | pub fn primary_output_connected_to_layer(&mut self, node_id: &NodeId, ...
method primary_input_connected_to_layer (line 1080) | pub fn primary_input_connected_to_layer(&mut self, node_id: &NodeId, n...
method hidden_primary_export (line 1086) | pub fn hidden_primary_export(&self, network_path: &[NodeId]) -> bool {
method hidden_primary_output (line 1094) | pub fn hidden_primary_output(&self, node_id: &NodeId, network_path: &[...
method hidden_primary_import (line 1101) | pub fn hidden_primary_import(&self, network_path: &[NodeId]) -> bool {
method is_absolute (line 1109) | pub fn is_absolute(&self, node_id: &NodeId, network_path: &[NodeId]) -...
method is_chain (line 1120) | pub fn is_chain(&self, node_id: &NodeId, network_path: &[NodeId]) -> b...
method is_stack (line 1131) | pub fn is_stack(&self, node_id: &NodeId, network_path: &[NodeId]) -> b...
method is_artboard (line 1142) | pub fn is_artboard(&self, node_id: &NodeId, network_path: &[NodeId]) -...
method all_artboards (line 1147) | pub fn all_artboards(&self) -> HashSet<LayerNodeIdentifier> {
method folders_sorted_by_most_nested (line 1169) | pub fn folders_sorted_by_most_nested(&self, network_path: &[NodeId]) -...
method document_bounds_document_space (line 1187) | pub fn document_bounds_document_space(&self, include_artboards: bool) ...
method document_bounds_viewport_space (line 1213) | pub fn document_bounds_viewport_space(&self, include_artboards: bool) ...
method selected_bounds_document_space (line 1221) | pub fn selected_bounds_document_space(&self, include_artboards: bool, ...
method shallowest_unique_layers (line 1235) | pub fn shallowest_unique_layers(&self, network_path: &[NodeId]) -> imp...
method shallowest_unique_layers_sorted (line 1263) | pub fn shallowest_unique_layers_sorted(&self, network_path: &[NodeId])...
method deepest_common_ancestor (line 1276) | pub fn deepest_common_ancestor(&self, selected_nodes: &SelectedNodes, ...
method upstream_flow_back_from_nodes (line 1300) | pub fn upstream_flow_back_from_nodes<'a>(&'a self, mut node_ids: Vec<N...
method upstream_output_connector (line 1331) | pub fn upstream_output_connector(&self, input_connector: &InputConnect...
method is_node_upstream_of_another_by_horizontal_flow (line 1341) | pub fn is_node_upstream_of_another_by_horizontal_flow(&self, node: Nod...
method from_old_network (line 1346) | pub fn from_old_network(old_network: OldNodeNetwork) -> Self {
method network_mut (line 1416) | fn network_mut(&mut self, network_path: &[NodeId]) -> Option<&mut Node...
method network_metadata_mut (line 1420) | fn network_metadata_mut(&mut self, network_path: &[NodeId]) -> Option<...
method node_metadata_mut (line 1424) | fn node_metadata_mut(&mut self, node_id: &NodeId, network_path: &[Node...
method encapsulating_network_metadata_mut (line 1437) | fn encapsulating_network_metadata_mut(&mut self, network_path: &[NodeI...
method encapsulating_node_metadata_mut (line 1463) | fn encapsulating_node_metadata_mut(&mut self, network_path: &[NodeId])...
method start_transaction (line 1481) | pub fn start_transaction(&mut self) {
method transaction_modified (line 1485) | pub fn transaction_modified(&mut self) {
method finish_transaction (line 1491) | pub fn finish_transaction(&mut self) {
method selected_nodes_mut (line 1496) | pub fn selected_nodes_mut(&mut self, network_path: &[NodeId]) -> Optio...
method selection_step_back (line 1530) | pub fn selection_step_back(&mut self, network_path: &[NodeId]) {
method selection_step_forward (line 1541) | pub fn selection_step_forward(&mut self, network_path: &[NodeId]) {
method stack_dependents (line 1552) | fn stack_dependents(&mut self, network_path: &[NodeId]) -> Option<&Has...
method try_load_stack_dependents (line 1557) | fn try_load_stack_dependents(&mut self, network_path: &[NodeId]) {
method try_get_stack_dependents (line 1568) | fn try_get_stack_dependents(&self, network_path: &[NodeId]) -> Option<...
method load_stack_dependents (line 1581) | fn load_stack_dependents(&mut self, network_path: &[NodeId]) {
method unload_stack_dependents (line 1728) | pub fn unload_stack_dependents(&mut self, network_path: &[NodeId]) {
method unload_stack_dependents_y_offset (line 1737) | pub fn unload_stack_dependents_y_offset(&mut self, network_path: &[Nod...
method import_export_ports (line 1752) | pub fn import_export_ports(&mut self, network_path: &[NodeId]) -> Opti...
method load_import_export_ports (line 1772) | pub fn load_import_export_ports(&mut self, network_path: &[NodeId]) {
method unload_import_export_ports (line 1800) | fn unload_import_export_ports(&mut self, network_path: &[NodeId]) {
method modify_import_export (line 1832) | pub fn modify_import_export(&mut self, network_path: &[NodeId]) -> Opt...
method load_modify_import_export (line 1851) | pub fn load_modify_import_export(&mut self, network_path: &[NodeId]) {
method unload_modify_import_export (line 1913) | fn unload_modify_import_export(&mut self, network_path: &[NodeId]) {
method owned_nodes (line 1921) | fn owned_nodes(&self, node_id: &NodeId, network_path: &[NodeId]) -> Op...
method all_nodes_bounding_box (line 1932) | pub fn all_nodes_bounding_box(&mut self, network_path: &[NodeId]) -> O...
method load_all_nodes_bounding_box (line 1952) | pub fn load_all_nodes_bounding_box(&mut self, network_path: &[NodeId]) {
method unload_all_nodes_bounding_box (line 1972) | pub fn unload_all_nodes_bounding_box(&mut self, network_path: &[NodeId...
method outward_wires (line 1981) | pub fn outward_wires(&mut self, network_path: &[NodeId]) -> Option<&Ha...
method load_outward_wires (line 2001) | fn load_outward_wires(&mut self, network_path: &[NodeId]) {
method unload_outward_wires (line 2060) | fn unload_outward_wires(&mut self, network_path: &[NodeId]) {
method layer_width (line 2068) | pub fn layer_width(&mut self, node_id: &NodeId, network_path: &[NodeId...
method load_layer_width (line 2100) | pub fn load_layer_width(&mut self, node_id: &NodeId, network_path: &[N...
method try_unload_layer_width (line 2138) | pub fn try_unload_layer_width(&mut self, node_id: &NodeId, network_pat...
method get_input_center (line 2151) | pub fn get_input_center(&mut self, input: &InputConnector, network_pat...
method get_output_center (line 2168) | pub fn get_output_center(&mut self, output: &OutputConnector, network_...
method newly_loaded_input_wire (line 2185) | pub fn newly_loaded_input_wire(&mut self, input: &InputConnector, grap...
method wire_is_loaded (line 2213) | pub fn wire_is_loaded(&mut self, input: &InputConnector, network_path:...
method load_wire (line 2234) | fn load_wire(&mut self, input: &InputConnector, graph_wire_style: Grap...
method all_input_connectors (line 2278) | pub fn all_input_connectors(&self, network_path: &[NodeId]) -> Vec<Inp...
method node_graph_input_connectors (line 2295) | pub fn node_graph_input_connectors(&self, network_path: &[NodeId]) -> ...
method node_graph_wire_inputs (line 2303) | pub fn node_graph_wire_inputs(&self, network_path: &[NodeId]) -> Vec<(...
method unload_wires_for_node (line 2314) | fn unload_wires_for_node(&mut self, node_id: &NodeId, network_path: &[...
method unload_wire (line 2335) | pub fn unload_wire(&mut self, input: &InputConnector, network_path: &[...
method wire_to_root (line 2363) | pub fn wire_to_root(&mut self, graph_wire_style: GraphWireStyle, netwo...
method vector_wire_from_input (line 2406) | pub fn vector_wire_from_input(&mut self, input: &InputConnector, wire_...
method wire_path_from_input (line 2425) | pub fn wire_path_from_input(&mut self, input: &InputConnector, graph_w...
method node_click_targets (line 2440) | pub fn node_click_targets(&mut self, node_id: &NodeId, network_path: &...
method try_load_node_click_targets (line 2445) | fn try_load_node_click_targets(&mut self, node_id: &NodeId, network_pa...
method try_get_node_click_targets (line 2455) | fn try_get_node_click_targets(&self, node_id: &NodeId, network_path: &...
method load_node_click_targets (line 2464) | pub fn load_node_click_targets(&mut self, node_id: &NodeId, network_pa...
method node_bounding_box (line 2580) | pub fn node_bounding_box(&mut self, node_id: &NodeId, network_path: &[...
method try_get_node_bounding_box (line 2585) | pub fn try_get_node_bounding_box(&self, node_id: &NodeId, network_path...
method try_load_all_node_click_targets (line 2590) | pub fn try_load_all_node_click_targets(&mut self, network_path: &[Node...
method position_from_downstream_node (line 2601) | pub fn position_from_downstream_node(&mut self, node_id: &NodeId, netw...
method unload_node_click_targets (line 2683) | pub fn unload_node_click_targets(&mut self, node_id: &NodeId, network_...
method unload_upstream_node_click_targets (line 2692) | pub fn unload_upstream_node_click_targets(&mut self, node_ids: Vec<Nod...
method unload_all_nodes_click_targets (line 2700) | pub fn unload_all_nodes_click_targets(&mut self, network_path: &[NodeI...
method upstream_chain_nodes (line 2715) | pub fn upstream_chain_nodes(&self, network_path: &[NodeId]) -> Vec<Nod...
method collect_frontend_click_targets (line 2735) | pub fn collect_frontend_click_targets(&mut self, network_path: &[NodeI...
method set_document_to_viewport_transform (line 2818) | pub fn set_document_to_viewport_transform(&mut self, transform: DAffin...
method is_eligible_to_be_layer (line 2822) | pub fn is_eligible_to_be_layer(&self, node_id: &NodeId, network_path: ...
method node_graph_ptz (line 2834) | pub fn node_graph_ptz(&self, network_path: &[NodeId]) -> Option<&PTZ> {
method node_graph_ptz_mut (line 2842) | pub fn node_graph_ptz_mut(&mut self, network_path: &[NodeId]) -> Optio...
method node_from_click (line 2852) | pub fn node_from_click(&mut self, click: DVec2, network_path: &[NodeId...
method layer_click_target_from_click (line 2885) | pub fn layer_click_target_from_click(&mut self, click: DVec2, click_ta...
method input_connector_from_click (line 2916) | pub fn input_connector_from_click(&mut self, click: DVec2, network_pat...
method output_connector_from_click (line 2948) | pub fn output_connector_from_click(&mut self, click: DVec2, network_pa...
method input_position (line 2977) | pub fn input_position(&mut self, input_connector: &InputConnector, net...
method output_position (line 2988) | pub fn output_position(&mut self, output_connector: &OutputConnector, ...
method selected_nodes_bounding_box_viewport (line 3000) | pub fn selected_nodes_bounding_box_viewport(&mut self, network_path: &...
method selected_layers_artwork_bounding_box_viewport (line 3011) | pub fn selected_layers_artwork_bounding_box_viewport(&self) -> Option<...
method selected_unlocked_layers_bounding_box_viewport (line 3020) | pub fn selected_unlocked_layers_bounding_box_viewport(&self) -> Option...
method selected_nodes_bounding_box (line 3030) | pub fn selected_nodes_bounding_box(&mut self, network_path: &[NodeId])...
method graph_bounds_viewport_space (line 3048) | pub fn graph_bounds_viewport_space(&mut self, network_path: &[NodeId])...
method collect_layer_widths (line 3059) | pub fn collect_layer_widths(&mut self, network_path: &[NodeId]) -> (Ha...
method compute_modified_vector (line 3091) | pub fn compute_modified_vector(&self, layer: LayerNodeIdentifier) -> O...
method load_structure (line 3111) | pub fn load_structure(&mut self) {
method update_transforms (line 3197) | pub fn update_transforms(&mut self, upstream_footprints: HashMap<NodeI...
method update_first_element_source_id (line 3203) | pub fn update_first_element_source_id(&mut self, new: HashMap<NodeId, ...
method update_click_targets (line 3208) | pub fn update_click_targets(&mut self, new_click_targets: HashMap<Laye...
method update_clip_targets (line 3213) | pub fn update_clip_targets(&mut self, new_clip_targets: HashSet<NodeId...
method update_vector_modify (line 3218) | pub fn update_vector_modify(&mut self, new_vector_modify: HashMap<Node...
method update_vector_data (line 3223) | pub fn update_vector_data(&mut self, new_layer_vector_data: HashMap<La...
method copy_all_navigation_metadata (line 3230) | pub fn copy_all_navigation_metadata(&mut self, other_interface: &NodeN...
method set_transform (line 3248) | pub fn set_transform(&mut self, transform: DAffine2, network_path: &[N...
method set_node_graph_width (line 3259) | pub fn set_node_graph_width(&mut self, node_graph_width: f64, network_...
method vector_modify (line 3269) | pub fn vector_modify(&mut self, node_id: &NodeId, modification_type: V...
method add_export (line 3286) | pub fn add_export(&mut self, default_value: TaggedValue, insert_index:...
method add_import (line 3347) | pub fn add_import(&mut self, default_value: TaggedValue, exposed: bool...
method remove_export (line 3407) | pub fn remove_export(&mut self, export_index: usize, network_path: &[N...
method remove_import (line 3469) | pub fn remove_import(&mut self, import_index: usize, network_path: &[N...
method reorder_export (line 3545) | pub fn reorder_export(&mut self, start_index: usize, mut end_index: us...
method reorder_import (line 3634) | pub fn reorder_import(&mut self, start_index: usize, mut end_index: us...
method replace_implementation (line 3728) | pub fn replace_implementation(&mut self, node_id: &NodeId, network_pat...
method replace_inputs (line 3748) | pub fn replace_inputs(&mut self, node_id: &NodeId, network_path: &[Nod...
method validate_input_metadata (line 3769) | pub fn validate_input_metadata(&mut self, node_id: &NodeId, node: &Doc...
method validate_output_names (line 3785) | pub fn validate_output_names(&mut self, node_id: &NodeId, node: &Docum...
method set_reference (line 3798) | pub fn set_reference(&mut self, node_id: &NodeId, network_path: &[Node...
method set_call_argument (line 3810) | pub fn set_call_argument(&mut self, node_id: &NodeId, network_path: &[...
method set_context_features (line 3822) | pub fn set_context_features(&mut self, node_id: &NodeId, network_path:...
method set_input (line 3834) | pub fn set_input(&mut self, input_connector: &InputConnector, new_inpu...
method disconnect_input (line 4066) | pub fn disconnect_input(&mut self, input_connector: &InputConnector, n...
method create_wire (line 4117) | pub fn create_wire(&mut self, output_connector: &OutputConnector, inpu...
method insert_node_group (line 4130) | pub fn insert_node_group(&mut self, nodes: Vec<(NodeId, NodeTemplate)>...
method insert_node (line 4162) | pub fn insert_node(&mut self, node_id: NodeId, node_template: NodeTemp...
method delete_nodes (line 4197) | pub fn delete_nodes(&mut self, nodes_to_delete: Vec<NodeId>, delete_ch...
method remove_references_from_network (line 4312) | pub fn remove_references_from_network(&mut self, node_id: &NodeId, net...
method start_previewing_without_restore (line 4386) | pub fn start_previewing_without_restore(&mut self, network_path: &[Nod...
method stop_previewing (line 4395) | fn stop_previewing(&mut self, network_path: &[NodeId]) {
method set_display_name (line 4429) | pub fn set_display_name(&mut self, node_id: &NodeId, display_name: Str...
method set_import_export_name (line 4471) | pub fn set_import_export_name(&mut self, mut name: String, index: Impo...
method set_pinned (line 4501) | pub fn set_pinned(&mut self, node_id: &NodeId, network_path: &[NodeId]...
method set_visibility (line 4511) | pub fn set_visibility(&mut self, node_id: &NodeId, network_path: &[Nod...
method set_locked (line 4524) | pub fn set_locked(&mut self, node_id: &NodeId, network_path: &[NodeId]...
method set_to_node_or_layer (line 4536) | pub fn set_to_node_or_layer(&mut self, node_id: &NodeId, network_path:...
method toggle_preview (line 4639) | pub fn toggle_preview(&mut self, toggle_id: NodeId, network_path: &[No...
method set_absolute_position (line 4727) | fn set_absolute_position(&mut self, node_id: &NodeId, position: IVec2,...
method set_stack_position (line 4749) | pub fn set_stack_position(&mut self, node_id: &NodeId, y_offset: u32, ...
method set_stack_position_calculated_offset (line 4770) | pub fn set_stack_position_calculated_offset(&mut self, node_id: &NodeI...
method set_chain_position (line 4784) | pub fn set_chain_position(&mut self, node_id: &NodeId, network_path: &...
method valid_upstream_chain_nodes (line 4842) | fn valid_upstream_chain_nodes(&mut self, input_connector: &InputConnec...
method try_set_upstream_to_chain (line 4889) | pub fn try_set_upstream_to_chain(&mut self, input_connector: &InputCon...
method try_set_node_to_chain (line 4920) | fn try_set_node_to_chain(&mut self, node_id: &NodeId, network_path: &[...
method force_set_upstream_to_chain (line 4930) | pub fn force_set_upstream_to_chain(&mut self, node_id: &NodeId, networ...
method set_upstream_chain_to_absolute (line 4947) | fn set_upstream_chain_to_absolute(&mut self, node_id: &NodeId, network...
method nodes_sorted_top_to_bottom (line 4970) | pub fn nodes_sorted_top_to_bottom<'a>(&mut self, node_ids: impl Iterat...
method shift_absolute_node_position (line 4987) | pub fn shift_absolute_node_position(&mut self, layer: &NodeId, shift: ...
method shift_selected_nodes (line 5016) | pub fn shift_selected_nodes(&mut self, direction: Direction, shift_wit...
method try_shift_node (line 5229) | fn try_shift_node(&mut self, node_id: &NodeId, shift: IVec2, shifted_n...
method vertical_shift_with_push (line 5236) | fn vertical_shift_with_push(&mut self, node_id: &NodeId, shift_sign: i...
method check_collision_with_stack_dependents (line 5298) | fn check_collision_with_stack_dependents(&mut self, node_id: &NodeId, ...
method shift_node_or_parent (line 5351) | fn shift_node_or_parent(&mut self, node_id: &NodeId, shift_sign: i32, ...
method shift_node (line 5371) | pub fn shift_node(&mut self, node_id: &NodeId, shift: IVec2, network_p...
method move_layer_to_stack (line 5421) | pub fn move_layer_to_stack(&mut self, layer: LayerNodeIdentifier, mut ...
method insert_node_between (line 5635) | pub fn insert_node_between(&mut self, node_id: &NodeId, input_connecto...
method move_node_to_chain_start (line 5657) | pub fn move_node_to_chain_start(&mut self, node_id: &NodeId, parent: L...
method clone (line 56) | fn clone(&self) -> Self {
method eq (line 68) | fn eq(&self, other: &Self) -> bool {
type FlowType (line 5674) | pub enum FlowType {
type FlowIter (line 5691) | struct FlowIter<'a> {
type Item (line 5698) | type Item = NodeId;
method next (line 5699) | fn next(&mut self) -> Option<Self::Item> {
type ImportOrExport (line 5728) | pub enum ImportOrExport {
type InputConnector (line 5736) | pub enum InputConnector {
method node (line 5755) | pub fn node(node_id: NodeId, input_index: usize) -> Self {
method input_index (line 5759) | pub fn input_index(&self) -> usize {
method node_id (line 5766) | pub fn node_id(&self) -> Option<NodeId> {
method default (line 5749) | fn default() -> Self {
type OutputConnector (line 5777) | pub enum OutputConnector {
method node (line 5796) | pub fn node(node_id: NodeId, output_index: usize) -> Self {
method index (line 5800) | pub fn index(&self) -> usize {
method node_id (line 5807) | pub fn node_id(&self) -> Option<NodeId> {
method from_input (line 5814) | pub fn from_input(input: &NodeInput) -> Option<Self> {
method default (line 5790) | fn default() -> Self {
type Ports (line 5824) | pub struct Ports {
method new (line 5836) | pub fn new() -> Ports {
method click_targets (line 5843) | pub fn click_targets(&self) -> impl Iterator<Item = &ClickTarget> {
method input_ports (line 5850) | pub fn input_ports(&self) -> impl Iterator<Item = &(usize, ClickTarget...
method output_ports (line 5854) | pub fn output_ports(&self) -> impl Iterator<Item = &(usize, ClickTarge...
method insert_input_port_at_center (line 5858) | fn insert_input_port_at_center(&mut self, input_index: usize, center: ...
method insert_custom_input_port (line 5863) | fn insert_custom_input_port(&mut self, input_index: usize, click_targe...
method insert_output_port_at_center (line 5867) | fn insert_output_port_at_center(&mut self, output_index: usize, center...
method insert_custom_output_port (line 5872) | fn insert_custom_output_port(&mut self, output_index: usize, click_tar...
method insert_node_input (line 5876) | fn insert_node_input(&mut self, input_index: usize, row_index: usize, ...
method insert_node_output (line 5882) | fn insert_node_output(&mut self, output_index: usize, node_top_left: D...
method insert_layer_input (line 5888) | fn insert_layer_input(&mut self, input_index: usize, node_top_left: DV...
method insert_layer_output (line 5897) | fn insert_layer_output(&mut self, node_top_left: DVec2) {
method clicked_input_port_from_point (line 5903) | pub fn clicked_input_port_from_point(&self, point: DVec2) -> Option<us...
method clicked_output_port_from_point (line 5907) | pub fn clicked_output_port_from_point(&self, point: DVec2) -> Option<u...
method input_port_position (line 5911) | pub fn input_port_position(&self, index: usize) -> Option<DVec2> {
method output_port_position (line 5921) | pub fn output_port_position(&self, index: usize) -> Option<DVec2> {
method default (line 5830) | fn default() -> Self {
type RootNode (line 5933) | pub struct RootNode {
method to_connector (line 5939) | pub fn to_connector(&self) -> OutputConnector {
type Previewing (line 5948) | pub enum Previewing {
type NodeNetworkMetadata (line 5958) | pub struct NodeNetworkMetadata {
method nested_metadata (line 5980) | pub fn nested_metadata(&self, nested_path: &[NodeId]) -> Option<&Self> {
method nested_metadata_mut (line 5992) | pub fn nested_metadata_mut(&mut self, nested_path: &[NodeId]) -> Optio...
method clone (line 5965) | fn clone(&self) -> Self {
method eq (line 5974) | fn eq(&self, other: &Self) -> bool {
type NodeNetworkPersistentMetadata (line 6005) | pub struct NodeNetworkPersistentMetadata {
type TransientMetadata (line 6032) | pub enum TransientMetadata<T> {
function unload (line 6040) | pub fn unload(&mut self) {
function is_loaded (line 6044) | pub fn is_loaded(&self) -> bool {
type NodeNetworkTransientMetadata (line 6051) | pub struct NodeNetworkTransientMetadata {
type ModifyImportExportClickTarget (line 6072) | pub struct ModifyImportExportClickTarget {
type NetworkEdgeDistance (line 6080) | pub struct NetworkEdgeDistance {
type LayerOwner (line 6088) | pub enum LayerOwner {
type DocumentNodeMetadata (line 6096) | pub struct DocumentNodeMetadata {
method clone (line 6104) | fn clone(&self) -> Self {
method eq (line 6113) | fn eq(&self, other: &Self) -> bool {
type NumberInputSettings (line 6119) | pub struct NumberInputSettings {
method default (line 6132) | fn default() -> Self {
type Vec2InputSettings (line 6148) | pub struct Vec2InputSettings {
type WidgetOverride (line 6157) | pub enum WidgetOverride {
type InputPersistentMetadata (line 6168) | pub struct InputPersistentMetadata {
method with_name (line 6183) | pub fn with_name(mut self, input_name: &str) -> Self {
method with_override (line 6187) | pub fn with_override(mut self, widget_override: WidgetOverride) -> Self {
method with_description (line 6241) | pub fn with_description(mut self, description: &str) -> Self {
type InputTransientMetadata (line 6248) | struct InputTransientMetadata {
type DocumentNodePersistentMetadata (line 6257) | pub struct DocumentNodePersistentMetadata {
method is_layer (line 6279) | pub fn is_layer(&self) -> bool {
type InputMetadata (line 6285) | pub struct InputMetadata {
method from (line 6307) | fn from(input_name_and_description: (&str, &str)) -> Self {
method with_name_description_override (line 6318) | pub fn with_name_description_override(input_name: &str, description: &...
method clone (line 6292) | fn clone(&self) -> Self {
method eq (line 6301) | fn eq(&self, other: &Self) -> bool {
type NodeTypePersistentMetadata (line 6327) | pub enum NodeTypePersistentMetadata {
method node (line 6339) | pub fn node(position: IVec2) -> NodeTypePersistentMetadata {
method layer (line 6344) | pub fn layer(position: IVec2) -> NodeTypePersistentMetadata {
method default (line 6333) | fn default() -> Self {
type LayerPersistentMetadata (line 6354) | pub struct LayerPersistentMetadata {
method eq (line 6365) | fn eq(&self, other: &Self) -> bool {
type NodePersistentMetadata (line 6371) | pub struct NodePersistentMetadata {
method new (line 6377) | pub fn new(position: NodePosition) -> Self {
type LayerPosition (line 6384) | pub enum LayerPosition {
type NodePosition (line 6393) | pub enum NodePosition {
type DocumentNodeTransientMetadata (line 6402) | pub struct DocumentNodeTransientMetadata {
type DocumentNodeClickTargets (line 6410) | pub struct DocumentNodeClickTargets {
type NodeTypeTransientMetadata (line 6421) | pub enum NodeTypeTransientMetadata {
type LayerTransientMetadata (line 6428) | pub struct LayerTransientMetadata {
type NodeTypeClickTargets (line 6438) | pub enum NodeTypeClickTargets {
type LayerClickTargets (line 6445) | pub struct LayerClickTargets {
type LayerClickTargetTypes (line 6456) | pub enum LayerClickTargetTypes {
type NavigationMetadata (line 6464) | pub struct NavigationMetadata {
type NodeTemplate (line 6480) | pub struct NodeTemplate {
type TransactionStatus (line 6486) | pub enum TransactionStatus {
function copy_isolated_node (line 6497) | async fn copy_isolated_node() {
FILE: editor/src/messages/portfolio/document/utility_types/network_interface/deserialization.rs
type DocumentNodePersistentMetadataInputNames (line 7) | pub struct DocumentNodePersistentMetadataInputNames {
type DocumentNodePersistentMetadataPropertiesRow (line 39) | pub struct DocumentNodePersistentMetadataPropertiesRow {
method from (line 23) | fn from(old: DocumentNodePersistentMetadataInputNames) -> Self {
type PropertiesRow (line 55) | pub struct PropertiesRow {
type DocumentNodePersistentMetadataHasPrimaryOutput (line 94) | pub struct DocumentNodePersistentMetadataHasPrimaryOutput {
method from (line 65) | fn from(old: DocumentNodePersistentMetadataPropertiesRow) -> Self {
type DocumentNodePersistentMetadataStringReference (line 125) | struct DocumentNodePersistentMetadataStringReference {
method from (line 110) | fn from(old: DocumentNodePersistentMetadataHasPrimaryOutput) -> Self {
method from (line 140) | fn from(mut old: DocumentNodePersistentMetadataStringReference) -> Self {
type DocumentNodePersistentMetadataVersioned (line 158) | enum DocumentNodePersistentMetadataVersioned {
function deserialize_node_persistent_metadata (line 167) | pub fn deserialize_node_persistent_metadata<'de, D>(deserializer: D) -> ...
FILE: editor/src/messages/portfolio/document/utility_types/network_interface/memo_network.rs
type MemoNetwork (line 6) | pub struct MemoNetwork {
method deserialize (line 12) | fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
method serialize (line 21) | fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
method network (line 36) | pub fn network(&self) -> &NodeNetwork {
method network_mut (line 40) | pub fn network_mut(&mut self) -> &mut NodeNetwork {
method new (line 45) | pub fn new(network: NodeNetwork) -> Self {
method current_hash (line 49) | pub fn current_hash(&self) -> u64 {
method hash (line 30) | fn hash<H: Hasher>(&self, state: &mut H) {
FILE: editor/src/messages/portfolio/document/utility_types/network_interface/resolved_types.rs
type ResolvedDocumentNodeTypes (line 16) | pub struct ResolvedDocumentNodeTypes {
method update (line 22) | pub fn update(&mut self, delta: ResolvedDocumentNodeTypesDelta, errors...
type TypeSource (line 35) | pub enum TypeSource {
method displayed_type (line 50) | pub fn displayed_type(&self) -> FrontendGraphDataType {
method compiled_nested_type (line 78) | pub fn compiled_nested_type(&self) -> Option<&Type> {
method add_node_string (line 87) | pub fn add_node_string(self) -> Option<String> {
method resolved_type_tooltip_string (line 92) | pub fn resolved_type_tooltip_string(&self) -> String {
method resolved_type_node_string (line 103) | pub fn resolved_type_node_string(&self) -> String {
method input_has_error (line 115) | fn input_has_error(&mut self, input_connector: &InputConnector, network_...
method input_type_not_invalid (line 147) | pub fn input_type_not_invalid(&mut self, input_connector: &InputConnecto...
method input_type (line 175) | pub fn input_type(&mut self, input_connector: &InputConnector, network_p...
method tagged_value_from_input (line 184) | pub fn tagged_value_from_input(&mut self, input_connector: &InputConnect...
method potential_valid_input_types (line 210) | pub fn potential_valid_input_types(&mut self, input_connector: &InputCon...
method complete_valid_input_types (line 273) | pub fn complete_valid_input_types(&mut self, input_connector: &InputConn...
method output_type (line 327) | pub fn output_type(&mut self, output_connector: &OutputConnector, networ...
method valid_output_types (line 357) | fn valid_output_types(&mut self, output_connector: &OutputConnector, net...
FILE: editor/src/messages/portfolio/document/utility_types/nodes.rs
type LayerStructureEntry (line 12) | pub struct LayerStructureEntry {
type LayerPanelEntry (line 20) | pub struct LayerPanelEntry {
type SelectedNodes (line 55) | pub struct SelectedNodes(pub Vec<NodeId>);
method layer_visible (line 58) | pub fn layer_visible(&self, layer: LayerNodeIdentifier, network_interf...
method selected_visible_layers (line 68) | pub fn selected_visible_layers<'a>(&'a self, network_interface: &'a No...
method layer_locked (line 73) | pub fn layer_locked(&self, layer: LayerNodeIdentifier, network_interfa...
method selected_unlocked_layers (line 83) | pub fn selected_unlocked_layers<'a>(&'a self, network_interface: &'a N...
method selected_visible_and_unlocked_layers (line 88) | pub fn selected_visible_and_unlocked_layers<'a>(&'a self, network_inte...
method selected_visible_and_unlocked_layers_mean_average_origin (line 93) | pub fn selected_visible_and_unlocked_layers_mean_average_origin<'a>(&'...
method selected_visible_and_unlocked_median_points (line 101) | pub fn selected_visible_and_unlocked_median_points<'a>(&'a self, netwo...
method selected_layers (line 109) | pub fn selected_layers<'a>(&'a self, metadata: &'a DocumentMetadata) -...
method selected_layers_except_artboards (line 113) | pub fn selected_layers_except_artboards<'a>(&'a self, network_interfac...
method selected_layers_contains (line 118) | pub fn selected_layers_contains(&self, layer: LayerNodeIdentifier, met...
method selected_nodes (line 123) | pub fn selected_nodes(&self) -> impl Iterator<Item = &NodeId> + '_ {
method selected_nodes_ref (line 127) | pub fn selected_nodes_ref(&self) -> &Vec<NodeId> {
method network_has_selected_nodes (line 131) | pub fn network_has_selected_nodes(&self, network: &NodeNetwork) -> bool {
method has_selected_nodes (line 135) | pub fn has_selected_nodes(&self) -> bool {
method retain_selected_nodes (line 139) | pub fn retain_selected_nodes(&mut self, f: impl FnMut(&NodeId) -> bool) {
method set_selected_nodes (line 143) | pub fn set_selected_nodes(&mut self, new: Vec<NodeId>) {
method add_selected_nodes (line 147) | pub fn add_selected_nodes(&mut self, new: Vec<NodeId>) {
method clear_selected_nodes (line 151) | pub fn clear_selected_nodes(&mut self) {
method replace_with (line 155) | pub fn replace_with(&mut self, new: Vec<NodeId>) -> Vec<NodeId> {
method filtered_selected_nodes (line 159) | pub fn filtered_selected_nodes(&self, filter: impl Fn(&NodeId) -> bool...
type CollapsedLayers (line 166) | pub struct CollapsedLayers(pub Vec<LayerNodeIdentifier>);
FILE: editor/src/messages/portfolio/document/utility_types/transformation.rs
type AnchorPoint (line 18) | struct AnchorPoint {
type HandlePoint (line 24) | struct HandlePoint {
type InitialPoints (line 32) | pub struct InitialPoints {
type OriginalTransforms (line 38) | pub enum OriginalTransforms {
method clear (line 48) | pub fn clear(&mut self) {
method get_layer_transform (line 56) | fn get_layer_transform(layer: LayerNodeIdentifier, network_interface: ...
method update (line 63) | pub fn update<'a>(&mut self, selected: &'a [LayerNodeIdentifier], netw...
method default (line 43) | fn default() -> Self {
type Axis (line 135) | pub enum Axis {
method contrainted_to_axis (line 143) | pub fn contrainted_to_axis(self, target: Axis, local: bool) -> (Self, ...
type Translation (line 153) | pub struct Translation {
method to_dvec (line 160) | pub fn to_dvec(self, state: &TransformationState, document: &DocumentM...
method increment_amount (line 182) | pub fn increment_amount(self, delta: DVec2) -> Self {
method set_amount (line 189) | pub fn set_amount(self, change: DVec2) -> Self {
method negate (line 197) | pub fn negate(self) -> Self {
method with_constraint (line 202) | pub fn with_constraint(self, target: Axis, local: bool) -> (Self, bool) {
type Rotation (line 209) | pub struct Rotation {
method to_f64 (line 215) | pub fn to_f64(self, increment_mode: bool) -> f64 {
method increment_amount (line 227) | pub fn increment_amount(self, delta: f64) -> Self {
method set_amount (line 233) | pub fn set_amount(self, angle: f64) -> Self {
method negate (line 240) | pub fn negate(self) -> Self {
type Scale (line 247) | pub struct Scale {
method to_f64 (line 264) | pub fn to_f64(self, increment: bool) -> f64 {
method to_dvec (line 269) | pub fn to_dvec(self, increment_mode: bool) -> DVec2 {
method negate (line 279) | pub fn negate(self) -> Self {
method increment_amount (line 285) | pub fn increment_amount(self, delta: f64) -> Self {
method set_amount (line 293) | pub fn set_amount(self, change: f64) -> Self {
method with_constraint (line 301) | pub fn with_constraint(self, target: Axis, local: bool) -> (Self, bool) {
method default (line 254) | fn default() -> Self {
type TransformOperation (line 308) | pub enum TransformOperation {
method apply_transform_operation (line 334) | pub fn apply_transform_operation(&self, selected: &mut Selected, state...
method axis_constraint (line 350) | pub fn axis_constraint(&self) -> Axis {
method can_begin_typing (line 358) | pub fn can_begin_typing(&self) -> bool {
method constrain_axis (line 363) | pub fn constrain_axis(&mut self, axis: Axis, selected: &mut Selected, ...
method grs_typed (line 383) | pub fn grs_typed(&mut self, typed: Option<f64>, selected: &mut Selecte...
method hints (line 394) | pub fn hints(&self, responses: &mut VecDeque<Message>, local: bool) {
method is_constraint_to_axis (line 459) | pub fn is_constraint_to_axis(&self) -> bool {
method is_typing (line 463) | pub fn is_typing(&self) -> bool {
method negate (line 473) | pub fn negate(&mut self, selected: &mut Selected, state: &Transformati...
type TransformType (line 317) | pub enum TransformType {
method equivalent_to (line 324) | pub fn equivalent_to(&self, operation: TransformOperation) -> bool {
type Selected (line 487) | pub struct Selected<'a> {
function new (line 501) | pub fn new(
function center_of_aabb (line 530) | pub fn center_of_aabb(&mut self) -> DVec2 {
function bounding_box (line 540) | pub fn bounding_box(&mut self) -> Quad {
function transform_layer (line 565) | fn transform_layer(document_metadata: &DocumentMetadata, layer: LayerNod...
function transform_path (line 577) | fn transform_path(
function apply_transform_pen (line 619) | pub fn apply_transform_pen(&mut self, transformation: DAffine2) {
function apply_transformation (line 626) | pub fn apply_transformation(&mut self, transformation: DAffine2, transfo...
function update_transforms (line 644) | pub fn update_transforms(&mut self, delta: DAffine2, pivot: Option<DVec2...
function revert_operation (line 653) | pub fn revert_operation(&mut self) {
type Typing (line 691) | pub struct Typing {
method type_number (line 701) | pub fn type_number(&mut self, number: u8) -> Option<f64> {
method type_backspace (line 708) | pub fn type_backspace(&mut self) -> Option<f64> {
method type_decimal_point (line 722) | pub fn type_decimal_point(&mut self) -> Option<f64> {
method type_negate (line 732) | pub fn type_negate(&mut self) -> Option<f64> {
method evaluate (line 743) | pub fn eval
Copy disabled (too large)
Download .json
Condensed preview — 862 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (12,800K chars).
[
{
"path": ".branding",
"chars": 171,
"preview": "https://github.com/Keavon/graphite-branded-assets/archive/8ae15dc9c51a3855475d8cab1d0f29d9d9bc622c.tar.gz\nc19abe4ac848f3"
},
{
"path": ".cargo/config.toml",
"chars": 412,
"preview": "[target.wasm32-unknown-unknown]\nrustflags = [\n\t# Currently disabled because of https://github.com/GraphiteEditor/Graphit"
},
{
"path": ".devcontainer/devcontainer.json",
"chars": 814,
"preview": "{\n\t\"image\": \"mcr.microsoft.com/devcontainers/base:debian\",\n\t\"features\": {\n\t\t\"ghcr.io/devcontainers/features/rust:1\": {\n\t"
},
{
"path": ".editorconfig",
"chars": 184,
"preview": "[*.{rs,js,ts,svelte,json,toml,svg,html,css,scss}]\nindent_style = tab\nindent_size = 4\nend_of_line = lf\ntrim_trailing_whit"
},
{
"path": ".envrc",
"chars": 10,
"preview": "use flake\n"
},
{
"path": ".gitattributes",
"chars": 595,
"preview": "# Requires Git to check out files with the LF (not CRLF) line endings for files it automatically recognizes as being tex"
},
{
"path": ".github/FUNDING.yml",
"chars": 25,
"preview": "github: [GraphiteEditor]\n"
},
{
"path": ".github/pull_request_template.md",
"chars": 1122,
"preview": "<!--\nGraphite has ZERO-TOLERANCE for contributing undisclosed AI-generated content.\nIf your PR involves AI, you must rea"
},
{
"path": ".github/workflows/build.yml",
"chars": 28883,
"preview": "name: \"Build\"\n\non:\n push:\n branches:\n - master\n tags:\n - latest-stable\n workflow_dispatch:\n inputs:"
},
{
"path": ".github/workflows/cargo-deny.yml",
"chars": 702,
"preview": "name: \"Audit Security Advisories\"\n\non:\n # Run once each week\n schedule:\n - cron: \"0 0 * * 0\"\n\njobs:\n cargo-deny:\n "
},
{
"path": ".github/workflows/check.yml",
"chars": 2687,
"preview": "name: \"Check\"\n\non:\n pull_request: {}\n merge_group: {}\n\nenv:\n CARGO_TERM_COLOR: always\n\njobs:\n # Check if CI can be s"
},
{
"path": ".github/workflows/comment-!build-commands.yml",
"chars": 5358,
"preview": "# USAGE:\n# After reviewing the code, core team members may comment on a PR with `!build` followed by optional `<target>`"
},
{
"path": ".github/workflows/comment-clippy-warnings.yaml",
"chars": 3497,
"preview": "name: \"Clippy Check\"\n\non:\n pull_request:\n types: [opened, reopened, synchronize, ready_for_review]\n\njobs:\n clippy:\n"
},
{
"path": ".github/workflows/comment-profiling-changes.yaml",
"chars": 15535,
"preview": "name: \"Profiling Changes\"\n\non:\n pull_request:\n paths:\n - \"node-graph/**\"\n - \"Cargo.toml\"\n - \"Cargo.lo"
},
{
"path": ".github/workflows/library-rawkit.yml",
"chars": 1503,
"preview": "name: \"Library: Rawkit\"\n\non:\n push:\n branches:\n - master\n paths:\n - \"libraries/rawkit/**\"\n pull_reques"
},
{
"path": ".github/workflows/provide-shaders.yml",
"chars": 1131,
"preview": "name: \"Provide Shaders\"\n\non:\n push:\n branches:\n - master\n workflow_dispatch: {}\n\njobs:\n build:\n runs-on: u"
},
{
"path": ".github/workflows/scripts/artifact-upload.bash",
"chars": 2574,
"preview": "#!/usr/bin/env bash\nset -euo pipefail\n\nusage() {\n cat <<EOF\nUsage: $0 <owner> <repo> <branch> <target-path> <artifact-f"
},
{
"path": ".github/workflows/website.yml",
"chars": 2259,
"preview": "name: \"Website\"\n\non:\n workflow_dispatch: {}\n push:\n branches:\n - master\n paths:\n - website/**\n pull_r"
},
{
"path": ".gitignore",
"chars": 163,
"preview": "branding/\ntarget/\nthird-party-licenses.txt*\nresult/\n.flatpak-builder/\n*.spv\n*.exrc\nperf.data*\nprofile.json\nprofile.json."
},
{
"path": ".nix/default.nix",
"chars": 2312,
"preview": "inputs:\n\nlet\n systems = [\n \"x86_64-linux\"\n \"aarch64-linux\"\n ];\n forAllSystems = f: inputs.nixpkgs.lib.genAttrs "
},
{
"path": ".nix/deps/cef.nix",
"chars": 635,
"preview": "{ pkgs, ... }:\n\nlet\n cefPath = pkgs.cef-binary.overrideAttrs (finalAttrs: {\n postInstall = ''\n rm -r $out/* $ou"
},
{
"path": ".nix/deps/crane.nix",
"chars": 61,
"preview": "{ pkgs, inputs, ... }:\n\n{\n lib = inputs.crane.mkLib pkgs;\n}\n"
},
{
"path": ".nix/deps/rust-gpu.nix",
"chars": 1478,
"preview": "{ pkgs, ... }:\n\nlet\n extensions = [\n \"rust-src\"\n \"rust-analyzer\"\n \"clippy\"\n \"cargo\"\n \"rustc-dev\"\n \"ll"
},
{
"path": ".nix/dev.nix",
"chars": 1198,
"preview": "{ pkgs, deps, ... }:\n\nlet\n libs = [\n pkgs.wayland\n pkgs.vulkan-loader\n pkgs.libGL\n pkgs.openssl\n pkgs.li"
},
{
"path": ".nix/pkgs/graphite-branding.nix",
"chars": 470,
"preview": "{ info, pkgs, ... }:\n\nlet\n brandingTar = pkgs.fetchurl (\n let\n lockContent = builtins.readFile \"${info.src}/.br"
},
{
"path": ".nix/pkgs/graphite-bundle.nix",
"chars": 2403,
"preview": "{\n pkgs,\n self,\n system,\n ...\n}:\n{\n graphite ? self.packages.${system}.graphite,\n}:\nlet\n bundle =\n {\n arch"
},
{
"path": ".nix/pkgs/graphite-flatpak-manifest.nix",
"chars": 803,
"preview": "{\n pkgs,\n self,\n system,\n ...\n}:\n{\n graphite-bundle ? self.packages.${system}.graphite-bundle,\n}:\n\n(pkgs.formats.js"
},
{
"path": ".nix/pkgs/graphite-raster-nodes-shaders.nix",
"chars": 767,
"preview": "{ info, deps, ... }:\n\n(deps.crane.lib.overrideToolchain (_: deps.rustGPU.toolchain)).buildPackage {\n pname = \"raster-no"
},
{
"path": ".nix/pkgs/graphite.nix",
"chars": 4492,
"preview": "{\n info,\n pkgs,\n self,\n deps,\n system,\n lib,\n ...\n}:\n\n{\n dev ? false,\n}:\n\nlet\n branding = self.packages.${syste"
},
{
"path": ".nix/pkgs/tools/third-party-licenses.nix",
"chars": 673,
"preview": "{\n info,\n deps,\n pkgs,\n ...\n}:\n\nlet\n cargoVendorDir = deps.crane.lib.vendorCargoDeps { inherit (info) src; };\n com"
},
{
"path": ".nvmrc",
"chars": 3,
"preview": "24\n"
},
{
"path": ".prettierrc",
"chars": 215,
"preview": "{\n\t\"singleQuote\": false,\n\t\"useTabs\": true,\n\t\"tabWidth\": 4,\n\t\"printWidth\": 200,\n\t\"overrides\": [\n\t\t{\n\t\t\t\"files\": [\n\t\t\t\t\"*."
},
{
"path": ".vscode/extensions.json",
"chars": 448,
"preview": "{\n\t// NOTE: Keep this in sync with `.devcontainer/devcontainer.json`\n\t\"recommendations\": [\n\t\t// Rust\n\t\t\"rust-lang.rust-a"
},
{
"path": ".vscode/launch.json",
"chars": 941,
"preview": "{\n\t// Use IntelliSense to learn about possible attributes.\n\t// Hover to view descriptions of existing attributes.\n\t// Fo"
},
{
"path": ".vscode/settings.json",
"chars": 2290,
"preview": "{\n\t// Rust: save on format\n\t\"[rust]\": {\n\t\t\"editor.formatOnSave\": true,\n\t\t\"editor.formatOnPaste\": true,\n\t\t\"editor.default"
},
{
"path": "Cargo.toml",
"chars": 8007,
"preview": "[workspace]\nmembers = [\n\t\"desktop\",\n\t\"desktop/wrapper\",\n\t\"desktop/embedded-resources\",\n\t\"desktop/bundle\",\n\t\"desktop/plat"
},
{
"path": "LICENSE.txt",
"chars": 11357,
"preview": " Apache License\n Version 2.0, January 2004\n "
},
{
"path": "README.md",
"chars": 5908,
"preview": "\n\n<a href=\"https://graphite.art/\">\n<picture>\n<source media=\"(prefers-color-scheme: dark)\" srcset=\"https://github.com/use"
},
{
"path": "about.toml",
"chars": 2033,
"preview": "accepted = [\n\t\"Apache-2.0 WITH LLVM-exception\", # Keep this list in sync with those in `/deny.toml`\n\t\"Apache-2.0\", # Kee"
},
{
"path": "demo-artwork/changing-seasons.graphite",
"chars": 185468,
"preview": "{\"network_interface\":{\"network\":{\"exports\":[{\"Node\":{\"node_id\":3143874172491239000,\"output_index\":0}}],\"nodes\":[[1031624"
},
{
"path": "demo-artwork/isometric-fountain.graphite",
"chars": 1273616,
"preview": "{\"network_interface\":{\"network\":{\"exports\":[{\"Node\":{\"node_id\":15709488322180832347,\"output_index\":0}}],\"nodes\":[[105070"
},
{
"path": "demo-artwork/marbled-mandelbrot.graphite",
"chars": 30443,
"preview": "{\"network_interface\":{\"network\":{\"exports\":[{\"Node\":{\"node_id\":12241147352993594415,\"output_index\":0}}],\"nodes\":[[438871"
},
{
"path": "demo-artwork/painted-dreams.graphite",
"chars": 691226,
"preview": "{\"network_interface\":{\"network\":{\"exports\":[{\"Node\":{\"node_id\":392274448837115448,\"output_index\":0}}],\"nodes\":[[13353438"
},
{
"path": "demo-artwork/parametric-dunescape.graphite",
"chars": 518839,
"preview": "{\"network_interface\":{\"network\":{\"exports\":[{\"Node\":{\"node_id\":4445985685181725042,\"output_index\":0}}],\"nodes\":[[1715475"
},
{
"path": "demo-artwork/procedural-string-lights.graphite",
"chars": 136021,
"preview": "{\"network_interface\":{\"network\":{\"exports\":[{\"Node\":{\"node_id\":14972365039974885000,\"output_index\":0}}],\"nodes\":[[183562"
},
{
"path": "demo-artwork/red-dress.graphite",
"chars": 1482059,
"preview": "{\"network_interface\":{\"network\":{\"exports\":[{\"Node\":{\"node_id\":2394762731964337494,\"output_index\":0}}],\"nodes\":[[1012746"
},
{
"path": "demo-artwork/valley-of-spires.graphite",
"chars": 989067,
"preview": "{\"network_interface\":{\"network\":{\"exports\":[{\"Node\":{\"node_id\":16815500381887058038,\"output_index\":0}}],\"nodes\":[[202,{\""
},
{
"path": "deny.toml",
"chars": 8918,
"preview": "# This template contains all of the possible sections and their default values\n\n# Note that all fields that take a lint "
},
{
"path": "desktop/Cargo.toml",
"chars": 2274,
"preview": "[package]\nname = \"graphite-desktop\"\nversion = \"0.1.0\"\ndescription = \"Graphite Desktop\"\nauthors = [\"Graphite Authors <con"
},
{
"path": "desktop/assets/art.graphite.Graphite.desktop",
"chars": 411,
"preview": "[Desktop Entry]\nName=Graphite\nGenericName=Vector & Raster Graphics Editor\nComment=Open-source vector & raster graphics e"
},
{
"path": "desktop/bundle/Cargo.toml",
"chars": 389,
"preview": "[package]\nname = \"graphite-desktop-bundle\"\nversion = \"0.0.0\"\ndescription = \"Graphite Desktop Bundle\"\nauthors = [\"Graphit"
},
{
"path": "desktop/bundle/build.rs",
"chars": 455,
"preview": "fn main() {\n\tprintln!(\"cargo:rerun-if-env-changed=CARGO_PROFILE\");\n\tprintln!(\"cargo:rerun-if-env-changed=PROFILE\");\n\tlet"
},
{
"path": "desktop/bundle/src/common.rs",
"chars": 2068,
"preview": "#![cfg_attr(target_os = \"linux\", allow(unused))] // TODO: Remove this when bundling for linux is implemented\n\nuse std::e"
},
{
"path": "desktop/bundle/src/linux.rs",
"chars": 789,
"preview": "use crate::common::*;\n\npub fn main() -> Result<(), Box<dyn std::error::Error>> {\n\tlet app_bin = build_bin(\"graphite-desk"
},
{
"path": "desktop/bundle/src/mac.rs",
"chars": 4986,
"preview": "use std::collections::HashMap;\nuse std::error::Error;\nuse std::fs;\nuse std::path::{Path, PathBuf};\n\nuse crate::common::*"
},
{
"path": "desktop/bundle/src/main.rs",
"chars": 303,
"preview": "mod common;\n\n#[cfg(target_os = \"linux\")]\nmod linux;\n#[cfg(target_os = \"macos\")]\nmod mac;\n#[cfg(target_os = \"windows\")]\nm"
},
{
"path": "desktop/bundle/src/win.rs",
"chars": 1736,
"preview": "use std::error::Error;\nuse std::fs;\nuse std::path::{Path, PathBuf};\n\nuse crate::common::*;\n\nconst EXECUTABLE: &str = \"Gr"
},
{
"path": "desktop/embedded-resources/Cargo.toml",
"chars": 400,
"preview": "[package]\nname = \"graphite-desktop-embedded-resources\"\nversion = \"0.1.0\"\ndescription = \"Graphite Desktop Embedded Resour"
},
{
"path": "desktop/embedded-resources/build.rs",
"chars": 1367,
"preview": "const EMBEDDED_RESOURCES_ENV: &str = \"EMBEDDED_RESOURCES\";\nconst DEFAULT_RESOURCES_DIR: &str = \"../../frontend/dist\";\n\nf"
},
{
"path": "desktop/embedded-resources/src/lib.rs",
"chars": 696,
"preview": "//! This crate provides `EMBEDDED_RESOURCES` that can be included in the desktop application binary.\n//! It is intended "
},
{
"path": "desktop/platform/linux/Cargo.toml",
"chars": 351,
"preview": "[package]\nname = \"graphite-desktop-platform-linux\"\nversion = \"0.0.0\"\ndescription = \"Graphite Desktop Platform Linux\"\naut"
},
{
"path": "desktop/platform/linux/src/main.rs",
"chars": 42,
"preview": "fn main() {\n\tgraphite_desktop::start();\n}\n"
},
{
"path": "desktop/platform/mac/Cargo.toml",
"chars": 395,
"preview": "[package]\nname = \"graphite-desktop-platform-mac\"\nversion = \"0.0.0\"\ndescription = \"Graphite Desktop Platform Mac\"\nauthors"
},
{
"path": "desktop/platform/mac/src/helper.rs",
"chars": 49,
"preview": "fn main() {\n\tgraphite_desktop::start_helper();\n}\n"
},
{
"path": "desktop/platform/mac/src/main.rs",
"chars": 42,
"preview": "fn main() {\n\tgraphite_desktop::start();\n}\n"
},
{
"path": "desktop/platform/win/Cargo.toml",
"chars": 424,
"preview": "[package]\nname = \"graphite-desktop-platform-win\"\nversion = \"0.0.0\"\ndescription = \"Graphite Desktop Platform Windows\"\naut"
},
{
"path": "desktop/platform/win/build.rs",
"chars": 909,
"preview": "fn main() {\n\t#[cfg(target_os = \"windows\")]\n\t{\n\t\tlet mut res = winres::WindowsResource::new();\n\n\t\tres.set_icon(\"../../../"
},
{
"path": "desktop/platform/win/src/main.rs",
"chars": 76,
"preview": "#![windows_subsystem = \"windows\"]\nfn main() {\n\tgraphite_desktop::start();\n}\n"
},
{
"path": "desktop/src/app.rs",
"chars": 23120,
"preview": "use rand::Rng;\nuse rfd::AsyncFileDialog;\nuse std::fs;\nuse std::io::Read;\nuse std::sync::Arc;\nuse std::sync::atomic::{Ato"
},
{
"path": "desktop/src/cef/consts.rs",
"chars": 713,
"preview": "use std::time::Duration;\n\npub(crate) const RESOURCE_SCHEME: &str = \"resources\";\npub(crate) const RESOURCE_DOMAIN: &str ="
},
{
"path": "desktop/src/cef/context/builder.rs",
"chars": 7997,
"preview": "use cef::args::Args;\nuse cef::sys::{CEF_API_VERSION_LAST, cef_log_severity_t};\nuse cef::{\n\tApp, BrowserSettings, CefStri"
},
{
"path": "desktop/src/cef/context/multithreaded.rs",
"chars": 1671,
"preview": "use cef::sys::cef_thread_id_t;\nuse cef::{Task, ThreadId, post_task};\nuse std::cell::RefCell;\nuse winit::event::WindowEve"
},
{
"path": "desktop/src/cef/context/singlethreaded.rs",
"chars": 2285,
"preview": "use cef::{Browser, ImplBrowser, ImplBrowserHost};\nuse winit::event::WindowEvent;\n\nuse crate::cef::input::InputState;\nuse"
},
{
"path": "desktop/src/cef/context.rs",
"chars": 354,
"preview": "#[cfg(not(target_os = \"macos\"))]\nmod multithreaded;\nmod singlethreaded;\n\nmod builder;\npub(crate) use builder::{CefContex"
},
{
"path": "desktop/src/cef/dirs.rs",
"chars": 650,
"preview": "use std::path::PathBuf;\n\nuse crate::dirs::{app_data_dir, ensure_dir_exists};\n\nstatic CEF_DIR_NAME: &str = \"browser\";\n\npu"
},
{
"path": "desktop/src/cef/input/keymap.rs",
"chars": 5101,
"preview": "use winit::keyboard::{Key, NamedKey, PhysicalKey};\n\npub(crate) trait ToCharRepresentation {\n\tfn to_char_representation(&"
},
{
"path": "desktop/src/cef/input/state.rs",
"chars": 7401,
"preview": "use cef::MouseEvent;\nuse cef::sys::cef_event_flags_t;\nuse std::time::Instant;\nuse winit::dpi::PhysicalPosition;\nuse wini"
},
{
"path": "desktop/src/cef/input.rs",
"chars": 5880,
"preview": "use cef::sys::{cef_key_event_type_t, cef_mouse_button_type_t};\nuse cef::{Browser, ImplBrowser, ImplBrowserHost, KeyEvent"
},
{
"path": "desktop/src/cef/internal/browser_process_app.rs",
"chars": 5616,
"preview": "#[cfg(target_os = \"linux\")]\nuse std::env;\n\nuse cef::rc::{Rc, RcImpl};\nuse cef::sys::{_cef_app_t, cef_base_ref_counted_t}"
},
{
"path": "desktop/src/cef/internal/browser_process_client.rs",
"chars": 3412,
"preview": "use cef::rc::{Rc, RcImpl};\nuse cef::sys::{_cef_client_t, cef_base_ref_counted_t};\nuse cef::{ContextMenuHandler, DisplayH"
},
{
"path": "desktop/src/cef/internal/browser_process_handler.rs",
"chars": 1842,
"preview": "use std::time::{Duration, Instant};\n\nuse cef::rc::{Rc, RcImpl};\nuse cef::sys::{_cef_browser_process_handler_t, cef_base_"
},
{
"path": "desktop/src/cef/internal/context_menu_handler.rs",
"chars": 1665,
"preview": "use cef::rc::{Rc, RcImpl};\nuse cef::sys::{_cef_context_menu_handler_t, cef_base_ref_counted_t};\nuse cef::{ImplContextMen"
},
{
"path": "desktop/src/cef/internal/display_handler.rs",
"chars": 5733,
"preview": "use cef::rc::{Rc, RcImpl};\nuse cef::sys::{_cef_display_handler_t, cef_base_ref_counted_t, cef_cursor_type_t::*, cef_log_"
},
{
"path": "desktop/src/cef/internal/life_span_handler.rs",
"chars": 1823,
"preview": "use cef::rc::{Rc, RcImpl};\nuse cef::sys::{_cef_life_span_handler_t, cef_base_ref_counted_t};\nuse cef::{ImplLifeSpanHandl"
},
{
"path": "desktop/src/cef/internal/load_handler.rs",
"chars": 1611,
"preview": "use cef::rc::{Rc, RcImpl};\nuse cef::sys::{_cef_load_handler_t, cef_base_ref_counted_t, cef_load_handler_t};\nuse cef::{Im"
},
{
"path": "desktop/src/cef/internal/render_handler.rs",
"chars": 2660,
"preview": "use cef::rc::{Rc, RcImpl};\nuse cef::sys::{_cef_render_handler_t, cef_base_ref_counted_t};\nuse cef::{Browser, ImplRenderH"
},
{
"path": "desktop/src/cef/internal/render_process_app.rs",
"chars": 1711,
"preview": "use cef::rc::{Rc, RcImpl};\nuse cef::sys::{_cef_app_t, cef_base_ref_counted_t};\nuse cef::{App, ImplApp, RenderProcessHand"
},
{
"path": "desktop/src/cef/internal/render_process_handler.rs",
"chars": 4301,
"preview": "use cef::rc::{ConvertReturnValue, Rc, RcImpl};\nuse cef::sys::{_cef_render_process_handler_t, cef_base_ref_counted_t, cef"
},
{
"path": "desktop/src/cef/internal/render_process_v8_handler.rs",
"chars": 2447,
"preview": "use cef::{ImplV8Handler, ImplV8Value, V8Value, WrapV8Handler, rc::Rc, v8_context_get_current_context};\n\nuse crate::cef::"
},
{
"path": "desktop/src/cef/internal/resource_handler.rs",
"chars": 3049,
"preview": "use cef::rc::{Rc, RcImpl};\nuse cef::sys::{_cef_resource_handler_t, cef_base_ref_counted_t};\nuse cef::{Callback, CefStrin"
},
{
"path": "desktop/src/cef/internal/scheme_handler_factory.rs",
"chars": 2772,
"preview": "use cef::rc::{Rc, RcImpl};\nuse cef::sys::{_cef_scheme_handler_factory_t, cef_base_ref_counted_t, cef_scheme_options_t};\n"
},
{
"path": "desktop/src/cef/internal/task.rs",
"chars": 1407,
"preview": "use cef::rc::{Rc, RcImpl};\nuse cef::sys::{_cef_task_t, cef_base_ref_counted_t};\nuse cef::{ImplTask, WrapTask};\nuse std::"
},
{
"path": "desktop/src/cef/internal.rs",
"chars": 639,
"preview": "mod browser_process_app;\nmod browser_process_client;\nmod browser_process_handler;\n\nmod render_process_app;\nmod render_pr"
},
{
"path": "desktop/src/cef/ipc.rs",
"chars": 3470,
"preview": "use cef::{CefString, Frame, ImplBinaryValue, ImplFrame, ImplListValue, ImplProcessMessage, ImplV8Context, ProcessId, V8C"
},
{
"path": "desktop/src/cef/platform.rs",
"chars": 1668,
"preview": "#[cfg(feature = \"accelerated_paint\")]\npub fn should_enable_hardware_acceleration() -> bool {\n\t#[cfg(target_os = \"linux\")"
},
{
"path": "desktop/src/cef/utility.rs",
"chars": 269,
"preview": "pub unsafe fn pointer_to_string(pointer: *mut cef::sys::_cef_string_utf16_t) -> String {\n\tlet str = unsafe { (*pointer)."
},
{
"path": "desktop/src/cef.rs",
"chars": 8654,
"preview": "//! CEF (Chromium Embedded Framework) integration for Graphite Desktop\n//!\n//! This module provides CEF browser integrat"
},
{
"path": "desktop/src/cli.rs",
"chars": 297,
"preview": "#[derive(clap::Parser)]\n#[clap(name = \"graphite\", version)]\npub struct Cli {\n\t#[arg(help = \"Files to open on startup\")]\n"
},
{
"path": "desktop/src/consts.rs",
"chars": 737,
"preview": "pub(crate) const APP_NAME: &str = \"Graphite\";\n#[cfg(any(target_os = \"linux\", target_os = \"windows\"))]\npub(crate) const A"
},
{
"path": "desktop/src/dirs.rs",
"chars": 622,
"preview": "use std::fs::create_dir_all;\nuse std::path::PathBuf;\n\nuse crate::consts::{APP_DIRECTORY_NAME, APP_DOCUMENTS_DIRECTORY_NA"
},
{
"path": "desktop/src/event.rs",
"chars": 1145,
"preview": "use crate::wrapper::NodeGraphExecutionResult;\nuse crate::wrapper::messages::DesktopWrapperMessage;\n\npub(crate) enum AppE"
},
{
"path": "desktop/src/gpu_context.rs",
"chars": 1028,
"preview": "use crate::wrapper::{WgpuContext, WgpuContextBuilder, WgpuFeatures};\n\npub(super) async fn create_wgpu_context() -> WgpuC"
},
{
"path": "desktop/src/lib.rs",
"chars": 4531,
"preview": "use crate::app::App;\nuse crate::cef::CefHandler;\nuse crate::cli::Cli;\nuse crate::consts::APP_LOCK_FILE_NAME;\nuse crate::"
},
{
"path": "desktop/src/main.rs",
"chars": 42,
"preview": "fn main() {\n\tgraphite_desktop::start();\n}\n"
},
{
"path": "desktop/src/persist.rs",
"chars": 5283,
"preview": "use crate::wrapper::messages::{Document, DocumentId};\n\n#[derive(Default, serde::Serialize, serde::Deserialize)]\npub(crat"
},
{
"path": "desktop/src/preferences.rs",
"chars": 915,
"preview": "use graphite_desktop_wrapper::messages::Preferences;\n\npub(crate) fn write(preferences: Preferences) {\n\tlet Ok(preference"
},
{
"path": "desktop/src/render/composite_shader.wgsl",
"chars": 3238,
"preview": "// =============\n// VERTEX SHADER\n// =============\n\nstruct VertexOutput {\n\t@builtin(position) clip_position: vec4<f32>,\n"
},
{
"path": "desktop/src/render/frame_buffer_ref.rs",
"chars": 1391,
"preview": "use thiserror::Error;\n\npub(crate) struct FrameBufferRef<'a> {\n\tbuffer: &'a [u8],\n\twidth: usize,\n\theight: usize,\n}\nimpl<'"
},
{
"path": "desktop/src/render/state.rs",
"chars": 11762,
"preview": "use std::borrow::Cow;\nuse wgpu::PresentMode;\n\nuse crate::window::Window;\nuse crate::wrapper::{TargetTexture, WgpuContext"
},
{
"path": "desktop/src/render.rs",
"chars": 133,
"preview": "mod frame_buffer_ref;\npub(crate) use frame_buffer_ref::FrameBufferRef;\n\nmod state;\npub(crate) use state::{RenderError, R"
},
{
"path": "desktop/src/window/linux.rs",
"chars": 995,
"preview": "use winit::event_loop::ActiveEventLoop;\nuse winit::platform::wayland::ActiveEventLoopExtWayland;\nuse winit::platform::wa"
},
{
"path": "desktop/src/window/mac/app.rs",
"chars": 1091,
"preview": "use objc2::{ClassType, define_class, msg_send};\nuse objc2_app_kit::{NSApplication, NSEvent, NSEventType, NSResponder};\nu"
},
{
"path": "desktop/src/window/mac/menu.rs",
"chars": 4775,
"preview": "use muda::Menu as MudaMenu;\nuse muda::accelerator::Accelerator;\nuse muda::{CheckMenuItem, IsMenuItem, MenuEvent, MenuIte"
},
{
"path": "desktop/src/window/mac.rs",
"chars": 1075,
"preview": "use winit::event_loop::ActiveEventLoop;\nuse winit::platform::macos::WindowAttributesMacOS;\nuse winit::window::{Window, W"
},
{
"path": "desktop/src/window/win/native_handle.rs",
"chars": 14991,
"preview": "//! Implements a Windows-specific custom window frame (no titlebar, but native boarder, shadows and resize).\n//! Look an"
},
{
"path": "desktop/src/window/win.rs",
"chars": 1395,
"preview": "use windows::Win32::System::Com::{COINIT_APARTMENTTHREADED, CoInitializeEx};\nuse windows::Win32::System::Console::{ATTAC"
},
{
"path": "desktop/src/window.rs",
"chars": 6215,
"preview": "use crate::consts::APP_NAME;\nuse crate::event::AppEventScheduler;\nuse crate::wrapper::messages::MenuItem;\nuse std::colle"
},
{
"path": "desktop/wrapper/Cargo.toml",
"chars": 886,
"preview": "[package]\nname = \"graphite-desktop-wrapper\"\nversion = \"0.1.0\"\ndescription = \"Graphite Desktop Wrapper\"\nauthors = [\"Graph"
},
{
"path": "desktop/wrapper/src/handle_desktop_wrapper_message.rs",
"chars": 4225,
"preview": "use graphite_editor::messages::clipboard::utility_types::ClipboardContentRaw;\nuse graphite_editor::messages::prelude::*;"
},
{
"path": "desktop/wrapper/src/intercept_editor_message.rs",
"chars": 290,
"preview": "use super::DesktopWrapperMessageDispatcher;\nuse super::messages::EditorMessage;\n\npub(super) fn intercept_editor_message("
},
{
"path": "desktop/wrapper/src/intercept_frontend_message.rs",
"chars": 6388,
"preview": "#[cfg(target_os = \"macos\")]\nuse graphite_editor::messages::layout::utility_types::layout_widget::LayoutTarget;\nuse graph"
},
{
"path": "desktop/wrapper/src/lib.rs",
"chars": 2513,
"preview": "use graph_craft::wasm_application_io::WasmApplicationIo;\nuse graphite_editor::application::{Editor, Environment, Host, P"
},
{
"path": "desktop/wrapper/src/message_dispatcher.rs",
"chars": 2528,
"preview": "use graphite_editor::application::Editor;\nuse std::collections::VecDeque;\n\nuse super::handle_desktop_wrapper_message::ha"
},
{
"path": "desktop/wrapper/src/messages.rs",
"chars": 3623,
"preview": "use graphite_editor::messages::prelude::FrontendMessage;\nuse std::path::PathBuf;\n\npub(crate) use graphite_editor::messag"
},
{
"path": "desktop/wrapper/src/utils.rs",
"chars": 9511,
"preview": "#[cfg(target_os = \"macos\")]\npub(crate) mod menu {\n\tuse base64::engine::Engine;\n\tuse base64::engine::general_purpose::STA"
},
{
"path": "editor/Cargo.toml",
"chars": 1741,
"preview": "[package]\nname = \"graphite-editor\"\npublish = false\nversion = \"0.0.0\"\nrust-version = \"1.88\"\nauthors = [\"Graphite Authors "
},
{
"path": "editor/build.rs",
"chars": 2481,
"preview": "use std::env;\nuse std::process::Command;\n\nconst GRAPHITE_RELEASE_SERIES: &str = \"Alpha 4\";\n\nfn main() {\n\t// Instruct Car"
},
{
"path": "editor/src/application.rs",
"chars": 2973,
"preview": "use crate::dispatcher::Dispatcher;\nuse crate::messages::prelude::*;\npub use graphene_std::uuid::*;\nuse std::sync::OnceLo"
},
{
"path": "editor/src/consts.rs",
"chars": 7841,
"preview": "// GRAPH\npub const GRID_SIZE: u32 = 24;\npub const EXPORTS_TO_TOP_EDGE_PIXEL_GAP: u32 = 72;\npub const EXPORTS_TO_RIGHT_ED"
},
{
"path": "editor/src/dispatcher.rs",
"chars": 26651,
"preview": "use crate::messages::debug::utility_types::MessageLoggingVerbosity;\nuse crate::messages::defer::DeferMessageContext;\nuse"
},
{
"path": "editor/src/lib.rs",
"chars": 351,
"preview": "extern crate graphite_proc_macros;\n\n// `macro_use` puts these macros into scope for all descendant code files\n#[macro_us"
},
{
"path": "editor/src/macros.rs",
"chars": 1100,
"preview": "/// Syntax sugar for initializing an `ActionList`\n///\n/// # Example\n///\n/// ```ignore\n/// actions!(DocumentMessage::Undo"
},
{
"path": "editor/src/messages/animation/animation_message.rs",
"chars": 468,
"preview": "use super::animation_message_handler::AnimationTimeMode;\nuse crate::messages::prelude::*;\n\n#[impl_message(Message, Anima"
},
{
"path": "editor/src/messages/animation/animation_message_handler.rs",
"chars": 4391,
"preview": "use std::time::Duration;\n\nuse crate::messages::prelude::*;\n\nuse super::TimingInformation;\n\n#[derive(PartialEq, Clone, De"
},
{
"path": "editor/src/messages/animation/mod.rs",
"chars": 280,
"preview": "mod animation_message;\nmod animation_message_handler;\n\n#[doc(inline)]\npub use animation_message::{AnimationMessage, Anim"
},
{
"path": "editor/src/messages/app_window/app_window_message.rs",
"chars": 314,
"preview": "use crate::messages::prelude::*;\n\n#[impl_message(Message, AppWindow)]\n#[derive(PartialEq, Clone, Debug, serde::Serialize"
},
{
"path": "editor/src/messages/app_window/app_window_message_handler.rs",
"chars": 2759,
"preview": "use crate::application::{Environment, Platform};\nuse crate::messages::prelude::*;\nuse crate::{application::Host, message"
},
{
"path": "editor/src/messages/app_window/mod.rs",
"chars": 230,
"preview": "mod app_window_message;\npub mod app_window_message_handler;\n\n#[doc(inline)]\npub use app_window_message::{AppWindowMessag"
},
{
"path": "editor/src/messages/broadcast/broadcast_message.rs",
"chars": 373,
"preview": "use crate::messages::prelude::*;\n\n#[impl_message(Message, Broadcast)]\n#[derive(PartialEq, Clone, Debug, serde::Serialize"
},
{
"path": "editor/src/messages/broadcast/broadcast_message_handler.rs",
"chars": 910,
"preview": "use crate::messages::prelude::*;\n\n#[derive(Debug, Clone, Default, ExtractField)]\npub struct BroadcastMessageHandler {\n\te"
},
{
"path": "editor/src/messages/broadcast/event/event_message.rs",
"chars": 336,
"preview": "use crate::messages::prelude::*;\n\n#[impl_message(Message, BroadcastMessage, TriggerEvent)]\n#[derive(PartialEq, Eq, Clone"
},
{
"path": "editor/src/messages/broadcast/event/event_message_handler.rs",
"chars": 662,
"preview": "use crate::messages::prelude::*;\n\n#[derive(ExtractField)]\npub struct EventMessageContext<'a> {\n\tpub listeners: &'a mut H"
},
{
"path": "editor/src/messages/broadcast/event/mod.rs",
"chars": 217,
"preview": "mod event_message;\nmod event_message_handler;\n\n#[doc(inline)]\npub use event_message::{EventMessage, EventMessageDiscrimi"
},
{
"path": "editor/src/messages/broadcast/mod.rs",
"chars": 238,
"preview": "mod broadcast_message;\nmod broadcast_message_handler;\n\npub mod event;\n\n#[doc(inline)]\npub use broadcast_message::{Broadc"
},
{
"path": "editor/src/messages/clipboard/clipboard_message.rs",
"chars": 424,
"preview": "use crate::messages::clipboard::utility_types::{ClipboardContent, ClipboardContentRaw};\nuse crate::messages::prelude::*;"
},
{
"path": "editor/src/messages/clipboard/clipboard_message_handler.rs",
"chars": 3399,
"preview": "use crate::messages::clipboard::utility_types::{ClipboardContent, ClipboardContentRaw};\nuse crate::messages::prelude::*;"
},
{
"path": "editor/src/messages/clipboard/mod.rs",
"chars": 249,
"preview": "mod clipboard_message;\npub mod clipboard_message_handler;\npub mod utility_types;\n\n#[doc(inline)]\npub use clipboard_messa"
},
{
"path": "editor/src/messages/clipboard/utility_types.rs",
"chars": 419,
"preview": "#[derive(PartialEq, Clone, Debug, serde::Serialize, serde::Deserialize)]\npub enum ClipboardContentRaw {\n\tText(String),\n\t"
},
{
"path": "editor/src/messages/debug/debug_message.rs",
"chars": 239,
"preview": "use crate::messages::prelude::*;\n\n#[impl_message(Message, Debug)]\n#[derive(PartialEq, Eq, Clone, Debug, Hash, serde::Ser"
},
{
"path": "editor/src/messages/debug/debug_message_handler.rs",
"chars": 1526,
"preview": "use super::utility_types::MessageLoggingVerbosity;\nuse crate::messages::prelude::*;\n\n#[derive(Debug, Default, ExtractFie"
},
{
"path": "editor/src/messages/debug/mod.rs",
"chars": 218,
"preview": "mod debug_message;\nmod debug_message_handler;\n\npub mod utility_types;\n\n#[doc(inline)]\npub use debug_message::{DebugMessa"
},
{
"path": "editor/src/messages/debug/utility_types.rs",
"chars": 128,
"preview": "#[derive(Debug, Default, Clone, Copy, Eq, PartialEq)]\npub enum MessageLoggingVerbosity {\n\t#[default]\n\tOff,\n\tNames,\n\tCont"
},
{
"path": "editor/src/messages/defer/defer_message.rs",
"chars": 396,
"preview": "use crate::messages::prelude::*;\n\n#[impl_message(Message, Defer)]\n#[derive(PartialEq, Clone, Debug, serde::Serialize, se"
},
{
"path": "editor/src/messages/defer/defer_message_handler.rs",
"chars": 2082,
"preview": "use crate::messages::prelude::*;\n\n#[derive(ExtractField)]\npub struct DeferMessageContext<'a> {\n\tpub portfolio: &'a Portf"
},
{
"path": "editor/src/messages/defer/mod.rs",
"chars": 217,
"preview": "mod defer_message;\nmod defer_message_handler;\n\n#[doc(inline)]\npub use defer_message::{DeferMessage, DeferMessageDiscrimi"
},
{
"path": "editor/src/messages/dialog/dialog_message.rs",
"chars": 1022,
"preview": "use crate::messages::prelude::*;\n\n#[impl_message(Message, Dialog)]\n#[derive(PartialEq, Clone, Debug, serde::Serialize, s"
},
{
"path": "editor/src/messages/dialog/dialog_message_handler.rs",
"chars": 6293,
"preview": "use super::simple_dialogs::{self, AboutGraphiteDialog, DemoArtworkDialog, LicensesDialog};\nuse crate::application::GRAPH"
},
{
"path": "editor/src/messages/dialog/export_dialog/export_dialog_message.rs",
"chars": 427,
"preview": "use crate::messages::frontend::utility_types::{ExportBounds, FileType};\nuse crate::messages::prelude::*;\n\n#[impl_message"
},
{
"path": "editor/src/messages/dialog/export_dialog/export_dialog_message_handler.rs",
"chars": 6129,
"preview": "use crate::messages::frontend::utility_types::{ExportBounds, FileType};\nuse crate::messages::layout::utility_types::widg"
},
{
"path": "editor/src/messages/dialog/export_dialog/mod.rs",
"chars": 277,
"preview": "mod export_dialog_message;\nmod export_dialog_message_handler;\n\n#[doc(inline)]\npub use export_dialog_message::{ExportDial"
},
{
"path": "editor/src/messages/dialog/mod.rs",
"chars": 688,
"preview": "//! Handles dialogs that appear as floating menus in the center of the editor window.\n//!\n//! Dialogs are represented as"
},
{
"path": "editor/src/messages/dialog/new_document_dialog/mod.rs",
"chars": 286,
"preview": "mod new_document_dialog_message;\nmod new_document_dialog_message_handler;\n\n#[doc(inline)]\npub use new_document_dialog_me"
},
{
"path": "editor/src/messages/dialog/new_document_dialog/new_document_dialog_message.rs",
"chars": 327,
"preview": "use crate::messages::prelude::*;\n\n#[impl_message(Message, DialogMessage, NewDocumentDialog)]\n#[derive(PartialEq, Clone, "
},
{
"path": "editor/src/messages/dialog/new_document_dialog/new_document_dialog_message_handler.rs",
"chars": 4641,
"preview": "use crate::messages::layout::utility_types::widget_prelude::*;\nuse crate::messages::prelude::*;\nuse glam::{IVec2, UVec2}"
},
{
"path": "editor/src/messages/dialog/preferences_dialog/mod.rs",
"chars": 317,
"preview": "mod preferences_dialog_message;\nmod preferences_dialog_message_handler;\n\n#[doc(inline)]\npub use preferences_dialog_messa"
},
{
"path": "editor/src/messages/dialog/preferences_dialog/preferences_dialog_message.rs",
"chars": 247,
"preview": "use crate::messages::prelude::*;\n\n#[impl_message(Message, DialogMessage, PreferencesDialog)]\n#[derive(Eq, PartialEq, Clo"
},
{
"path": "editor/src/messages/dialog/preferences_dialog/preferences_dialog_message_handler.rs",
"chars": 18859,
"preview": "use crate::consts::{VIEWPORT_ZOOM_WHEEL_RATE, VIEWPORT_ZOOM_WHEEL_RATE_CHANGE};\nuse crate::messages::layout::utility_typ"
},
{
"path": "editor/src/messages/dialog/simple_dialogs/about_graphite_dialog.rs",
"chars": 2304,
"preview": "use crate::application::commit_info_localized;\nuse crate::messages::layout::utility_types::widget_prelude::*;\nuse crate:"
},
{
"path": "editor/src/messages/dialog/simple_dialogs/close_all_documents_dialog.rs",
"chars": 1328,
"preview": "use crate::messages::layout::utility_types::widget_prelude::*;\nuse crate::messages::prelude::*;\n\n/// A dialog for confir"
},
{
"path": "editor/src/messages/dialog/simple_dialogs/close_document_dialog.rs",
"chars": 1831,
"preview": "use crate::messages::broadcast::event::EventMessage;\nuse crate::messages::layout::utility_types::widget_prelude::*;\nuse "
},
{
"path": "editor/src/messages/dialog/simple_dialogs/confirm_restart_dialog.rs",
"chars": 1561,
"preview": "use crate::messages::layout::utility_types::widget_prelude::*;\nuse crate::messages::prelude::*;\n\n/// A dialog for confir"
},
{
"path": "editor/src/messages/dialog/simple_dialogs/demo_artwork_dialog.rs",
"chars": 2287,
"preview": "use crate::messages::layout::utility_types::widget_prelude::*;\nuse crate::messages::prelude::*;\n\n/// A dialog to let the"
},
{
"path": "editor/src/messages/dialog/simple_dialogs/error_dialog.rs",
"chars": 832,
"preview": "use crate::messages::layout::utility_types::widget_prelude::*;\nuse crate::messages::prelude::*;\n\n/// A dialog to notify "
},
{
"path": "editor/src/messages/dialog/simple_dialogs/licenses_dialog.rs",
"chars": 2207,
"preview": "use crate::messages::layout::utility_types::widget_prelude::*;\nuse crate::messages::prelude::*;\n\npub struct LicensesDial"
},
{
"path": "editor/src/messages/dialog/simple_dialogs/licenses_third_party_dialog.rs",
"chars": 1836,
"preview": "use crate::messages::layout::utility_types::widget_prelude::*;\nuse crate::messages::prelude::*;\n\npub struct LicensesThir"
},
{
"path": "editor/src/messages/dialog/simple_dialogs/mod.rs",
"chars": 656,
"preview": "mod about_graphite_dialog;\nmod close_all_documents_dialog;\nmod close_document_dialog;\nmod confirm_restart_dialog;\nmod de"
},
{
"path": "editor/src/messages/frontend/frontend_message.rs",
"chars": 9132,
"preview": "use super::IconName;\nuse super::utility_types::{DocumentDetails, MouseCursorIcon, OpenDocument};\nuse crate::messages::ap"
},
{
"path": "editor/src/messages/frontend/mod.rs",
"chars": 346,
"preview": "mod frontend_message;\n\npub mod utility_types;\n\n#[doc(inline)]\npub use frontend_message::{FrontendMessage, FrontendMessag"
},
{
"path": "editor/src/messages/frontend/utility_types.rs",
"chars": 1905,
"preview": "use std::path::PathBuf;\n\nuse crate::messages::portfolio::document::utility_types::document_metadata::LayerNodeIdentifier"
},
{
"path": "editor/src/messages/input_mapper/input_mapper_message.rs",
"chars": 571,
"preview": "use crate::messages::input_mapper::utility_types::input_keyboard::Key;\nuse crate::messages::input_mapper::utility_types:"
},
{
"path": "editor/src/messages/input_mapper/input_mapper_message_handler.rs",
"chars": 4075,
"preview": "use super::utility_types::input_keyboard::KeysGroup;\nuse super::utility_types::misc::Mapping;\nuse crate::application::Ed"
},
{
"path": "editor/src/messages/input_mapper/input_mappings.rs",
"chars": 49125,
"preview": "use crate::application::Editor;\nuse crate::consts::{BIG_NUDGE_AMOUNT, BRUSH_SIZE_CHANGE_KEYBOARD, NUDGE_AMOUNT};\nuse cra"
},
{
"path": "editor/src/messages/input_mapper/key_mapping/key_mapping_message.rs",
"chars": 464,
"preview": "use crate::messages::prelude::*;\n\n#[impl_message(Message, KeyMapping)]\n#[derive(PartialEq, Eq, Clone, Debug, Hash, serde"
},
{
"path": "editor/src/messages/input_mapper/key_mapping/key_mapping_message_handler.rs",
"chars": 1328,
"preview": "use crate::messages::input_mapper::input_mapper_message_handler::InputMapperMessageContext;\nuse crate::messages::input_m"
},
{
"path": "editor/src/messages/input_mapper/key_mapping/mod.rs",
"chars": 277,
"preview": "mod key_mapping_message;\nmod key_mapping_message_handler;\n\n#[doc(inline)]\npub use key_mapping_message::{KeyMappingMessag"
},
{
"path": "editor/src/messages/input_mapper/mod.rs",
"chars": 338,
"preview": "mod input_mapper_message;\nmod input_mapper_message_handler;\n\npub mod input_mappings;\npub mod key_mapping;\npub mod utilit"
},
{
"path": "editor/src/messages/input_mapper/utility_types/input_keyboard.rs",
"chars": 14055,
"preview": "use crate::application::Editor;\nuse crate::messages::prelude::*;\nuse bitflags::bitflags;\nuse std::fmt::{self, Display, F"
},
{
"path": "editor/src/messages/input_mapper/utility_types/input_mouse.rs",
"chars": 3599,
"preview": "use crate::consts::DRAG_THRESHOLD;\nuse crate::messages::prelude::*;\nuse bitflags::bitflags;\nuse glam::DVec2;\nuse std::co"
},
{
"path": "editor/src/messages/input_mapper/utility_types/macros.rs",
"chars": 5919,
"preview": "/// Constructs a `KeyStates` bit vector and sets the bit flags for all the given modifier `Key`s.\nmacro_rules! modifiers"
},
{
"path": "editor/src/messages/input_mapper/utility_types/misc.rs",
"chars": 5085,
"preview": "use super::input_keyboard::{KeysGroup, LabeledShortcut, all_required_modifiers_pressed};\nuse crate::messages::input_mapp"
},
{
"path": "editor/src/messages/input_mapper/utility_types/mod.rs",
"chars": 75,
"preview": "pub mod input_keyboard;\npub mod input_mouse;\npub mod macros;\npub mod misc;\n"
},
{
"path": "editor/src/messages/input_preprocessor/input_preprocessor_message.rs",
"chars": 1031,
"preview": "use crate::messages::input_mapper::utility_types::input_keyboard::{Key, ModifierKeys};\nuse crate::messages::input_mapper"
},
{
"path": "editor/src/messages/input_preprocessor/input_preprocessor_message_handler.rs",
"chars": 11700,
"preview": "use crate::application::Editor;\nuse crate::messages::input_mapper::utility_types::input_keyboard::{Key, KeyStates, Modif"
},
{
"path": "editor/src/messages/input_preprocessor/mod.rs",
"chars": 317,
"preview": "mod input_preprocessor_message;\nmod input_preprocessor_message_handler;\n\n#[doc(inline)]\npub use input_preprocessor_messa"
},
{
"path": "editor/src/messages/layout/layout_message.rs",
"chars": 662,
"preview": "use crate::messages::layout::utility_types::widget_prelude::*;\nuse crate::messages::prelude::*;\n\n#[impl_message(Message,"
},
{
"path": "editor/src/messages/layout/layout_message_handler.rs",
"chars": 16915,
"preview": "use crate::messages::input_mapper::utility_types::input_keyboard::KeysGroup;\nuse crate::messages::layout::utility_types:"
},
{
"path": "editor/src/messages/layout/mod.rs",
"chars": 229,
"preview": "mod layout_message;\npub mod layout_message_handler;\n\npub mod utility_types;\n\n#[doc(inline)]\npub use layout_message::{Lay"
},
{
"path": "editor/src/messages/layout/utility_types/layout_widget.rs",
"chars": 32864,
"preview": "use super::widgets::button_widgets::*;\nuse super::widgets::input_widgets::*;\nuse super::widgets::label_widgets::*;\nuse c"
},
{
"path": "editor/src/messages/layout/utility_types/mod.rs",
"chars": 232,
"preview": "pub mod layout_widget;\npub mod widgets;\n\npub mod widget_prelude {\n\tpub use super::layout_widget::*;\n\tpub use super::widg"
},
{
"path": "editor/src/messages/layout/utility_types/widgets/button_widgets.rs",
"chars": 7173,
"preview": "use crate::messages::frontend::IconName;\nuse crate::messages::input_mapper::utility_types::misc::ActionShortcut;\nuse cra"
}
]
// ... and 662 more files (download for full content)
About this extraction
This page contains the full source code of the GraphiteEditor/Graphite GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 862 files (11.1 MB), approximately 2.9M tokens, and a symbol index with 7371 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.