Full Code of BAndysc/nodify-avalonia for AI

avalonia_port af468753371d cached
389 files
1.7 MB
384.5k tokens
1459 symbols
1 requests
Download .txt
Showing preview only (1,897K chars total). Download the full file or copy to clipboard to get everything.
Repository: BAndysc/nodify-avalonia
Branch: avalonia_port
Commit: af468753371d
Files: 389
Total size: 1.7 MB

Directory structure:
gitextract_apgfzb0f/

├── .editorconfig
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── ask-a-question.md
│   │   ├── bug_report.md
│   │   └── config.yml
│   └── workflows/
│       ├── build.yml
│       ├── codeql-analysis.yml
│       ├── create-release-branch.yml
│       ├── publish-package.yml
│       └── sync-docs.yml
├── .gitignore
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Directory.Build.props
├── Examples/
│   ├── Nodify.Calculator/
│   │   ├── App.xaml
│   │   ├── App.xaml.cs
│   │   ├── ApplicationViewModel.cs
│   │   ├── AssemblyInfo.cs
│   │   ├── CalculatorInputOperationViewModel.cs
│   │   ├── CalculatorOperationViewModel.cs
│   │   ├── CalculatorViewModel.cs
│   │   ├── ConnectionViewModel.cs
│   │   ├── ConnectorViewModel.cs
│   │   ├── Converters/
│   │   │   └── ItemToListConverter.cs
│   │   ├── CreateOperationInfoViewModel.cs
│   │   ├── EditorView.xaml
│   │   ├── EditorView.xaml.cs
│   │   ├── EditorViewModel.cs
│   │   ├── ExpandoOperationViewModel.cs
│   │   ├── ExpressionOperationViewModel.cs
│   │   ├── GlobalUsings.cs
│   │   ├── MainWindow.xaml
│   │   ├── MainWindow.xaml.cs
│   │   ├── Nodify.Calculator.csproj
│   │   ├── OperationGraphViewModel.cs
│   │   ├── OperationGroupViewModel.cs
│   │   ├── OperationInfoViewModel.cs
│   │   ├── OperationViewModel.cs
│   │   ├── Operations/
│   │   │   ├── BinaryOperation.cs
│   │   │   ├── IOperation.cs
│   │   │   ├── OperationFactory.cs
│   │   │   ├── OperationsContainer.cs
│   │   │   ├── ParamsOperation.cs
│   │   │   ├── UnaryOperation.cs
│   │   │   └── ValueOperation.cs
│   │   ├── OperationsExtensions.cs
│   │   ├── OperationsMenuView.xaml
│   │   ├── OperationsMenuView.xaml.cs
│   │   ├── OperationsMenuViewModel.cs
│   │   ├── PendingConnectionViewModel.cs
│   │   ├── Program.cs
│   │   └── Themes/
│   │       ├── Dark.xaml
│   │       ├── Light.xaml
│   │       └── Nodify.xaml
│   ├── Nodify.Playground/
│   │   ├── App.xaml
│   │   ├── App.xaml.cs
│   │   ├── AssemblyInfo.cs
│   │   ├── BaseSettingViewModel.cs
│   │   ├── Converters/
│   │   │   ├── FlowToConnectorPositionConverter.cs
│   │   │   ├── FlowToDirectionConverter.cs
│   │   │   ├── UIntToRectConverter.cs
│   │   │   └── UIntToRelativeRectConverter.cs
│   │   ├── Editor/
│   │   │   ├── CommentNodeViewModel.cs
│   │   │   ├── ConnectionViewModel.cs
│   │   │   ├── ConnectorViewModel.cs
│   │   │   ├── FlowNodeViewModel.cs
│   │   │   ├── GraphSchema.cs
│   │   │   ├── KnotNodeViewModel.cs
│   │   │   ├── NodeViewModel.cs
│   │   │   ├── NodifyEditorView.xaml
│   │   │   ├── NodifyEditorView.xaml.cs
│   │   │   ├── NodifyEditorViewModel.cs
│   │   │   ├── PendingConnectionViewModel.cs
│   │   │   ├── VerticalNodeViewModel.cs
│   │   │   └── WpfComboBox.cs
│   │   ├── EditorInputMode.cs
│   │   ├── EditorSettings.cs
│   │   ├── EditorSettingsView.xaml
│   │   ├── EditorSettingsView.xaml.cs
│   │   ├── GlobalUsings.cs
│   │   ├── Helpers/
│   │   │   ├── NodeViewModelExtensions.cs
│   │   │   └── RandomNodesGenerator.cs
│   │   ├── ISettingViewModel.cs
│   │   ├── MainWindow.xaml
│   │   ├── MainWindow.xaml.cs
│   │   ├── Nodify.Playground.csproj
│   │   ├── PlaygroundSettings.cs
│   │   ├── PlaygroundViewModel.cs
│   │   ├── PointEditor.cs
│   │   ├── PointEditorView.xaml
│   │   ├── PointEditorView.xaml.cs
│   │   ├── Program.cs
│   │   ├── ProxySettingViewModel.cs
│   │   ├── SettingsView.xaml
│   │   ├── SettingsView.xaml.cs
│   │   └── Themes/
│   │       ├── Brushes.xaml
│   │       ├── Dark.xaml
│   │       ├── Light.xaml
│   │       └── Nodify.xaml
│   ├── Nodify.Shapes/
│   │   ├── App.xaml
│   │   ├── App.xaml.cs
│   │   ├── AppShellViewModel.cs
│   │   ├── AssemblyInfo.cs
│   │   ├── Avalonia/
│   │   │   ├── Cursors.cs
│   │   │   └── ToolItemSelector.cs
│   │   ├── Canvas/
│   │   │   ├── CanvasToolbarViewModel.cs
│   │   │   ├── CanvasView.xaml
│   │   │   ├── CanvasView.xaml.cs
│   │   │   ├── CanvasViewModel.cs
│   │   │   ├── ConnectionViewModel.cs
│   │   │   ├── ConnectorViewModel.cs
│   │   │   ├── Decorators/
│   │   │   │   ├── ICanvasDecorator.cs
│   │   │   │   ├── ShapeToolbarViewModel.cs
│   │   │   │   └── UserCursorViewModel.cs
│   │   │   ├── Gestures/
│   │   │   │   ├── DrawingGesturesMappings.cs
│   │   │   │   ├── LockedGestureMappings.cs
│   │   │   │   └── UnboundGestureMappings.cs
│   │   │   ├── Shapes/
│   │   │   │   ├── EllipseViewModel.cs
│   │   │   │   ├── RectangleViewModel.cs
│   │   │   │   ├── ShapeViewModel.cs
│   │   │   │   └── TriangleViewModel.cs
│   │   │   └── UndoRedo/
│   │   │       ├── MoveShapesAction.cs
│   │   │       ├── ResizeShapesAction.cs
│   │   │       └── SelectShapesAction.cs
│   │   ├── Controls/
│   │   │   └── ResizableContainer.cs
│   │   ├── GlobalUsings.cs
│   │   ├── MainView.axaml
│   │   ├── MainView.axaml.cs
│   │   ├── MainWindow.xaml
│   │   ├── MainWindow.xaml.cs
│   │   └── Nodify.Shapes.csproj
│   ├── Nodify.Shapes.Desktop/
│   │   ├── Nodify.Shapes.Desktop.csproj
│   │   └── Program.cs
│   ├── Nodify.Shapes.Web/
│   │   ├── AppBundle/
│   │   │   ├── app.css
│   │   │   ├── index.html
│   │   │   └── main.js
│   │   ├── Nodify.Shapes.Web.csproj
│   │   ├── Program.cs
│   │   ├── Properties/
│   │   │   └── launchSettings.json
│   │   └── runtimeconfig.template.json
│   ├── Nodify.Shared/
│   │   ├── Behaviours/
│   │   │   ├── DataTrigger.cs
│   │   │   ├── PropertySetter.cs
│   │   │   └── WpfBtn.cs
│   │   ├── BindingProxy.cs
│   │   ├── BoxValue.cs
│   │   ├── Controls/
│   │   │   ├── EditableTextBlock.cs
│   │   │   ├── ResizablePanel.cs
│   │   │   ├── Swatches.xaml.cs
│   │   │   ├── TabControlEx.cs
│   │   │   └── TabItemEx.cs
│   │   ├── Converters/
│   │   │   ├── BooleanToVisibilityConverter.cs
│   │   │   ├── ColorToSolidColorBrushConverter.cs
│   │   │   ├── DebugConverter.cs
│   │   │   ├── EnumValuesConverter.cs
│   │   │   ├── InverseBooleanConverter.cs
│   │   │   ├── MultiValueEqualityConverter.cs
│   │   │   ├── RandomBrushConverter.cs
│   │   │   ├── ResizeDirectionToVisiblityConverter.cs
│   │   │   ├── StringToVisibilityConverter.cs
│   │   │   └── ToStringConverter.cs
│   │   ├── DelegateCommand.cs
│   │   ├── FluentSyntax.cs
│   │   ├── GlobalUsings.cs
│   │   ├── Nodify.Shared.csproj
│   │   ├── NodifyObservableCollection.cs
│   │   ├── ObservableObject.cs
│   │   ├── Properties/
│   │   │   └── AssemblyInfo.cs
│   │   ├── RequeryCommand.cs
│   │   ├── StringExtensions.cs
│   │   ├── ThemeManager.cs
│   │   ├── Themes/
│   │   │   ├── Brushes.xaml
│   │   │   ├── Controls.xaml
│   │   │   ├── Dark.xaml
│   │   │   ├── Generic.xaml
│   │   │   ├── Icons.xaml
│   │   │   ├── Light.xaml
│   │   │   └── Nodify.xaml
│   │   └── UndoRedo/
│   │       ├── ActionsHistory.cs
│   │       ├── BatchAction.cs
│   │       ├── DelegateAction.cs
│   │       ├── PropertyCache.cs
│   │       └── Undoable.cs
│   └── Nodify.StateMachine/
│       ├── App.xaml
│       ├── App.xaml.cs
│       ├── BlackboardItemReferenceViewModel.cs
│       ├── BlackboardItemViewModel.cs
│       ├── BlackboardKeyEditorView.xaml
│       ├── BlackboardKeyEditorView.xaml.cs
│       ├── BlackboardKeyEditorViewModel.cs
│       ├── BlackboardKeyViewModel.cs
│       ├── BlackboardViewModel.cs
│       ├── Converters/
│       │   ├── BlackboardKeyEditorConverter.cs
│       │   ├── ConnectorOffsetConverter.cs
│       │   ├── DrawingBrushToRectangleConverter.cs
│       │   └── FilterBlackboardKeysConverter.cs
│       ├── GlobalUsings.cs
│       ├── Helpers/
│       │   └── BlackboardDescriptor.cs
│       ├── MainWindow.xaml
│       ├── MainWindow.xaml.cs
│       ├── Nodify.StateMachine.csproj
│       ├── Program.cs
│       ├── Runner/
│       │   ├── Actions/
│       │   │   ├── CopyKeyAction.cs
│       │   │   ├── SetKeyValueAction.cs
│       │   │   └── SetStateDelayAction.cs
│       │   ├── Blackboard/
│       │   │   ├── Blackboard.cs
│       │   │   ├── BlackboardConditionSet.cs
│       │   │   ├── BlackboardItemAttribute.cs
│       │   │   ├── BlackboardKey.cs
│       │   │   ├── BlackboardProperty.cs
│       │   │   ├── BlackboardPropertyAttribute.cs
│       │   │   ├── IBlackboardAction.cs
│       │   │   └── IBlackboardCondition.cs
│       │   ├── Conditions/
│       │   │   ├── AreEqualCondition.cs
│       │   │   ├── HasKeyCondition.cs
│       │   │   └── HasValueCondition.cs
│       │   ├── Debugging/
│       │   │   ├── DebugBlackboardDecorator.cs
│       │   │   ├── DebugStateDecorator.cs
│       │   │   └── DebugTransitionDecorator.cs
│       │   ├── State.cs
│       │   ├── StateMachine.cs
│       │   └── Transition.cs
│       ├── StateMachineRunnerViewModel.cs
│       ├── StateMachineViewModel.cs
│       ├── StateViewModel.cs
│       ├── Themes/
│       │   ├── Brushes.xaml
│       │   ├── Dark.xaml
│       │   ├── Light.xaml
│       │   └── Nodify.xaml
│       └── TransitionViewModel.cs
├── LICENSE
├── Nodify/
│   ├── Compatibility/
│   │   ├── Attributes/
│   │   │   ├── ContentPropertyAttribute.cs
│   │   │   └── StyleTypedPropertyAttribute.cs
│   │   ├── Commands/
│   │   │   ├── ApplicationCommands.cs
│   │   │   ├── CanExecuteRoutedEventArgs.cs
│   │   │   ├── CommandBinding.cs
│   │   │   ├── CommandManager.cs
│   │   │   ├── ExecutedRoutedEventArgs.cs
│   │   │   ├── RoutedCommand.cs
│   │   │   └── RoutedUICommand.cs
│   │   ├── Controls/
│   │   │   ├── GroupStyle.cs
│   │   │   ├── MultiSelector.cs
│   │   │   ├── Primitives/
│   │   │   │   └── IScrollInfo.cs
│   │   │   ├── WpfControl.cs
│   │   │   └── WpfShape.cs
│   │   ├── DefaultStyleKeyProperty.cs
│   │   ├── Dragging/
│   │   │   ├── DragCompletedEventArgs.cs
│   │   │   ├── DragDeltaEventArgs.cs
│   │   │   └── DragStartedEventArgs.cs
│   │   ├── EmptyNamespaces.cs
│   │   ├── Extensions/
│   │   │   ├── ControlCaptureExtensions.cs
│   │   │   ├── PointExtensions.cs
│   │   │   ├── SizeExtensions.cs
│   │   │   ├── StreamGeometryContextExtensions.cs
│   │   │   └── VisualExtensions.cs
│   │   ├── Input/
│   │   │   ├── InputGesture.cs
│   │   │   ├── InputGestureCollection.cs
│   │   │   ├── InputKeyGesture.cs
│   │   │   ├── MouseAction.cs
│   │   │   ├── MouseButtonEventArgs.cs
│   │   │   ├── MouseButtonState.cs
│   │   │   ├── MouseEventArgs.cs
│   │   │   ├── MouseGesture.cs
│   │   │   ├── MouseMoveEventArgs.cs
│   │   │   └── MouseWheelEventArgs.cs
│   │   ├── PanelUtilities.cs
│   │   └── VisualTreeHelper.cs
│   ├── Connections/
│   │   ├── BaseConnection.Avalonia.cs
│   │   ├── BaseConnection.cs
│   │   ├── CircuitConnection.cs
│   │   ├── Connection.cs
│   │   ├── ConnectionContainer.Avalonia.cs
│   │   ├── ConnectionContainer.cs
│   │   ├── ConnectionsMultiSelector.Avalonia.cs
│   │   ├── ConnectionsMultiSelector.cs
│   │   ├── Connector.Avalonia.cs
│   │   ├── Connector.cs
│   │   ├── CuttingLine.cs
│   │   ├── LineConnection.cs
│   │   ├── PendingConnection.Avalonia.cs
│   │   ├── PendingConnection.cs
│   │   └── StepConnection.cs
│   ├── DecoratorContainer.cs
│   ├── DecoratorsControl.cs
│   ├── EditorCommands.cs
│   ├── EditorGestures.cs
│   ├── EditorStates/
│   │   ├── ContainerDefaultState.cs
│   │   ├── ContainerDraggingState.cs
│   │   ├── ContainerState.cs
│   │   ├── EditorCuttingState.cs
│   │   ├── EditorDefaultState.cs
│   │   ├── EditorPanningState.cs
│   │   ├── EditorPushingItemsState.cs
│   │   ├── EditorSelectingState.cs
│   │   └── EditorState.cs
│   ├── Events/
│   │   ├── ConnectionEventArgs.cs
│   │   ├── ConnectorEventArgs.cs
│   │   ├── PendingConnectionEventArgs.cs
│   │   └── ResizeEventArgs.cs
│   ├── GlobalUsings.cs
│   ├── Helpers/
│   │   ├── BindableStyleClasses.cs
│   │   ├── BoxValue.cs
│   │   ├── DependencyObjectExtensions.cs
│   │   ├── DraggingOptimized.cs
│   │   ├── DraggingSimple.cs
│   │   ├── MathExtensions.cs
│   │   ├── MultiGesture.cs
│   │   ├── PushItemsStrategy.cs
│   │   ├── SelectionHelper.cs
│   │   └── UnscaleTransformConverter.cs
│   ├── ItemContainer.Avalonia.cs
│   ├── ItemContainer.cs
│   ├── Minimap/
│   │   ├── Minimap.Avalonia.cs
│   │   ├── Minimap.cs
│   │   ├── MinimapItem.cs
│   │   ├── MinimapPanel.Avalonia.cs
│   │   ├── MinimapPanel.cs
│   │   ├── SubtractConverter.cs
│   │   └── ZoomEventArgs.cs
│   ├── Nodes/
│   │   ├── GroupingNode.cs
│   │   ├── KnotNode.cs
│   │   ├── Node.Avalonia.cs
│   │   ├── Node.cs
│   │   ├── NodeInput.Avalonia.cs
│   │   ├── NodeInput.cs
│   │   ├── NodeOutput.Avalonia.cs
│   │   ├── NodeOutput.cs
│   │   └── StateNode.cs
│   ├── Nodify.csproj
│   ├── Nodify.csproj.DotSettings
│   ├── NodifyCanvas.cs
│   ├── NodifyEditor.Avalonia.cs
│   ├── NodifyEditor.PushingItems.cs
│   ├── NodifyEditor.Scrolling.cs
│   ├── NodifyEditor.cs
│   ├── Properties/
│   │   └── AssemblyInfo.cs
│   ├── Theme.axaml
│   └── Themes/
│       ├── Brushes.xaml
│       ├── Controls.xaml
│       ├── Dark.xaml
│       ├── Generic.xaml
│       ├── Light.xaml
│       ├── Nodify.xaml
│       ├── NodifyStyle.axaml
│       └── Styles/
│           ├── Connection.xaml
│           ├── Connector.xaml
│           ├── Controls.xaml
│           ├── CuttingLine.xaml
│           ├── DecoratorContainer.xaml
│           ├── GroupingNode.xaml
│           ├── ItemContainer.xaml
│           ├── KnotNode.xaml
│           ├── Minimap.xaml
│           ├── Node.xaml
│           ├── NodeInput.xaml
│           ├── NodeOutput.xaml
│           ├── NodifyEditor.xaml
│           ├── PendingConnection.xaml
│           └── StateNode.xaml
├── Nodify.sln
├── Nodify.sln.DotSettings
├── PULL_REQUEST_TEMPLATE.md
├── README.md
├── build/
│   ├── Nodify.public.snk
│   └── Nodify.snk
├── build_cloudflare.sh
└── docs/
    ├── API-Reference.md
    ├── Connections-Overview.md
    ├── Connectors-Overview.md
    ├── CuttingLine-Overview.md
    ├── Documentation.md
    ├── Editor-Overview.md
    ├── FAQ.md
    ├── Getting-Started.md
    ├── Home.md
    ├── ItemContainer-Overview.md
    ├── Minimap-Overview.md
    ├── Nodes-Overview.md
    ├── _Sidebar.md
    └── localization/
        └── zh-CN/
            ├── API-Reference.md
            ├── _Sidebar.md
            ├── 主页.md
            ├── 开始.md
            ├── 编辑器概述.md
            ├── 节点概述.md
            ├── 连接器概述.md
            ├── 连接概述.md
            ├── 问答.md
            └── 项目容器概述.md

================================================
FILE CONTENTS
================================================

================================================
FILE: .editorconfig
================================================

[*.{c,c++,cc,cginc,compute,cp,cpp,cu,cuh,cxx,h,hh,hlsl,hlsli,hlslinc,hpp,hxx,inc,inl,ino,ipp,mpp,mq4,mq5,mqh,tpp,usf,ush}]
indent_style = tab
indent_size = tab
tab_width = 4

[*.{asax,ascx,aspx,axaml,cs,cshtml,css,htm,html,js,jsx,master,paml,razor,skin,ts,tsx,vb,xaml,xamlx,xoml}]
indent_style = space
indent_size = 4
tab_width = 4

[*.{appxmanifest,axml,build,config,csproj,dbml,discomap,dtd,json,jsproj,lsproj,njsproj,nuspec,proj,props,resjson,resw,resx,StyleCop,targets,tasks,vbproj,xml,xsd}]
indent_style = space
indent_size = 2
tab_width = 2

[*]

# Microsoft .NET properties
csharp_new_line_before_members_in_object_initializers = false
csharp_preferred_modifier_order = public, private, protected, internal, new, abstract, virtual, sealed, override, static, readonly, extern, unsafe, volatile, async:suggestion
csharp_style_var_for_built_in_types = false:suggestion
dotnet_style_parentheses_in_arithmetic_binary_operators = never_if_unnecessary:none
dotnet_style_parentheses_in_other_binary_operators = never_if_unnecessary:none
dotnet_style_parentheses_in_relational_binary_operators = never_if_unnecessary:none
dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion
dotnet_style_predefined_type_for_member_access = true:suggestion
dotnet_style_qualification_for_event = false:suggestion
dotnet_style_qualification_for_field = false:suggestion
dotnet_style_qualification_for_method = false:suggestion
dotnet_style_qualification_for_property = false:suggestion
dotnet_style_require_accessibility_modifiers = for_non_interface_members:suggestion

# ReSharper properties
resharper_for_built_in_types = use_var_when_evident
resharper_for_simple_types = use_var_when_evident

# ReSharper inspection severities
resharper_arrange_object_creation_when_type_evident_highlighting = none
resharper_arrange_redundant_parentheses_highlighting = hint
resharper_arrange_this_qualifier_highlighting = hint
resharper_arrange_type_member_modifiers_highlighting = hint
resharper_arrange_type_modifiers_highlighting = hint
resharper_built_in_type_reference_style_for_member_access_highlighting = hint
resharper_built_in_type_reference_style_highlighting = hint
resharper_merge_sequential_patterns_highlighting = none
resharper_redundant_base_qualifier_highlighting = warning
resharper_suggest_var_or_type_built_in_types_highlighting = hint


================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms

github: miroiu
custom: ["https://www.buymeacoffee.com/miroiu", "https://paypal.me/miroiuemanuel"]


================================================
FILE: .github/ISSUE_TEMPLATE/ask-a-question.md
================================================
---
name: "❓ Ask a question"
about: Need help or have a question?
title: "[Question]"
labels: question
assignees: miroiu

---




================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: "\U0001F41B Bug report"
about: Create a bug report to help this project improve
title: "[Bug]"
labels: bug
assignees: miroiu

---

<!--
  Hi! 
  
  All fields are optional and are present only to guide you.
  Thanks for contributing!
-->

**Describe the bug**
A clear and concise description of what the bug is.

**To Reproduce**
Steps to reproduce the behavior.

**Expected behavior**
A clear and concise description of what you expected to happen.

**Screenshots**
If applicable, add screenshots to help explain your problem.

**Does it happen in WPF version?**
If possible, please try to reproduce the bug in the [WPF version](https://github.com/miroiu/nodify). If it also happen in WPF's, it has to be fixed in the upstream and then it can be merged to this Avalonia port.

**Additional context**
Add any other context about the problem here.


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
    - name: 📝 Read the docs
      url: https://github.com/miroiu/nodify/wiki
      about: Be sure you've read the docs!


================================================
FILE: .github/workflows/build.yml
================================================
name: Build

on:
  push:
    branches: ["master", "release-v*", "avalonia_port"]
    paths-ignore:
      - "docs/**"
  pull_request:
    paths-ignore:
      - "docs/**"

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Setup .NET
        uses: actions/setup-dotnet@v4
        with:
          dotnet-version: "9.0.x"
      - name: Build
        run: |
          dotnet workload restore
          dotnet build --configuration Release


================================================
FILE: .github/workflows/codeql-analysis.yml
================================================
name: "CodeQL"

on:
  push:
    branches: ["master", "release-v*", "avalonia_port"]
    paths:
      - Nodify/**
  pull_request:
    branches: ["master", "release-v*", "avalonia_port"]
  schedule:
    - cron: "27 6 * * 2"

jobs:
  analyze:
    name: Analyze
    runs-on: ubuntu-latest

    strategy:
      fail-fast: false
      matrix:
        include:
          - language: csharp
            build-mode: none

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      # Initializes the CodeQL tools for scanning.
      - name: Initialize CodeQL
        uses: github/codeql-action/init@v3
        with:
          languages: ${{ matrix.language }}
          build-mode: ${{ matrix.build-mode }}

      - name: Perform CodeQL Analysis
        uses: github/codeql-action/analyze@v3
        with:
          category: "/language:${{matrix.language}}"


================================================
FILE: .github/workflows/create-release-branch.yml
================================================
name: Create release branch

on:
  push:
    tags:
      - "v*.0.0"

jobs:
  create-release:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Save tag version
        uses: little-core-labs/get-git-tag@v3.0.1
        id: tagName
      - name: Setup .NET Core
        uses: actions/setup-dotnet@v2.1.0
        with:
          dotnet-version: '9.0.x'
      - name: Install dependencies
        run:  |
          dotnet workload restore
          dotnet restore
      - name: Build
        run: dotnet build --configuration Release --no-restore
      - name: Create release branch
        uses: peterjgrainger/action-create-branch@v2.2.0
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          branch: release-${{ steps.tagName.outputs.tag }}
    


================================================
FILE: .github/workflows/publish-package.yml
================================================
name: Publish package

on:
  workflow_dispatch:
  push:
    tags:
      - "v*.*.*"

jobs:
  publish:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4
      - name: Setup .NET Core
        uses: actions/setup-dotnet@v4
        with:
          dotnet-version: '9.0.x'
      - name: Install dependencies
        run:  |
          dotnet workload restore
          dotnet restore
      - name: Build
        run: dotnet build --configuration Release --no-restore
      - name: Publish the package
        run: dotnet nuget push "*/bin/Release/*.nupkg" -k ${{ secrets.NUGET_KEY }} -s https://api.nuget.org/v3/index.json

      


================================================
FILE: .github/workflows/sync-docs.yml
================================================
name: Documentation

on:
  push:
    branches:
      - master
    paths:
      - "docs/**"
  workflow_dispatch:

jobs:
  job-sync-docs-to-wiki:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Repo
        uses: actions/checkout@v2
      - name: Sync docs to wiki
        uses: newrelic/wiki-sync-action@main
        with:
          source: docs
          destination: wiki
          token: ${{ secrets.DOCS_TOKEN  }}


================================================
FILE: .gitignore
================================================
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore

# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates

# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs

# Mono auto generated files
mono_crash.*

# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/

# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/

# Visual Studio 2017 auto generated files
Generated\ Files/

# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*

# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml

# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c

# Benchmark Results
BenchmarkDotNet.Artifacts/

# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/

# StyleCop
StyleCopReport.xml

# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc

# Chutzpah Test files
_Chutzpah*

# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb

# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap

# Visual Studio Trace Files
*.e2e

# TFS 2012 Local Workspace
$tf/

# Guidance Automation Toolkit
*.gpState

# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user

# TeamCity is a build add-in
_TeamCity*

# DotCover is a Code Coverage Tool
*.dotCover

# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json

# Visual Studio code coverage results
*.coverage
*.coveragexml

# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*

# MightyMoose
*.mm.*
AutoTest.Net/

# Web workbench (sass)
.sass-cache/

# Installshield output folder
[Ee]xpress/

# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html

# Click-Once directory
publish/

# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj

# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/

# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets

# Microsoft Azure Build Output
csx/
*.build.csdef

# Microsoft Azure Emulator
ecf/
rcf/

# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload

# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/

# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs

# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk

# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/

# RIA/Silverlight projects
Generated_Code/

# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak

# SQL Server files
*.mdf
*.ldf
*.ndf

# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl

# Microsoft Fakes
FakesAssemblies/

# GhostDoc plugin setting file
*.GhostDoc.xml

# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/

# Visual Studio 6 build log
*.plg

# Visual Studio 6 workspace options file
*.opt

# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw

# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions

# Paket dependency manager
.paket/paket.exe
paket-files/

# FAKE - F# Make
.fake/

# CodeRush personal settings
.cr/personal

# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc

# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config

# Tabs Studio
*.tss

# Telerik's JustMock configuration file
*.jmconfig

# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs

# OpenCover UI analysis results
OpenCover/

# Azure Stream Analytics local run output
ASALocalRun/

# MSBuild Binary and Structured Log
*.binlog

# NVidia Nsight GPU debugger configuration file
*.nvuser

# MFractors (Xamarin productivity tool) working folder
.mfractor/

# Local History for Visual Studio
.localhistory/

# BeatPulse healthcheck temp database
healthchecksdb

# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/

# Ionide (cross platform F# VS Code tools) working folder
.ionide/
.idea


================================================
FILE: CHANGELOG.md
================================================
## Changelog

#### **In development**

> - Breaking Changes:
> - Features:
> - Bugfixes:
	
#### **Version 6.6.0**

> - Breaking Changes:
> - Features:
>	- Added InputGroupStyle and OutputGroupStyle to Node (not supported in Avalonia)
>	- Added PanWithMouseWheel, PanHorizontalModifierKey and PanVerticalModifierKey to EditorGestures.Editor
>	- Added CornerRadius dependency property to LineConnection, CircuitConnection and StepConnection
>	- Added EditorGestures.Editor.PushItems gesture used to start pushing ItemContainers vertically or horizontally
>	- Added PushedAreaStyle, PushedAreaOrientation and IsPushingItems dependency properties to NodifyEditor
>	- Added NodifyEditor.SnapToGrid utility function
> - Bugfixes:
>	- Fixed ItemContainer.BorderBrush and ItemContainer.SelectedBrush not reacting to theme changes

#### **Version 6.5.0**

> - Features:
>	- Added SelectedConnection, SelectedConnections, CanSelectMultipleConnections and CanSelectMultipleItems dependency properties to NodifyEditor
>	- Added IsSelected and IsSelectable attached dependency properties to BaseConnection
>	- Added PrioritizeBaseConnectionForSelection static field to BaseConnection
>	- Added EditorGestures.Connection.Selection
>	- Added support for ScrollViewer in NodifyEditor (implements IScrollInfo)
>	- Added NodifyEditor.ScrollIncrement dependency property

#### **Version 6.4.0**

> - Features:
>	- Added OutlineBrush and OutlineThickness dependency properties to BaseConnection to support increasing the selection area without increasing the stroke thickness
>	- Added IsAnimatingDirectionalArrows and DirectionalArrowsAnimationDuration dependency properties to BaseConnection to support controlling the animation from XAML

#### **Version 6.3.0**

> - Features:
>	- Added a CuttingLine control that removes intersecting connections
>	- Added CuttingLineStyle, CuttingStartedCommand, CuttingCompletedCommand, IsCutting, EnableCuttingLinePreview and CuttingConnectionTypes to NodifyEditor
>	- Added EditorGestures.Editor.Cutting and EditorGestures.Editor.CancelAction
> - Bugfixes:
>	- Fixed connection styles not inheriting from the BaseConnection style

#### **Version 6.2.0**

> - Features:
>	- Added a Minimap control and EditorGestures.Minimap
>	- Added ContentContainerStyle, HeaderContainerStyle and FooterContainerStyle dependency properties to Node
>	- Added BringIntoView that takes a Rect parameter to NodifyEditor
>	- Added the NodifyEditor's DataContext as the parameter of the ItemsSelectStartedCommand, ItemsSelectCompletedCommand, ItemsDragStartedCommand and ItemsDragCompletedCommand commands
> - Bugfixes:
>	- Fixed hover effect and padding of NodeInput and NodeOutput for vertical orientation
>	- Fixed ItemContainers being selected sometimes when double clicking the canvas

#### **Version 6.1.0**

> - Features:
>	- Added new built-in connection type: StepConnection
> - Bugfixes:
>	- Fixed CircuitConnection directional arrows not interpolating correctly
>	- Fixed BaseConnection SplitEvent and DisconnectEvent not being raised if the corresponding command is null
>	- Fixed DecoratorContainer scaling with zoom when not referencing a theme in App.xaml
>	- Fixed style not applying to the default Connection template outside App.xaml
	
#### **Version 6.0.0**

> - Breaking Changes:
>	- Added a parameter for the orientation to DrawArrowGeometry, DrawDefaultArrowhead, DrawRectangleArrowhead and DrawEllipseArrowhead in BaseConnection
>	- Added source and target parameters to GetTextPosition in BaseConnection
>	- EditorGestures is now a singleton instead of a static class (can be inherited to create custom mappings)
>	- Selection gestures for ItemContainer and GroupingNode are now separated from the NodifyEditor selection gestures
>	- Renamed EditorGestures.Editor.Zoom to ZoomModifierKey
> - Features:
>	- Added SourceOrientation and TargetOrientation to BaseConnection to support vertical connectors (vertical/mixed connection orientation)
>	- Added DirectionalArrowsCount to BaseConnection to allow drawing multipe arrows on a connection flowing in the connection direction
>	- Added DrawDirectionalArrowsGeometry and DrawDirectionalArrowheadGeometry to BaseConnection to allow customizing the directional arrows
>	- Improved EditorGestures to allow changing input gestures at runtime
>	- Added new gesture types: AnyGesture, AllGestures, and InputGestureRef
>	- Added Orientation dependency property to NodeInput and NodeOutput
>	- Added DirectionalArrowsOffset dependency property to BaseConnection
>	- Added StartAnimation and StopAnimation methods to BaseConnection
> - Bugfixes:
>	- Fixed BaseConnection.Text not always displaying in the center of the connection
>	- Fixed a bug where the item container would incorrectly transition to the dragging state on mouse over

#### **Version 5.2.0**

> - Features:
>	- Added Text to BaseConnection, allowing displaying of text on connections
>	- Added Foreground, FontSize, FontWeight, FontStyle, FontStretch and FontFamily to BaseConnection, allowing styling the displaying text
> - Bugfixes:
>   - Fixed MouseCapture not being released when EnableStickyConnections is enabled and the PendingConnection is canceled by a key gesture 

#### **Version 5.1.0**

> - Features:
>   - Added ItemContainer.SelectedBorderThickness dependency property
>   - Added NodifyEditor.GetLocationInsideEditor
> - Bugfixes:
>   - Fixed PendingConnection.PreviewTarget not being set to null when there is no actual target
>   - Fixed PendingConnection.PreviewTarget not being set on Connector.PendingConnectionStartedEvent
>   - Fixed PendingConnection.PreviewTarget not being set to null on Connector.PendingConnectionCompletedEvent
>   - Fixed connectors panel not being affected by Node.VerticalAlignment
>   - Changing BorderThickness causes layout shift when selecting an item container
>   - Fixed the unintentional movement caused by snapping correction

#### **Version 5.0.2**

> - Bugfixes:
>   - Fixed NodeOutput content horizontal alignment
>   - Fixed Connector not opening Context Menu

#### **Version 5.0.1**

> - Bugfixes:
>   - Returning false from PendingConnection.StartedCommand.CanExecute does not stop the creation of a pending connection
>   - BaseConnection.ArrowEnds does not display correctly when BaseConnection.Direction is ConnectionDirection.Backward

#### **Version 5.0.0**

> - Breaking Changes:
>   - Removed BaseConnection.GetArrowHeadPoints
>   - Removed BaseConnection.OffsetMode
>   - Changed return type of BaseConnection.DrawLineGeometry to support both arrowheads no matter the number of points on the line
>   - Changed the default for BaseConnection.SourceOffset and BaseConnection.TargetOffset from Size(0, 0) to Size(14, 0)
>   - Changed the default for BaseConnection.ArrowSize from Size(7, 6) to Size(8, 8)
> - Features:
>   - Added BaseConnection.SourceOffsetMode and BaseConnection.TargetOffsetMode
>   - Added BaseConnection.ArrowEnds dependency property to allow configurable arrowhead ends
>   - Added BaseConnection.ArrowShape dependency property to allow configurable arrowhead shape
>   - Added NodifyEditor.EnableDraggingContainersOptimizations to allow receiving ItemContainer.Location updates in realtime
>   - Added ConnectionOffsetMode.Static to allow offsetting the source and target points of the connection on the X and the Y axis without revolving around the source or target points

#### **Version 4.1.0**

> - Features:
>   - Added EditorGestures.Selection.DefaultMouseAction to make it easier to change between mouse buttons for selection
>   - Added EditorGestures.Selection.Cancel gesture to cancel the selection operation reverting to the previous selection
>   - Added ItemsSelectStartedCommand and ItemsSelectCompletedCommand dependency properties to NodifyEditor for better undo/redo support
> - Bugfixes:
>   - Fixed NodifyEditor.SelectedItems being empty after selection is completed
>   - Fixed drag canceling when Drag and CancelAction are bound to the same gesture

#### **Version 4.0.1**

> - Bugfixes:
>   - Fixed DisablePanning not working anymore

#### **Version 4.0.0**

> - Breaking Changes:
>   - Removed Selection field from NodifyEditor
>   - Removed InitialMousePosition, CurrentMousePosition, PreviousMousePosition fields from NodifyEditor
>   - Removed ItemContainer.DraggableHost (use Editor.ItemsHost instead)
>   - Made SelectionType required in SelectionHelper
>   - Moved GroupingNode.SwitchMovementModeModifierKey to EditorGestures.GroupingNode
>   - Pending connections are now restricted to connect only to Connectors or to NodifyEditors and ItemContainers if PendingConnection.AllowOnlyConnectors is false
> - Features:
>   - Added Connector.EnableStickyConnections to allow completing pending connections in two steps
>   - Added editor states which can be overriden by inheriting from NodifyEditor and implementing NodifyEditor.GetInitialState()
>     - EditorState - base class for all editor states
>     - EditorDefaultState
>     - EditorSelectingState
>     - EditorPanningState
>   - Added container states which can be overriden by inheriting from ItemContainer and implementing ItemContainer.GetInitialState()
>     - ContainerState - base class for all container states
>     - ContainerDefaultState
>     - ContainerDraggingState
>   - Added MultiGesture utility that can combine multiple input gestures into one gesture
>   - Added configurable input gestures for NodifyEditor, ItemContainer, Connector, BaseConnection and GroupingNode to EditorGestures
>   - Added State, PushState, PopState and PopAllStates to NodifyEditor and ItemContainer
>   - Changed the default AutoPanSpeed to 15 from 10 pixels per tick
>   - Allow setting ItemContainer.IsPreviewingLocation from derived classes
> - Bugfixes:
>   - Fixed HandleRightClickAfterPanningThreshold not working as expected
>   - Fixed DisablePanning not disabling auto panning in certain situations
>   - Fixed GroupingNode selection not working with multiple selection modes
>   - Fixed PendingConnection connecting cross editors

#### **Version 3.0.0**

> - Breaking Changes:
>   - Changed Decorators from UIElement collection to IEnumerable
> - Features:
>   - Added ItemsExtent and DecoratorsExtent dependency properties to NodifyEditor
>   - Added DecoratorTemplate dependency property to NodifyEditor
>   - Added FitToScreenExtentMargin static field to NodifyEditor
>   - Added Extent dependency property to NodifyCanvas
> - Bugfixes:
>   - Selection rectangle and Decorators are no longer scaled with the viewport zoom
>   - Fixed connector anchor not updating when container size changed

#### **Version 2.0.1**

> - Bugfixes:
>   - Fixed pending connection default style

#### **Version 2.0.0**

> - Breaking Changes:
>   - Renamed Offset to ViewportLocation in NodifyEditor
>   - Renamed Scale to ViewportZoom in NodifyEditor
>   - Renamed MinScale to MinViewportZoom in NodifyEditor
>   - Renamed MaxScale to MaxViewportZoom in NodifyEditor
>   - Renamed AppliedTransform to ViewportTransform in NodifyEditor
>   - Renamed DirectionalConnection to LineConnection
>   - Removed BringIntoViewAnimationDuration from NodifyEditor
>   - Removed Viewport dependency property from NodifyEditor
>   - Removed ActualSize dependency property from StateNode
>   - Removed Icon dependency property from Node as the icon can _(and should)_ be added in the HeaderTemplate if necessary
>   - PART_ItemsHost is now required for NodifyEditor to work
>   - ItemContainers cannot be used outside a NodifyEditor anymore
>   - ZoomAtPosition now requires graph space coordinates instead of screen space coordinates
>   - Removed custom value converters
>   - Made DependencyObjectExtensions internal
>   - Removed the <http://miroiu.github.io/winfx/xaml/nodify> xaml prefix
> - Features:
>   - Added ResizeStartedEvent routed event to GroupingNode
>   - Added ViewportSize - **OneWayToSource** dependency property to NodifyEditor
>   - Added ActualSize - **OneWayToSource** dependency property to ItemContainer
>   - Added DecoratorContainer and DecoratorContainerStyle dependency properties to NodifyEditor
>   - Added RemoveConnectionCommand command to NodifyEditor
>   - Added DisconnectCommand and SplitCommand commands to BaseConnection
>   - Added ContentBrush dependency property to NodifyEditor
>   - Added HasFooter dependency property to Node
>   - Added FitToScreen command to NodifyEditor and EditorCommands
>   - Added onFinish callback to BringIntoView in NodifyEditor
>   - Added ArrowSize and Spacing dependency properties to all connections inheriting from BaseConnection
>   - Added BringIntoViewMaxDuration dependency property to NodifyEditor
>   - Added BringIntoViewSpeed dependency property to NodifyEditor
>   - Auto panning speed now scales with the zoom factor
> - Bugfixes:
>   - Every public property or method should work with graph space coordinates
>   - Disable auto panning when panning is disabled
>   - Min zoom could be set to a very small value
>   - Bring into view was not disabling all interfering operations


================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct

## Our Pledge

In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, sex characteristics, gender identity and expression,
level of experience, education, socio-economic status, nationality, personal
appearance, race, religion, or sexual identity and orientation.

## Our Standards

Examples of behavior that contributes to creating a positive environment
include:

* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members

Examples of unacceptable behavior by participants include:

* The use of sexualized language or imagery and unwelcome sexual attention or
 advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
 address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
 professional setting

## Our Responsibilities

Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.

Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.

## Scope

This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at miroiu.emanuel@gmail.com. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.

Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html

[homepage]: https://www.contributor-covenant.org

For answers to common questions about this code of conduct, see
https://www.contributor-covenant.org/faq


================================================
FILE: CONTRIBUTING.md
================================================
# 👋 **Welcome to Nodify!** 👋

👍🎉 First off, thanks for taking the time to contribute! Your contributions help make Nodify better for everyone. 👍🎉

If you find Nodify useful, please consider giving us a ⭐ **star** ⭐ on our GitHub repository!

Code of Conduct: By contributing to Nodify, you agree to uphold our [Code of Conduct](CODE_OF_CONDUCT.md). We expect all contributors to be respectful and inclusive. (Don't worry, it's all common sense 😎)

## How you can contribute

- ❓ [Ask a question](https://github.com/miroiu/nodify/issues/new?assignees=miroiu&labels=question&template=ask-a-question.md&title=%5BQuestion%5D) - If you're unsure about anything related to Nodify, feel free to ask! No question is too small.
- 🐛 [Create a bug report](https://github.com/miroiu/nodify/issues/new?assignees=miroiu&labels=bug&template=bug_report.md&title=%5BBug%5D) - Noticed something not working as expected? Let us know by creating a bug report. Please provide as much detail as possible to help us address the issue.
- 🌺 [Suggest an enhancement](https://github.com/miroiu/nodify/issues/new?assignees=miroiu&labels=enhancement&template=feature_request.md&title=%5BFeature%5D) - Have an idea to make Nodify even better? We'd love to hear it! Share your suggestions for new features or improvements.
- ✨ [Explore example applications](https://github.com/miroiu/nodify/tree/master/Examples) - Check out the example applications provided with Nodify. They're great for learning how to use the library in different scenarios.
- 🎉 [Showcase your application](https://github.com/miroiu/nodify/issues/56) - Built something cool with Nodify? Share it with the community! We'd love to see what you've created.
- 📝 [Help with the documentation](https://github.com/miroiu/nodify/wiki) - Documentation is crucial for making Nodify accessible to everyone. If you spot errors or have suggestions for improvement, please let us know or update the docs yourself!
- 🔧 [Fix a bug](https://github.com/miroiu/nodify/labels/bug) - If you're a developer, you can contribute by fixing bugs in Nodify. Simply locate an open issue tagged as a bug and submit a pull request with your fix.
- 🔗 [Create a pull request linking to a feature](https://github.com/miroiu/nodify/labels/enhancement) - Implemented a new feature or enhancement? Fantastic! Submit a pull request linking to the relevant feature or enhancement issue.

## Some tips

- Write clear and descriptive issues and try to avoid duplication
- If you find a **Closed** issue that relates to yours, open a new issue and include a link to the original issue in the body of your new one.
- The easiest way to update documentation is to navigate [to the docs website](https://github.com/miroiu/nodify/wiki) and click 'Edit this page' which is found at the top right of any page.
- If you want to create an example application that others can use to learn from, then [create an issue](https://github.com/miroiu/nodify/issues/new?assignees=miroiu&labels=application&template=add_example_app.md&title=%5BApplication%5D) describing what your application is doing and if you need help with anything.
- The application you showcase can use any license.


================================================
FILE: Directory.Build.props
================================================
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <AvaloniaVersion>11.1.0</AvaloniaVersion>
  </PropertyGroup>
</Project>


================================================
FILE: Examples/Nodify.Calculator/App.xaml
================================================
<Application xmlns="https://github.com/avaloniaui"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             x:Class="Nodify.Calculator.App"
             RequestedThemeVariant="Dark">
    <!-- "Default" ThemeVariant follows system theme variant. "Dark" or "Light" are other available options. -->
    
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceInclude Source="avares://Nodify.Shared/Themes/Icons.xaml" />
                <ResourceInclude Source="avares://Nodify.Shared/Themes/Generic.xaml" />
                <ResourceInclude Source="avares://Nodify.Shared/Themes/Dark.xaml" />
                <ResourceInclude Source="avares://Nodify/Themes/Generic.xaml" />
                <ResourceInclude Source="avares://Nodify/Themes/Dark.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
    
    <Application.Styles>
        <FluentTheme DensityStyle="Compact"/>
    </Application.Styles>
</Application>


================================================
FILE: Examples/Nodify.Calculator/App.xaml.cs
================================================
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;

namespace Nodify.Calculator
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : Application
    {
        public override void Initialize()
        {
            AvaloniaXamlLoader.Load(this);
        }

        public override void OnFrameworkInitializationCompleted()
        {
            if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
            {
                desktop.MainWindow = new MainWindow();
            }

            base.OnFrameworkInitializationCompleted();
        }
    }
}


================================================
FILE: Examples/Nodify.Calculator/ApplicationViewModel.cs
================================================
using System;
using System.Linq;
using System.Windows.Input;

namespace Nodify.Calculator
{
    public class ApplicationViewModel : ObservableObject
    {
        public NodifyObservableCollection<EditorViewModel> Editors { get; } = new NodifyObservableCollection<EditorViewModel>();

        public ApplicationViewModel()
        {
            AddEditorCommand = new DelegateCommand(() => Editors.Add(new EditorViewModel
            {
                Name = $"Editor {Editors.Count + 1}"
            }));
            CloseEditorCommand = new DelegateCommand<Guid>(
                id => Editors.RemoveOne(editor => editor.Id == id),
                _ => Editors.Count > 0 && SelectedEditor != null);
            Editors.WhenAdded((editor) =>
            {
                if (AutoSelectNewEditor || Editors.Count == 1)
                {
                    SelectedEditor = editor;
                }
                editor.OnOpenInnerCalculator += OnOpenInnerCalculator;
            })
            .WhenRemoved((editor) =>
            {
                editor.OnOpenInnerCalculator -= OnOpenInnerCalculator;
                var childEditors = Editors.Where(ed => ed.Parent == editor).ToList();
                childEditors.ForEach(ed => Editors.Remove(ed));
            });
            Editors.Add(new EditorViewModel
            {
                Name = $"Editor {Editors.Count + 1}"
            });
        }

        private void OnOpenInnerCalculator(EditorViewModel parentEditor, CalculatorViewModel calculator)
        {
            var editor = Editors.FirstOrDefault(e => e.Calculator == calculator);
            if (editor != null)
            {
                SelectedEditor = editor;
            }
            else
            {
                var childEditor = new EditorViewModel
                {
                    Parent = parentEditor,
                    Calculator = calculator,
                    Name = $"[Inner] Editor {Editors.Count + 1}"
                };
                Editors.Add(childEditor);
            }
        }

        public ICommand AddEditorCommand { get; }
        public ICommand CloseEditorCommand { get; }

        private EditorViewModel? _selectedEditor;
        public EditorViewModel? SelectedEditor
        {
            get => _selectedEditor;
            set => SetProperty(ref _selectedEditor, value);
        }

        private bool _autoSelectNewEditor = true;
        public bool AutoSelectNewEditor
        {
            get => _autoSelectNewEditor;
            set => SetProperty(ref _autoSelectNewEditor , value); 
        }
    }
}


================================================
FILE: Examples/Nodify.Calculator/AssemblyInfo.cs
================================================
using System.Windows;

[assembly: ThemeInfo(
    ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
                                     //(used if a resource is not found in the page,
                                     // or application resource dictionaries)
    ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
                                              //(used if a resource is not found in the page,
                                              // app, or any theme specific resource dictionaries)
)]


================================================
FILE: Examples/Nodify.Calculator/CalculatorInputOperationViewModel.cs
================================================
namespace Nodify.Calculator
{
    public class CalculatorInputOperationViewModel : OperationViewModel
    {
        public CalculatorInputOperationViewModel()
        {
            AddOutputCommand = new RequeryCommand(
                () => Output.Add(new ConnectorViewModel
                {
                    Title = $"In {Output.Count}"
                }),
                () => Output.Count < 10);

            RemoveOutputCommand = new RequeryCommand(
                () => Output.RemoveAt(Output.Count - 1),
                () => Output.Count > 1);

            Output.Add(new ConnectorViewModel
            {
                Title = $"In {Output.Count}"
            });
        }

        public new NodifyObservableCollection<ConnectorViewModel> Output { get; set; } =
            new NodifyObservableCollection<ConnectorViewModel>();

        public INodifyCommand AddOutputCommand { get; }
        public INodifyCommand RemoveOutputCommand { get; }
    }
}


================================================
FILE: Examples/Nodify.Calculator/CalculatorOperationViewModel.cs
================================================
using System.Windows;

namespace Nodify.Calculator
{
    public class CalculatorOperationViewModel : OperationViewModel
    {
        public CalculatorViewModel InnerCalculator { get; } = new CalculatorViewModel();

        private OperationViewModel InnerOutput { get; } = new OperationViewModel
        {
            Title = "Output Parameters",
            Input = { new ConnectorViewModel() },
            Location = new Point(500, 300),
            IsReadOnly = true
        };

        private CalculatorInputOperationViewModel InnerInput { get; } = new CalculatorInputOperationViewModel
        {
            Title = "Input Parameters",
            Location = new Point(300, 300),
            IsReadOnly = true
        };

        public CalculatorOperationViewModel()
        {
            InnerCalculator.Operations.Add(InnerInput);
            InnerCalculator.Operations.Add(InnerOutput);

            Output = new ConnectorViewModel();

            InnerOutput.Input[0].ValueObservers.Add(Output);

            InnerInput.Output.ForEach(x => Input.Add(new ConnectorViewModel
            {
                Title = x.Title
            }));

            InnerInput.Output
                .WhenAdded(x => Input.Add(new ConnectorViewModel
                {
                    Title = x.Title
                }))
                .WhenRemoved(x => Input.RemoveOne(i => i.Title == x.Title));
        }

        protected override void OnInputValueChanged()
        {
            for (var i = 0; i < Input.Count; i++)
            {
                InnerInput.Output[i].Value = Input[i].Value;
            }
        }
    }
}


================================================
FILE: Examples/Nodify.Calculator/CalculatorViewModel.cs
================================================
using System.Linq;
using System.Windows;

namespace Nodify.Calculator
{
    public class CalculatorViewModel : ObservableObject
    {
        public CalculatorViewModel()
        {
            CreateConnectionCommand = new DelegateCommand<ConnectorViewModel>(
                _ => CreateConnection(PendingConnection.Source, PendingConnection.Target),
                _ => CanCreateConnection(PendingConnection.Source, PendingConnection.Target));
            StartConnectionCommand = new DelegateCommand<ConnectorViewModel>(_ => PendingConnection.IsVisible = true, (c) => !(c.IsConnected && c.IsInput));
            DisconnectConnectorCommand = new DelegateCommand<ConnectorViewModel>(DisconnectConnector);
            DeleteSelectionCommand = new DelegateCommand(DeleteSelection);
            GroupSelectionCommand = new DelegateCommand(GroupSelectedOperations, () => SelectedOperations.Count > 0);

            Connections.WhenAdded(c =>
            {
                c.Input.IsConnected = true;
                c.Output.IsConnected = true;

                c.Input.Value = c.Output.Value;

                c.Output.ValueObservers.Add(c.Input);
            })
            .WhenRemoved(c =>
            {
                var ic = Connections.Count(con => con.Input == c.Input || con.Output == c.Input);
                var oc = Connections.Count(con => con.Input == c.Output || con.Output == c.Output);

                if (ic == 0)
                {
                    c.Input.IsConnected = false;
                }

                if (oc == 0)
                {
                    c.Output.IsConnected = false;
                }

                c.Output.ValueObservers.Remove(c.Input);
            });

            Operations.WhenAdded(x =>
            {
                x.Input.WhenRemoved(RemoveConnection);

                if (x is CalculatorInputOperationViewModel ci)
                {
                    ci.Output.WhenRemoved(RemoveConnection);
                }

                void RemoveConnection(ConnectorViewModel i)
                {
                    var c = Connections.Where(con => con.Input == i || con.Output == i).ToArray();
                    c.ForEach(con => Connections.Remove(con));
                }
            })
            .WhenRemoved(x =>
            {
                foreach (var input in x.Input)
                {
                    DisconnectConnector(input);
                }

                if (x.Output != null)
                {
                    DisconnectConnector(x.Output);
                }
            });

            OperationsMenu = new OperationsMenuViewModel(this);
        }

        private NodifyObservableCollection<OperationViewModel> _operations = new NodifyObservableCollection<OperationViewModel>();
        public NodifyObservableCollection<OperationViewModel> Operations
        {
            get => _operations;
            set => SetProperty(ref _operations, value);
        }

        private NodifyObservableCollection<OperationViewModel> _selectedOperations = new NodifyObservableCollection<OperationViewModel>();
        public NodifyObservableCollection<OperationViewModel> SelectedOperations
        {
            get => _selectedOperations;
            set => SetProperty(ref _selectedOperations, value);
        }

        public NodifyObservableCollection<ConnectionViewModel> Connections { get; } = new NodifyObservableCollection<ConnectionViewModel>();
        public PendingConnectionViewModel PendingConnection { get; set; } = new PendingConnectionViewModel();
        public OperationsMenuViewModel OperationsMenu { get; set; }

        public INodifyCommand StartConnectionCommand { get; }
        public INodifyCommand CreateConnectionCommand { get; }
        public INodifyCommand DisconnectConnectorCommand { get; }
        public INodifyCommand DeleteSelectionCommand { get; }
        public INodifyCommand GroupSelectionCommand { get; }

        private void DisconnectConnector(ConnectorViewModel connector)
        {
            var connections = Connections.Where(c => c.Input == connector || c.Output == connector).ToList();
            connections.ForEach(c => Connections.Remove(c));
        }

        internal bool CanCreateConnection(ConnectorViewModel source, ConnectorViewModel? target)
            => target == null || (source != target && source.Operation != target.Operation && source.IsInput != target.IsInput);

        internal void CreateConnection(ConnectorViewModel source, ConnectorViewModel? target)
        {
            if (target == null)
            {
                PendingConnection.IsVisible = true;
                OperationsMenu.OpenAt(PendingConnection.TargetLocation);
                OperationsMenu.Closed += OnOperationsMenuClosed;
                return;
            }

            var input = source.IsInput ? source : target;
            var output = target.IsInput ? source : target;

            PendingConnection.IsVisible = false;

            DisconnectConnector(input);

            Connections.Add(new ConnectionViewModel
            {
                Input = input,
                Output = output
            });
        }

        private void OnOperationsMenuClosed()
        {
            PendingConnection.IsVisible = false;
            OperationsMenu.Closed -= OnOperationsMenuClosed;
        }

        private void DeleteSelection()
        {
            var selected = SelectedOperations.ToList();
            selected.ForEach(o => Operations.Remove(o));
        }

        private void GroupSelectedOperations()
        {
            var selected = SelectedOperations.ToList();
            var bounding = selected.GetBoundingBox(50);

            Operations.Add(new OperationGroupViewModel
            {
                Title = "Operations",
                Location = bounding.Position,
                GroupSize = new Size(bounding.Width, bounding.Height)
            });
        }
    }
}



================================================
FILE: Examples/Nodify.Calculator/ConnectionViewModel.cs
================================================
namespace Nodify.Calculator
{
    public class ConnectionViewModel : ObservableObject
    {
        private ConnectorViewModel _input = default!;
        public ConnectorViewModel Input
        {
            get => _input;
            set => SetProperty(ref _input, value);
        }

        private ConnectorViewModel _output = default!;
        public ConnectorViewModel Output
        {
            get => _output;
            set => SetProperty(ref _output, value);
        }
    }
}


================================================
FILE: Examples/Nodify.Calculator/ConnectorViewModel.cs
================================================
using System.Collections.Generic;
using System.Windows;

namespace Nodify.Calculator
{
    public class ConnectorViewModel : ObservableObject
    {
        private string? _title;
        public string? Title
        {
            get => _title;
            set => SetProperty(ref _title, value);
        }

        private double _value;
        public double Value
        {
            get => _value;
            set => SetProperty(ref _value, value)
                .Then(() => ValueObservers.ForEach(o => o.Value = value));
        }

        private bool _isConnected;
        public bool IsConnected
        {
            get => _isConnected;
            set => SetProperty(ref _isConnected, value);
        }

        private bool _isInput;
        public bool IsInput
        {
            get => _isInput;
            set => SetProperty(ref _isInput, value);
        }

        private Point _anchor;
        public Point Anchor
        {
            get => _anchor;
            set => SetProperty(ref _anchor, value);
        }

        private OperationViewModel _operation = default!;
        public OperationViewModel Operation
        {
            get => _operation;
            set => SetProperty(ref _operation, value);
        }

        public List<ConnectorViewModel> ValueObservers { get; } = new List<ConnectorViewModel>();
    }
}


================================================
FILE: Examples/Nodify.Calculator/Converters/ItemToListConverter.cs
================================================
using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Windows.Data;

namespace Nodify.Calculator
{
    public class ItemToListConverter : IValueConverter
    {
        public object? Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value != null)
            {
                var argType = value.GetType();
                var listType = typeof(List<>).MakeGenericType(argType);
                var list = Activator.CreateInstance(listType) as IList;
                list?.Add(value);

                return list;
            }

            return value;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotSupportedException();
        }
    }
}


================================================
FILE: Examples/Nodify.Calculator/CreateOperationInfoViewModel.cs
================================================
using System.Windows;

namespace Nodify.Calculator
{
    public class CreateOperationInfoViewModel
    {
        public CreateOperationInfoViewModel(OperationInfoViewModel info, Point location)
        {
            Info = info;
            Location = location;
        }

        public OperationInfoViewModel Info { get; }
        public Point Location { get; }
    }
}


================================================
FILE: Examples/Nodify.Calculator/EditorView.xaml
================================================
<UserControl x:Class="Nodify.Calculator.EditorView"
             xmlns="https://github.com/avaloniaui"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:local="clr-namespace:Nodify.Calculator"
             xmlns:nodify="https://miroiu.github.io/nodify"
             xmlns:shared="clr-namespace:Nodify;assembly=Nodify.Shared"
             xmlns:sys="clr-namespace:System;assembly=System.Runtime"
             xmlns:collections="clr-namespace:System.Collections;assembly=System.Runtime"
             xmlns:compatibility="clr-namespace:Nodify.Compatibility;assembly=Nodify"
             d:DataContext="{d:DesignInstance Type=local:EditorViewModel}"
             mc:Ignorable="d"
             d:DesignHeight="450"
             d:DesignWidth="800">
    <UserControl.Resources>
        <GeometryDrawing x:Key="SmallGridGeometry"
                         Geometry="M0,0 L0,1 0.03,1 0.03,0.03 1,0.03 1,0 Z"
                         Brush="{DynamicResource GridLinesBrush}" />

        <GeometryDrawing x:Key="LargeGridGeometry"
                         Geometry="M0,0 L0,1 0.015,1 0.015,0.015 1,0.015 1,0 Z"
                         Brush="{DynamicResource GridLinesBrush}" />

        <DrawingBrush x:Key="SmallGridLinesDrawingBrush"
                      TileMode="Tile"
                      DestinationRect="0 0 15 15"
                      TransformOrigin="0,0"
                      Transform="{Binding DpiScaledViewportTransform, ElementName=Editor}"
                      Drawing="{StaticResource SmallGridGeometry}" />

        <DrawingBrush x:Key="LargeGridLinesDrawingBrush"
                      TileMode="Tile"
                      Opacity="0.5"
                      DestinationRect="0 0 150 150"
                      Transform="{Binding DpiScaledViewportTransform, ElementName=Editor}"
                      Drawing="{StaticResource LargeGridGeometry}" />

        <LinearGradientBrush x:Key="BorderBrush" 
                             StartPoint="0%,0%" 
                             EndPoint="100%,0%">
            <GradientStop Color="#6366f1"
                          Offset="0" />
            <GradientStop Color="#a855f7"
                          Offset="0.5" />
            <GradientStop Color="#ec4899"
                          Offset="1" />
        </LinearGradientBrush>
        
        <Animation x:Key="BorderBrushAnimation"
            FillMode="None"
            IterationCount="Infinite"
            x:SetterTargetType="ContentControl"
            Duration="0:0:8">
            <KeyFrame Cue="0%">
                <Setter Property="BorderBrush">
                    <Setter.Value>
                        <LinearGradientBrush StartPoint="100%,0%" EndPoint="0%,100%">
                            <GradientStop Color="#6366f1" Offset="0" />
                            <GradientStop Color="#a855f7" Offset="0.5" />
                            <GradientStop Color="#ec4899" Offset="1" />
                        </LinearGradientBrush>
                    </Setter.Value>
                </Setter>
            </KeyFrame>
            <KeyFrame Cue="25%">
                <Setter Property="BorderBrush">
                    <Setter.Value>
                        <LinearGradientBrush StartPoint="100%,100%" EndPoint="0%,0%">
                            <GradientStop Color="#6366f1" Offset="0" />
                            <GradientStop Color="#a855f7" Offset="0.5" />
                            <GradientStop Color="#ec4899" Offset="1" />
                        </LinearGradientBrush>
                    </Setter.Value>
                </Setter>
            </KeyFrame>
            <KeyFrame Cue="50%">
                <Setter Property="BorderBrush">
                    <Setter.Value>
                        <LinearGradientBrush StartPoint="0%,100%" EndPoint="100%,0%">
                            <GradientStop Color="#6366f1" Offset="0" />
                            <GradientStop Color="#a855f7" Offset="0.5" />
                            <GradientStop Color="#ec4899" Offset="1" />
                        </LinearGradientBrush>
                    </Setter.Value>
                </Setter>
            </KeyFrame>
            <KeyFrame Cue="75%">
                <Setter Property="BorderBrush">
                    <Setter.Value>
                        <LinearGradientBrush StartPoint="0%,0%" EndPoint="100%,100%">
                            <GradientStop Color="#6366f1" Offset="0" />
                            <GradientStop Color="#a855f7" Offset="0.5" />
                            <GradientStop Color="#ec4899" Offset="1" />
                        </LinearGradientBrush>
                    </Setter.Value>
                </Setter>
            </KeyFrame>
            <KeyFrame Cue="100%">
                <Setter Property="BorderBrush">
                    <Setter.Value>
                        <LinearGradientBrush StartPoint="100%,0%" EndPoint="0%,100%">
                            <GradientStop Color="#6366f1" Offset="0" />
                            <GradientStop Color="#a855f7" Offset="0.5" />
                            <GradientStop Color="#ec4899" Offset="1" />
                        </LinearGradientBrush>
                    </Setter.Value>
                </Setter>
            </KeyFrame>
        </Animation>

        <local:ItemToListConverter x:Key="ItemToListConverter" />

        <DataTemplate x:Key="ConnectionTemplate"
                      DataType="{x:Type local:ConnectionViewModel}">
            <nodify:CircuitConnection Source="{Binding Output.Anchor}"
                                      Target="{Binding Input.Anchor}" />
        </DataTemplate>

        <DataTemplate x:Key="PendingConnectionTemplate"
                      DataType="{x:Type local:PendingConnectionViewModel}">
            <nodify:PendingConnection IsVisible="{Binding IsVisible}"
                                      Source="{Binding Source, Mode=OneWayToSource}"
                                      Target="{Binding Target, Mode=OneWayToSource}"
                                      TargetAnchor="{Binding TargetLocation, Mode=OneWayToSource}"
                                      StartedCommand="{Binding DataContext.StartConnectionCommand, RelativeSource={RelativeSource AncestorType={x:Type nodify:NodifyEditor}}}"
                                      CompletedCommand="{Binding DataContext.CreateConnectionCommand, RelativeSource={RelativeSource AncestorType={x:Type nodify:NodifyEditor}}}" />
        </DataTemplate>
        
        <ControlTheme x:Key="ItemContainerStyle"
               TargetType="{x:Type nodify:ItemContainer}"
               BasedOn="{StaticResource {x:Type nodify:ItemContainer}}">
            <Setter Property="Location"
                    Value="{Binding Location}" />
            <Setter Property="IsSelected"
                    Value="{Binding IsSelected}" />
            <Setter Property="ActualSize"
                    Value="{Binding Size, Mode=OneWayToSource}" />
            <Setter Property="BorderBrush"
                    Value="{StaticResource BorderBrush}" />
            <Setter Property="BorderThickness"
                    Value="2" />
        </ControlTheme>
    </UserControl.Resources>

    <Grid>
        <nodify:NodifyEditor DataContext="{Binding Calculator}"
                             ItemsSource="{Binding Operations}"
                             Connections="{Binding Connections}"
                             SelectedItems="{Binding SelectedOperations}"
                             DisconnectConnectorCommand="{Binding DisconnectConnectorCommand}"
                             PendingConnection="{Binding PendingConnection}"
                             PendingConnectionTemplate="{StaticResource PendingConnectionTemplate}"
                             ConnectionTemplate="{StaticResource ConnectionTemplate}"
                             Background="{StaticResource SmallGridLinesDrawingBrush}"
                             ItemContainerTheme="{StaticResource ItemContainerStyle}"
                             GridCellSize="15"
                             DragDrop.AllowDrop="True"
                             x:Name="Editor">
            <nodify:NodifyEditor.Resources>
                <ControlTheme TargetType="{x:Type nodify:NodeInput}" x:Key="{x:Type nodify:NodeInput}"
                       BasedOn="{StaticResource {x:Type nodify:NodeInput}}">
                    <Setter Property="Header"
                            Value="{Binding}" />
                    <Setter Property="IsConnected"
                            Value="{Binding IsConnected}" />
                    <Setter Property="Anchor"
                            Value="{Binding Anchor, Mode=OneWayToSource}" />
                    <Setter Property="(ToolTip.Tip)"
                            Value="{Binding Value}" />
                    <Setter Property="HeaderTemplate">
                        <Setter.Value>
                            <DataTemplate DataType="{x:Type local:ConnectorViewModel}">
                                <StackPanel Orientation="Horizontal">
                                    <TextBlock Text="{Binding Title}"
                                               VerticalAlignment="Center"
                                               Margin="0 0 5 0" />
                                    <TextBox Text="{Binding Value}"
                                             IsVisible="{Binding !IsConnected}" />
                                </StackPanel>
                            </DataTemplate>
                        </Setter.Value>
                    </Setter>
                </ControlTheme>

                <ControlTheme TargetType="{x:Type nodify:NodeOutput}" x:Key="{x:Type nodify:NodeOutput}"
                       BasedOn="{StaticResource {x:Type nodify:NodeOutput}}">
                    <Setter Property="Header"
                            Value="{Binding}" />
                    <Setter Property="IsConnected"
                            Value="{Binding IsConnected}" />
                    <Setter Property="Anchor"
                            Value="{Binding Anchor, Mode=OneWayToSource}" />
                    <Setter Property="HeaderTemplate">
                        <Setter.Value>
                            <DataTemplate DataType="{x:Type local:ConnectorViewModel}">
                                <TextBox Text="{Binding Value}"
                                         IsEnabled="False" />
                            </DataTemplate>
                        </Setter.Value>
                    </Setter>
                </ControlTheme>
            </nodify:NodifyEditor.Resources>

            <nodify:NodifyEditor.DataTemplates>
                <DataTemplate DataType="{x:Type local:OperationGraphViewModel}">
                    <nodify:GroupingNode Header="{Binding}"
                                         CanResize="{Binding IsExpanded}"
                                         ActualSize="{Binding DesiredSize, Mode=TwoWay}"
                                         MovementMode="Self">
                        <nodify:GroupingNode.HeaderTemplate>
                            <DataTemplate DataType="{x:Type local:OperationGraphViewModel}">
                                <Grid>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="*" />
                                        <ColumnDefinition Width="Auto" />
                                    </Grid.ColumnDefinitions>

                                    <TextBlock Text="{Binding Title}" />
                                    <StackPanel Orientation="Horizontal"
                                                Margin="5 0 0 0"
                                                Grid.Column="1">
                                        <TextBlock Text="Expand?"
                                                   IsVisible="{Binding IsExpanded}"
                                                   Margin="0 0 5 0" />
                                        <CheckBox IsChecked="{Binding IsExpanded}" />
                                    </StackPanel>
                                </Grid>
                            </DataTemplate>
                        </nodify:GroupingNode.HeaderTemplate>
                        <Grid>
                            <ScrollViewer 
                                HorizontalScrollBarVisibility="Auto"
                                VerticalScrollBarVisibility="Auto">
                                <nodify:NodifyEditor Tag="{Binding DataContext, RelativeSource={RelativeSource Self}}"
                                                     DataContext="{Binding InnerCalculator}"
                                                     ItemsSource="{Binding Operations}"
                                                     Connections="{Binding Connections}"
                                                     SelectedItems="{Binding SelectedOperations}"
                                                     DisconnectConnectorCommand="{Binding DisconnectConnectorCommand}"
                                                     PendingConnection="{Binding PendingConnection}"
                                                     PendingConnectionTemplate="{StaticResource PendingConnectionTemplate}"
                                                     ConnectionTemplate="{StaticResource ConnectionTemplate}"
                                                     ItemContainerTheme="{StaticResource ItemContainerStyle}"
                                                     Background="Transparent"
                                                     GridCellSize="15"
                                                     DragDrop.AllowDrop="True"
                                                     IsVisible="{Binding DataContext.IsExpanded, RelativeSource={RelativeSource AncestorType=nodify:GroupingNode}, Converter={shared:BooleanToVisibilityConverter}}">

                                    <nodify:NodifyEditor.KeyBindings>
                                        <KeyBinding Gesture="Delete"
                                                    Command="{Binding DeleteSelectionCommand}" />
                                        <KeyBinding Gesture="C"
                                                    Command="{Binding GroupSelectionCommand}" />
                                    </nodify:NodifyEditor.KeyBindings>

                                    <nodify:NodifyEditor.Decorators>
                                        <collections:ArrayList>
                                            <nodify:DecoratorContainer DataContext="{Binding OperationsMenu}"
                                                                       Location="{Binding Location}">
                                                <local:OperationsMenuView />
                                            </nodify:DecoratorContainer>
                                        </collections:ArrayList>
                                    </nodify:NodifyEditor.Decorators>
                                </nodify:NodifyEditor>
                            </ScrollViewer>
                            
                            <Grid>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="Auto" />
                                    <ColumnDefinition Width="*" />
                                    <ColumnDefinition Width="Auto" />
                                </Grid.ColumnDefinitions>

                                <ItemsControl ItemsSource="{Binding Input}">
                                    <ItemsControl.ItemTemplate>
                                        <DataTemplate>
                                            <nodify:NodeInput />
                                        </DataTemplate>
                                    </ItemsControl.ItemTemplate>
                                </ItemsControl>

                                <nodify:NodeOutput DataContext="{Binding Output}"
                                                   Grid.Column="1"
                                                   VerticalAlignment="Top"
                                                   HorizontalAlignment="Right" />
                            </Grid>
                        </Grid>
                    </nodify:GroupingNode>
                </DataTemplate>
                
                <DataTemplate DataType="{x:Type local:ExpandoOperationViewModel}">
                    <nodify:Node Header="{Binding Title}"
                                 Content="{Binding}"
                                 Input="{Binding Input}"
                                 Output="{Binding Output, Converter={StaticResource ItemToListConverter}}">
                        <nodify:Node.ContentTemplate>
                            <DataTemplate DataType="{x:Type local:ExpandoOperationViewModel}">
                                <StackPanel>
                                    <Button Theme="{StaticResource IconButton}"
                                            Content="{StaticResource PlusIcon}"
                                            Command="{Binding AddInputCommand}" />
                                    <Button Theme="{StaticResource IconButton}"
                                            Content="{StaticResource RemoveKeyIcon}"
                                            Command="{Binding RemoveInputCommand}" />
                                </StackPanel>
                            </DataTemplate>
                        </nodify:Node.ContentTemplate>
                    </nodify:Node>
                </DataTemplate>

                <DataTemplate DataType="{x:Type local:ExpressionOperationViewModel}">
                    <nodify:Node Content="{Binding}"
                                 Input="{Binding Input}"
                                 Output="{Binding Output, Converter={StaticResource ItemToListConverter}}">
                        <nodify:Node.ContentTemplate>
                            <DataTemplate DataType="{x:Type local:ExpressionOperationViewModel}">
                                <TextBox Text="{Binding Expression}"
                                         MinWidth="100"
                                         Margin="5 0 0 0" />
                            </DataTemplate>
                        </nodify:Node.ContentTemplate>
                    </nodify:Node>
                </DataTemplate>

                <DataTemplate DataType="{x:Type local:CalculatorOperationViewModel}">
                    <nodify:Node Header="{Binding Title}"
                                 Input="{Binding Input}"
                                 Output="{Binding Output, Converter={StaticResource ItemToListConverter}}"
                                 ToolTip.Tip="Double click to expand">
                        <Interaction.Behaviors>
                            <RoutedEventTriggerBehavior RoutedEvent="{x:Static InputElement.DoubleTappedEvent}">
                                <InvokeCommandAction Command="{Binding DataContext.OpenCalculatorCommand, RelativeSource={RelativeSource AncestorType=UserControl}}"
                                                     CommandParameter="{Binding InnerCalculator}" />
                            </RoutedEventTriggerBehavior>
                        </Interaction.Behaviors>
                    </nodify:Node>
                </DataTemplate>

                <DataTemplate DataType="{x:Type local:CalculatorInputOperationViewModel}">
                    <nodify:Node Header="{Binding Title}"
                                 Output="{Binding Output}">
                        <StackPanel>
                            <Button Theme="{StaticResource IconButton}"
                                    Content="{StaticResource PlusIcon}"
                                    Command="{Binding AddOutputCommand}" />
                            <Button Theme="{StaticResource IconButton}"
                                    Content="{StaticResource RemoveKeyIcon}"
                                    Command="{Binding RemoveOutputCommand}" />
                        </StackPanel>
                        
                        <nodify:Node.Resources>
                            <ControlTheme TargetType="{x:Type nodify:NodeOutput}" x:Key="{x:Type nodify:NodeOutput}"
                                          BasedOn="{StaticResource {x:Type nodify:NodeOutput}}">
                                <Setter Property="Header"
                                        Value="{Binding}" />
                                <Setter Property="IsConnected"
                                        Value="{Binding IsConnected}" />
                                <Setter Property="Anchor"
                                        Value="{Binding Anchor, Mode=OneWayToSource}" />
                                <Setter Property="HeaderTemplate">
                                    <Setter.Value>
                                        <DataTemplate DataType="{x:Type local:ConnectorViewModel}">
                                            <StackPanel Orientation="Horizontal">
                                                <TextBox Text="{Binding Value}"
                                                         IsEnabled="False" />
                                                <TextBlock Text="{Binding Title}"
                                                           Margin="5 0 0 0" />
                                            </StackPanel>
                                        </DataTemplate>
                                    </Setter.Value>
                                </Setter>
                            </ControlTheme>
                        </nodify:Node.Resources>
                    </nodify:Node>
                </DataTemplate>

                <DataTemplate DataType="{x:Type local:OperationGroupViewModel}">
                    <nodify:GroupingNode Header="{Binding Title}"
                                         ActualSize="{Binding GroupSize, Mode=TwoWay}" />
                </DataTemplate>

                <DataTemplate DataType="{x:Type local:OperationViewModel}">
                    <nodify:Node Content="{Binding Title}"
                                 Input="{Binding Input}"
                                 Output="{Binding Output, Converter={StaticResource ItemToListConverter}}" />
                </DataTemplate>
            </nodify:NodifyEditor.DataTemplates>
            
            <nodify:NodifyEditor.KeyBindings>
                <KeyBinding Gesture="Delete"
                            Command="{Binding DeleteSelectionCommand}" />
                <KeyBinding Gesture="C"
                            Command="{Binding GroupSelectionCommand}" />
            </nodify:NodifyEditor.KeyBindings>
            
            <nodify:NodifyEditor.Decorators>
                <collections:ArrayList>
                    <nodify:DecoratorContainer DataContext="{Binding OperationsMenu}"
                                               Location="{Binding Location}">
                        <local:OperationsMenuView />
                    </nodify:DecoratorContainer>
                </collections:ArrayList>
            </nodify:NodifyEditor.Decorators>
        </nodify:NodifyEditor>

        <Grid Background="{StaticResource LargeGridLinesDrawingBrush}"
              Panel.ZIndex="-2" />

        <Border HorizontalAlignment="Right"
                MinWidth="200"
                MaxWidth="300"
                Padding="7"
                Margin="10"
                CornerRadius="3"
                BorderThickness="2">
            <Border.Background>
                <SolidColorBrush Color="{DynamicResource BackgroundColor}"
                                 Opacity="0.7" />
            </Border.Background>
            <ScrollViewer>
                <ItemsControl ItemsSource="{Binding Calculator.OperationsMenu.AvailableOperations}">
                    <ItemsControl.ItemContainerTheme>
                        <ControlTheme TargetType="{x:Type ContentPresenter}">
                            <Setter Property="Control.Margin" 
                                    Value="5"/>
                            <Setter Property="Control.HorizontalAlignment" 
                                    Value="Left"/>
                            <Setter Property="Control.Cursor" 
                                    Value="Hand"/>
                            <Setter Property="(ToolTip.Tip)" 
                                    Value="Drag and drop into the editor"/>
                        </ControlTheme>
                    </ItemsControl.ItemContainerTheme>
                    <ItemsControl.ItemTemplate>
                        <DataTemplate DataType="{x:Type local:OperationInfoViewModel}">
                            <nodify:Node Content="{Binding Title}"
                                         Input="{Binding Input}"
                                         BorderBrush="{StaticResource BorderBrush}"
                                         BorderThickness="2"
                                         PointerPressed="OnNodePressed"
                                         PointerExited="OnNodeExited"
                                         PointerMoved="OnNodeDrag">
                                <nodify:Node.Output>
                                    <collections:ArrayList>
                                        <sys:String>Output</sys:String>
                                    </collections:ArrayList>
                                </nodify:Node.Output>
                                <!-- <nodify:Node.Styles> -->
                                <!--     <Style Selector="nodify|Node"> -->
                                <!--         <Style.Animations> -->
                                <!--             <StaticResource ResourceKey="BorderBrushAnimation" /> -->
                                <!--         </Style.Animations> -->
                                <!--     </Style> -->
                                <!-- </nodify:Node.Styles> -->
                            </nodify:Node>
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>
            </ScrollViewer>
        </Border>
    </Grid>
</UserControl>


================================================
FILE: Examples/Nodify.Calculator/EditorView.xaml.cs
================================================
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

namespace Nodify.Calculator
{
    public partial class EditorView : UserControl
    {
        public EditorView()
        {
            InitializeComponent();

            PointerPressedEvent.AddClassHandler<NodifyEditor>(CloseOperationsMenuPointerPressed);
            ItemContainer.DragStartedEvent.AddClassHandler<ItemContainer>(CloseOperationsMenu);
            PointerReleasedEvent.AddClassHandler<NodifyEditor>(OpenOperationsMenu);
            Editor.AddHandler(DragDrop.DropEvent, OnDropNode);
        }
        
        private void OpenOperationsMenu(object? sender, PointerReleasedEventArgs e)
        {
            if (!e.Handled && e.Source is NodifyEditor editor && !editor.IsPanning && editor.DataContext is CalculatorViewModel calculator &&
                e.InitialPressMouseButton == MouseButton.Right)
            {
                e.Handled = true;
                calculator.OperationsMenu.OpenAt(editor.MouseLocation);
            }
        }

        private void CloseOperationsMenuPointerPressed(object? sender, PointerPressedEventArgs e)
        {
            if (e.GetCurrentPoint(this).Properties.PointerUpdateKind == PointerUpdateKind.LeftButtonPressed)
                CloseOperationsMenu(sender, e);
        }
        
        private void CloseOperationsMenu(object? sender, RoutedEventArgs e)
        {
            ItemContainer? itemContainer = sender as ItemContainer;
            NodifyEditor? editor = sender as NodifyEditor ?? itemContainer?.Editor;

            if (!e.Handled && editor?.DataContext is CalculatorViewModel calculator)
            {
                calculator.OperationsMenu.Close();
            }
        }

        private void OnDropNode(object? sender, DragEventArgs e)
        {
            NodifyEditor? editor = (e.Source as NodifyEditor) ?? (e.Source as Control)?.GetLogicalParent() as NodifyEditor;
            if(editor != null && editor.DataContext is CalculatorViewModel calculator
                && e.Data.Get(typeof(OperationInfoViewModel).FullName) is OperationInfoViewModel operation)
            {
                OperationViewModel op = OperationFactory.GetOperation(operation);
                op.Location = editor.GetLocationInsideEditor(e);
                calculator.Operations.Add(op);

                e.Handled = true;
            }
        }
        
        private void OnNodeDrag(object? sender, MouseEventArgs e)
        {
            if(leftButtonPressed && ((Control)sender).DataContext is OperationInfoViewModel operation)
            {
                var data = new DataObject();
                data.Set(typeof(OperationInfoViewModel).FullName, operation);
                DragDrop.DoDragDrop(e, data, DragDropEffects.Copy);
            }
        }

        private void OnNodePressed(object? sender, PointerPressedEventArgs e)
        {
            leftButtonPressed = e.GetCurrentPoint(this).Properties.PointerUpdateKind ==
                                PointerUpdateKind.LeftButtonPressed;
        }

        private void OnNodeExited(object? sender, PointerEventArgs e)
        {
            leftButtonPressed = false;
        }
        
        private bool leftButtonPressed;
    }
}


================================================
FILE: Examples/Nodify.Calculator/EditorViewModel.cs
================================================
using System;
using System.Collections.Generic;
using System.Windows.Input;

namespace Nodify.Calculator
{
    public class EditorViewModel : ObservableObject
    {
        public event Action<EditorViewModel, CalculatorViewModel>? OnOpenInnerCalculator;

        public EditorViewModel? Parent { get; set; }

        public EditorViewModel()
        {
            Calculator = new CalculatorViewModel();
            OpenCalculatorCommand = new DelegateCommand<CalculatorViewModel>(calculator =>
            {
                OnOpenInnerCalculator?.Invoke(this, calculator);
            });
        }

        public INodifyCommand OpenCalculatorCommand { get; }

        public Guid Id { get; } = Guid.NewGuid();

        private CalculatorViewModel _calculator = default!;
        public CalculatorViewModel Calculator 
        {
            get => _calculator;
            set => SetProperty(ref _calculator, value);
        }

        private string? _name;
        public string? Name
        {
            get => _name;
            set => SetProperty(ref _name, value);
        }
    }
}


================================================
FILE: Examples/Nodify.Calculator/ExpandoOperationViewModel.cs
================================================
namespace Nodify.Calculator
{
    public class ExpandoOperationViewModel : OperationViewModel
    {
        public ExpandoOperationViewModel()
        {
            AddInputCommand = new RequeryCommand(
                () => Input.Add(new ConnectorViewModel()),
                () => Input.Count < MaxInput);

            RemoveInputCommand = new RequeryCommand(
                () => Input.RemoveAt(Input.Count - 1),
                () => Input.Count > MinInput);

            Input.WhenAdded(_ => AddInputCommand.RaiseCanExecuteChanged());
            Input.WhenRemoved(_ => AddInputCommand.RaiseCanExecuteChanged());
            Input.WhenAdded(_ => RemoveInputCommand.RaiseCanExecuteChanged());
            Input.WhenRemoved(_ => RemoveInputCommand.RaiseCanExecuteChanged());
        }

        public INodifyCommand AddInputCommand { get; }
        public INodifyCommand RemoveInputCommand { get; }

        private uint _minInput = 0;
        public uint MinInput
        {
            get => _minInput;
            set => SetProperty(ref _minInput, value);
        }

        private uint _maxInput = uint.MaxValue;
        public uint MaxInput
        {
            get => _maxInput;
            set => SetProperty(ref _maxInput, value);
        }
    }
}


================================================
FILE: Examples/Nodify.Calculator/ExpressionOperationViewModel.cs
================================================
using StringMath;
using System.Collections.Generic;
using System.Linq;

namespace Nodify.Calculator
{
    public class ExpressionOperationViewModel : OperationViewModel
    {
        private MathExpr? _expr;
        private string? _expression;
        public string? Expression
        {
            get => _expression;
            set => SetProperty(ref _expression, value)
                .Then(GenerateInput);
        }

        private void GenerateInput()
        {
            try
            {
                _expr = Expression!.ToMathExpr();
                ConnectorViewModel[]? toRemove = Input.Where(i => !_expr.LocalVariables.Contains(i.Title)).ToArray();
                toRemove.ForEach(i => Input.Remove(i));
                HashSet<string> existingVars = Input.Select(s => s.Title).Where(s => s != null).ToHashSet()!;

                foreach (string variable in _expr.LocalVariables.Except(existingVars))
                {
                    Input.Add(new ConnectorViewModel
                    {
                        Title = variable
                    });
                }

                OnInputValueChanged();
            }
            catch
            {

            }
        }

        protected override void OnInputValueChanged()
        {
            if (Output != null && _expr != null)
            {
                try
                {
                    Input.ForEach(i => _expr.Substitute(i.Title!, i.Value));
                    Output.Value = _expr.Result;
                }
                catch
                {

                }
            }
        }
    }
}


================================================
FILE: Examples/Nodify.Calculator/GlobalUsings.cs
================================================
global using Avalonia.Controls;
global using Avalonia;
global using Avalonia.Data.Converters;
global using Avalonia.Markup.Xaml;
global using System.Windows.Input;
global using Avalonia.Interactivity;
global using Avalonia.Controls.ApplicationLifetimes;
global using Avalonia.Input;
global using Avalonia.LogicalTree;
global using MouseEventArgs = Avalonia.Input.PointerEventArgs;

================================================
FILE: Examples/Nodify.Calculator/MainWindow.xaml
================================================
<Window x:Class="Nodify.Calculator.MainWindow"
        xmlns="https://github.com/avaloniaui"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Nodify.Calculator"
        xmlns:shared="clr-namespace:Nodify;assembly=Nodify.Shared"
        Background="{DynamicResource NodifyEditor.BackgroundBrush}"
        Foreground="{DynamicResource ForegroundBrush}"
        mc:Ignorable="d"
        Title="MainWindow"
        Height="650"
        Width="1200">
    <Window.DataContext>
        <local:ApplicationViewModel />
    </Window.DataContext>
    
    <Window.KeyBindings>
        <KeyBinding Gesture="Ctrl+T"
                    Command="{Binding Source={x:Static shared:ThemeManager.SetNextThemeCommand}}" />
        <KeyBinding Gesture="Ctrl+N"
                    Command="{Binding AddEditorCommand}" />
        <KeyBinding Gesture="Ctrl+W"
                    Command="{Binding CloseEditorCommand}"
                    CommandParameter="{Binding SelectedEditor.Id}"/>
    </Window.KeyBindings>
    
    <Window.Resources>
        <shared:BindingProxy x:Key="Proxy" 
                             DataContext="{Binding}"/>
    </Window.Resources>
    
    <Window.DataTemplates>
        <DataTemplate DataType="{x:Type local:EditorViewModel}">
            <local:EditorView/>
        </DataTemplate>
    </Window.DataTemplates>
    
    <Grid>
        <shared:TabControlEx ItemsSource="{Binding Editors}"
                             SelectedItem="{Binding SelectedEditor}" 
                             AddTabCommand="{Binding AddEditorCommand}"
                             AutoScrollToEnd="{Binding AutoSelectNewEditor}">
            <shared:TabControlEx.ItemContainerTheme>
                <ControlTheme TargetType="{x:Type shared:TabItemEx}" 
                       BasedOn="{StaticResource {x:Type shared:TabItemEx}}">
                    <Setter Property="Header" 
                            Value="{Binding Name}"/>
                    <Setter Property="CloseTabCommand" 
                            Value="{Binding DataContext.CloseEditorCommand ,Source={StaticResource Proxy}}"/>
                    <Setter Property="CloseTabCommandParameter" 
                            Value="{Binding Id}"/>
                </ControlTheme>
            </shared:TabControlEx.ItemContainerTheme>
        </shared:TabControlEx>

        <Expander Header="Click to hide/show"
                  IsExpanded="True"
                  Margin="10"
                  Padding="0"
                  HorizontalAlignment="Left"
                  VerticalAlignment="Bottom">
            <Border MaxWidth="325"
                    MaxHeight="300"
                    CornerRadius="3">
                <Border.Background>
                    <SolidColorBrush Color="{DynamicResource BackgroundColor}"
                                     Opacity="0.7" />
                </Border.Background>
                <ScrollViewer HorizontalScrollBarVisibility="Disabled">
                    <StackPanel Margin="10"
                                IsHitTestVisible="False">
                        <StackPanel.Resources>
                            <ControlTheme TargetType="{x:Type TextBlock}" x:Key="{x:Type TextBlock}">
                                <Setter Property="Margin"
                                        Value="0 0 0 5" />
                            </ControlTheme>
                        </StackPanel.Resources>

                        <StackPanel Margin="0 0 0 20">
                            <TextBlock Text="(New) Drag and drop nodes from the toolbox"
                                   TextWrapping="Wrap"
                                   Foreground="{DynamicResource NodeInput.BorderBrush}"
                                   FontWeight="Bold"/>
                        </StackPanel>
                        <TextBlock TextWrapping="Wrap">
                            <Run Foreground="Red"
                                    FontWeight="Bold">CTRL + N/W</Run>
                            <Run>: open/close editor</Run>
                        </TextBlock>
                        <TextBlock TextWrapping="Wrap">
                            <Run Foreground="Red"
                                    FontWeight="Bold">ALT + Click</Run>
                            <Run>: disconnect connector</Run>
                        </TextBlock>
                        <TextBlock TextWrapping="Wrap">
                            <Run Foreground="Red"
                                    FontWeight="Bold">Right Click</Run>
                            <Run>: show operations menu (create nodes)</Run>
                        </TextBlock>
                        <TextBlock TextWrapping="Wrap">
                            <Run Foreground="Red"
                                    FontWeight="Bold">Delete</Run>
                            <Run>:  delete selection</Run>
                        </TextBlock>
                        <TextBlock TextWrapping="Wrap">
                            <Run Foreground="Red"
                                    FontWeight="Bold">CTRL + T</Run>
                            <Run>: change theme</Run>
                        </TextBlock>
                        <TextBlock TextWrapping="Wrap">
                            <Run Foreground="Red"
                                    FontWeight="Bold">C</Run>
                            <Run>: group selection (hold SHIFT and mouse drag the header to move the group node alone)</Run>
                        </TextBlock>
                        <TextBlock Text="Drag a connection and drop it on the editor"
                                TextWrapping="Wrap"
                                FontWeight="Bold" />
                        <TextBlock Text="Hover over a connector to see its value"
                                   TextWrapping="Wrap"
                                   FontWeight="Bold" />
                        <TextBlock Text="Create a Calculator node and double click it to open"
                                   TextWrapping="Wrap"
                                   FontWeight="Bold" />
                        <TextBlock Text="Create an Operation Graph and add operations to it"
                                   TextWrapping="Wrap"
                                   FontWeight="Bold" />
                    </StackPanel>
                </ScrollViewer>
            </Border>
        </Expander>
    </Grid>
</Window>


================================================
FILE: Examples/Nodify.Calculator/MainWindow.xaml.cs
================================================
using System.Windows;

namespace Nodify.Calculator
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            EditorGestures.Mappings.Editor.Cutting.Value = MultiGesture.None;
        }
    }
}


================================================
FILE: Examples/Nodify.Calculator/Nodify.Calculator.csproj
================================================
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFrameworks>net9</TargetFrameworks>
    <Nullable>enable</Nullable>
    <AssemblyOriginatorKeyFile>..\..\build\Nodify.snk</AssemblyOriginatorKeyFile>
    <SignAssembly>true</SignAssembly>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="StringMath" Version="4.1.2" />
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include="..\..\Nodify\Nodify.csproj" />
    <ProjectReference Include="..\Nodify.Shared\Nodify.Shared.csproj" />
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="Avalonia" Version="$(AvaloniaVersion)"/>
    <PackageReference Include="Avalonia.Desktop" Version="$(AvaloniaVersion)"/>
    <PackageReference Include="Avalonia.Themes.Fluent" Version="$(AvaloniaVersion)"/>
    <PackageReference Include="Avalonia.Fonts.Inter" Version="$(AvaloniaVersion)"/>
    <PackageReference Include="Avalonia.Xaml.Behaviors" Version="11.1.0.4"/>
    <!--Condition below is needed to remove Avalonia.Diagnostics package from build output in Release configuration.-->
    <PackageReference Condition="'$(Configuration)' == 'Debug'" Include="Avalonia.Diagnostics" Version="$(AvaloniaVersion)"/>
  </ItemGroup>

  <ItemGroup>
    <AdditionalFiles SourceItemGroup="AvaloniaXaml" Include="**/*.xaml"/>
    <AvaloniaResource Include="**/*.xaml" />
  </ItemGroup>
</Project>


================================================
FILE: Examples/Nodify.Calculator/OperationGraphViewModel.cs
================================================
using System.Windows;

namespace Nodify.Calculator
{
    public class OperationGraphViewModel : CalculatorOperationViewModel
    {
        private Size _size;
        public Size DesiredSize
        {
            get => _size;
            set => SetProperty(ref _size, value);
        }
        
        private Size _prevSize;

        private bool _isExpanded = true;
        public bool IsExpanded
        {
            get => _isExpanded;
            set
            {
                if (SetProperty(ref _isExpanded, value))
                {
                    if (_isExpanded)
                    {
                        DesiredSize = _prevSize;
                    }
                    else
                    {
                        _prevSize = Size;
                        // Fit content
                        DesiredSize = new Size(0,0);
                    }
                }
            }
        }

        public OperationGraphViewModel()
        {
            InnerCalculator.Operations[0].Location = new Point(50, 50);
            InnerCalculator.Operations[1].Location = new Point(200, 50);
        }
    }
}

================================================
FILE: Examples/Nodify.Calculator/OperationGroupViewModel.cs
================================================
using System.Windows;

namespace Nodify.Calculator
{
    public class OperationGroupViewModel : OperationViewModel
    {
        private Size _size;
        public Size GroupSize
        {
            get => _size;
            set => SetProperty(ref _size, value);
        }
    }
}

================================================
FILE: Examples/Nodify.Calculator/OperationInfoViewModel.cs
================================================
using System.Collections.Generic;

namespace Nodify.Calculator
{
    public enum OperationType
    {
        Normal,
        Expando,
        Expression,
        Calculator,
        Group,
        Graph
    }

    public class OperationInfoViewModel
    {
        public string? Title { get; set; }
        public OperationType Type { get; set; }
        public IOperation? Operation { get; set; }
        public List<string?> Input { get; } = new List<string?>();
        public uint MinInput { get; set; }
        public uint MaxInput { get; set; }
    }
}


================================================
FILE: Examples/Nodify.Calculator/OperationViewModel.cs
================================================
using System.ComponentModel;
using System.Linq;
using System.Windows;

namespace Nodify.Calculator
{
    public class OperationViewModel : ObservableObject
    {
        public OperationViewModel()
        {
            Input.WhenAdded(x =>
            {
                x.Operation = this;
                x.IsInput = true;
                x.PropertyChanged += OnInputValueChanged;
            })
            .WhenRemoved(x =>
            {
                x.PropertyChanged -= OnInputValueChanged;
            });
        }

        private void OnInputValueChanged(object? sender, PropertyChangedEventArgs e)
        {
            if (e.PropertyName == nameof(ConnectorViewModel.Value))
            {
                OnInputValueChanged();
            }
        }

        private Point _location;
        public Point Location
        {
            get => _location;
            set => SetProperty(ref _location, value);
        }

        private Size _size;
        public Size Size
        {
            get => _size;
            set => SetProperty(ref _size, value);
        }

        private string? _title;
        public string? Title
        {
            get => _title;
            set => SetProperty(ref _title, value);
        }

        private bool _isSelected;
        public bool IsSelected
        {
            get => _isSelected;
            set => SetProperty(ref _isSelected, value);
        }

        public bool IsReadOnly { get; set; }

        private IOperation? _operation;
        public IOperation? Operation
        {
            get => _operation;
            set => SetProperty(ref _operation, value)
                .Then(OnInputValueChanged);
        }

        public NodifyObservableCollection<ConnectorViewModel> Input { get; } = new NodifyObservableCollection<ConnectorViewModel>();

        private ConnectorViewModel? _output;
        public ConnectorViewModel? Output
        {
            get => _output;
            set
            {
                if (SetProperty(ref _output, value) && _output != null)
                {
                    _output.Operation = this;
                }
            }
        }

        protected virtual void OnInputValueChanged()
        {
            if (Output != null && Operation != null)
            {
                try
                {
                    var input = Input.Select(i => i.Value).ToArray();
                    Output.Value = Operation?.Execute(input) ?? 0;
                }
                catch
                {

                }
            }
        }
    }
}


================================================
FILE: Examples/Nodify.Calculator/Operations/BinaryOperation.cs
================================================
using System;

namespace Nodify.Calculator
{
    public class BinaryOperation : IOperation
    {
        private readonly Func<double, double, double> _func;

        public BinaryOperation(Func<double, double, double> func) => _func = func;

        public double Execute(params double[] operands)
            => _func.Invoke(operands[0], operands[1]);
    }
}


================================================
FILE: Examples/Nodify.Calculator/Operations/IOperation.cs
================================================
namespace Nodify.Calculator
{
    public interface IOperation
    {
        double Execute(params double[] operands);
    }
}


================================================
FILE: Examples/Nodify.Calculator/Operations/OperationFactory.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Windows;

namespace Nodify.Calculator
{
    public static class OperationFactory
    {
        public static List<OperationInfoViewModel> GetOperationsInfo(Type container)
        {
            List<OperationInfoViewModel> result = new List<OperationInfoViewModel>();

            foreach (var method in container.GetMethods())
            {
                if (method.IsStatic)
                {
                    OperationInfoViewModel op = new OperationInfoViewModel
                    {
                        Title = method.Name
                    };

                    var attr = method.GetCustomAttribute<OperationAttribute>();
                    var para = method.GetParameters();

                    bool generateInputNames = true;

                    op.Type = OperationType.Normal;

                    if (para.Length == 2)
                    {
                        var delType = typeof(Func<double, double, double>);
                        var del = (Func<double, double, double>)Delegate.CreateDelegate(delType, method);

                        op.Operation = new BinaryOperation(del);
                    }
                    else if (para.Length == 1)
                    {
                        if (para[0].ParameterType.IsArray)
                        {
                            op.Type = OperationType.Expando;

                            var delType = typeof(Func<double[], double>);
                            var del = (Func<double[], double>)Delegate.CreateDelegate(delType, method);

                            op.Operation = new ParamsOperation(del);
                            op.MaxInput = int.MaxValue;
                        }
                        else
                        {
                            var delType = typeof(Func<double, double>);
                            var del = (Func<double, double>)Delegate.CreateDelegate(delType, method);

                            op.Operation = new UnaryOperation(del);
                        }
                    }
                    else if (para.Length == 0)
                    {
                        var delType = typeof(Func<double>);
                        var del = (Func<double>)Delegate.CreateDelegate(delType, method);

                        op.Operation = new ValueOperation(del);
                    }

                    if (attr != null)
                    {
                        op.MinInput = attr.MinInput;
                        op.MaxInput = attr.MaxInput;
                        generateInputNames = attr.GenerateInputNames;
                    }
                    else
                    {
                        op.MinInput = (uint)para.Length;
                        op.MaxInput = (uint)para.Length;
                    }

                    foreach (var param in para)
                    {
                        op.Input.Add(generateInputNames ? param.Name : null);
                    }

                    for (int i = op.Input.Count; i < op.MinInput; i++)
                    {
                        op.Input.Add(null);
                    }

                    result.Add(op);
                }
            }

            return result;
        }

        public static OperationViewModel GetOperation(OperationInfoViewModel info)
        {
            var input = info.Input.Select(i => new ConnectorViewModel
            {
                Title = i
            });

            switch (info.Type)
            {
                case OperationType.Expression:
                    return new ExpressionOperationViewModel
                    {
                        Title = info.Title,
                        Output = new ConnectorViewModel(),
                        Operation = info.Operation,
                        Expression = "1 + sin {a} + cos {b}"
                    };

                case OperationType.Calculator:
                    return new CalculatorOperationViewModel
                    {
                        Title = info.Title,
                        Operation = info.Operation,
                    };

                case OperationType.Expando:
                    var o = new ExpandoOperationViewModel
                    {
                        MaxInput = info.MaxInput,
                        MinInput = info.MinInput,
                        Title = info.Title,
                        Output = new ConnectorViewModel(),
                        Operation = info.Operation
                    };

                    o.Input.AddRange(input);
                    return o;

                case OperationType.Group:
                    return new OperationGroupViewModel
                    {
                        Title = info.Title,
                    };

                case OperationType.Graph:
                    return new OperationGraphViewModel
                    {
                        Title = info.Title,
                        DesiredSize = new Size(420, 250)
                    };

                default:
                {
                    var op = new OperationViewModel
                    {
                        Title = info.Title,
                        Output = new ConnectorViewModel(),
                        Operation = info.Operation
                    };

                    op.Input.AddRange(input);
                    return op;
                }
            }
        }
    }
}


================================================
FILE: Examples/Nodify.Calculator/Operations/OperationsContainer.cs
================================================
using System;
using System.Linq;

namespace Nodify.Calculator
{
    public static class OperationsContainer
    {
        [Operation(MinInput = 2, MaxInput = 10, GenerateInputNames = false)]
        public static double Add(params double[] operands)
            => operands.Sum();

        [Operation(MinInput = 2, MaxInput = 10, GenerateInputNames = false)]
        public static double Multiply(params double[] operands)
            => operands.Aggregate((x, y) => x * y);

        public static double Divide(double a, double b)
            => a / b;

        public static double Subtract(double a, double b)
            => a - b;

        public static double Pow(double value, double exp)
            => (double)Math.Pow((double)value, (double)exp);

        [Operation(GenerateInputNames = false)]
        public static double Abs(double value)
            => Math.Abs(value);

        public static double PI()
            => (double)Math.PI;
    }

    public sealed class OperationAttribute : Attribute
    {
        public uint MaxInput { get; set; }
        public uint MinInput { get; set; }
        public bool GenerateInputNames { get; set; }
    }
}


================================================
FILE: Examples/Nodify.Calculator/Operations/ParamsOperation.cs
================================================
using System;

namespace Nodify.Calculator
{
    public class ParamsOperation : IOperation
    {
        private readonly Func<double[], double> _func;

        public ParamsOperation(Func<double[], double> func) => _func = func;

        public double Execute(params double[] operands)
            => _func.Invoke(operands);
    }
}


================================================
FILE: Examples/Nodify.Calculator/Operations/UnaryOperation.cs
================================================
using System;

namespace Nodify.Calculator
{
    public class UnaryOperation : IOperation
    {
        private readonly Func<double, double> _func;

        public UnaryOperation(Func<double, double> func) => _func = func;

        public double Execute(params double[] operands)
            => _func.Invoke(operands[0]);
    }
}


================================================
FILE: Examples/Nodify.Calculator/Operations/ValueOperation.cs
================================================
using System;

namespace Nodify.Calculator
{
    public class ValueOperation : IOperation
    {
        private readonly Func<double> _func;

        public ValueOperation(Func<double> func) => _func = func;

        public double Execute(params double[] operands)
            => _func();
    }
}


================================================
FILE: Examples/Nodify.Calculator/OperationsExtensions.cs
================================================
using System.Collections.Generic;
using System.Windows;

namespace Nodify.Calculator
{
    public static class OperationsExtensions
    {
        public static Rect GetBoundingBox(this IEnumerable<OperationViewModel> nodes, double padding = 0, int gridCellSize = 15)
        {
            var minX = double.MaxValue;
            var minY = double.MaxValue;

            var maxX = double.MinValue;
            var maxY = double.MinValue;

            const int width = 200; //node.Width
            const int height = 100; //node.Height

            foreach (var node in nodes)
            {
                if (node.Location.X < minX)
                {
                    minX = node.Location.X;
                }

                if (node.Location.Y < minY)
                {
                    minY = node.Location.Y;
                }

                var sizeX = node.Location.X + width;
                if (sizeX > maxX)
                {
                    maxX = sizeX;
                }

                var sizeY = node.Location.Y + height;
                if (sizeY > maxY)
                {
                    maxY = sizeY;
                }
            }

            var result = new Rect(minX - padding, minY - padding, maxX - minX + padding * 2, maxY - minY + padding * 2);
            result = new Rect((int)result.X / gridCellSize * gridCellSize,
                (int)result.Y / gridCellSize * gridCellSize,
                result.Width,
                result.Height);
            return result;
        }
    }
}

================================================
FILE: Examples/Nodify.Calculator/OperationsMenuView.xaml
================================================
<UserControl x:Class="Nodify.Calculator.OperationsMenuView"
             xmlns="https://github.com/avaloniaui"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:local="clr-namespace:Nodify.Calculator"
             xmlns:shared="clr-namespace:Nodify;assembly=Nodify.Shared"
             mc:Ignorable="d"
             MinWidth="250"
             d:DesignHeight="400"
             d:DesignWidth="250"
             d:DataContext="{d:DesignInstance local:OperationsMenuViewModel}">
    <UserControl.Resources>
        <ControlTheme TargetType="{x:Type TextBlock}" x:Key="{x:Type TextBlock}">
            <Setter Property="Foreground"
                    Value="{DynamicResource ForegroundBrush}" />
        </ControlTheme>
    </UserControl.Resources>

    <Border Padding="7"
            CornerRadius="3"
            Background="{DynamicResource Node.BackgroundBrush}"
            BorderBrush="{StaticResource NodifyEditor.SelectionRectangleStrokeBrush}"
            BorderThickness="2"
            IsVisible="{Binding IsVisible, Converter={shared:BooleanToVisibilityConverter}}">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="*" />
            </Grid.RowDefinitions>

            <ItemsControl Grid.Row="1"
                          ItemsSource="{Binding AvailableOperations}">
                <ItemsControl.ItemTemplate>
                    <DataTemplate DataType="{x:Type local:OperationInfoViewModel}">
                        <Button Content="{Binding Title}"
                                Command="{Binding DataContext.CreateOperationCommand, RelativeSource={RelativeSource AncestorType=UserControl}}"
                                CommandParameter="{Binding}"
                                Background="Transparent"
                                BorderBrush="Transparent"
                                Foreground="{DynamicResource ForegroundBrush}"
                                Padding="3"
                                Cursor="Hand"
                                HorizontalContentAlignment="Left">
                            <Button.Theme>
                                <ControlTheme TargetType="{x:Type Button}">
                                    <Setter Property="Template">
                                        <Setter.Value>
                                            <ControlTemplate TargetType="{x:Type Button}">
                                                <Border Name="Border"
                                                        Background="{TemplateBinding Background}"
                                                        Padding="{TemplateBinding Padding}">
                                                    <ContentPresenter Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}" />
                                                </Border>
                                            </ControlTemplate>
                                        </Setter.Value>
                                    </Setter>
                                    <Style Selector="^:pointerover /template/ Border#Border">
                                        <Setter Property="Background"
                                                Value="{DynamicResource NodeInput.BorderBrush}" />                                        
                                    </Style>
                                </ControlTheme>
                            </Button.Theme>
                        </Button>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </Grid>
    </Border>
</UserControl>


================================================
FILE: Examples/Nodify.Calculator/OperationsMenuView.xaml.cs
================================================
using System.Windows.Controls;

namespace Nodify.Calculator
{
    public partial class OperationsMenuView : UserControl
    {
        public OperationsMenuView()
        {
            InitializeComponent();
        }
    }
}


================================================
FILE: Examples/Nodify.Calculator/OperationsMenuViewModel.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;

namespace Nodify.Calculator
{
    public class OperationsMenuViewModel : ObservableObject
    {
        private bool _isVisible;
        public bool IsVisible
        {
            get => _isVisible;
            set
            {
                SetProperty(ref _isVisible, value);
                if (!value)
                {
                    Closed?.Invoke();
                }
            }
        }

        private Point _location;
        public Point Location
        {
            get => _location;
            set => SetProperty(ref _location, value);
        }

        public event Action? Closed;

        public void OpenAt(Point targetLocation)
        {
            Close();
            Location = targetLocation;
            IsVisible = true;
        }

        public void Close()
        {
            IsVisible = false;
        }

        public NodifyObservableCollection<OperationInfoViewModel> AvailableOperations { get; }
        public INodifyCommand CreateOperationCommand { get; }
        private readonly CalculatorViewModel _calculator;

        public OperationsMenuViewModel(CalculatorViewModel calculator)
        {
            _calculator = calculator;
            List<OperationInfoViewModel> operations = new List<OperationInfoViewModel>
            {
                new OperationInfoViewModel
                {
                    Type = OperationType.Graph,
                    Title = "Operation Graph",
                },
                new OperationInfoViewModel
                {
                    Type = OperationType.Calculator,
                    Title = "Calculator"
                },
                new OperationInfoViewModel
                {
                    Type = OperationType.Expression,
                    Title = "Custom",
                }
            };
            operations.AddRange(OperationFactory.GetOperationsInfo(typeof(OperationsContainer)));

            AvailableOperations = new NodifyObservableCollection<OperationInfoViewModel>(operations);
            CreateOperationCommand = new DelegateCommand<OperationInfoViewModel>(CreateOperation);
        }

        private void CreateOperation(OperationInfoViewModel operationInfo)
        {
            OperationViewModel op = OperationFactory.GetOperation(operationInfo);
            op.Location = Location;

            _calculator.Operations.Add(op);

            var pending = _calculator.PendingConnection;
            if (pending.IsVisible)
            {
                var connector = pending.Source.IsInput ? op.Output : op.Input.FirstOrDefault();
                if (connector != null && _calculator.CanCreateConnection(pending.Source, connector))
                {
                    _calculator.CreateConnection(pending.Source, connector);
                }
            }
            Close();
        }
    }
}


================================================
FILE: Examples/Nodify.Calculator/PendingConnectionViewModel.cs
================================================
using System.Windows;

namespace Nodify.Calculator
{
    public class PendingConnectionViewModel : ObservableObject
    {
        private ConnectorViewModel _source = default!;
        public ConnectorViewModel Source
        {
            get => _source;
            set => SetProperty(ref _source, value);
        }

        private ConnectorViewModel? _target;
        public ConnectorViewModel? Target
        {
            get => _target;
            set => SetProperty(ref _target, value);
        }

        private bool _isVisible;
        public bool IsVisible
        {
            get => _isVisible;
            set => SetProperty(ref _isVisible, value);
        }

        private Point _targetLocation;

        public Point TargetLocation
        {
            get => _targetLocation;
            set => SetProperty(ref _targetLocation, value);
        }
    }
}


================================================
FILE: Examples/Nodify.Calculator/Program.cs
================================================
using System;
using Avalonia;

namespace Nodify.Calculator;

class Program
{
    // Initialization code. Don't use any Avalonia, third-party APIs or any
    // SynchronizationContext-reliant code before AppMain is called: things aren't initialized
    // yet and stuff might break.
    [STAThread]
    public static void Main(string[] args) => BuildAvaloniaApp()
        .StartWithClassicDesktopLifetime(args);

    // Avalonia configuration, don't remove; also used by visual designer.
    public static AppBuilder BuildAvaloniaApp()
        => AppBuilder.Configure<App>()
            .UsePlatformDetect()
            .WithInterFont()
            .LogToTrace();
}

================================================
FILE: Examples/Nodify.Calculator/Themes/Dark.xaml
================================================
<ResourceDictionary xmlns="https://github.com/avaloniaui"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

</ResourceDictionary>

================================================
FILE: Examples/Nodify.Calculator/Themes/Light.xaml
================================================
<ResourceDictionary xmlns="https://github.com/avaloniaui"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

</ResourceDictionary>

================================================
FILE: Examples/Nodify.Calculator/Themes/Nodify.xaml
================================================
<ResourceDictionary xmlns="https://github.com/avaloniaui"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

</ResourceDictionary>

================================================
FILE: Examples/Nodify.Playground/App.xaml
================================================
<Application x:Class="Nodify.Playground.App"
             xmlns="https://github.com/avaloniaui"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             RequestedThemeVariant="Dark">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceInclude Source="avares://Nodify/Themes/Generic.xaml" />
                <ResourceInclude Source="avares://Nodify/Themes/Nodify.xaml" />
                <ResourceInclude Source="avares://Nodify.Shared/Themes/Icons.xaml" />
                <ResourceInclude Source="avares://Nodify.Shared/Themes/Generic.xaml" />
                <ResourceInclude Source="avares://Nodify.Shared/Themes/Nodify.xaml" />
                <ResourceInclude Source="avares://Nodify.Playground/Themes/Nodify.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
    
    <Application.Styles>
        <FluentTheme DensityStyle="Compact"/>
    </Application.Styles>
    
    <Application.DataTemplates>
        <DataTemplate x:DataType="DrawingBrush">
            <Rectangle Fill="{Binding .}" Width="16" Height="16" />
        </DataTemplate>
    </Application.DataTemplates>
</Application>


================================================
FILE: Examples/Nodify.Playground/App.xaml.cs
================================================
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;

namespace Nodify.Playground
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : Application
    {
        public override void Initialize()
        {
            AvaloniaXamlLoader.Load(this);
        }

        public override void OnFrameworkInitializationCompleted()
        {
            if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
            {
                desktop.MainWindow = new MainWindow();
            }

            base.OnFrameworkInitializationCompleted();
        }
    }
}


================================================
FILE: Examples/Nodify.Playground/AssemblyInfo.cs
================================================
using System.Windows;

[assembly: ThemeInfo(
    ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
                                     //(used if a resource is not found in the page,
                                     // or application resource dictionaries)
    ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
                                              //(used if a resource is not found in the page,
                                              // app, or any theme specific resource dictionaries)
)]


================================================
FILE: Examples/Nodify.Playground/BaseSettingViewModel.cs
================================================
using System;

namespace Nodify.Playground
{
    public class BaseSettingViewModel<T> : ObservableObject, ISettingViewModel
    {
        public string Name { get; }
        public string? Description { get; }

        private object? _value;

        object? ISettingViewModel.Value
        {
            get => _value;
            set => SetProperty(ref _value, value);
        }

        public SettingsType Type { get;}

        public T Value
        {
            get => (T)((ISettingViewModel)this).Value!;
            set => ((ISettingViewModel)this).Value = value;
        }

        public BaseSettingViewModel(string name, string? description = default)
        {
            Name = name;
            Description = description;
            Type = typeof(T) switch
            {
                { } t when t == typeof(string) => SettingsType.Text,
                { } t when t == typeof(bool) => SettingsType.Boolean,
                { } t when t == typeof(uint) || t == typeof(double) => SettingsType.Number,
                { } t when t == typeof(PointEditor) => SettingsType.Point,
                { IsEnum: true } => SettingsType.Option,
                _ => throw new InvalidOperationException($"Type {typeof(T).Name} does not have a matching {nameof(SettingsType)}.")
            };
        }
    }
}

================================================
FILE: Examples/Nodify.Playground/Converters/FlowToConnectorPositionConverter.cs
================================================
using System;
using System.Globalization;
using System.Windows.Controls;
using System.Windows.Data;

namespace Nodify.Playground
{
    public class FlowToConnectorPositionConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value is ConnectionViewModel connection)
            {
                var connector = parameter is "Input" ? connection.Input : connection.Output;

                if (connector.Node is KnotNodeViewModel)
                {
                    var otherConnector = connection.Input == connector ? connection.Output : connection.Input;

                    if (otherConnector.Node is KnotNodeViewModel)
                    {
                        return ToPosition(connector == connection.Input ? ConnectorFlow.Input : ConnectorFlow.Output, connector.Node.Orientation);
                    }

                    return ToPosition(otherConnector.Flow == ConnectorFlow.Output ? ConnectorFlow.Input : ConnectorFlow.Output, connector.Node.Orientation);
                }

                return ToPosition(connector.Flow, connector.Node.Orientation);
            }

            return value;
        }

        private ConnectorPosition ToPosition(ConnectorFlow flow, Orientation orientation)
        {
            if (orientation == Orientation.Horizontal)
            {
                return flow == ConnectorFlow.Output
                    ? ConnectorPosition.Right
                    : ConnectorPosition.Left;
            }

            return flow == ConnectorFlow.Output
                ? ConnectorPosition.Bottom
                : ConnectorPosition.Top;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}


================================================
FILE: Examples/Nodify.Playground/Converters/FlowToDirectionConverter.cs
================================================
using System;
using System.Globalization;
using System.Windows.Data;

namespace Nodify.Playground
{
    public class FlowToDirectionConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value is ConnectorFlow flow)
            {
                return flow == ConnectorFlow.Output ? ConnectionDirection.Forward : ConnectionDirection.Backward;
            }

            return value;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value is ConnectionDirection dir)
            {
                return dir == ConnectionDirection.Forward ? ConnectorFlow.Output : ConnectorFlow.Input;
            }

            return value;
        }
    }
}


================================================
FILE: Examples/Nodify.Playground/Converters/UIntToRectConverter.cs
================================================
using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;
using System.Windows.Markup;

namespace Nodify.Playground
{
    public class UIntToRectConverter : MarkupExtension, IValueConverter
    {
        public uint Multiplier { get; set; } = 1;

        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            uint size = System.Convert.ToUInt32(value) * Multiplier;
            return new Rect(0d, 0d, size, size);
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotSupportedException();
        }

        public override object ProvideValue(IServiceProvider serviceProvider)
            => this;
    }
}


================================================
FILE: Examples/Nodify.Playground/Converters/UIntToRelativeRectConverter.cs
================================================
using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;
using System.Windows.Markup;

namespace Nodify.Playground
{
    public class UIntToRelativeRectConverter : MarkupExtension, IValueConverter
    {
        public static UIntToRelativeRectConverter Absolute { get; } = new UIntToRelativeRectConverter() { Unit = RelativeUnit.Absolute };
        
        public static UIntToRelativeRectConverter Relative { get; } = new UIntToRelativeRectConverter() { Unit = RelativeUnit.Relative };
        
        public uint Multiplier { get; set; } = 1;
        
        public RelativeUnit Unit { get; set; } = RelativeUnit.Absolute;

        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            uint size = System.Convert.ToUInt32(value) * Multiplier;
            return new RelativeRect(0d, 0d, size, size, Unit);
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotSupportedException();
        }

        public override object ProvideValue(IServiceProvider serviceProvider)
            => this;
    }
}


================================================
FILE: Examples/Nodify.Playground/Editor/CommentNodeViewModel.cs
================================================
using System.Windows;

namespace Nodify.Playground
{
    public class CommentNodeViewModel : NodeViewModel
    {
        private string? _title;
        public string? Title
        {
            get => _title;
            set => SetProperty(ref _title, value);
        }

        private Size _size;
        public Size Size
        {
            get => _size;
            set => SetProperty(ref _size, value);
        }
    }
}


================================================
FILE: Examples/Nodify.Playground/Editor/ConnectionViewModel.cs
================================================
using System.Windows;
using System.Windows.Input;

namespace Nodify.Playground
{
    public class ConnectionViewModel : ObservableObject
    {
        private NodifyEditorViewModel _graph = default!;
        public NodifyEditorViewModel Graph
        {
            get => _graph;
            internal set => SetProperty(ref _graph, value);
        }

        private ConnectorViewModel _input = default!;
        public ConnectorViewModel Input
        {
            get => _input;
            set => SetProperty(ref _input, value);
        }

        private ConnectorViewModel _output = default!;
        public ConnectorViewModel Output
        {
            get => _output;
            set => SetProperty(ref _output, value);
        }

        private bool _isSelected;
        public bool IsSelected
        {
            get => _isSelected;
            set => SetProperty(ref _isSelected, value);
        }

        public ICommand SplitCommand { get; }
        public ICommand DisconnectCommand { get; }

        public ConnectionViewModel()
        {
            SplitCommand = new DelegateCommand<Point>(Split);
            DisconnectCommand = new DelegateCommand(Remove);
        }

        public void Split(Point point)
            => Graph.Schema.SplitConnection(this, point);

        public void Remove()
            => Graph.Connections.Remove(this);
    }
}


================================================
FILE: Examples/Nodify.Playground/Editor/ConnectorViewModel.cs
================================================
using System.Linq;
using System.Windows;

namespace Nodify.Playground
{
    public enum ConnectorFlow
    {
        Input,
        Output
    }

    public enum ConnectorShape
    {
        Circle,
        Triangle,
        Square,
    }

    public class ConnectorViewModel : ObservableObject
    {
        private string? _title;
        public string? Title
        {
            get => _title;
            set => SetProperty(ref _title, value);
        }

        private bool _isConnected;
        public bool IsConnected
        {
            get => _isConnected;
            set => SetProperty(ref _isConnected, value);
        }

        private Point _anchor;
        public Point Anchor
        {
            get => _anchor;
            set => SetProperty(ref _anchor, value);
        }

        private NodeViewModel _node = default!;
        public NodeViewModel Node
        {
            get => _node;
            internal set
            {
                if (SetProperty(ref _node, value))
                {
                    OnNodeChanged();
                }
            }
        }

        private ConnectorShape _shape;
        public ConnectorShape Shape
        {
            get => _shape;
            set => SetProperty(ref _shape, value);
        }

        public ConnectorFlow Flow { get; private set; }

        public int MaxConnections { get; set; } = 2;

        public NodifyObservableCollection<ConnectionViewModel> Connections { get; } = new NodifyObservableCollection<ConnectionViewModel>();

        public ConnectorViewModel()
        {
            Connections.WhenAdded(c =>
            {
                c.Input.IsConnected = true;
                c.Output.IsConnected = true;
            }).WhenRemoved(c =>
            {
                if (c.Input.Connections.Count == 0)
                {
                    c.Input.IsConnected = false;
                }

                if (c.Output.Connections.Count == 0)
                {
                    c.Output.IsConnected = false;
                }
            });
        }

        protected virtual void OnNodeChanged()
        {
            if (Node is FlowNodeViewModel flow)
            {
                Flow = flow.Input.Contains(this) ? ConnectorFlow.Input : ConnectorFlow.Output;
            }
            else if (Node is KnotNodeViewModel knot)
            {
                Flow = knot.Flow;
            }
        }

        public bool IsConnectedTo(ConnectorViewModel con)
            => Connections.Any(c => c.Input == con || c.Output == con);

        public virtual bool AllowsNewConnections()
            => Connections.Count < MaxConnections;

        public void Disconnect()
            => Node.Graph.Schema.DisconnectConnector(this);
    }
}


================================================
FILE: Examples/Nodify.Playground/Editor/FlowNodeViewModel.cs
================================================
using System.Windows.Controls;

namespace Nodify.Playground
{
    public class FlowNodeViewModel : NodeViewModel
    {
        private string? _title;
        public string? Title
        {
            get => _title;
            set => SetProperty(ref _title, value);
        }

        public NodifyObservableCollection<ConnectorViewModel> Input { get; } = new NodifyObservableCollection<ConnectorViewModel>();
        public NodifyObservableCollection<ConnectorViewModel> Output { get; } = new NodifyObservableCollection<ConnectorViewModel>();

        public FlowNodeViewModel()
        {
            Orientation = Orientation.Horizontal;

            Input.WhenAdded(c => c.Node = this)
                 .WhenRemoved(c => c.Disconnect());

            Output.WhenAdded(c => c.Node = this)
                 .WhenRemoved(c => c.Disconnect());
        }

        public void Disconnect()
        {
            Input.Clear();
            Output.Clear();
        }
    }
}


================================================
FILE: Examples/Nodify.Playground/Editor/GraphSchema.cs
================================================
using System.Collections.Generic;
using System.Linq;
using System.Windows;

namespace Nodify.Playground
{
    public class GraphSchema
    {
        #region Add Connection

        public bool CanAddConnection(ConnectorViewModel source, object target)
        {
            if (target is ConnectorViewModel con)
            {
                return source != con
                    && source.Node != con.Node
                    && source.Node.Graph == con.Node.Graph
                    && source.Shape == con.Shape
                    && source.AllowsNewConnections()
                    && con.AllowsNewConnections()
                    && (source.Flow != con.Flow || con.Node is KnotNodeViewModel)
                    && !source.IsConnectedTo(con);
            }
            else if (source.AllowsNewConnections() && target is FlowNodeViewModel node)
            {
                var allConnectors = source.Flow == ConnectorFlow.Input ? node.Output : node.Input;
                return allConnectors.Any(c => c.AllowsNewConnections());
            }

            return false;
        }

        public bool TryAddConnection(ConnectorViewModel source, object? target)
        {
            if (target != null && CanAddConnection(source, target))
            {
                if (target is ConnectorViewModel connector)
                {
                    AddConnection(source, connector);
                    return true;
                }
                else if (target is FlowNodeViewModel node)
                {
                    AddConnection(source, node);
                    return true;
                }
            }

            return false;
        }

        private void AddConnection(ConnectorViewModel source, ConnectorViewModel target)
        {
            var sourceIsInput = source.Flow == ConnectorFlow.Input;

            source.Node.Graph.Connections.Add(new ConnectionViewModel
            {
                Input = sourceIsInput ? source : target,
                Output = sourceIsInput ? target : source
            });
        }

        private void AddConnection(ConnectorViewModel source, FlowNodeViewModel target)
        {
            var allConnectors = source.Flow == ConnectorFlow.Input ? target.Output : target.Input;
            var connector = allConnectors.First(c => c.AllowsNewConnections());

            AddConnection(source, connector);
        }

        #endregion

        public void DisconnectConnector(ConnectorViewModel connector)
        {
            var graph = connector.Node.Graph;
            var connections = connector.Connections.ToList();
            connections.ForEach(c => graph.Connections.Remove(c));
        }

        public void SplitConnection(ConnectionViewModel connection, Point location)
        {
            var knot = new KnotNodeViewModel(connection.Output.Node.Orientation)
            {
                Location = location,
                Flow = connection.Output.Flow,
                Connector = new ConnectorViewModel
                {
                    MaxConnections = connection.Output.MaxConnections + connection.Input.MaxConnections,
                    Shape = connection.Input.Shape
                }
            };
            connection.Graph.Nodes.Add(knot);

            AddConnection(connection.Output, knot.Connector);
            AddConnection(knot.Connector, connection.Input);

            connection.Remove();
        }

        public void AddCommentAroundNodes(IList<NodeViewModel> nodes, string? text = default)
        {
            var rect = nodes.GetBoundingBox(50);
            var comment = new CommentNodeViewModel
            {
                Location = rect.Position,
                Size = rect.Size,
                Title = text ?? "New comment"
            };

            nodes[0].Graph.Nodes.Add(comment);
        }
    }
}


================================================
FILE: Examples/Nodify.Playground/Editor/KnotNodeViewModel.cs
================================================
using System.Windows.Controls;

namespace Nodify.Playground
{
    public class KnotNodeViewModel : NodeViewModel
    {
        public KnotNodeViewModel(Orientation orientation)
        {
            Orientation = orientation;
        }

        public KnotNodeViewModel() : this(Orientation.Horizontal)
        {
        }

        private ConnectorViewModel _connector = default!;
        public ConnectorViewModel Connector
        {
            get => _connector;
            set
            {
                if (SetProperty(ref _connector, value))
                {
                    _connector.Node = this;
                }
            }
        }

        public ConnectorFlow Flow { get; set; }
    }
}


================================================
FILE: Examples/Nodify.Playground/Editor/NodeViewModel.cs
================================================
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

namespace Nodify.Playground
{
    public abstract class NodeViewModel : ObservableObject
    {
        private NodifyEditorViewModel _graph = default!;
        public NodifyEditorViewModel Graph
        {
            get => _graph;
            internal set => SetProperty(ref _graph, value);
        }

        private Point _location;
        public Point Location
        {
            get => _location;
            set => SetProperty(ref _location, value);
        }

        public Orientation Orientation { get; protected set; }

        public ICommand DeleteCommand { get; }

        public NodeViewModel()
        {
            DeleteCommand = new DelegateCommand(() => Graph.Nodes.Remove(this));
        }
    }
}


================================================
FILE: Examples/Nodify.Playground/Editor/NodifyEditorView.xaml
================================================
<UserControl x:Class="Nodify.Playground.NodifyEditorView"
             xmlns="https://github.com/avaloniaui"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:local="clr-namespace:Nodify.Playground"
             xmlns:nodify="https://miroiu.github.io/nodify"
             xmlns:shared="clr-namespace:Nodify;assembly=Nodify.Shared"
             mc:Ignorable="d"
             Background="{DynamicResource NodifyEditor.BackgroundBrush}"
             d:DesignHeight="450"
             d:DesignWidth="800">

    <UserControl.DataContext>
        <local:NodifyEditorViewModel />
    </UserControl.DataContext>

    <UserControl.Resources>
        <shared:RandomBrushConverter x:Key="RandomBrushConverter" />
        <local:FlowToDirectionConverter x:Key="FlowToDirectionConverter" />
        <local:FlowToConnectorPositionConverter x:Key="FlowToConnectorPositionConverter" />

        <GeometryDrawing x:Key="SmallGridGeometry"
                         Geometry="M0,0 L0,1 0.03,1 0.03,0.03 1,0.03 1,0 Z"
                         Brush="{DynamicResource GridLinesBrush}" />

        <GeometryDrawing x:Key="LargeGridGeometry"
                         Geometry="M0,0 L0,1 0.015,1 0.015,0.015 1,0.015 1,0 Z"
                         Brush="{DynamicResource GridLinesBrush}" />

        <DrawingBrush x:Key="SmallGridLinesDrawingBrush"
                      TileMode="Tile"
                      DestinationRect="{Binding GridSpacing, Source={x:Static local:EditorSettings.Instance}, Converter={local:UIntToRelativeRectConverter}}"
                      Transform="{Binding DpiScaledViewportTransform, ElementName=Editor}"
                      Drawing="{StaticResource SmallGridGeometry}" />

        <DrawingBrush x:Key="LargeGridLinesDrawingBrush"
                      TileMode="Tile"
                      Opacity="0.5"
                      DestinationRect="{Binding GridSpacing, Source={x:Static local:EditorSettings.Instance}, Converter={local:UIntToRelativeRectConverter Multiplier=10}}"
                      Transform="{Binding DpiScaledViewportTransform, ElementName=Editor}"
                      Drawing="{StaticResource LargeGridGeometry}" />

        <SolidColorBrush x:Key="SquareConnectorColor"
                         Color="MediumSlateBlue" />
        <SolidColorBrush x:Key="TriangleConnectorColor"
                         Color="MediumVioletRed" />
        <SolidColorBrush x:Key="SquareConnectorOutline"
                         Color="MediumSlateBlue"
                         Opacity="0.15" />
        <SolidColorBrush x:Key="TriangleConnectorOutline"
                         Color="MediumVioletRed"
                         Opacity="0.15" />

        <!-- <UIElement x:Key="ConnectionAnimationPlaceholder" -->
        <!--            Opacity="1" /> -->

        <!-- <Storyboard x:Key="HighlightConnection"> -->
        <!--     <DoubleAnimation Storyboard.Target="{StaticResource ConnectionAnimationPlaceholder}" -->
        <!--                      Storyboard.TargetProperty="(UIElement.Opacity)" -->
        <!--                      Duration="0:0:0.3" -->
        <!--                      From="1" -->
        <!--                      To="0.3" /> -->
        <!-- </Storyboard> -->

        <ControlTheme x:Key="ConnectionStyle"
               TargetType="{x:Type nodify:BaseConnection}"
               BasedOn="{StaticResource {x:Type nodify:BaseConnection}}">
            <Setter Property="(nodify:BindableStyleClasses.Classes)" Value="{Binding Input.Shape}" />
            <Setter Property="(Interaction.Behaviors)">
                <BehaviorCollectionTemplate>
                    <BehaviorCollection>
                        <DataTrigger Property="Input.Shape" 
                                     Value="{x:Static local:ConnectorShape.Square}">
                            <PropertySetter Property="Stroke"
                                    Value="{StaticResource SquareConnectorColor}" />
                            <PropertySetter Property="Fill"
                                    Value="{StaticResource SquareConnectorColor}" />
                        </DataTrigger>
                        <DataTrigger Property="Input.Shape" 
                                     Value="{x:Static local:ConnectorShape.Triangle}">
                            <PropertySetter Property="Stroke"
                                    Value="{StaticResource TriangleConnectorColor}" />
                            <PropertySetter Property="Fill"
                                    Value="{StaticResource TriangleConnectorColor}" />
                        </DataTrigger>
                        <DataTrigger Property="IsPointerOver" Value="True">
                            <!-- <DataTrigger.EnterActions> -->
                            <!--     <BeginStoryboard Name="HighlightConnection" Storyboard="{StaticResource HighlightConnection}" /> -->
                            <!-- </DataTrigger.EnterActions> -->
                            <!-- <DataTrigger.ExitActions> -->
                            <!--     <RemoveStoryboard BeginStoryboardName="HighlightConnection" /> -->
                            <!-- </DataTrigger.ExitActions> -->
                            <PropertySetter Property="Opacity"
                                    Value="1" />
                        </DataTrigger>
                        <DataTrigger Property="IsPointerOver" Value="False">
                            <PropertySetter Property="OutlineBrush"
                                            Value="Transparent" />
                        </DataTrigger>
                        <DataTrigger Property="IsSelectable"
                                 Value="True">
                            <PropertySetter Property="Cursor"
                                    Value="Hand" />
                        </DataTrigger>
                    </BehaviorCollection>
                </BehaviorCollectionTemplate>
            </Setter>
            <Style Selector="^.Triangle">
                <Setter Property="OutlineBrush"
                        Value="{StaticResource TriangleConnectorOutline}" />
            </Style>
            <Style Selector="^.Square">
                <Setter Property="OutlineBrush"
                        Value="{StaticResource SquareConnectorOutline}" />
            </Style>
            <Style Selector="^[(nodify|BaseConnection.IsSelected)=False]">
                <Style Selector="^[IsPointerOver=False]">
                    <Setter Property="OutlineBrush"
                            Value="Transparent" />
                </Style>
            </Style>
            <!-- <Setter Property="Opacity" 
                Value="{Binding Source={StaticResource ConnectionAnimationPlaceholder}, Path=Opacity}" /> -->
            <Setter Property="StrokeThickness" 
                    Value="3"/>
            <Setter Property="Stroke" 
                    Value="{DynamicResource Connection.StrokeBrush}"/>
            <Setter Property="Fill" 
                    Value="{DynamicResource Connection.StrokeBrush}"/>
            <Setter Property="OutlineBrush">
                <Setter.Value>
                    <SolidColorBrush Color="{DynamicResource Connection.StrokeColor}"
                                     Opacity="0.15" />
                </Setter.Value>
            </Setter>
            <Setter Property="(ToolTip.Tip)"
                    Value="Double click to split" />
            <Setter Property="Source"
                    Value="{Binding Output.Anchor}" />
            <Setter Property="Target"
                    Value="{Binding Input.Anchor}" />
            <Setter Property="SplitCommand"
                    Value="{Binding SplitCommand}" />
            <Setter Property="DisconnectCommand"
                    Value="{Binding DisconnectCommand}" />
            <Setter Property="SourceOffsetMode"
                    Value="{Binding ConnectionSourceOffsetMode, Source={x:Static local:EditorSettings.Instance}}" />
            <Setter Property="TargetOffsetMode"
                    Value="{Binding ConnectionTargetOffsetMode, Source={x:Static local:EditorSettings.Instance}}" />
            <Setter Property="SourceOffset"
                    Value="{Binding ConnectionSourceOffset.Size, Source={x:Static local:EditorSettings.Instance}}" />
            <Setter Property="TargetOffset"
                    Value="{Binding ConnectionTargetOffset.Size, Source={x:Static local:EditorSettings.Instance}}" />
            <Setter Property="ArrowSize"
                    Value="{Binding ConnectionArrowSize.Size, Source={x:Static local:EditorSettings.Instance}}" />
            <Setter Property="ArrowEnds"
                    Value="{Binding ArrowHeadEnds, Source={x:Static local:EditorSettings.Instance}}" />
            <Setter Property="ArrowShape"
                    Value="{Binding ArrowHeadShape, Source={x:Static local:EditorSettings.Instance}}" />
            <Setter Property="Spacing"
                    Value="{Binding ConnectionSpacing, Source={x:Static local:EditorSettings.Instance}}" />
            <Setter Property="Direction"
                    Value="{Binding Output.Flow, Converter={StaticResource FlowToDirectionConverter}}" />
            <Setter Property="SourceOrientation"
                    Value="{Binding Output.Node.Orientation}" />
            <Setter Property="TargetOrientation"
                    Value="{Binding Input.Node.Orientation}" />
            <Setter Property="DirectionalArrowsCount"
                    Value="{Binding DirectionalArrowsCount, Source={x:Static local:EditorSettings.Instance}}" />
            <Setter Property="DirectionalArrowsOffset"
                    Value="{Binding DirectionalArrowsOffset, Source={x:Static local:EditorSettings.Instance}}" />
            <Setter Property="IsAnimatingDirectionalArrows"
                    Value="{Binding IsAnimatingConnections, Source={x:Static local:EditorSettings.Instance}}" />
            <Setter Property="DirectionalArrowsAnimationDuration"
                    Value="{Binding DirectionalArrowsAnimationDuration, Source={x:Static local:EditorSettings.Instance}}" />
            <Setter Property="Text"
                    Value="{Binding ConnectionText, Source={x:Static local:EditorSettings.Instance}}" />
            <Setter Property="IsSelectable"
                    Value="{Binding SelectableConnections, Source={x:Static local:EditorSettings.Instance}}" />
            <Setter Property="IsSelected"
                    Value="{Binding IsSelected}" />
        </ControlTheme>

        <DataTemplate x:Key="CircuitConnectionTemplate">
            <nodify:CircuitConnection Theme="{StaticResource ConnectionStyle}"
                                      Angle="{Binding CircuitConnectionAngle, Source={x:Static local:EditorSettings.Instance}}"
                                      CornerRadius="{Binding ConnectionCornerRadius, Source={x:Static local:EditorSettings.Instance}}" />
        </DataTemplate>

        <DataTemplate x:Key="StepConnectionTemplate">
            <nodify:StepConnection Theme="{StaticResource ConnectionStyle}"
                                   CornerRadius="{Binding ConnectionCornerRadius, Source={x:Static local:EditorSettings.Instance}}"
                                   SourcePosition="{Binding ., Converter={StaticResource FlowToConnectorPositionConverter}, ConverterParameter=Output}"
                                   TargetPosition="{Binding ., Converter={StaticResource FlowToConnectorPositionConverter}, ConverterParameter=Input}" />
        </DataTemplate>

        <DataTemplate x:Key="LineConnectionTemplate">
            <nodify:LineConnection Theme="{StaticResource ConnectionStyle}"
                                   CornerRadius="{Binding ConnectionCornerRadius, Source={x:Static local:EditorSettings.Instance}}" />
        </DataTemplate>

        <DataTemplate x:Key="ConnectionTemplate">
            <nodify:Connection Theme="{StaticResource ConnectionStyle}" />
        </DataTemplate>

        <ControlTemplate x:Key="SquareConnector" 
                         TargetType="TemplatedControl">
            <Rectangle Width="14"
                       Height="14"
                       StrokeJoin="Round"
                       StrokeLineCap="Round"
                       Stroke="{TemplateBinding BorderBrush}"
                       Fill="{TemplateBinding Background}"
                       StrokeThickness="2" />
        </ControlTemplate>

        <ControlTemplate x:Key="TriangleConnector" 
                         TargetType="TemplatedControl">
            <Polygon Width="14"
                     Height="14"
                     Points="1,13 13,13 7,1"
                     StrokeLineCap="Round"
                     StrokeJoin="Round"
                     Stroke="{TemplateBinding BorderBrush}"
                     Fill="{TemplateBinding Background}"
                     StrokeThickness="2" />
        </ControlTemplate>

        <!-- <Storyboard x:Key="MarchingAnts"> -->
        <!--     <DoubleAnimation RepeatBehavior="Forever" -->
        <!--                      Storyboard.TargetProperty="StrokeDashOffset"  -->
        <!--                      BeginTime="00:00:00" -->
        <!--                      Duration="0:3:0" -->
        <!--                      From="1000" -->
        <!--                      To="0"/> -->
        <!-- </Storyboard> -->

        <ControlTheme x:Key="SelectionRectangleStyle"
               TargetType="Rectangle"
               BasedOn="{StaticResource NodifyEditor.SelectionRectangleStyle}">
            <Setter Property="StrokeDashArray"
                    Value="4,4" />
            <Setter Property="StrokeThickness"
                    Value="2" />
            <Setter Property="(Interaction.Behaviors)">
                <BehaviorCollectionTemplate>
                    <BehaviorCollection>
                        <!-- <EventTrigger RoutedEvent="Control.Loaded"> -->
                        <!--     <BeginStoryboard Storyboard="{StaticResource MarchingAnts}" /> -->
                        <!-- </EventTrigger> -->
                    </BehaviorCollection>
                </BehaviorCollectionTemplate>
            </Setter>
        </ControlTheme>

        <ControlTheme x:Key="CuttingLineStyle"
               TargetType="{x:Type nodify:CuttingLine}"
               BasedOn="{StaticResource {x:Type nodify:CuttingLine}}">
            <Setter Property="StrokeDashArray"
                    Value="1,1" />
            <Setter Property="StrokeThickness"
                    Value="2" />
        </ControlTheme>
    </UserControl.Resources>

    <Grid>
        <nodify:NodifyEditor x:Name="Editor"
                             ItemsSource="{Binding Nodes}"
                             SelectedItem="{Binding SelectedNode}"
                             SelectedItems="{Binding SelectedNodes}"
                             CanSelectMultipleItems="{Binding CanSelectMultipleNodes, Source={x:Static local:EditorSettings.Instance}}"
                             Connections="{Binding Connections}"
                             SelectedConnection="{Binding SelectedConnection}"
                             SelectedConnections="{Binding SelectedConnections}"
                             CanSelectMultipleConnections="{Binding CanSelectMultipleConnections, Source={x:Static local:EditorSettings.Instance}}"
                             PendingConnection="{Binding PendingConnection}"
                             DisconnectConnectorCommand="{Binding DisconnectConnectorCommand}"
                             ViewportLocation="{Binding Location.Value, Source={x:Static local:EditorSettings.Instance}}"
                             ViewportSize="{Binding ViewportSize, Mode=OneWayToSource}"
                             ViewportZoom="{Binding Zoom, Source={x:Static local:EditorSettings.Instance}}"
                             MinViewportZoom="{Binding MinZoom, Source={x:Static local:EditorSettings.Instance}}"
                             MaxViewportZoom="{Binding MaxZoom, Source={x:Static local:EditorSettings.Instance}}"
                             AutoPanSpeed="{Binding AutoPanningSpeed, Source={x:Static local:EditorSettings.Instance}}"
                             AutoPanEdgeDistance="{Binding AutoPanningEdgeDistance, Source={x:Static local:EditorSettings.Instance}}"
                             GridCellSize="{Binding GridSpacing, Source={x:Static local:EditorSettings.Instance}}"
                             EnableRealtimeSelection="{Binding EnableRealtimeSelection, Source={x:Static local:EditorSettings.Instance}}"
                             DisableAutoPanning="{Binding DisableAutoPanning, Source={x:Static local:EditorSettings.Instance}}"
                             DisablePanning="{Binding DisablePanning, Source={x:Static local:EditorSettings.Instance}}"
                             DisableZooming="{Binding DisableZooming, Source={x:Static local:EditorSettings.Instance}}"
                             DisplayConnectionsOnTop="{Binding DisplayConnectionsOnTop, Source={x:Static local:EditorSettings.Instance}}"
                             BringIntoViewSpeed="{Binding BringIntoViewSpeed, Source={x:Static local:EditorSettings.Instance}}"
                             BringIntoViewMaxDuration="{Binding BringIntoViewMaxDuration, Source={x:Static local:EditorSettings.Instance}}"
                             SelectionRectangleStyle="{StaticResource SelectionRectangleStyle}"
                             CuttingLineStyle="{StaticResource CuttingLineStyle}">
            <nodify:NodifyEditor.Theme>
                <ControlTheme TargetType="{x:Type nodify:NodifyEditor}"
                       BasedOn="{StaticResource {x:Type nodify:NodifyEditor}}">
                    <Setter Property="ConnectionTemplate"
                            Value="{StaticResource ConnectionTemplate}" />
                    <Setter Property="(Interaction.Behaviors)">
                        <BehaviorCollectionTemplate>
                            <BehaviorCollection>
                                <DataTrigger Property="ShowGridLines" Source="{x:Static local:PlaygroundSettings.Instance}"
                                             Value="True">
                                    <PropertySetter Property="Background"
                                            Value="{StaticResource SmallGridLinesDrawingBrush}" />
                                </DataTrigger>
                                <DataTrigger Property="ConnectionStyle" Source="{x:Static local:EditorSettings.Instance}"
                                                     Value="Line">
                                    <PropertySetter Property="ConnectionTemplate"
                                                    Value="{StaticResource LineConnectionTemplate}" />
                                </DataTrigger>
                                <DataTrigger Property="ConnectionStyle" Source="{x:Static local:EditorSettings.Instance}"
                                                     Value="Circuit">
                                    <PropertySetter Property="ConnectionTemplate"
                                                    Value="{StaticResource CircuitConnectionTemplate}" />
                                </DataTrigger>
                                <DataTrigger Property="ConnectionStyle" Source="{x:Static local:EditorSettings.Instance}"
                                                     Value="Step">
                                    <PropertySetter Property="ConnectionTemplate"
                                                    Value="{StaticResource StepConnectionTemplate}" />
                                </DataTrigger>
                            </BehaviorCollection>
                        </BehaviorCollectionTemplate>
                    </Setter>
                </ControlTheme>
            </nodify:NodifyEditor.Theme>

            <nodify:NodifyEditor.KeyBindings>
                <KeyBinding Gesture="Delete"
                            Command="{Binding DeleteSelectionCommand}" />
                <KeyBinding Gesture="C"
                            Command="{Binding CommentSelectionCommand}" />
            </nodify:NodifyEditor.KeyBindings>

            <nodify:NodifyEditor.Resources>
                <ControlTheme TargetType="{x:Type nodify:PendingConnection}" x:Key="{x:Type nodify:PendingConnection}"
                       BasedOn="{StaticResource {x:Type nodify:PendingConnection}}">
                    <Setter Property="CompletedCommand"
                            Value="{Binding Graph.CreateConnectionCommand}" />
                    <Setter Property="Source"
                            Value="{Binding Source, Mode=OneWayToSource}" />
                    <Setter Property="Target"
                            Value="{Binding PreviewTarget, Mode=OneWayToSource}" />
                    <Setter Property="PreviewTarget"
                            Value="{Binding PreviewTarget, Mode=OneWayToSource}" />
                    <Setter Property="Content"
                            Value="{Binding PreviewText}" />
                    <Setter Property="EnablePreview"
                            Value="{Binding EnablePendingConnectionPreview, Source={x:Static local:EditorSettings.Instance}}" />
                    <Setter Property="EnableSnapping"
                            Value="{Binding EnablePendingConnectionSnapping, Source={x:Static local:EditorSettings.Instance}}" />
                    <Setter Property="AllowOnlyConnectors"
                            Value="{Binding AllowConnectingToConnectorsOnly, Source={x:Static local:EditorSettings.Instance}}" />
                    <Setter Property="Direction"
                            Value="{Binding Source.Flow, Converter={StaticResource FlowToDirectionConverter}}" />
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type nodify:PendingConnection}">
                                <Canvas>
                                    <nodify:Connection Source="{TemplateBinding SourceAnchor}"
                                                       Target="{TemplateBinding TargetAnchor}"
                                                       Direction="{TemplateBinding Direction}"
                                                       SourceOrientation="{Binding Source.Node.Orientation}"
                                                       TargetOrientation="{Binding TargetOrientation}"
                                                       DirectionalArrowsCount="{Binding DirectionalArrowsCount, Source={x:Static local:EditorSettings.Instance}}"
                                                       StrokeThickness="{TemplateBinding StrokeThickness}"
                                                       SourceOffset="{Binding ConnectionSourceOffset.Size, Source={x:Static local:EditorSettings.Instance}}"
                                                       TargetOffset="{Binding ConnectionTargetOffset.Size, Source={x:Static local:EditorSettings.Instance}}"
                                                       SourceOffsetMode="{Binding ConnectionSourceOffsetMode, Source={x:Static local:EditorSettings.Instance}}"
                                                       TargetOffsetMode="None"
                                                       ArrowSize="{Binding ConnectionArrowSize.Size, Source={x:Static local:EditorSettings.Instance}}"
                                                       ArrowEnds="{Binding ArrowHeadEnds, Source={x:Static local:EditorSettings.Instance}}"
                                                       ArrowShape="{Binding ArrowHeadShape, Source={x:Static local:EditorSettings.Instance}}"
                                                       Spacing="{Binding ConnectionSpacing, Source={x:Static local:EditorSettings.Instance}}">
                                        <nodify:Connection.Theme>
                                            <ControlTheme TargetType="nodify:Connection"
                                                   BasedOn="{StaticResource {x:Type nodify:Connection}}">
                                                <Setter Property="Stroke"
                                                        Value="{DynamicResource Connection.StrokeBrush}" />
                                                <Setter Property="Fill"
                                                        Value="{DynamicResource Connection.StrokeBrush}" />
                                                <Setter Property="(Interaction.Behaviors)">
                                                    <BehaviorCollectionTemplate>
                                                        <BehaviorCollection>
                                                            <DataTrigger Property="Source.Shape" 
                                                                         Value="{x:Static local:ConnectorShape.Square}">
                                                                <PropertySetter Property="Stroke" 
                                                                                Value="{StaticResource SquareConnectorColor}"/>
                                                                <PropertySetter Property="Fill" 
                                                                                Value="{StaticResource SquareConnectorColor}"/>
                                                            </DataTrigger>
                                                            <DataTrigger Property="Source.Shape" 
                                                                         Value="{x:Static local:ConnectorShape.Triangle}">
                                                                <PropertySetter Property="Stroke" 
                                                                                Value="{StaticResource TriangleConnectorColor}"/>
                                                                <PropertySetter Property="Fill" 
                                                                                Value="{StaticResource TriangleConnectorColor}"/>
                                                            </DataTrigger>
                                                        </BehaviorCollection>
                                                    </BehaviorCollectionTemplate>
                                                </Setter>
                                            </ControlTheme>
                                        </nodify:Connection.Theme>
                                    </nodify:Connection>
                                    <Border Background="{TemplateBinding Background}"
                                            Canvas.Left="{Binding TargetAnchor.X, RelativeSource={RelativeSource TemplatedParent}}"
                                            Canvas.Top="{Binding TargetAnchor.Y, RelativeSource={RelativeSource TemplatedParent}}"
                                            IsVisible="{Binding PreviewText, Converter={shared:StringToVisibilityConverter}}"
                                            Padding="{TemplateBinding Padding}"
                                            BorderThickness="{TemplateBinding BorderThickness}"
                                            BorderBrush="{TemplateBinding BorderBrush}"
                                            CornerRadius="3"
                                            Margin="15">
                                        <ContentPresenter Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}" />
                                    </Border>
                                </Canvas>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </ControlTheme>

                <ControlTheme TargetType="{x:Type nodify:Connector}" x:Key="{x:Type nodify:Connector}"
                       BasedOn="{StaticResource {x:Type nodify:Connector}}">
                    <Setter Property="Anchor"
                            Value="{Binding Anchor, Mode=OneWayToSource}" />
                    <Setter Property="IsConnected"
                            Value="{Binding IsConnected}" />
                </ControlTheme>

                <ControlTheme TargetType="{x:Type nodify:NodeInput}" x:Key="{x:Type nodify:NodeInput}"
                       BasedOn="{StaticResource {x:Type nodify:NodeInput}}">
                    <Setter Property="(Interaction.Behaviors)">
                        <BehaviorCollectionTemplate>
                            <BehaviorCollection>
                                <DataTrigger Property="Shape" 
                                             Value="{x:Static local:ConnectorShape.Square}">
                                    <PropertySetter Property="ConnectorTemplate" 
                                                    Value="{StaticResource SquareConnector}" />
                                    <PropertySetter Property="BorderBrush" 
                                                    Value="{StaticResource SquareConnectorColor}"/>
                                    <PropertySetter Property="HeaderTemplate">
                                        <PropertySetter.Value>
                                            <DataTemplate DataType="{x:Type local:ConnectorViewModel}">
                                                <StackPanel Orientation="Horizontal">
                                                    <TextBlock Text="{Binding Title}" 
                                                               Margin="0 0 5 0" />
                                                    <TextBox Text="{Binding MaxConnections}" 
                                                             MinWidth="30" />
                                                </StackPanel>
                                            </DataTemplate>
                                        </PropertySetter.Value>
                                    </PropertySetter>
                                </DataTrigger>
                                <DataTrigger Property="Shape" 
                                             Value="{x:Static local:ConnectorShape.Triangle}">
                                    <PropertySetter Property="ConnectorTemplate" 
                                                    Value="{StaticResource TriangleConnector}" />
                                    <PropertySetter Property="BorderBrush" 
                                                    Value="{StaticResource TriangleConnectorColor}"/>
                                    <PropertySetter Property="HeaderTemplate">
                                        <PropertySetter.Value>
                                            <DataTemplate DataType="{x:Type local:ConnectorViewModel}">
                                                <StackPanel Orientation="Horizontal">
                                                    <TextBlock Text="{Binding Title}" 
                                                               Margin="0 0 5 0" 
                                                               VerticalAlignment="Center" />
                                                    <CheckBox />
                                                </StackPanel>
                                            </DataTemplate>
                                        </PropertySetter.Value>
                                    </PropertySetter>
                                </DataTrigger>
                            </BehaviorCollection>
                        </BehaviorCollectionTemplate>
                    </Setter>
                    <Setter Property="HeaderTemplate">
                        <Setter.Value>
                            <DataTemplate DataType="{x:Type local:ConnectorViewModel}">
                                <TextBlock Text="{Binding Title}" />
                            </DataTemplate>
                        </Setter.Value>
                    </Setter>
                    <Setter Property="Header"
                            Value="{Binding}" />
                    <Setter Property="Anchor"
                            Value="{Binding Anchor, Mode=OneWayToSource}" />
                    <Setter Property="IsConnected"
                            Value="{Binding IsConnected}" />
                    <Setter Property="Background"
                            Value="Transparent" />
                </ControlTheme>

                <ControlTheme TargetType="{x:Type nodify:NodeOutput}" x:Key="{x:Type nodify:NodeOutput}"
                       BasedOn="{StaticResource {x:Type nodify:NodeOutput}}">
                    <Setter Property="(Interaction.Behaviors)">
                        <BehaviorCollectionTemplate>
                            <BehaviorCollection>
                                <DataTrigger Property="Shape" 
                                             Value="{x:Static local:ConnectorShape.Square}">
                                    <PropertySetter Property="ConnectorTemplate" 
                                                    Value="{StaticResource SquareConnector}" />
                                    <PropertySetter Property="BorderBrush" 
                                                    Value="{StaticResource SquareConnectorColor}"/>
                                </DataTrigger>
                                <DataTrigger Property="Shape" 
                                             Value="{x:Static local:ConnectorShape.Triangle}">
                                    <PropertySetter Property="ConnectorTemplate" 
                                                    Value="{StaticResource TriangleConnector}" />
                                    <PropertySetter Property="BorderBrush" 
                                                    Value="{StaticResource TriangleConnectorColor}"/>
                                </DataTrigger>
                            </BehaviorCollection>
                        </BehaviorCollectionTemplate>
                    </Setter>
                    <Setter Property="Header"
                            Value="{Binding Title}" />
                    <Setter Property="Anchor"
                            Value="{Binding Anchor, Mode=OneWayToSource}" />
                    <Setter Property="IsConnected"
                            Value="{Binding IsConnected}" />
                    <Setter Property="Background"
                            Value="Transparent" />
                </ControlTheme>
            </nodify:NodifyEditor.Resources>

            <nodify:NodifyEditor.DataTemplates>
                <DataTemplate DataType="{x:Type local:KnotNodeViewModel}">
                    <nodify:KnotNode Content="{Binding Connector}" />
                </DataTemplate>

                <DataTemplate DataType="{x:Type local:CommentNodeViewModel}">
                    <nodify:GroupingNode ActualSize="{Binding Size}"
                                         Header="{Binding Title}"
                                         MovementMode="{Binding GroupingNodeMovement, Mode=TwoWay, Source={x:Static local:EditorSettings.Instance}}" />
                </DataTemplate>

                <DataTemplate DataType="{x:Type local:VerticalNodeViewModel}">
                    <nodify:Node Header="{Binding Input}"
                                 Footer="{Binding Output}"
                                 Content="{Binding Title}">
                        <nodify:Node.ContentTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding}"
                                           Margin="5" />
                            </DataTemplate>
                        </nodify:Node.ContentTemplate>
                        <nodify:Node.HeaderTemplate>
                            <DataTemplate>
                                <ItemsControl ItemsSource="{Binding}">
                                    <ItemsControl.ItemTemplate>
                                        <DataTemplate DataType="{x:Type local:ConnectorViewModel}">
                                            <nodify:NodeInput Orientation="Vertical" />
                                        </DataTemplate>
                                    </ItemsControl.ItemTemplate>
                                    <ItemsControl.ItemsPanel>
                                        <ItemsPanelTemplate>
                                            <StackPanel Orientation="Horizontal"
                                                        HorizontalAlignment="Center" />
                                        </ItemsPanelTemplate>
                                    </ItemsControl.ItemsPanel>
                                </ItemsControl>
                            </DataTemplate>
                        </nodify:Node.HeaderTemplate>
                        <nodify:Node.FooterTemplate>
                            <DataTemplate>
                                <ItemsControl ItemsSource="{Binding}">
                                    <ItemsControl.ItemTemplate>
                                        <DataTemplate DataType="{x:Type local:ConnectorViewModel}">
                                            <nodify:NodeOutput Orientation="Vertical" />
                                        </DataTemplate>
                                    </ItemsControl.ItemTemplate>
                                    <ItemsControl.ItemsPanel>
                                        <ItemsPanelTemplate>
                                            <StackPanel Orientation="Horizontal"
                                                        HorizontalAlignment="Center" />
                                        </ItemsPanelTemplate>
                                    </ItemsControl.ItemsPanel>
                                </ItemsControl>
                            </DataTemplate>
                        </nodify:Node.FooterTemplate>
                    </nodify:Node>
                </DataTemplate>

                <DataTemplate DataType="{x:Type local:FlowNodeViewModel}">
                    <nodify:Node Input="{Binding Input}"
                                 Output="{Binding Output}"
                                 Header="{Binding Title}" />
                </DataTemplate>
            </nodify:NodifyEditor.DataTemplates>
            
            <nodify:NodifyEditor.ItemContainerTheme>
                <ControlTheme TargetType="{x:Type nodify:ItemContainer}"
                       BasedOn="{StaticResource {x:Type nodify:ItemContainer}}">
                    <Setter Property="BorderThickness"
                            Value="2" />
                    <Setter Property="SelectedBorderThickness"
                            Value="4" />
                    <Setter Property="IsSelectable"
                            Value="{Binding SelectableNodes, Source={x:Static local:EditorSettings.Instance}}" />
                    <Setter Property="IsDraggable"
                            Value="{Binding DraggableNodes, Source={x:Static local:EditorSettings.Instance}}" />                            
                    <!-- <Setter Property="CacheMode"> -->
                    <!--     <Setter.Value> -->
                    <!--         <BitmapCache RenderAtScale="{Binding MaxZoom, Source={x:Static local:EditorSettings.Instance}}" EnableClearType="True" /> -->
                    <!--     </Setter.Value> -->
                    <!-- </Setter> -->
                    <Setter Property="Location"
                            Value="{Binding Location}" />
                    <Setter Property="(Interaction.Behaviors)">
                        <BehaviorCollectionTemplate>
                            <BehaviorCollection>
                                <DataTrigger Property="IsSelected" 
                                             Value="True">
                                    <PropertySetter Property="Panel.ZIndex" 
                                                    Value="1" />
                                </DataTrigger>
                            </BehaviorCollection>
                        </BehaviorCollectionTemplate>
                    </Setter>
                </ControlTheme>
            </nodify:NodifyEditor.ItemContainerTheme>
        </nodify:NodifyEditor>

        <Grid Background="{StaticResource LargeGridLinesDrawingBrush}"
              IsVisible="{Binding ShowGridLines, Source={x:Static local:PlaygroundSettings.Instance}, Converter={shared:BooleanToVisibilityConverter}}"
              Panel.ZIndex="-2" />

        <nodify:Minimap ItemsSource="{Binding ItemsSource, ElementName=Editor}"
                        ViewportSize="{Binding ViewportSize, ElementName=Editor}"
                        ViewportLocation="{Binding ViewportLocation, ElementName=Editor}"
                        IsVisible="{Binding ShowMinimap, Source={x:Static local:PlaygroundSettings.Instance}, Converter={shared:BooleanToVisibilityConverter}}"
                        IsReadOnly="{Binding DisableMinimapControls, Source={x:Static local:PlaygroundSettings.Instance}}"
                        ResizeToViewport="{Binding ResizeToViewport, Source={x:Static local:PlaygroundSettings.Instance}}"
                        MaxViewportOffset="{Binding MinimapMaxViewportOffset.Size, Source={x:Static local:PlaygroundSettings.Instance}}"
                        Zoom="Minimap_Zoom"
                        HorizontalAlignment="Right"
                        VerticalAlignment="Bottom"
                        Width="300"
                        Height="200"
                        Margin="5 40">
            <nodify:Minimap.ItemTemplate>
                <DataTemplate DataType="{x:Type local:NodeViewModel}">
                    <Grid />
                </DataTemplate>
            </nodify:Minimap.ItemTemplate>
            <nodify:Minimap.ItemContainerTheme>
                <ControlTheme TargetType="{x:Type nodify:MinimapItem}"
                       BasedOn="{StaticResource {x:Type nodify:MinimapItem}}">
                    <Setter Property="Location"
                            Value="{Binding Location}" />
                    <Setter Property="Width"
                            Value="150" />
                    <Setter Property="Height"
                            Value="130" />
                </ControlTheme>
            </nodify:Minimap.ItemContainerTheme>
        </nodify:Minimap>

        <StackPanel HorizontalAlignment="Right"
                    VerticalAlignment="Top"
                    Margin="5 60"
                    Width="250">
            <Border CornerRadius="3"
                    IsVisible="{Binding SelectedConnection, Converter={shared:BooleanToVisibilityConverter}}"
                    Background="{DynamicResource PanelBackgroundBrush}"
                    BorderThickness="1"
                    BorderBrush="{DynamicResource BorderBrush}"
                    Margin="0 0 0 10">
                <StackPanel Margin="10">
                    <StackPanel.Styles>
                        <Style Selector="TextBlock">
                            <Setter Property="Margin"
                                    Value="0 0 0 5" />
                        </Style>
                    </StackPanel.Styles>

                    <StackPanel Margin="0 0 0 14">
                        <TextBlock Text="Selected connection"
                                   Foreground="{DynamicResource Node.ForegroundBrush}"
                                   FontWeight="Bold" />
                    </StackPanel>

                    <TextBlock TextWrapping="Wrap"
                               Margin="0 0 0 14"
                               Foreground="{DynamicResource Node.ForegroundBrush}">
                        <Run>From</Run>
                        <Run Text="{Binding SelectedConnection.Output.Node.Title}"
                             Foreground="Red" />
                        <Run> - </Run>
                        <Run Text="{Binding SelectedConnection.Output.Title}"
                             Foreground="Red" />
                        <Run>to</Run>
                        <Run Text="{Binding SelectedConnection.Input.Node.Title}"
                             Foreground="Red" />
                        <Run> - </Run>
                        <Run Text="{Binding SelectedConnection.Input.Title}"
                             Foreground="Red" />
                    </TextBlock>

                    <Button Command="{Binding SelectedConnection.DisconnectCommand}"
                            HorizontalAlignment="Left"
                            Theme="{StaticResource HollowButton}"
                            Content="Delete" />
                </StackPanel>
            </Border>
            <Border CornerRadius="3"
                    IsVisible="{Binding SelectedNode, Converter={shared:BooleanToVisibilityConverter}}"
                    Background="{DynamicResource PanelBackgroundBrush}"
                    BorderThickness="1"
                    BorderBrush="{DynamicResource BorderBrush}">
                <StackPanel Margin="10">
                    <StackPanel.Styles>
                        <Style Selector="TextBlock">
                            <Setter Property="Margin"
                                    Value="0 0 0 5" />
                        </Style>
                    </StackPanel.Styles>

                    <StackPanel Margin="0 0 0 14">
                        <TextBlock Text="Selected node"
                                   Foreground="{DynamicResource Node.ForegroundBrush}"
                                   FontWeight="Bold" />
                    </StackPanel>

                    <TextBlock TextWrapping="Wrap"
                               Margin="0 0 0 14"
                               Foreground="{DynamicResource Node.ForegroundBrush}">
                        <Run>Title: </Run>
                        <Run Text="{Binding SelectedNode.Title}"
                             Foreground="Red" />
                    </TextBlock>
                    <TextBlock TextWrapping="Wrap"
                               Margin="0 0 0 14"
                               Foreground="{DynamicResource Node.ForegroundBrush}">
                        <Run>Location: </Run>
                        <Run Text="{Binding SelectedNode.Location}"
                             Foreground="Red" />
                    </TextBlock>

                    <Button Command="{Binding SelectedNode.DeleteCommand}"
                            HorizontalAlignment="Left"
                            Theme="{StaticResource HollowButton}"
                            Content="Delete" />
                </StackPanel>
            </Border>
        </StackPanel>
    </Grid>

</UserControl>


================================================
FILE: Examples/Nodify.Playground/Editor/NodifyEditorView.xaml.cs
================================================
using System.Windows.Controls;

namespace Nodify.Playground
{
    public partial class NodifyEditorView : UserControl
    {
        public NodifyEditor EditorInstance => Editor;

        public NodifyEditorView()
        {
            InitializeComponent();
        }

        private void Minimap_Zoom(object sender, ZoomEventArgs e)
        {
            EditorInstance.ZoomAtPosition(e.Zoom, e.Location);
        }
    }
}


================================================
FILE: Examples/Nodify.Playground/Editor/NodifyEditorViewModel.cs
================================================
using System.Linq;
using System.Windows;
using System.Windows.Input;

namespace Nodify.Playground
{
    public class NodifyEditorViewModel : ObservableObject
    {
        public NodifyEditorViewModel()
        {
            Schema = new GraphSchema();

            PendingConnection = new PendingConnectionViewModel
            {
                Graph = this
            };

            DeleteSelectionCommand = new DelegateCommand(DeleteSelection, () => SelectedNodes.Count > 0 || SelectedConnections.Count > 0);
            CommentSelectionCommand = new RequeryCommand(() => Schema.AddCommentAroundNodes(SelectedNodes, "New comment"), () => SelectedNodes.Count > 0);
            DisconnectConnectorCommand = new DelegateCommand<ConnectorViewModel>(c => c.Disconnect());
            CreateConnectionCommand = new DelegateCommand<object>(target => Schema.TryAddConnection(PendingConnection.Source!, target), target => PendingConnection.Source != null && target != null);

            Connections.WhenAdded(c =>
            {
                c.Graph = this;
                c.Input.Connections.Add(c);
                c.Output.Connections.Add(c);
            })
            // Called when the collection is cleared
            .WhenRemoved(c =>
            {
                c.Input.Connections.Remove(c);
                c.Output.Connections.Remove(c);
            });

            Nodes.WhenAdded(x => x.Graph = this)
                 // Not called when the collection is cleared
                 .WhenRemoved(x =>
                 {
                     if (x is FlowNodeViewModel flow)
                     {
                         flow.Disconnect();
                     }
                     else if (x is KnotNodeViewModel knot)
                     {
                         knot.Connector.Disconnect();
                     }
                 })
                 .WhenCleared(x => Connections.Clear());
        }

        private NodifyObservableCollection<NodeViewModel> _nodes = new NodifyObservableCollection<NodeViewModel>();
        public NodifyObservableCollection<NodeViewModel> Nodes
        {
            get => _nodes;
            set => SetProperty(ref _nodes, value);
        }

        private NodifyObservableCollection<NodeViewModel> _selectedNodes = new NodifyObservableCollection<NodeViewModel>();
        public NodifyObservableCollection<NodeViewModel> SelectedNodes
        {
            get => _selectedNodes;
            set => SetProperty(ref _selectedNodes, value);
        }

        private NodifyObservableCollection<ConnectionViewModel> _selectedConnections = new NodifyObservableCollection<ConnectionViewModel>();
        public NodifyObservableCollection<ConnectionViewModel> SelectedConnections
        {
            get => _selectedConnections;
            set => SetProperty(ref _selectedConnections, value);
        }

        private NodifyObservableCollection<ConnectionViewModel> _connections = new NodifyObservableCollection<ConnectionViewModel>();
        public NodifyObservableCollection<ConnectionViewModel> Connections
        {
            get => _connections;
            set => SetProperty(ref _connections, value);
        }

        private Size _viewportSize;
        public Size ViewportSize
        {
            get => _viewportSize;
            set => SetProperty(ref _viewportSize, value);
        }

        public PendingConnectionViewModel PendingConnection { get; }

        private ConnectionViewModel? _selectedConnection;
        public ConnectionViewModel? SelectedConnection
        {
            get => _selectedConnection;
            set => SetProperty(ref _selectedConnection, value);
        }

        private NodeViewModel? _selectedNode;
        public NodeViewModel? SelectedNode
        {
            get => _selectedNode;
            set => SetProperty(ref _selectedNode, value);
        }

        public GraphSchema Schema { get; }

        public ICommand DeleteSelectionCommand { get; }
        public ICommand DisconnectConnectorCommand { get; }
        public ICommand CreateConnectionCommand { get; }
        public ICommand CommentSelectionCommand { get; }

        private void DeleteSelection()
        {
            foreach (var connection in SelectedConnections.ToList())
            {
                connection.Remove();
            }

            var selected = SelectedNodes.ToList();

            for (int i = 0; i < selected.Count; i++)
            {
                Nodes.Remove(selected[i]);
            }
        }
    }
}


================================================
FILE: Examples/Nodify.Playground/Editor/PendingConnectionViewModel.cs
================================================
using System.Windows.Controls;

namespace Nodify.Playground
{
    public class PendingConnectionViewModel : ObservableObject
    {
        private NodifyEditorViewModel _graph = default!;
        public NodifyEditorViewModel Graph
        {
            get => _graph;
            internal set => SetProperty(ref _graph, value);
        }

        private ConnectorViewModel? _source;
        public ConnectorViewModel? Source
        {
            get => _source;
            set
            {
                if(SetProperty(ref _source, value))
                {
                    SetTargetOrientation();
                }
            }
        }

        private object? _previewTarget;
        public object? PreviewTarget
        {
            get => _previewTarget;
            set
            {
                if (SetProperty(ref _previewTarget, value))
                {
                    OnPreviewTargetChanged();
                }
            }
        }

        private string? _previewText;
        public string? PreviewText
        {
            get => _previewText;
            set => SetProperty(ref _previewText, value);
        }

        private Orientation _targetOrientation;
        public Orientation TargetOrientation
        {
            get => _targetOrientation;
            set => SetProperty(ref _targetOrientation, value);
        }

        protected virtual void OnPreviewTargetChanged()
        {
            bool canConnect = PreviewTarget != null && Graph.Schema.CanAddConnection(Source!, PreviewTarget);
            PreviewText = PreviewTarget switch
            {
         
Download .txt
gitextract_apgfzb0f/

├── .editorconfig
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── ask-a-question.md
│   │   ├── bug_report.md
│   │   └── config.yml
│   └── workflows/
│       ├── build.yml
│       ├── codeql-analysis.yml
│       ├── create-release-branch.yml
│       ├── publish-package.yml
│       └── sync-docs.yml
├── .gitignore
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Directory.Build.props
├── Examples/
│   ├── Nodify.Calculator/
│   │   ├── App.xaml
│   │   ├── App.xaml.cs
│   │   ├── ApplicationViewModel.cs
│   │   ├── AssemblyInfo.cs
│   │   ├── CalculatorInputOperationViewModel.cs
│   │   ├── CalculatorOperationViewModel.cs
│   │   ├── CalculatorViewModel.cs
│   │   ├── ConnectionViewModel.cs
│   │   ├── ConnectorViewModel.cs
│   │   ├── Converters/
│   │   │   └── ItemToListConverter.cs
│   │   ├── CreateOperationInfoViewModel.cs
│   │   ├── EditorView.xaml
│   │   ├── EditorView.xaml.cs
│   │   ├── EditorViewModel.cs
│   │   ├── ExpandoOperationViewModel.cs
│   │   ├── ExpressionOperationViewModel.cs
│   │   ├── GlobalUsings.cs
│   │   ├── MainWindow.xaml
│   │   ├── MainWindow.xaml.cs
│   │   ├── Nodify.Calculator.csproj
│   │   ├── OperationGraphViewModel.cs
│   │   ├── OperationGroupViewModel.cs
│   │   ├── OperationInfoViewModel.cs
│   │   ├── OperationViewModel.cs
│   │   ├── Operations/
│   │   │   ├── BinaryOperation.cs
│   │   │   ├── IOperation.cs
│   │   │   ├── OperationFactory.cs
│   │   │   ├── OperationsContainer.cs
│   │   │   ├── ParamsOperation.cs
│   │   │   ├── UnaryOperation.cs
│   │   │   └── ValueOperation.cs
│   │   ├── OperationsExtensions.cs
│   │   ├── OperationsMenuView.xaml
│   │   ├── OperationsMenuView.xaml.cs
│   │   ├── OperationsMenuViewModel.cs
│   │   ├── PendingConnectionViewModel.cs
│   │   ├── Program.cs
│   │   └── Themes/
│   │       ├── Dark.xaml
│   │       ├── Light.xaml
│   │       └── Nodify.xaml
│   ├── Nodify.Playground/
│   │   ├── App.xaml
│   │   ├── App.xaml.cs
│   │   ├── AssemblyInfo.cs
│   │   ├── BaseSettingViewModel.cs
│   │   ├── Converters/
│   │   │   ├── FlowToConnectorPositionConverter.cs
│   │   │   ├── FlowToDirectionConverter.cs
│   │   │   ├── UIntToRectConverter.cs
│   │   │   └── UIntToRelativeRectConverter.cs
│   │   ├── Editor/
│   │   │   ├── CommentNodeViewModel.cs
│   │   │   ├── ConnectionViewModel.cs
│   │   │   ├── ConnectorViewModel.cs
│   │   │   ├── FlowNodeViewModel.cs
│   │   │   ├── GraphSchema.cs
│   │   │   ├── KnotNodeViewModel.cs
│   │   │   ├── NodeViewModel.cs
│   │   │   ├── NodifyEditorView.xaml
│   │   │   ├── NodifyEditorView.xaml.cs
│   │   │   ├── NodifyEditorViewModel.cs
│   │   │   ├── PendingConnectionViewModel.cs
│   │   │   ├── VerticalNodeViewModel.cs
│   │   │   └── WpfComboBox.cs
│   │   ├── EditorInputMode.cs
│   │   ├── EditorSettings.cs
│   │   ├── EditorSettingsView.xaml
│   │   ├── EditorSettingsView.xaml.cs
│   │   ├── GlobalUsings.cs
│   │   ├── Helpers/
│   │   │   ├── NodeViewModelExtensions.cs
│   │   │   └── RandomNodesGenerator.cs
│   │   ├── ISettingViewModel.cs
│   │   ├── MainWindow.xaml
│   │   ├── MainWindow.xaml.cs
│   │   ├── Nodify.Playground.csproj
│   │   ├── PlaygroundSettings.cs
│   │   ├── PlaygroundViewModel.cs
│   │   ├── PointEditor.cs
│   │   ├── PointEditorView.xaml
│   │   ├── PointEditorView.xaml.cs
│   │   ├── Program.cs
│   │   ├── ProxySettingViewModel.cs
│   │   ├── SettingsView.xaml
│   │   ├── SettingsView.xaml.cs
│   │   └── Themes/
│   │       ├── Brushes.xaml
│   │       ├── Dark.xaml
│   │       ├── Light.xaml
│   │       └── Nodify.xaml
│   ├── Nodify.Shapes/
│   │   ├── App.xaml
│   │   ├── App.xaml.cs
│   │   ├── AppShellViewModel.cs
│   │   ├── AssemblyInfo.cs
│   │   ├── Avalonia/
│   │   │   ├── Cursors.cs
│   │   │   └── ToolItemSelector.cs
│   │   ├── Canvas/
│   │   │   ├── CanvasToolbarViewModel.cs
│   │   │   ├── CanvasView.xaml
│   │   │   ├── CanvasView.xaml.cs
│   │   │   ├── CanvasViewModel.cs
│   │   │   ├── ConnectionViewModel.cs
│   │   │   ├── ConnectorViewModel.cs
│   │   │   ├── Decorators/
│   │   │   │   ├── ICanvasDecorator.cs
│   │   │   │   ├── ShapeToolbarViewModel.cs
│   │   │   │   └── UserCursorViewModel.cs
│   │   │   ├── Gestures/
│   │   │   │   ├── DrawingGesturesMappings.cs
│   │   │   │   ├── LockedGestureMappings.cs
│   │   │   │   └── UnboundGestureMappings.cs
│   │   │   ├── Shapes/
│   │   │   │   ├── EllipseViewModel.cs
│   │   │   │   ├── RectangleViewModel.cs
│   │   │   │   ├── ShapeViewModel.cs
│   │   │   │   └── TriangleViewModel.cs
│   │   │   └── UndoRedo/
│   │   │       ├── MoveShapesAction.cs
│   │   │       ├── ResizeShapesAction.cs
│   │   │       └── SelectShapesAction.cs
│   │   ├── Controls/
│   │   │   └── ResizableContainer.cs
│   │   ├── GlobalUsings.cs
│   │   ├── MainView.axaml
│   │   ├── MainView.axaml.cs
│   │   ├── MainWindow.xaml
│   │   ├── MainWindow.xaml.cs
│   │   └── Nodify.Shapes.csproj
│   ├── Nodify.Shapes.Desktop/
│   │   ├── Nodify.Shapes.Desktop.csproj
│   │   └── Program.cs
│   ├── Nodify.Shapes.Web/
│   │   ├── AppBundle/
│   │   │   ├── app.css
│   │   │   ├── index.html
│   │   │   └── main.js
│   │   ├── Nodify.Shapes.Web.csproj
│   │   ├── Program.cs
│   │   ├── Properties/
│   │   │   └── launchSettings.json
│   │   └── runtimeconfig.template.json
│   ├── Nodify.Shared/
│   │   ├── Behaviours/
│   │   │   ├── DataTrigger.cs
│   │   │   ├── PropertySetter.cs
│   │   │   └── WpfBtn.cs
│   │   ├── BindingProxy.cs
│   │   ├── BoxValue.cs
│   │   ├── Controls/
│   │   │   ├── EditableTextBlock.cs
│   │   │   ├── ResizablePanel.cs
│   │   │   ├── Swatches.xaml.cs
│   │   │   ├── TabControlEx.cs
│   │   │   └── TabItemEx.cs
│   │   ├── Converters/
│   │   │   ├── BooleanToVisibilityConverter.cs
│   │   │   ├── ColorToSolidColorBrushConverter.cs
│   │   │   ├── DebugConverter.cs
│   │   │   ├── EnumValuesConverter.cs
│   │   │   ├── InverseBooleanConverter.cs
│   │   │   ├── MultiValueEqualityConverter.cs
│   │   │   ├── RandomBrushConverter.cs
│   │   │   ├── ResizeDirectionToVisiblityConverter.cs
│   │   │   ├── StringToVisibilityConverter.cs
│   │   │   └── ToStringConverter.cs
│   │   ├── DelegateCommand.cs
│   │   ├── FluentSyntax.cs
│   │   ├── GlobalUsings.cs
│   │   ├── Nodify.Shared.csproj
│   │   ├── NodifyObservableCollection.cs
│   │   ├── ObservableObject.cs
│   │   ├── Properties/
│   │   │   └── AssemblyInfo.cs
│   │   ├── RequeryCommand.cs
│   │   ├── StringExtensions.cs
│   │   ├── ThemeManager.cs
│   │   ├── Themes/
│   │   │   ├── Brushes.xaml
│   │   │   ├── Controls.xaml
│   │   │   ├── Dark.xaml
│   │   │   ├── Generic.xaml
│   │   │   ├── Icons.xaml
│   │   │   ├── Light.xaml
│   │   │   └── Nodify.xaml
│   │   └── UndoRedo/
│   │       ├── ActionsHistory.cs
│   │       ├── BatchAction.cs
│   │       ├── DelegateAction.cs
│   │       ├── PropertyCache.cs
│   │       └── Undoable.cs
│   └── Nodify.StateMachine/
│       ├── App.xaml
│       ├── App.xaml.cs
│       ├── BlackboardItemReferenceViewModel.cs
│       ├── BlackboardItemViewModel.cs
│       ├── BlackboardKeyEditorView.xaml
│       ├── BlackboardKeyEditorView.xaml.cs
│       ├── BlackboardKeyEditorViewModel.cs
│       ├── BlackboardKeyViewModel.cs
│       ├── BlackboardViewModel.cs
│       ├── Converters/
│       │   ├── BlackboardKeyEditorConverter.cs
│       │   ├── ConnectorOffsetConverter.cs
│       │   ├── DrawingBrushToRectangleConverter.cs
│       │   └── FilterBlackboardKeysConverter.cs
│       ├── GlobalUsings.cs
│       ├── Helpers/
│       │   └── BlackboardDescriptor.cs
│       ├── MainWindow.xaml
│       ├── MainWindow.xaml.cs
│       ├── Nodify.StateMachine.csproj
│       ├── Program.cs
│       ├── Runner/
│       │   ├── Actions/
│       │   │   ├── CopyKeyAction.cs
│       │   │   ├── SetKeyValueAction.cs
│       │   │   └── SetStateDelayAction.cs
│       │   ├── Blackboard/
│       │   │   ├── Blackboard.cs
│       │   │   ├── BlackboardConditionSet.cs
│       │   │   ├── BlackboardItemAttribute.cs
│       │   │   ├── BlackboardKey.cs
│       │   │   ├── BlackboardProperty.cs
│       │   │   ├── BlackboardPropertyAttribute.cs
│       │   │   ├── IBlackboardAction.cs
│       │   │   └── IBlackboardCondition.cs
│       │   ├── Conditions/
│       │   │   ├── AreEqualCondition.cs
│       │   │   ├── HasKeyCondition.cs
│       │   │   └── HasValueCondition.cs
│       │   ├── Debugging/
│       │   │   ├── DebugBlackboardDecorator.cs
│       │   │   ├── DebugStateDecorator.cs
│       │   │   └── DebugTransitionDecorator.cs
│       │   ├── State.cs
│       │   ├── StateMachine.cs
│       │   └── Transition.cs
│       ├── StateMachineRunnerViewModel.cs
│       ├── StateMachineViewModel.cs
│       ├── StateViewModel.cs
│       ├── Themes/
│       │   ├── Brushes.xaml
│       │   ├── Dark.xaml
│       │   ├── Light.xaml
│       │   └── Nodify.xaml
│       └── TransitionViewModel.cs
├── LICENSE
├── Nodify/
│   ├── Compatibility/
│   │   ├── Attributes/
│   │   │   ├── ContentPropertyAttribute.cs
│   │   │   └── StyleTypedPropertyAttribute.cs
│   │   ├── Commands/
│   │   │   ├── ApplicationCommands.cs
│   │   │   ├── CanExecuteRoutedEventArgs.cs
│   │   │   ├── CommandBinding.cs
│   │   │   ├── CommandManager.cs
│   │   │   ├── ExecutedRoutedEventArgs.cs
│   │   │   ├── RoutedCommand.cs
│   │   │   └── RoutedUICommand.cs
│   │   ├── Controls/
│   │   │   ├── GroupStyle.cs
│   │   │   ├── MultiSelector.cs
│   │   │   ├── Primitives/
│   │   │   │   └── IScrollInfo.cs
│   │   │   ├── WpfControl.cs
│   │   │   └── WpfShape.cs
│   │   ├── DefaultStyleKeyProperty.cs
│   │   ├── Dragging/
│   │   │   ├── DragCompletedEventArgs.cs
│   │   │   ├── DragDeltaEventArgs.cs
│   │   │   └── DragStartedEventArgs.cs
│   │   ├── EmptyNamespaces.cs
│   │   ├── Extensions/
│   │   │   ├── ControlCaptureExtensions.cs
│   │   │   ├── PointExtensions.cs
│   │   │   ├── SizeExtensions.cs
│   │   │   ├── StreamGeometryContextExtensions.cs
│   │   │   └── VisualExtensions.cs
│   │   ├── Input/
│   │   │   ├── InputGesture.cs
│   │   │   ├── InputGestureCollection.cs
│   │   │   ├── InputKeyGesture.cs
│   │   │   ├── MouseAction.cs
│   │   │   ├── MouseButtonEventArgs.cs
│   │   │   ├── MouseButtonState.cs
│   │   │   ├── MouseEventArgs.cs
│   │   │   ├── MouseGesture.cs
│   │   │   ├── MouseMoveEventArgs.cs
│   │   │   └── MouseWheelEventArgs.cs
│   │   ├── PanelUtilities.cs
│   │   └── VisualTreeHelper.cs
│   ├── Connections/
│   │   ├── BaseConnection.Avalonia.cs
│   │   ├── BaseConnection.cs
│   │   ├── CircuitConnection.cs
│   │   ├── Connection.cs
│   │   ├── ConnectionContainer.Avalonia.cs
│   │   ├── ConnectionContainer.cs
│   │   ├── ConnectionsMultiSelector.Avalonia.cs
│   │   ├── ConnectionsMultiSelector.cs
│   │   ├── Connector.Avalonia.cs
│   │   ├── Connector.cs
│   │   ├── CuttingLine.cs
│   │   ├── LineConnection.cs
│   │   ├── PendingConnection.Avalonia.cs
│   │   ├── PendingConnection.cs
│   │   └── StepConnection.cs
│   ├── DecoratorContainer.cs
│   ├── DecoratorsControl.cs
│   ├── EditorCommands.cs
│   ├── EditorGestures.cs
│   ├── EditorStates/
│   │   ├── ContainerDefaultState.cs
│   │   ├── ContainerDraggingState.cs
│   │   ├── ContainerState.cs
│   │   ├── EditorCuttingState.cs
│   │   ├── EditorDefaultState.cs
│   │   ├── EditorPanningState.cs
│   │   ├── EditorPushingItemsState.cs
│   │   ├── EditorSelectingState.cs
│   │   └── EditorState.cs
│   ├── Events/
│   │   ├── ConnectionEventArgs.cs
│   │   ├── ConnectorEventArgs.cs
│   │   ├── PendingConnectionEventArgs.cs
│   │   └── ResizeEventArgs.cs
│   ├── GlobalUsings.cs
│   ├── Helpers/
│   │   ├── BindableStyleClasses.cs
│   │   ├── BoxValue.cs
│   │   ├── DependencyObjectExtensions.cs
│   │   ├── DraggingOptimized.cs
│   │   ├── DraggingSimple.cs
│   │   ├── MathExtensions.cs
│   │   ├── MultiGesture.cs
│   │   ├── PushItemsStrategy.cs
│   │   ├── SelectionHelper.cs
│   │   └── UnscaleTransformConverter.cs
│   ├── ItemContainer.Avalonia.cs
│   ├── ItemContainer.cs
│   ├── Minimap/
│   │   ├── Minimap.Avalonia.cs
│   │   ├── Minimap.cs
│   │   ├── MinimapItem.cs
│   │   ├── MinimapPanel.Avalonia.cs
│   │   ├── MinimapPanel.cs
│   │   ├── SubtractConverter.cs
│   │   └── ZoomEventArgs.cs
│   ├── Nodes/
│   │   ├── GroupingNode.cs
│   │   ├── KnotNode.cs
│   │   ├── Node.Avalonia.cs
│   │   ├── Node.cs
│   │   ├── NodeInput.Avalonia.cs
│   │   ├── NodeInput.cs
│   │   ├── NodeOutput.Avalonia.cs
│   │   ├── NodeOutput.cs
│   │   └── StateNode.cs
│   ├── Nodify.csproj
│   ├── Nodify.csproj.DotSettings
│   ├── NodifyCanvas.cs
│   ├── NodifyEditor.Avalonia.cs
│   ├── NodifyEditor.PushingItems.cs
│   ├── NodifyEditor.Scrolling.cs
│   ├── NodifyEditor.cs
│   ├── Properties/
│   │   └── AssemblyInfo.cs
│   ├── Theme.axaml
│   └── Themes/
│       ├── Brushes.xaml
│       ├── Controls.xaml
│       ├── Dark.xaml
│       ├── Generic.xaml
│       ├── Light.xaml
│       ├── Nodify.xaml
│       ├── NodifyStyle.axaml
│       └── Styles/
│           ├── Connection.xaml
│           ├── Connector.xaml
│           ├── Controls.xaml
│           ├── CuttingLine.xaml
│           ├── DecoratorContainer.xaml
│           ├── GroupingNode.xaml
│           ├── ItemContainer.xaml
│           ├── KnotNode.xaml
│           ├── Minimap.xaml
│           ├── Node.xaml
│           ├── NodeInput.xaml
│           ├── NodeOutput.xaml
│           ├── NodifyEditor.xaml
│           ├── PendingConnection.xaml
│           └── StateNode.xaml
├── Nodify.sln
├── Nodify.sln.DotSettings
├── PULL_REQUEST_TEMPLATE.md
├── README.md
├── build/
│   ├── Nodify.public.snk
│   └── Nodify.snk
├── build_cloudflare.sh
└── docs/
    ├── API-Reference.md
    ├── Connections-Overview.md
    ├── Connectors-Overview.md
    ├── CuttingLine-Overview.md
    ├── Documentation.md
    ├── Editor-Overview.md
    ├── FAQ.md
    ├── Getting-Started.md
    ├── Home.md
    ├── ItemContainer-Overview.md
    ├── Minimap-Overview.md
    ├── Nodes-Overview.md
    ├── _Sidebar.md
    └── localization/
        └── zh-CN/
            ├── API-Reference.md
            ├── _Sidebar.md
            ├── 主页.md
            ├── 开始.md
            ├── 编辑器概述.md
            ├── 节点概述.md
            ├── 连接器概述.md
            ├── 连接概述.md
            ├── 问答.md
            └── 项目容器概述.md
Download .txt
SYMBOL INDEX (1459 symbols across 260 files)

FILE: Examples/Nodify.Calculator/App.xaml.cs
  class App (line 14) | public partial class App : Application
    method Initialize (line 16) | public override void Initialize()
    method OnFrameworkInitializationCompleted (line 21) | public override void OnFrameworkInitializationCompleted()

FILE: Examples/Nodify.Calculator/ApplicationViewModel.cs
  class ApplicationViewModel (line 7) | public class ApplicationViewModel : ObservableObject
    method ApplicationViewModel (line 11) | public ApplicationViewModel()
    method OnOpenInnerCalculator (line 40) | private void OnOpenInnerCalculator(EditorViewModel parentEditor, Calcu...

FILE: Examples/Nodify.Calculator/CalculatorInputOperationViewModel.cs
  class CalculatorInputOperationViewModel (line 3) | public class CalculatorInputOperationViewModel : OperationViewModel
    method CalculatorInputOperationViewModel (line 5) | public CalculatorInputOperationViewModel()

FILE: Examples/Nodify.Calculator/CalculatorOperationViewModel.cs
  class CalculatorOperationViewModel (line 5) | public class CalculatorOperationViewModel : OperationViewModel
    method CalculatorOperationViewModel (line 24) | public CalculatorOperationViewModel()
    method OnInputValueChanged (line 46) | protected override void OnInputValueChanged()

FILE: Examples/Nodify.Calculator/CalculatorViewModel.cs
  class CalculatorViewModel (line 6) | public class CalculatorViewModel : ObservableObject
    method CalculatorViewModel (line 8) | public CalculatorViewModel()
    method DisconnectConnector (line 100) | private void DisconnectConnector(ConnectorViewModel connector)
    method CanCreateConnection (line 106) | internal bool CanCreateConnection(ConnectorViewModel source, Connector...
    method CreateConnection (line 109) | internal void CreateConnection(ConnectorViewModel source, ConnectorVie...
    method OnOperationsMenuClosed (line 133) | private void OnOperationsMenuClosed()
    method DeleteSelection (line 139) | private void DeleteSelection()
    method GroupSelectedOperations (line 145) | private void GroupSelectedOperations()

FILE: Examples/Nodify.Calculator/ConnectionViewModel.cs
  class ConnectionViewModel (line 3) | public class ConnectionViewModel : ObservableObject

FILE: Examples/Nodify.Calculator/ConnectorViewModel.cs
  class ConnectorViewModel (line 6) | public class ConnectorViewModel : ObservableObject

FILE: Examples/Nodify.Calculator/Converters/ItemToListConverter.cs
  class ItemToListConverter (line 9) | public class ItemToListConverter : IValueConverter
    method Convert (line 11) | public object? Convert(object value, Type targetType, object parameter...
    method ConvertBack (line 26) | public object ConvertBack(object value, Type targetType, object parame...

FILE: Examples/Nodify.Calculator/CreateOperationInfoViewModel.cs
  class CreateOperationInfoViewModel (line 5) | public class CreateOperationInfoViewModel
    method CreateOperationInfoViewModel (line 7) | public CreateOperationInfoViewModel(OperationInfoViewModel info, Point...

FILE: Examples/Nodify.Calculator/EditorView.xaml.cs
  class EditorView (line 7) | public partial class EditorView : UserControl
    method EditorView (line 9) | public EditorView()
    method OpenOperationsMenu (line 19) | private void OpenOperationsMenu(object? sender, PointerReleasedEventAr...
    method CloseOperationsMenuPointerPressed (line 29) | private void CloseOperationsMenuPointerPressed(object? sender, Pointer...
    method CloseOperationsMenu (line 35) | private void CloseOperationsMenu(object? sender, RoutedEventArgs e)
    method OnDropNode (line 46) | private void OnDropNode(object? sender, DragEventArgs e)
    method OnNodeDrag (line 60) | private void OnNodeDrag(object? sender, MouseEventArgs e)
    method OnNodePressed (line 70) | private void OnNodePressed(object? sender, PointerPressedEventArgs e)
    method OnNodeExited (line 76) | private void OnNodeExited(object? sender, PointerEventArgs e)

FILE: Examples/Nodify.Calculator/EditorViewModel.cs
  class EditorViewModel (line 7) | public class EditorViewModel : ObservableObject
    method EditorViewModel (line 13) | public EditorViewModel()

FILE: Examples/Nodify.Calculator/ExpandoOperationViewModel.cs
  class ExpandoOperationViewModel (line 3) | public class ExpandoOperationViewModel : OperationViewModel
    method ExpandoOperationViewModel (line 5) | public ExpandoOperationViewModel()

FILE: Examples/Nodify.Calculator/ExpressionOperationViewModel.cs
  class ExpressionOperationViewModel (line 7) | public class ExpressionOperationViewModel : OperationViewModel
    method GenerateInput (line 18) | private void GenerateInput()
    method OnInputValueChanged (line 43) | protected override void OnInputValueChanged()

FILE: Examples/Nodify.Calculator/MainWindow.xaml.cs
  class MainWindow (line 5) | public partial class MainWindow : Window
    method MainWindow (line 7) | public MainWindow()

FILE: Examples/Nodify.Calculator/OperationGraphViewModel.cs
  class OperationGraphViewModel (line 5) | public class OperationGraphViewModel : CalculatorOperationViewModel
    method OperationGraphViewModel (line 38) | public OperationGraphViewModel()

FILE: Examples/Nodify.Calculator/OperationGroupViewModel.cs
  class OperationGroupViewModel (line 5) | public class OperationGroupViewModel : OperationViewModel

FILE: Examples/Nodify.Calculator/OperationInfoViewModel.cs
  type OperationType (line 5) | public enum OperationType
  class OperationInfoViewModel (line 15) | public class OperationInfoViewModel

FILE: Examples/Nodify.Calculator/OperationViewModel.cs
  class OperationViewModel (line 7) | public class OperationViewModel : ObservableObject
    method OperationViewModel (line 9) | public OperationViewModel()
    method OnInputValueChanged (line 23) | private void OnInputValueChanged(object? sender, PropertyChangedEventA...
    method OnInputValueChanged (line 84) | protected virtual void OnInputValueChanged()

FILE: Examples/Nodify.Calculator/Operations/BinaryOperation.cs
  class BinaryOperation (line 5) | public class BinaryOperation : IOperation
    method BinaryOperation (line 9) | public BinaryOperation(Func<double, double, double> func) => _func = f...
    method Execute (line 11) | public double Execute(params double[] operands)

FILE: Examples/Nodify.Calculator/Operations/IOperation.cs
  type IOperation (line 3) | public interface IOperation
    method Execute (line 5) | double Execute(params double[] operands);

FILE: Examples/Nodify.Calculator/Operations/OperationFactory.cs
  class OperationFactory (line 9) | public static class OperationFactory
    method GetOperationsInfo (line 11) | public static List<OperationInfoViewModel> GetOperationsInfo(Type cont...
    method GetOperation (line 95) | public static OperationViewModel GetOperation(OperationInfoViewModel i...

FILE: Examples/Nodify.Calculator/Operations/OperationsContainer.cs
  class OperationsContainer (line 6) | public static class OperationsContainer
    method Add (line 8) | [Operation(MinInput = 2, MaxInput = 10, GenerateInputNames = false)]
    method Multiply (line 12) | [Operation(MinInput = 2, MaxInput = 10, GenerateInputNames = false)]
    method Divide (line 16) | public static double Divide(double a, double b)
    method Subtract (line 19) | public static double Subtract(double a, double b)
    method Pow (line 22) | public static double Pow(double value, double exp)
    method Abs (line 25) | [Operation(GenerateInputNames = false)]
    method PI (line 29) | public static double PI()
  class OperationAttribute (line 33) | public sealed class OperationAttribute : Attribute

FILE: Examples/Nodify.Calculator/Operations/ParamsOperation.cs
  class ParamsOperation (line 5) | public class ParamsOperation : IOperation
    method ParamsOperation (line 9) | public ParamsOperation(Func<double[], double> func) => _func = func;
    method Execute (line 11) | public double Execute(params double[] operands)

FILE: Examples/Nodify.Calculator/Operations/UnaryOperation.cs
  class UnaryOperation (line 5) | public class UnaryOperation : IOperation
    method UnaryOperation (line 9) | public UnaryOperation(Func<double, double> func) => _func = func;
    method Execute (line 11) | public double Execute(params double[] operands)

FILE: Examples/Nodify.Calculator/Operations/ValueOperation.cs
  class ValueOperation (line 5) | public class ValueOperation : IOperation
    method ValueOperation (line 9) | public ValueOperation(Func<double> func) => _func = func;
    method Execute (line 11) | public double Execute(params double[] operands)

FILE: Examples/Nodify.Calculator/OperationsExtensions.cs
  class OperationsExtensions (line 6) | public static class OperationsExtensions
    method GetBoundingBox (line 8) | public static Rect GetBoundingBox(this IEnumerable<OperationViewModel>...

FILE: Examples/Nodify.Calculator/OperationsMenuView.xaml.cs
  class OperationsMenuView (line 5) | public partial class OperationsMenuView : UserControl
    method OperationsMenuView (line 7) | public OperationsMenuView()

FILE: Examples/Nodify.Calculator/OperationsMenuViewModel.cs
  class OperationsMenuViewModel (line 8) | public class OperationsMenuViewModel : ObservableObject
    method OpenAt (line 33) | public void OpenAt(Point targetLocation)
    method Close (line 40) | public void Close()
    method OperationsMenuViewModel (line 49) | public OperationsMenuViewModel(CalculatorViewModel calculator)
    method CreateOperation (line 76) | private void CreateOperation(OperationInfoViewModel operationInfo)

FILE: Examples/Nodify.Calculator/PendingConnectionViewModel.cs
  class PendingConnectionViewModel (line 5) | public class PendingConnectionViewModel : ObservableObject

FILE: Examples/Nodify.Calculator/Program.cs
  class Program (line 6) | class Program
    method Main (line 11) | [STAThread]
    method BuildAvaloniaApp (line 16) | public static AppBuilder BuildAvaloniaApp()

FILE: Examples/Nodify.Playground/App.xaml.cs
  class App (line 14) | public partial class App : Application
    method Initialize (line 16) | public override void Initialize()
    method OnFrameworkInitializationCompleted (line 21) | public override void OnFrameworkInitializationCompleted()

FILE: Examples/Nodify.Playground/BaseSettingViewModel.cs
  class BaseSettingViewModel (line 5) | public class BaseSettingViewModel<T> : ObservableObject, ISettingViewModel
    method BaseSettingViewModel (line 26) | public BaseSettingViewModel(string name, string? description = default)

FILE: Examples/Nodify.Playground/Converters/FlowToConnectorPositionConverter.cs
  class FlowToConnectorPositionConverter (line 8) | public class FlowToConnectorPositionConverter : IValueConverter
    method Convert (line 10) | public object Convert(object value, Type targetType, object parameter,...
    method ToPosition (line 34) | private ConnectorPosition ToPosition(ConnectorFlow flow, Orientation o...
    method ConvertBack (line 48) | public object ConvertBack(object value, Type targetType, object parame...

FILE: Examples/Nodify.Playground/Converters/FlowToDirectionConverter.cs
  class FlowToDirectionConverter (line 7) | public class FlowToDirectionConverter : IValueConverter
    method Convert (line 9) | public object Convert(object value, Type targetType, object parameter,...
    method ConvertBack (line 19) | public object ConvertBack(object value, Type targetType, object parame...

FILE: Examples/Nodify.Playground/Converters/UIntToRectConverter.cs
  class UIntToRectConverter (line 9) | public class UIntToRectConverter : MarkupExtension, IValueConverter
    method Convert (line 13) | public object Convert(object value, Type targetType, object parameter,...
    method ConvertBack (line 19) | public object ConvertBack(object value, Type targetType, object parame...
    method ProvideValue (line 24) | public override object ProvideValue(IServiceProvider serviceProvider)

FILE: Examples/Nodify.Playground/Converters/UIntToRelativeRectConverter.cs
  class UIntToRelativeRectConverter (line 9) | public class UIntToRelativeRectConverter : MarkupExtension, IValueConverter
    method Convert (line 19) | public object Convert(object value, Type targetType, object parameter,...
    method ConvertBack (line 25) | public object ConvertBack(object value, Type targetType, object parame...
    method ProvideValue (line 30) | public override object ProvideValue(IServiceProvider serviceProvider)

FILE: Examples/Nodify.Playground/Editor/CommentNodeViewModel.cs
  class CommentNodeViewModel (line 5) | public class CommentNodeViewModel : NodeViewModel

FILE: Examples/Nodify.Playground/Editor/ConnectionViewModel.cs
  class ConnectionViewModel (line 6) | public class ConnectionViewModel : ObservableObject
    method ConnectionViewModel (line 39) | public ConnectionViewModel()
    method Split (line 45) | public void Split(Point point)
    method Remove (line 48) | public void Remove()

FILE: Examples/Nodify.Playground/Editor/ConnectorViewModel.cs
  type ConnectorFlow (line 6) | public enum ConnectorFlow
  type ConnectorShape (line 12) | public enum ConnectorShape
  class ConnectorViewModel (line 19) | public class ConnectorViewModel : ObservableObject
    method ConnectorViewModel (line 68) | public ConnectorViewModel()
    method OnNodeChanged (line 88) | protected virtual void OnNodeChanged()
    method IsConnectedTo (line 100) | public bool IsConnectedTo(ConnectorViewModel con)
    method AllowsNewConnections (line 103) | public virtual bool AllowsNewConnections()
    method Disconnect (line 106) | public void Disconnect()

FILE: Examples/Nodify.Playground/Editor/FlowNodeViewModel.cs
  class FlowNodeViewModel (line 5) | public class FlowNodeViewModel : NodeViewModel
    method FlowNodeViewModel (line 17) | public FlowNodeViewModel()
    method Disconnect (line 28) | public void Disconnect()

FILE: Examples/Nodify.Playground/Editor/GraphSchema.cs
  class GraphSchema (line 7) | public class GraphSchema
    method CanAddConnection (line 11) | public bool CanAddConnection(ConnectorViewModel source, object target)
    method TryAddConnection (line 33) | public bool TryAddConnection(ConnectorViewModel source, object? target)
    method AddConnection (line 52) | private void AddConnection(ConnectorViewModel source, ConnectorViewMod...
    method AddConnection (line 63) | private void AddConnection(ConnectorViewModel source, FlowNodeViewMode...
    method DisconnectConnector (line 73) | public void DisconnectConnector(ConnectorViewModel connector)
    method SplitConnection (line 80) | public void SplitConnection(ConnectionViewModel connection, Point loca...
    method AddCommentAroundNodes (line 100) | public void AddCommentAroundNodes(IList<NodeViewModel> nodes, string? ...

FILE: Examples/Nodify.Playground/Editor/KnotNodeViewModel.cs
  class KnotNodeViewModel (line 5) | public class KnotNodeViewModel : NodeViewModel
    method KnotNodeViewModel (line 7) | public KnotNodeViewModel(Orientation orientation)
    method KnotNodeViewModel (line 12) | public KnotNodeViewModel() : this(Orientation.Horizontal)

FILE: Examples/Nodify.Playground/Editor/NodeViewModel.cs
  class NodeViewModel (line 7) | public abstract class NodeViewModel : ObservableObject
    method NodeViewModel (line 27) | public NodeViewModel()

FILE: Examples/Nodify.Playground/Editor/NodifyEditorView.xaml.cs
  class NodifyEditorView (line 5) | public partial class NodifyEditorView : UserControl
    method NodifyEditorView (line 9) | public NodifyEditorView()
    method Minimap_Zoom (line 14) | private void Minimap_Zoom(object sender, ZoomEventArgs e)

FILE: Examples/Nodify.Playground/Editor/NodifyEditorViewModel.cs
  class NodifyEditorViewModel (line 7) | public class NodifyEditorViewModel : ObservableObject
    method NodifyEditorViewModel (line 9) | public NodifyEditorViewModel()
    method DeleteSelection (line 110) | private void DeleteSelection()

FILE: Examples/Nodify.Playground/Editor/PendingConnectionViewModel.cs
  class PendingConnectionViewModel (line 5) | public class PendingConnectionViewModel : ObservableObject
    method OnPreviewTargetChanged (line 54) | protected virtual void OnPreviewTargetChanged()
    method SetTargetOrientation (line 68) | private void SetTargetOrientation()

FILE: Examples/Nodify.Playground/Editor/VerticalNodeViewModel.cs
  class VerticalNodeViewModel (line 5) | public class VerticalNodeViewModel : FlowNodeViewModel
    method VerticalNodeViewModel (line 7) | public VerticalNodeViewModel()

FILE: Examples/Nodify.Playground/Editor/WpfComboBox.cs
  class WpfComboBox (line 15) | public class WpfComboBox : ComboBox
    method OnPointerPressed (line 19) | protected override void OnPointerPressed(PointerPressedEventArgs e)
    method OnPointerReleased (line 29) | protected override void OnPointerReleased(PointerReleasedEventArgs e)

FILE: Examples/Nodify.Playground/EditorInputMode.cs
  type EditorInputMode (line 5) | public enum EditorInputMode
  type EditorGesturesMappings (line 13) | public enum EditorGesturesMappings
  class EditorInputModeExtensions (line 19) | public static class EditorInputModeExtensions
    method Apply (line 21) | public static void Apply(this EditorGestures mappings, EditorInputMode...
    method Apply (line 53) | public static void Apply(this EditorGestures value, EditorGesturesMapp...
    method ToGesturesMappings (line 59) | public static EditorGestures ToGesturesMappings(this EditorGesturesMap...
  class CustomGesturesMappings (line 69) | public class CustomGesturesMappings : EditorGestures
    method CustomGesturesMappings (line 71) | public CustomGesturesMappings()

FILE: Examples/Nodify.Playground/EditorSettings.cs
  type ConnectionStyle (line 6) | public enum ConnectionStyle
  class EditorSettings (line 14) | public class EditorSettings : ObservableObject
    method EditorSettings (line 22) | private EditorSettings()
    method OnSearchTextChanged (line 298) | private void OnSearchTextChanged(object? sender, System.ComponentModel...

FILE: Examples/Nodify.Playground/EditorSettingsView.xaml.cs
  class EditorSettingsView (line 19) | public partial class EditorSettingsView : UserControl
    method EditorSettingsView (line 21) | public EditorSettingsView()

FILE: Examples/Nodify.Playground/Helpers/NodeViewModelExtensions.cs
  class NodeViewModelExtensions (line 6) | public static class NodeViewModelExtensions
    method GetBoundingBox (line 8) | public static Rect GetBoundingBox(this IList<NodeViewModel> nodes, dou...
    method AddRange (line 55) | public static void AddRange<T>(this ICollection<T> col, IEnumerable<T>...

FILE: Examples/Nodify.Playground/Helpers/RandomNodesGenerator.cs
  type NodesGeneratorSettings (line 8) | public struct NodesGeneratorSettings
    method NodesGeneratorSettings (line 12) | public NodesGeneratorSettings(uint count)
    method Snap (line 57) | public int Snap(int x)
  class RandomNodesGenerator (line 61) | public static class RandomNodesGenerator
    method GenerateNodes (line 65) | public static List<T> GenerateNodes<T>(NodesGeneratorSettings settings)
    method GenerateConnections (line 87) | public static List<ConnectionViewModel> GenerateConnections(IList<Node...
    method ConnectPins (line 114) | public static List<ConnectionViewModel> ConnectPins(IList<ConnectorVie...
    method GenerateConnectors (line 167) | public static List<ConnectorViewModel> GenerateConnectors(NodesGenerat...

FILE: Examples/Nodify.Playground/ISettingViewModel.cs
  type SettingsType (line 3) | public enum SettingsType
  type ISettingViewModel (line 12) | public interface ISettingViewModel

FILE: Examples/Nodify.Playground/MainWindow.xaml.cs
  class CompositionTargetEx (line 9) | public static class CompositionTargetEx
    method OnRendering (line 34) | public static void OnRendering(object? sender, EventArgs e)
  class MainWindow (line 47) | public partial class MainWindow : Window
    method MainWindow (line 51) | public MainWindow()
    method OnRendering (line 58) | private void OnRendering(double fps)
    method BringIntoView_Click (line 66) | private void BringIntoView_Click(object? sender, RoutedEventArgs e)
    method AnimateConnections_Click (line 83) | private void AnimateConnections_Click(object sender, RoutedEventArgs e)
    method Render (line 88) | public override void Render(DrawingContext context)

FILE: Examples/Nodify.Playground/PlaygroundSettings.cs
  class PlaygroundSettings (line 7) | public class PlaygroundSettings : ObservableObject
    method PlaygroundSettings (line 20) | private PlaygroundSettings()
    method FilterAndSort (line 91) | public IEnumerable<ISettingViewModel> FilterAndSort(IReadOnlyCollectio...

FILE: Examples/Nodify.Playground/PlaygroundViewModel.cs
  class PlaygroundViewModel (line 9) | public class PlaygroundViewModel : ObservableObject
    method PlaygroundViewModel (line 13) | public PlaygroundViewModel()
    method OnSettingsChanged (line 26) | private void OnSettingsChanged(object? sender, System.ComponentModel.P...
    method ResetGraph (line 40) | private void ResetGraph()
    method GenerateRandomNodes (line 47) | private async void GenerateRandomNodes()
    method ToggleConnections (line 84) | private async void ToggleConnections()
    method PerformanceTest (line 96) | private async void PerformanceTest()
    method ConnectNodes (line 121) | private async Task ConnectNodes()
    method CopyToAsync (line 147) | private async Task CopyToAsync(IList source, IList target)

FILE: Examples/Nodify.Playground/PointEditor.cs
  class PointEditor (line 5) | public class PointEditor : ObservableObject

FILE: Examples/Nodify.Playground/PointEditorView.xaml.cs
  class PointEditorView (line 5) | public partial class PointEditorView : UserControl
    method PointEditorView (line 7) | public PointEditorView()

FILE: Examples/Nodify.Playground/Program.cs
  class Program (line 5) | class Program
    method Main (line 10) | [STAThread]
    method BuildAvaloniaApp (line 15) | public static AppBuilder BuildAvaloniaApp()

FILE: Examples/Nodify.Playground/ProxySettingViewModel.cs
  class ProxySettingViewModel (line 5) | public class ProxySettingViewModel<T> : BaseSettingViewModel<T>
    method ProxySettingViewModel (line 10) | public ProxySettingViewModel(Func<T> getter, Action<T> setter, string ...

FILE: Examples/Nodify.Playground/SettingsView.xaml.cs
  class SettingsView (line 7) | public partial class SettingsView : UserControl
    method SettingsView (line 18) | public SettingsView()

FILE: Examples/Nodify.Shapes.Desktop/Program.cs
  class Program (line 6) | class Program
    method Main (line 11) | [STAThread]
    method BuildAvaloniaApp (line 16) | public static AppBuilder BuildAvaloniaApp()

FILE: Examples/Nodify.Shapes.Web/Program.cs
  class Program (line 7) | internal partial class Program
    method Main (line 9) | private static async Task Main(string[] args)
    method BuildAvaloniaApp (line 16) | public static AppBuilder BuildAvaloniaApp()

FILE: Examples/Nodify.Shapes/App.xaml.cs
  class App (line 9) | public partial class App : Application
    method App (line 11) | public App()
    method Initialize (line 19) | public override void Initialize()
    method OnFrameworkInitializationCompleted (line 24) | public override void OnFrameworkInitializationCompleted()

FILE: Examples/Nodify.Shapes/AppShellViewModel.cs
  class AppShellViewModel (line 5) | public class AppShellViewModel : ObservableObject

FILE: Examples/Nodify.Shapes/Avalonia/Cursors.cs
  class Cursors (line 3) | public static class Cursors

FILE: Examples/Nodify.Shapes/Avalonia/ToolItemSelector.cs
  class CanvasToolItemSelector (line 7) | public class CanvasToolItemSelector : IDataTemplate
    method Build (line 14) | public Control? Build(object? param)
    method Match (line 31) | public bool Match(object? data)

FILE: Examples/Nodify.Shapes/Canvas/CanvasToolbarViewModel.cs
  type CanvasTool (line 8) | public enum CanvasTool
  class CanvasToolbarViewModel (line 16) | public class CanvasToolbarViewModel : ObservableObject
    method CanvasToolbarViewModel (line 60) | public CanvasToolbarViewModel(CanvasViewModel canvas)
    method CreateShapeAtLocation (line 69) | public ShapeViewModel CreateShapeAtLocation(Point location)

FILE: Examples/Nodify.Shapes/Canvas/CanvasView.xaml.cs
  class CanvasView (line 11) | public partial class CanvasView : UserControl
    method CanvasView (line 18) | public CanvasView()
    method OnApplyTemplate (line 25) | protected override void OnApplyTemplate(TemplateAppliedEventArgs e)
    method OnGenerateNewLocation (line 35) | private void OnGenerateNewLocation(object? sender, EventArgs e)
    method OnMoveToLocationTick (line 45) | private void OnMoveToLocationTick(object? sender, EventArgs e)
    method Editor_MouseDown (line 67) | private void Editor_MouseDown(object sender, PointerPressedEventArgs e)
    method Editor_MouseMove (line 77) | private void Editor_MouseMove(object sender, PointerEventArgs e)
    method Editor_MouseUp (line 96) | private void Editor_MouseUp(object sender, PointerReleasedEventArgs e)
    method Minimap_Zoom (line 103) | private void Minimap_Zoom(object sender, ZoomEventArgs e)

FILE: Examples/Nodify.Shapes/Canvas/CanvasViewModel.cs
  class CanvasViewModel (line 11) | public class CanvasViewModel : ObservableObject
    method CanvasViewModel (line 41) | public CanvasViewModel()
    method MoveShapesStartedHandler (line 80) | private void MoveShapesStartedHandler()
    method MoveShapesCompletedHandler (line 86) | private void MoveShapesCompletedHandler()
    method SelectShapesStartedHandler (line 97) | private void SelectShapesStartedHandler()
    method SelectShapesCompletedHandler (line 104) | private void SelectShapesCompletedHandler()
    method ResizeShapeStartedHandler (line 113) | private void ResizeShapeStartedHandler()
    method ResizeShapeCompletedHandler (line 118) | private void ResizeShapeCompletedHandler()
    method FillCanvasWithShapes (line 126) | private void FillCanvasWithShapes()
    method AddShape (line 197) | public void AddShape(ShapeViewModel shape)
    method AddConnection (line 203) | private void AddConnection(ConnectorViewModel source, ConnectorViewMod...
    method RemoveConnection (line 210) | private void RemoveConnection(ConnectionViewModel connection)
    method CanConnect (line 216) | private bool CanConnect(ConnectorViewModel? source, ConnectorViewModel...
    method DeleteSelection (line 224) | public void DeleteSelection()

FILE: Examples/Nodify.Shapes/Canvas/ConnectionViewModel.cs
  class ConnectionViewModel (line 5) | public class ConnectionViewModel : IEquatable<ConnectionViewModel>
    method ConnectionViewModel (line 7) | public ConnectionViewModel(ConnectorViewModel source, ConnectorViewMod...
    method Equals (line 16) | public bool Equals(ConnectionViewModel? other)

FILE: Examples/Nodify.Shapes/Canvas/ConnectorViewModel.cs
  class ConnectorViewModel (line 5) | public class ConnectorViewModel : ObservableObject
    method ConnectorViewModel (line 7) | public ConnectorViewModel(ConnectorPosition position)

FILE: Examples/Nodify.Shapes/Canvas/Decorators/ICanvasDecorator.cs
  type ICanvasDecorator (line 5) | public interface ICanvasDecorator

FILE: Examples/Nodify.Shapes/Canvas/Decorators/ShapeToolbarViewModel.cs
  class ShapeToolbarViewModel (line 6) | public class ShapeToolbarViewModel : ObservableObject, ICanvasDecorator
    method HookLocationEvents (line 32) | private void HookLocationEvents(ShapeViewModel? prevShape, ShapeViewMo...
    method OnLocationChanged (line 44) | private void OnLocationChanged(object? sender, PropertyChangedEventArg...
    method Hide (line 50) | public void Hide()
    method Show (line 58) | public void Show()

FILE: Examples/Nodify.Shapes/Canvas/Decorators/UserCursorViewModel.cs
  class UserCursorViewModel (line 6) | public class UserCursorViewModel : ObservableObject, ICanvasDecorator

FILE: Examples/Nodify.Shapes/Canvas/Gestures/DrawingGesturesMappings.cs
  class DrawingGesturesMappings (line 5) | public class DrawingGesturesMappings : EditorGestures
    method DrawingGesturesMappings (line 11) | public DrawingGesturesMappings()

FILE: Examples/Nodify.Shapes/Canvas/Gestures/LockedGestureMappings.cs
  class LockedGestureMappings (line 5) | public class LockedGestureMappings : EditorGestures
    method LockedGestureMappings (line 9) | public LockedGestureMappings()

FILE: Examples/Nodify.Shapes/Canvas/Gestures/UnboundGestureMappings.cs
  class UnboundGestureMappings (line 3) | public class UnboundGestureMappings : EditorGestures
    method UnboundGestureMappings (line 7) | public UnboundGestureMappings()

FILE: Examples/Nodify.Shapes/Canvas/Shapes/EllipseViewModel.cs
  class EllipseViewModel (line 5) | public class EllipseViewModel : ShapeViewModel
    method EllipseViewModel (line 7) | public EllipseViewModel()

FILE: Examples/Nodify.Shapes/Canvas/Shapes/RectangleViewModel.cs
  class RectangleViewModel (line 5) | public class RectangleViewModel : ShapeViewModel
    method RectangleViewModel (line 7) | public RectangleViewModel()

FILE: Examples/Nodify.Shapes/Canvas/Shapes/ShapeViewModel.cs
  class ShapeViewModel (line 8) | public abstract class ShapeViewModel : Undoable
    method ShapeViewModel (line 10) | public ShapeViewModel(IActionsHistory history) : base(history)
    method ShapeViewModel (line 17) | public ShapeViewModel() : this(ActionsHistory.Global)

FILE: Examples/Nodify.Shapes/Canvas/Shapes/TriangleViewModel.cs
  class TriangleViewModel (line 5) | public class TriangleViewModel : ShapeViewModel
    method TriangleViewModel (line 7) | public TriangleViewModel()

FILE: Examples/Nodify.Shapes/Canvas/UndoRedo/MoveShapesAction.cs
  class MoveShapesAction (line 8) | public class MoveShapesAction : IAction
    method MoveShapesAction (line 14) | public MoveShapesAction(CanvasViewModel canvas)
    method Execute (line 22) | public void Execute()
    method Undo (line 27) | public void Undo()
    method SaveLocations (line 32) | public void SaveLocations()

FILE: Examples/Nodify.Shapes/Canvas/UndoRedo/ResizeShapesAction.cs
  class ResizeShapesAction (line 8) | public class ResizeShapesAction : IAction
    method ResizeShapesAction (line 17) | public ResizeShapesAction(CanvasViewModel canvas)
    method Execute (line 27) | public void Execute()
    method Undo (line 38) | public void Undo()
    method SaveSizes (line 49) | public void SaveSizes()

FILE: Examples/Nodify.Shapes/Canvas/UndoRedo/SelectShapesAction.cs
  class SelectShapesAction (line 7) | public class SelectShapesAction : IAction
    method SelectShapesAction (line 13) | public SelectShapesAction(CanvasViewModel canvas)
    method Execute (line 21) | public void Execute()
    method Undo (line 30) | public void Undo()
    method SaveSelection (line 36) | public void SaveSelection()

FILE: Examples/Nodify.Shapes/Controls/ResizableContainer.cs
  class ResizableContainer (line 5) | internal class ResizableContainer : ResizablePanel
    method OnMove (line 15) | protected override void OnMove(double x, double y)
    method OnProcessDelta (line 24) | protected override void OnProcessDelta(ref double dx, ref double dy)

FILE: Examples/Nodify.Shapes/MainView.axaml.cs
  class MainView (line 7) | public partial class MainView : UserControl
    method MainView (line 9) | public MainView()

FILE: Examples/Nodify.Shapes/MainWindow.xaml.cs
  class MainWindow (line 8) | public partial class MainWindow : Window
    method MainWindow (line 10) | public MainWindow()

FILE: Examples/Nodify.Shared/Behaviours/DataTrigger.cs
  class DataTrigger (line 15) | public class DataTrigger : Trigger
    method OnAttached (line 74) | protected override void OnAttached()
    method DataTrigger (line 80) | static DataTrigger()
    method Compare (line 92) | [RequiresUnreferencedCode("This functionality is not compatible with t...
    method EvaluateComparable (line 149) | [RequiresUnreferencedCode("This functionality is not compatible with t...
    method OnValueChanged (line 184) | private static void OnValueChanged(AvaloniaPropertyChangedEventArgs args)

FILE: Examples/Nodify.Shared/Behaviours/PropertySetter.cs
  class PropertySetter (line 18) | public class PropertySetter : AvaloniaObject, IAction
    method GetTypeByName (line 23) | [RequiresUnreferencedCode("This functionality is not compatible with t...
    method FindAttachedProperty (line 38) | [RequiresUnreferencedCode("This functionality is not compatible with t...
    method Execute (line 131) | public virtual object Execute(object? sender, object? parameter)
    method UpdatePropertyValue (line 174) | [RequiresUnreferencedCode("This functionality is not compatible with t...
    method UpdateAvaloniaPropertyValue (line 246) | [RequiresUnreferencedCode("This functionality is not compatible with t...
    method ValidateAvaloniaProperty (line 304) | private void ValidateAvaloniaProperty(AvaloniaProperty? property)
  class TypeConverterHelper (line 323) | internal static class TypeConverterHelper
    method Convert (line 332) | [RequiresUnreferencedCode("This functionality is not compatible with t...
    method GetScope (line 397) | private static string GetScope(string name)

FILE: Examples/Nodify.Shared/Behaviours/WpfBtn.cs
  class WpfBtn (line 9) | public class WpfBtn : Button
    method OnClick (line 21) | protected override void OnClick()
    method CanExecuteChanged (line 36) | private void CanExecuteChanged(object? sender, EventArgs e)
    method OnPropertyChanged (line 49) | protected override void OnPropertyChanged(AvaloniaPropertyChangedEvent...
    method OnAttachedToLogicalTree (line 77) | protected override void OnAttachedToLogicalTree(LogicalTreeAttachmentE...
    method OnDetachedFromLogicalTree (line 88) | protected override void OnDetachedFromLogicalTree(LogicalTreeAttachmen...

FILE: Examples/Nodify.Shared/BindingProxy.cs
  class BindingProxy (line 6) | public class BindingProxy : AvaloniaObject

FILE: Examples/Nodify.Shared/BoxValue.cs
  class BoxValue (line 5) | public static class BoxValue

FILE: Examples/Nodify.Shared/Controls/EditableTextBlock.cs
  class EditableTextBlock (line 8) | [TemplatePart(Name = ElementTextBox, Type = typeof(TextBox))]
    method OnIsEditingChanged (line 25) | private static void OnIsEditingChanged(AvaloniaObject d, AvaloniaPrope...
    method CoerceIsEditing (line 27) | private static bool CoerceIsEditing(AvaloniaObject d, bool value)
    method EditableTextBlock (line 105) | static EditableTextBlock()
    method OnApplyTemplate (line 114) | protected override void OnApplyTemplate(TemplateAppliedEventArgs e)
    method OnTextBoxVisiblityChanged (line 134) | private void OnTextBoxVisiblityChanged(bool e)
    method OnMouseDown (line 149) | protected override void OnMouseDown(MouseButtonEventArgs e)
    method OnMouseUp (line 162) | protected override void OnMouseUp(MouseButtonEventArgs e)
    method OnLostFocus (line 170) | private void OnLostFocus(object? sender, RoutedEventArgs e)
    method OnKeyDown (line 175) | protected override void OnKeyDown(KeyEventArgs e)
    class AnonuymousObserver (line 187) | private class AnonuymousObserver<T> : System.IObserver<T>
      method AnonuymousObserver (line 193) | public AnonuymousObserver(System.Action<T> onNext, System.Action<Sys...
      method OnCompleted (line 200) | public void OnCompleted() => _onCompleted?.Invoke();
      method OnError (line 201) | public void OnError(System.Exception error) => _onError?.Invoke(error);
      method OnNext (line 202) | public void OnNext(T value) => _onNext?.Invoke(value);
    method OnPropertyChanged (line 205) | protected override void OnPropertyChanged(AvaloniaPropertyChangedEvent...

FILE: Examples/Nodify.Shared/Controls/ResizablePanel.cs
  class ResizablePanel (line 9) | public class ResizablePanel : ContentControl
    method ResizablePanel (line 38) | static ResizablePanel()
    method ResizablePanel (line 44) | public ResizablePanel()
    method OnDragStarted (line 51) | private void OnDragStarted(object sender, VectorEventArgs e)
    method OnDragCompleted (line 59) | private void OnDragCompleted(object sender, VectorEventArgs e)
    method OnResize (line 67) | private void OnResize(object sender, VectorEventArgs e)
    method ResizeBottom (line 133) | private double ResizeBottom(VectorEventArgs e)
    method ResizeTop (line 138) | private double ResizeTop(VectorEventArgs e)
    method ResizeRight (line 143) | private double ResizeRight(VectorEventArgs e)
    method ResizeLeft (line 148) | private double ResizeLeft(VectorEventArgs e)
    method OnMove (line 153) | protected virtual void OnMove(double x, double y)
    method OnProcessDelta (line 159) | protected virtual void OnProcessDelta(ref double dx, ref double dy)
  class Resizer (line 164) | public class Resizer : Thumb
    method Resizer (line 175) | static Resizer()
  type ResizeDirections (line 182) | [Flags]

FILE: Examples/Nodify.Shared/Controls/Swatches.xaml.cs
  class Swatches (line 11) | public partial class Swatches : TemplatedControl
    method Swatches (line 31) | static Swatches()
    method OnPointerPressed (line 37) | protected override void OnPointerPressed(PointerPressedEventArgs e)

FILE: Examples/Nodify.Shared/Controls/TabControlEx.cs
  class TabControlEx (line 7) | [TemplatePart(Name = ElementScrollViewer, Type = typeof(ScrollViewer))]
    method TabControlEx (line 28) | static TabControlEx()
    method OnApplyTemplate (line 33) | protected override void OnApplyTemplate(TemplateAppliedEventArgs e)
    method OnScrollChanged (line 44) | private void OnScrollChanged(object? sender, ScrollChangedEventArgs e)
    method CreateContainerForItemOverride (line 52) | protected override Control CreateContainerForItemOverride(object? item...
    method NeedsContainerOverride (line 57) | protected override bool NeedsContainerOverride(object? item, int index...

FILE: Examples/Nodify.Shared/Controls/TabItemEx.cs
  class TabItemEx (line 7) | public class TabItemEx : TabItem
    method TabItemEx (line 24) | static TabItemEx()

FILE: Examples/Nodify.Shared/Converters/BooleanToVisibilityConverter.cs
  class BooleanToVisibilityConverter (line 9) | public class BooleanToVisibilityConverter : MarkupExtension, IValueConve...
    method Convert (line 14) | public object? Convert(object value, Type targetType, object parameter...
    method ConvertBack (line 30) | public object ConvertBack(object value, Type targetType, object parame...
    method ProvideValue (line 33) | public override object ProvideValue(IServiceProvider serviceProvider) ...

FILE: Examples/Nodify.Shared/Converters/ColorToSolidColorBrushConverter.cs
  class ColorToSolidColorBrushConverter (line 8) | public class ColorToSolidColorBrushConverter : IValueConverter
    method Convert (line 10) | public object Convert(object value, Type targetType, object parameter,...
    method ConvertBack (line 25) | public object ConvertBack(object value, Type targetType, object parame...

FILE: Examples/Nodify.Shared/Converters/DebugConverter.cs
  class DebugConverter (line 8) | public class DebugConverter : MarkupExtension, IValueConverter
    method Convert (line 10) | public object Convert(object value, Type targetType, object parameter,...
    method ConvertBack (line 16) | public object ConvertBack(object value, Type targetType, object parame...
    method ProvideValue (line 22) | public override object ProvideValue(IServiceProvider serviceProvider) ...

FILE: Examples/Nodify.Shared/Converters/EnumValuesConverter.cs
  type EnumValue (line 8) | public readonly struct EnumValue
    method EnumValue (line 10) | public EnumValue(string name, object? value)
  class EnumValuesConverter (line 20) | public class EnumValuesConverter : MarkupExtension, IValueConverter
    method Convert (line 22) | public object Convert(object value, Type targetType, object parameter,...
    method ConvertBack (line 42) | public object ConvertBack(object value, Type targetType, object parame...
    method ProvideValue (line 47) | public override object ProvideValue(IServiceProvider serviceProvider) ...

FILE: Examples/Nodify.Shared/Converters/InverseBooleanConverter.cs
  class InverseBooleanConverter (line 7) | public class InverseBooleanConverter : IValueConverter
    method Convert (line 9) | public object Convert(object value, Type targetType, object parameter,...
    method ConvertBack (line 17) | public object ConvertBack(object value, Type targetType, object parame...

FILE: Examples/Nodify.Shared/Converters/MultiValueEqualityConverter.cs
  class MultiValueEqualityConverter (line 9) | public class MultiValueEqualityConverter : IMultiValueConverter
    method Convert (line 11) | public object? Convert(IList<object?> values, Type targetType, object?...
    method ConvertBack (line 21) | public object[] ConvertBack(object value, Type[] targetTypes, object p...
    method AllElementsEqual (line 26) | private static bool AllElementsEqual(IEnumerable<object> values)
    method AllElementsNull (line 32) | private static bool AllElementsNull(IEnumerable<object> values)

FILE: Examples/Nodify.Shared/Converters/RandomBrushConverter.cs
  class RandomBrushConverter (line 8) | public class RandomBrushConverter : IValueConverter
    method Convert (line 12) | public object Convert(object value, Type targetType, object parameter,...
    method ConvertBack (line 25) | public object ConvertBack(object value, Type targetType, object parame...

FILE: Examples/Nodify.Shared/Converters/ResizeDirectionToVisiblityConverter.cs
  class ResizeDirectionToVisiblityConverter (line 8) | internal class ResizeDirectionToVisiblityConverter : IValueConverter
    method Convert (line 10) | public object Convert(object value, Type targetType, object parameter,...
    method ConvertBack (line 25) | public object ConvertBack(object value, Type targetType, object parame...

FILE: Examples/Nodify.Shared/Converters/StringToVisibilityConverter.cs
  class StringToVisibilityConverter (line 9) | public class StringToVisibilityConverter : MarkupExtension, IValueConverter
    method Convert (line 13) | public object? Convert(object value, Type targetType, object parameter...
    method ConvertBack (line 16) | public object ConvertBack(object value, Type targetType, object parame...
    method ProvideValue (line 19) | public override object ProvideValue(IServiceProvider serviceProvider) ...

FILE: Examples/Nodify.Shared/Converters/ToStringConverter.cs
  class ToStringConverter (line 8) | public class ToStringConverter : IValueConverter
    method Convert (line 10) | public object? Convert(object? value, Type targetType, object paramete...
    method ConvertBack (line 30) | public object ConvertBack(object value, Type targetType, object parame...

FILE: Examples/Nodify.Shared/DelegateCommand.cs
  type INodifyCommand (line 6) | public interface INodifyCommand : ICommand
    method RaiseCanExecuteChanged (line 8) | void RaiseCanExecuteChanged();
  class DelegateCommand (line 11) | public class DelegateCommand : INodifyCommand
    method DelegateCommand (line 18) | public DelegateCommand(Action action, Func<bool>? executeCondition = d...
    method CanExecute (line 24) | public bool CanExecute(object? parameter)
    method Execute (line 27) | public void Execute(object? parameter)
    method RaiseCanExecuteChanged (line 30) | public void RaiseCanExecuteChanged()
    method DelegateCommand (line 41) | public DelegateCommand(Action<T> action, Func<T, bool>? executeConditi...
    method CanExecute (line 47) | public bool CanExecute(object? parameter)
    method Execute (line 57) | public void Execute(object? parameter)
    method RaiseCanExecuteChanged (line 69) | public void RaiseCanExecuteChanged()
  class DelegateCommand (line 34) | public class DelegateCommand<T> : INodifyCommand
    method DelegateCommand (line 18) | public DelegateCommand(Action action, Func<bool>? executeCondition = d...
    method CanExecute (line 24) | public bool CanExecute(object? parameter)
    method Execute (line 27) | public void Execute(object? parameter)
    method RaiseCanExecuteChanged (line 30) | public void RaiseCanExecuteChanged()
    method DelegateCommand (line 41) | public DelegateCommand(Action<T> action, Func<T, bool>? executeConditi...
    method CanExecute (line 47) | public bool CanExecute(object? parameter)
    method Execute (line 57) | public void Execute(object? parameter)
    method RaiseCanExecuteChanged (line 69) | public void RaiseCanExecuteChanged()

FILE: Examples/Nodify.Shared/FluentSyntax.cs
  class FluentSyntax (line 7) | public static class FluentSyntax
    method Then (line 9) | public static void Then<T>(this T caller, Action<T> action)
    method Then (line 12) | public static bool Then(this bool condition, Action action)
    method Else (line 22) | public static bool Else(this bool condition, Action action)
    method ForEach (line 32) | public static IEnumerable<T> ForEach<T>(this IEnumerable<T> collection...
    method AddRange (line 52) | public static ICollection<T> AddRange<T>(this ICollection<T> collectio...
    method RemoveRange (line 58) | public static ICollection<T> RemoveRange<T>(this ICollection<T> collec...
    method RemoveOne (line 64) | public static ICollection<T> RemoveOne<T>(this ICollection<T> collecti...

FILE: Examples/Nodify.Shared/NodifyObservableCollection.cs
  type INodifyObservableCollection (line 9) | public interface INodifyObservableCollection<T>
    method WhenAdded (line 16) | INodifyObservableCollection<T> WhenAdded(Action<T> added);
    method WhenRemoved (line 24) | INodifyObservableCollection<T> WhenRemoved(Action<T> removed);
    method WhenCleared (line 32) | INodifyObservableCollection<T> WhenCleared(Action<IList<T>> cleared);
  class NodifyObservableCollection (line 35) | public class NodifyObservableCollection<T> : Collection<T>, INodifyObser...
    method NodifyObservableCollection (line 48) | public NodifyObservableCollection()
    method NodifyObservableCollection (line 52) | public NodifyObservableCollection(IEnumerable<T> collection)
    method WhenAdded (line 59) | public INodifyObservableCollection<T> WhenAdded(Action<T> added)
    method WhenRemoved (line 68) | public INodifyObservableCollection<T> WhenRemoved(Action<T> removed)
    method WhenCleared (line 77) | public INodifyObservableCollection<T> WhenCleared(Action<IList<T>> cle...
    method NotifyOnItemAdded (line 86) | protected virtual void NotifyOnItemAdded(T item)
    method NotifyOnItemRemoved (line 94) | protected virtual void NotifyOnItemRemoved(T item)
    method NotifyOnItemsCleared (line 102) | protected virtual void NotifyOnItemsCleared(IList<T> items)
    method ClearItems (line 114) | protected override void ClearItems()
    method InsertItem (line 136) | protected override void InsertItem(int index, T item)
    method RemoveItem (line 146) | protected override void RemoveItem(int index)
    method SetItem (line 157) | protected override void SetItem(int index, T item)
    method Move (line 167) | public void Move(int oldIndex, int newIndex)
    method OnCollectionChanged (line 176) | protected virtual void OnCollectionChanged(NotifyCollectionChangedEven...
    method OnPropertyChanged (line 179) | protected virtual void OnPropertyChanged(PropertyChangedEventArgs args)
    method OnCollectionChanged (line 182) | private void OnCollectionChanged(NotifyCollectionChangedAction action,...
    method OnCollectionChanged (line 185) | private void OnCollectionChanged(NotifyCollectionChangedAction action,...
    method OnCollectionChanged (line 188) | private void OnCollectionChanged(NotifyCollectionChangedAction action,...

FILE: Examples/Nodify.Shared/ObservableObject.cs
  class ObservableObject (line 9) | public class ObservableObject : INotifyPropertyChanged
    method OnPropertyChanged (line 26) | protected virtual void OnPropertyChanged([CallerMemberName] string pro...
    method SetProperty (line 39) | protected virtual bool SetProperty<T>(ref T field, T value, [CallerMem...

FILE: Examples/Nodify.Shared/RequeryCommand.cs
  class RequeryCommand (line 6) | public class RequeryCommand : INodifyCommand
    method RequeryCommand (line 17) | public RequeryCommand(Action action, Func<bool>? executeCondition = de...
    method CanExecute (line 23) | public bool CanExecute(object? parameter)
    method Execute (line 26) | public void Execute(object? parameter)
    method RaiseCanExecuteChanged (line 29) | public void RaiseCanExecuteChanged() { }
    method RequeryCommand (line 43) | public RequeryCommand(Action<T> action, Func<T, bool>? executeConditio...
    method CanExecute (line 49) | public bool CanExecute(object? parameter)
    method Execute (line 59) | public void Execute(object? parameter)
    method RaiseCanExecuteChanged (line 71) | public void RaiseCanExecuteChanged() { }
  class RequeryCommand (line 32) | public class RequeryCommand<T> : INodifyCommand
    method RequeryCommand (line 17) | public RequeryCommand(Action action, Func<bool>? executeCondition = de...
    method CanExecute (line 23) | public bool CanExecute(object? parameter)
    method Execute (line 26) | public void Execute(object? parameter)
    method RaiseCanExecuteChanged (line 29) | public void RaiseCanExecuteChanged() { }
    method RequeryCommand (line 43) | public RequeryCommand(Action<T> action, Func<T, bool>? executeConditio...
    method CanExecute (line 49) | public bool CanExecute(object? parameter)
    method Execute (line 59) | public void Execute(object? parameter)
    method RaiseCanExecuteChanged (line 71) | public void RaiseCanExecuteChanged() { }

FILE: Examples/Nodify.Shared/StringExtensions.cs
  class StringExtensions (line 5) | public static class StringExtensions
    method GetUnique (line 7) | public static string GetUnique(this ICollection<string> values, in str...

FILE: Examples/Nodify.Shared/ThemeManager.cs
  class ThemeManager (line 9) | public static class ThemeManager
    method ThemeManager (line 23) | static ThemeManager()
    method FindExistingResources (line 32) | private static List<ResourceInclude> FindExistingResources(List<(Uri b...
    method PreloadTheme (line 46) | private static void PreloadTheme(string themeName)
    method SetNextTheme (line 90) | public static void SetNextTheme()
    method SetTheme (line 105) | public static void SetTheme(string themeName)

FILE: Examples/Nodify.Shared/UndoRedo/ActionsHistory.cs
  type IActionsHistory (line 7) | public interface IActionsHistory : INotifyPropertyChanged
    method Undo (line 15) | void Undo();
    method Redo (line 16) | void Redo();
    method Clear (line 18) | void Clear();
    method Batch (line 23) | IDisposable Batch(string? label = default);
    method Record (line 25) | void Record(IAction action);
    method Pause (line 30) | void Pause(string? label = default);
    method Resume (line 33) | void Resume();
  type IAction (line 36) | public interface IAction
    method Execute (line 40) | void Execute();
    method Undo (line 41) | void Undo();
  class ActionsHistoryExtensions (line 44) | public static class ActionsHistoryExtensions
    method Record (line 46) | public static void Record(this IActionsHistory history, Action execute...
    method ExecuteAction (line 49) | public static void ExecuteAction(this IActionsHistory history, IAction...
  class ActionsHistory (line 56) | public class ActionsHistory : IActionsHistory
    method Batch (line 83) | public IDisposable Batch(string? label = default)
    method Record (line 86) | public void Record(IAction op)
    method AddToUndoStack (line 104) | private void AddToUndoStack(IAction op)
    method Undo (line 124) | public void Undo()
    method Redo (line 141) | public void Redo()
    method Clear (line 158) | public void Clear()
    method Pause (line 164) | public void Pause(string? label = default)
    method Resume (line 175) | public void Resume()
    class BatchOperation (line 192) | private class BatchOperation : IDisposable
      method BatchOperation (line 197) | public BatchOperation(string? label, ActionsHistory history)
      method Dispose (line 204) | public void Dispose()

FILE: Examples/Nodify.Shared/UndoRedo/BatchAction.cs
  class BatchAction (line 6) | public class BatchAction : IAction
    method BatchAction (line 8) | public BatchAction(string? label, IEnumerable<IAction> history)
    method Execute (line 18) | public void Execute()
    method Undo (line 26) | public void Undo()
    method ToString (line 34) | public override string? ToString()

FILE: Examples/Nodify.Shared/UndoRedo/DelegateAction.cs
  class DelegateAction (line 5) | public class DelegateAction : IAction
    method DelegateAction (line 12) | public DelegateAction(Action apply, Action unapply, string? label)
    method Execute (line 19) | public void Execute() => _execute();
    method Undo (line 20) | public void Undo() => _undo();
    method ToString (line 22) | public override string? ToString()

FILE: Examples/Nodify.Shared/UndoRedo/PropertyCache.cs
  type IPropertyAccessor (line 7) | public interface IPropertyAccessor
    method GetValue (line 9) | object? GetValue(object instance);
    method SetValue (line 10) | void SetValue(object instance, object? value);
  class PropertyAccessor (line 15) | public sealed class PropertyAccessor<TInstanceType, TPropertyType> : IPr...
    method PropertyAccessor (line 23) | public PropertyAccessor(Func<TInstanceType, TPropertyType> getter, Act...
    method GetValue (line 32) | public object? GetValue(object instance)
    method SetValue (line 35) | public void SetValue(object instance, object? value)
  class PropertyCache (line 39) | public class PropertyCache
    method Get (line 43) | public static IPropertyAccessor Get(Type type, string name)
    method Get (line 57) | public static IPropertyAccessor Get<T>(string name)
    method Create (line 60) | private static IPropertyAccessor Create(Type type, PropertyInfo property)

FILE: Examples/Nodify.Shared/UndoRedo/Undoable.cs
  type PropertyFlags (line 9) | [Flags]
  class Undoable (line 16) | public abstract class Undoable : ObservableObject
    method RecordHistory (line 22) | private void RecordHistory<TPropType>(string propName, TPropType previ...
    method RecordProperty (line 31) | protected void RecordProperty(string propName, PropertyFlags flags = P...
    method RecordProperty (line 43) | protected void RecordProperty<TType>(Expression<Func<TType, object?>> ...
    method GetPropertyName (line 52) | private static string GetPropertyName(Expression memberAccess)
    method SetProperty (line 61) | protected override bool SetProperty<TPropType>(ref TPropType field, TP...
    method Undoable (line 73) | public Undoable()
    method Undoable (line 78) | public Undoable(IActionsHistory history)

FILE: Examples/Nodify.StateMachine/App.xaml.cs
  class App (line 14) | public partial class App : Application
    method Initialize (line 16) | public override void Initialize()
    method OnFrameworkInitializationCompleted (line 21) | public override void OnFrameworkInitializationCompleted()

FILE: Examples/Nodify.StateMachine/BlackboardItemReferenceViewModel.cs
  class BlackboardItemReferenceViewModel (line 6) | public class BlackboardItemReferenceViewModel

FILE: Examples/Nodify.StateMachine/BlackboardItemViewModel.cs
  class BlackboardItemViewModel (line 5) | public class BlackboardItemViewModel : ObservableObject

FILE: Examples/Nodify.StateMachine/BlackboardKeyEditorView.xaml.cs
  class BlackboardKeyEditorView (line 5) | public partial class BlackboardKeyEditorView : UserControl
    method BlackboardKeyEditorView (line 7) | public BlackboardKeyEditorView()

FILE: Examples/Nodify.StateMachine/BlackboardKeyEditorViewModel.cs
  class BlackboardKeyEditorViewModel (line 5) | public class BlackboardKeyEditorViewModel : ObservableObject

FILE: Examples/Nodify.StateMachine/BlackboardKeyViewModel.cs
  class BlackboardKeyViewModel (line 5) | public class BlackboardKeyViewModel : ObservableObject
    method GetRealValue (line 65) | private object? GetRealValue(object? value)
    method GetDefaultValue (line 96) | public static object? GetDefaultValue(BlackboardKeyType type)

FILE: Examples/Nodify.StateMachine/BlackboardViewModel.cs
  class BlackboardViewModel (line 5) | public class BlackboardViewModel : ObservableObject
    method BlackboardViewModel (line 31) | public BlackboardViewModel()

FILE: Examples/Nodify.StateMachine/Converters/BlackboardKeyEditorConverter.cs
  class BlackboardKeyEditorConverter (line 9) | public class BlackboardKeyEditorConverter : MarkupExtension, IMultiValue...
    method Convert (line 13) | public object? Convert(IList<object?> values, Type targetType, object?...
    method ConvertBack (line 30) | public object[] ConvertBack(object value, Type[] targetTypes, object p...
    method ProvideValue (line 35) | public override object ProvideValue(IServiceProvider serviceProvider) ...

FILE: Examples/Nodify.StateMachine/Converters/ConnectorOffsetConverter.cs
  class ConnectorOffsetConverter (line 8) | public class ConnectorOffsetConverter : IValueConverter
    method Convert (line 10) | public object Convert(object value, Type targetType, object parameter,...
    method ConvertBack (line 21) | public object ConvertBack(object value, Type targetType, object parame...

FILE: Examples/Nodify.StateMachine/Converters/DrawingBrushToRectangleConverter.cs
  class DrawingBrushToRectangleConverter (line 8) | public class DrawingBrushToRectangleConverter : IValueConverter
    method Convert (line 12) | public object? Convert(object? value, Type targetType, object? paramet...
    method ConvertBack (line 27) | public object? ConvertBack(object? value, Type targetType, object? par...

FILE: Examples/Nodify.StateMachine/Converters/FilterBlackboardKeysConverter.cs
  class FilterBlackboardKeysConverter (line 10) | public class FilterBlackboardKeysConverter : MarkupExtension, IMultiValu...
    method Convert (line 12) | public object? Convert(IList<object?> values, Type targetType, object?...
    method ConvertBack (line 22) | public object[] ConvertBack(object value, Type[] targetTypes, object p...
    method ProvideValue (line 27) | public override object ProvideValue(IServiceProvider serviceProvider) ...

FILE: Examples/Nodify.StateMachine/Helpers/BlackboardDescriptor.cs
  class BlackboardDescriptor (line 8) | public static class BlackboardDescriptor
    class KeyDescription (line 10) | private class KeyDescription
      method KeyDescription (line 12) | public KeyDescription(string displayName, string propertyName, Black...
    class ItemDescription (line 26) | private class ItemDescription
    method GetItem (line 33) | public static BlackboardItemViewModel? GetItem(BlackboardItemReference...
    method GetReference (line 69) | public static BlackboardItemReferenceViewModel GetReference(Type type)
    method GetDescription (line 81) | private static ItemDescription GetDescription(Type type)
    method GetAvailableItems (line 121) | public static List<BlackboardItemReferenceViewModel> GetAvailableItems...

FILE: Examples/Nodify.StateMachine/MainWindow.xaml.cs
  class MainWindow (line 8) | public partial class MainWindow : Window
    method MainWindow (line 10) | public MainWindow()
    method ScrollViewer_MouseWheel (line 24) | private void ScrollViewer_MouseWheel(object sender, MouseWheelEventArg...
    method ScrollViewer_PreviewKeyDown (line 43) | private void ScrollViewer_PreviewKeyDown(object sender, KeyEventArgs e)

FILE: Examples/Nodify.StateMachine/Program.cs
  class Program (line 6) | class Program
    method Main (line 11) | [STAThread]
    method BuildAvaloniaApp (line 16) | public static AppBuilder BuildAvaloniaApp()

FILE: Examples/Nodify.StateMachine/Runner/Actions/CopyKeyAction.cs
  class CopyKeyAction (line 5) | [BlackboardItem("Copy Key")]
    method Execute (line 14) | public Task Execute(Blackboard blackboard)

FILE: Examples/Nodify.StateMachine/Runner/Actions/SetKeyValueAction.cs
  class SetKeyValueAction (line 5) | [BlackboardItem("Set Value")]
    method Execute (line 14) | public Task Execute(Blackboard blackboard)

FILE: Examples/Nodify.StateMachine/Runner/Actions/SetStateDelayAction.cs
  class SetStateDelayAction (line 5) | [BlackboardItem("Set State Delay")]
    method Execute (line 14) | public Task Execute(Blackboard blackboard)

FILE: Examples/Nodify.StateMachine/Runner/Blackboard/Blackboard.cs
  class Blackboard (line 5) | public class Blackboard
    method GetValue (line 12) | public virtual T? GetValue<T>(BlackboardKey key)
    method GetObject (line 23) | public virtual T? GetObject<T>(BlackboardKey key)
    method GetObject (line 34) | public virtual object? GetObject(BlackboardKey key)
    method Set (line 44) | public virtual void Set(BlackboardKey key, object? value)
    method HasKey (line 47) | public virtual bool HasKey(BlackboardKey key)
    method Remove (line 50) | public virtual void Remove(BlackboardKey key)
    method Clear (line 53) | public virtual void Clear()
    method CopyTo (line 56) | public void CopyTo(Blackboard newBlackboard)
    method GetValue (line 70) | public T? GetValue<T>(BlackboardProperty value) where T : struct
    method GetObject (line 73) | public T? GetObject<T>(BlackboardProperty value) where T : class
    method GetObject (line 76) | public object? GetObject(BlackboardProperty value)
  class BlackboardExtensions (line 80) | public static class BlackboardExtensions
    method IsValid (line 82) | public static bool IsValid(this BlackboardKey key)
    method IsValid (line 85) | public static bool IsValid(this BlackboardProperty action)

FILE: Examples/Nodify.StateMachine/Runner/Blackboard/BlackboardConditionSet.cs
  type BooleanOperator (line 6) | public enum BooleanOperator
  class BlackboardConditionSet (line 12) | public class BlackboardConditionSet : IBlackboardCondition
    method BlackboardConditionSet (line 14) | public BlackboardConditionSet(IEnumerable<IBlackboardCondition> condit...
    method Evaluate (line 23) | public async Task<bool> Evaluate(Blackboard blackboard)

FILE: Examples/Nodify.StateMachine/Runner/Blackboard/BlackboardItemAttribute.cs
  class BlackboardItemAttribute (line 5) | [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited...
    method BlackboardItemAttribute (line 8) | public BlackboardItemAttribute(string displayName)

FILE: Examples/Nodify.StateMachine/Runner/Blackboard/BlackboardKey.cs
  type BlackboardKeyType (line 6) | public enum BlackboardKeyType
  type BlackboardKey (line 15) | [DebuggerDisplay("{Name}: {Type}")]
    method BlackboardKey (line 20) | public BlackboardKey(string name, BlackboardKeyType type)
    method BlackboardKey (line 26) | public BlackboardKey(string name) : this(name, BlackboardKeyType.Object)
    method Equals (line 39) | public override bool Equals(object? obj)
    method GetHashCode (line 42) | public override int GetHashCode()
    method Equals (line 45) | public bool Equals(BlackboardKey other)

FILE: Examples/Nodify.StateMachine/Runner/Blackboard/BlackboardProperty.cs
  type BlackboardProperty (line 6) | [DebuggerDisplay("{IsKey ? Key : Value}")]
    method BlackboardProperty (line 11) | public BlackboardProperty(BlackboardKey key)
    method BlackboardProperty (line 17) | public BlackboardProperty(object? value)
    method Equals (line 32) | public override bool Equals(object? obj)
    method GetHashCode (line 35) | public override int GetHashCode()
    method Equals (line 38) | public bool Equals(BlackboardProperty other)
    method GetValue (line 47) | public T? GetValue<T>() where T : struct
    method GetObject (line 50) | public T? GetObject<T>() where T : class

FILE: Examples/Nodify.StateMachine/Runner/Blackboard/BlackboardPropertyAttribute.cs
  type BlackboardKeyUsage (line 5) | public enum BlackboardKeyUsage
  class BlackboardPropertyAttribute (line 14) | [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inheri...
    method BlackboardPropertyAttribute (line 22) | public BlackboardPropertyAttribute(string? name, BlackboardKeyType typ...
    method BlackboardPropertyAttribute (line 32) | public BlackboardPropertyAttribute(BlackboardKeyType type = Blackboard...

FILE: Examples/Nodify.StateMachine/Runner/Blackboard/IBlackboardAction.cs
  type IBlackboardAction (line 5) | public interface IBlackboardAction
    method Execute (line 7) | Task Execute(Blackboard blackboard);

FILE: Examples/Nodify.StateMachine/Runner/Blackboard/IBlackboardCondition.cs
  type IBlackboardCondition (line 5) | public interface IBlackboardCondition
    method Evaluate (line 7) | Task<bool> Evaluate(Blackboard blackboard);

FILE: Examples/Nodify.StateMachine/Runner/Conditions/AreEqualCondition.cs
  class AreEqualCondition (line 5) | [BlackboardItem("Are Equal")]
    method Evaluate (line 14) | public Task<bool> Evaluate(Blackboard blackboard)

FILE: Examples/Nodify.StateMachine/Runner/Conditions/HasKeyCondition.cs
  class HasKeyCondition (line 5) | [BlackboardItem("Has Key")]
    method Evaluate (line 11) | public Task<bool> Evaluate(Blackboard blackboard)

FILE: Examples/Nodify.StateMachine/Runner/Conditions/HasValueCondition.cs
  class HasValueCondition (line 5) | [BlackboardItem("Has Value")]
    method Evaluate (line 11) | public Task<bool> Evaluate(Blackboard blackboard)

FILE: Examples/Nodify.StateMachine/Runner/Debugging/DebugBlackboardDecorator.cs
  class DebugBlackboardDecorator (line 6) | public class DebugBlackboardDecorator : Blackboard
    method DebugBlackboardDecorator (line 15) | public DebugBlackboardDecorator(Blackboard? blackboard = default)
    method Remove (line 20) | public override void Remove(BlackboardKey key)
    method Clear (line 23) | public override void Clear()
    method GetObject (line 26) | public override T? GetObject<T>(BlackboardKey key) where T : class
    method GetValue (line 29) | public override T? GetValue<T>(BlackboardKey key)
    method Set (line 32) | public override void Set(BlackboardKey key, object? value)
    method HasKey (line 38) | public override bool HasKey(BlackboardKey key)
    method GetObject (line 41) | public override object? GetObject(BlackboardKey key)
    method Attach (line 44) | public virtual void Attach(Blackboard? blackboard)

FILE: Examples/Nodify.StateMachine/Runner/Debugging/DebugStateDecorator.cs
  class DebugStateDecorator (line 6) | public class DebugStateDecorator : State
    method DebugStateDecorator (line 10) | public DebugStateDecorator(State state) : base(state.Id, state.Transit...
    method Activate (line 15) | public override async Task Activate(Blackboard blackboard)

FILE: Examples/Nodify.StateMachine/Runner/Debugging/DebugTransitionDecorator.cs
  class DebugTransitionDecorator (line 5) | public class DebugTransitionDecorator : Transition
    method DebugTransitionDecorator (line 9) | public DebugTransitionDecorator(Transition transition) : base(transiti...
    method CanActivate (line 14) | public override async Task<bool> CanActivate(Blackboard blackboard)

FILE: Examples/Nodify.StateMachine/Runner/State.cs
  class State (line 7) | public class State
    method State (line 12) | public State(Guid id, IEnumerable<Transition> transitions, IBlackboard...
    method Activate (line 21) | public virtual Task Activate(Blackboard blackboard)

FILE: Examples/Nodify.StateMachine/Runner/StateMachine.cs
  type MachineState (line 8) | public enum MachineState
  class StateMachine (line 18) | public class StateMachine
    method StateMachine (line 30) | public StateMachine(Guid root, IEnumerable<State> states, Blackboard? ...
    method Start (line 47) | public async Task Start()
    method GetNext (line 75) | private async Task<State?> GetNext(State current)
    method Stop (line 90) | public void Stop()
    method Pause (line 93) | public void Pause()
    method Unpause (line 96) | public void Unpause()
    method ChangeState (line 99) | private bool ChangeState(MachineState newState)

FILE: Examples/Nodify.StateMachine/Runner/Transition.cs
  class Transition (line 6) | public class Transition
    method Transition (line 8) | public Transition(Guid from, Guid to, IBlackboardCondition? condition ...
    method CanActivate (line 19) | public virtual Task<bool> CanActivate(Blackboard blackboard)

FILE: Examples/Nodify.StateMachine/StateMachineRunnerViewModel.cs
  class StateMachineRunnerViewModel (line 7) | public class StateMachineRunnerViewModel : ObservableObject
    method StateMachineRunnerViewModel (line 31) | public StateMachineRunnerViewModel(StateMachineViewModel stateMachineV...
    method OnBlackboardKeyValueChanged (line 37) | private void OnBlackboardKeyValueChanged(BlackboardKey key, object? ne...
    method Start (line 51) | public async void Start()
    method Stop (line 63) | public void Stop()
    method HandleStateTransition (line 69) | private void HandleStateTransition(Guid from, Guid to)
    method SetActiveStateAndTransition (line 81) | private void SetActiveStateAndTransition(bool value)
    method HandleStateChange (line 94) | private void HandleStateChange(MachineState newState)
    method ResetBlackboardToOriginal (line 105) | private void ResetBlackboardToOriginal()
    method TogglePause (line 115) | public void TogglePause()
    method CreateStates (line 131) | private IEnumerable<State> CreateStates(IEnumerable<StateViewModel> st...
    method CreateTransitions (line 134) | private IEnumerable<Transition> CreateTransitions(StateViewModel state)
    method CreateCondition (line 149) | private IBlackboardCondition? CreateCondition(BlackboardItemViewModel?...
    method CreateAction (line 164) | private IBlackboardAction? CreateAction(BlackboardItemViewModel? action)
    method InitializeKeys (line 180) | private void InitializeKeys(NodifyObservableCollection<BlackboardKeyVi...
    method CreateBlackboard (line 200) | private Blackboard CreateBlackboard(BlackboardViewModel blackboard)
    method CreateActionValue (line 218) | private BlackboardProperty CreateActionValue(BlackboardKeyViewModel key)

FILE: Examples/Nodify.StateMachine/StateMachineViewModel.cs
  class StateMachineViewModel (line 7) | public class StateMachineViewModel : ObservableObject
    method StateMachineViewModel (line 9) | public StateMachineViewModel()
    method DisconnectState (line 116) | public void DisconnectState(StateViewModel state)
    method OnCreateDefaultNodes (line 122) | protected virtual void OnCreateDefaultNodes()
    method OnCreateDefaultKeys (line 215) | protected virtual void OnCreateDefaultKeys()

FILE: Examples/Nodify.StateMachine/StateViewModel.cs
  class StateViewModel (line 6) | public class StateViewModel : ObservableObject
    method StateViewModel (line 10) | public StateViewModel(Guid id)
    method StateViewModel (line 13) | public StateViewModel() : this(Guid.NewGuid()) { }
    method SetAction (line 77) | private void SetAction(BlackboardItemReferenceViewModel? actionRef)

FILE: Examples/Nodify.StateMachine/TransitionViewModel.cs
  class TransitionViewModel (line 3) | public class TransitionViewModel : ObservableObject
    method SetCondition (line 41) | private void SetCondition(BlackboardItemReferenceViewModel? conditionRef)

FILE: Nodify/Compatibility/Attributes/ContentPropertyAttribute.cs
  class ContentPropertyAttribute (line 3) | internal class ContentPropertyAttribute : Attribute
    method ContentPropertyAttribute (line 5) | public ContentPropertyAttribute(string name)

FILE: Nodify/Compatibility/Attributes/StyleTypedPropertyAttribute.cs
  class StyleTypedPropertyAttribute (line 3) | [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]

FILE: Nodify/Compatibility/Commands/ApplicationCommands.cs
  class ApplicationCommands (line 5) | internal static class ApplicationCommands
    method GetPlatformCommandKey (line 19) | private static KeyModifiers GetPlatformCommandKey()
    method GetReplaceKeyGesture (line 29) | private static InputKeyGesture GetReplaceKeyGesture()

FILE: Nodify/Compatibility/Commands/CanExecuteRoutedEventArgs.cs
  class CanExecuteRoutedEventArgs (line 3) | public sealed class CanExecuteRoutedEventArgs : RoutedEventArgs
    method CanExecuteRoutedEventArgs (line 11) | public CanExecuteRoutedEventArgs(ICommand command, object? parameter)

FILE: Nodify/Compatibility/Commands/CommandBinding.cs
  class CommandBinding (line 3) | internal class CommandBinding
    method CommandBinding (line 5) | public CommandBinding(RoutedCommand command,
    method DoCanExecute (line 20) | internal bool DoCanExecute(object sender, CanExecuteRoutedEventArgs e)
    method DoExecuted (line 46) | internal bool DoExecuted(object sender, ExecutedRoutedEventArgs e)

FILE: Nodify/Compatibility/Commands/CommandManager.cs
  class CommandManager (line 3) | internal static class CommandManager
    method RegisterClassCommandBinding (line 7) | public static void RegisterClassCommandBinding(Type type, CommandBindi...
    method InvalidateRequerySuggested (line 18) | public static void InvalidateRequerySuggested()
    method CommandManager (line 23) | static CommandManager()
    method KeyDownEventHandler (line 33) | private static void KeyDownEventHandler(Interactive sender, KeyEventAr...
    method KeyUpEventHandler (line 38) | private static void KeyUpEventHandler(Interactive sender, KeyEventArgs e)
    method PointerReleasedEventHandler (line 43) | private static void PointerReleasedEventHandler(Interactive sender, Po...
    method PointerPressedEventHandler (line 48) | private static void PointerPressedEventHandler(Interactive sender, Poi...
    method GotFocusEventHandler (line 53) | private static void GotFocusEventHandler(Interactive sender, GotFocusE...
    method LostFocusEventHandler (line 58) | private static void LostFocusEventHandler(Interactive sender, RoutedEv...

FILE: Nodify/Compatibility/Commands/ExecutedRoutedEventArgs.cs
  class ExecutedRoutedEventArgs (line 3) | public sealed class ExecutedRoutedEventArgs : RoutedEventArgs
    method ExecutedRoutedEventArgs (line 9) | internal ExecutedRoutedEventArgs(ICommand command, object? parameter)

FILE: Nodify/Compatibility/Commands/RoutedCommand.cs
  class RoutedCommand (line 4) | public class RoutedCommand : ICommand
    method RoutedCommand (line 12) | public RoutedCommand(string name, Type? ownerType)
    method RoutedCommand (line 17) | public RoutedCommand(string name, Type? ownerType, InputGesture inputG...
    method RoutedCommand (line 22) | public RoutedCommand(string name, Type? ownerType, InputGestureCollect...
    method RoutedCommand (line 29) | static RoutedCommand()
    method PopupIsOpenChanged (line 38) | private static void PopupIsOpenChanged(Popup popup, AvaloniaPropertyCh...
    method GotFocusEventHandler (line 47) | private static void GotFocusEventHandler(Interactive focused, GotFocus...
    method LostFocusEventHandler (line 52) | private static void LostFocusEventHandler(Interactive arg1, RoutedEven...
    method CanExecuteEventHandler (line 58) | private static void CanExecuteEventHandler(Interactive? control, CanEx...
    method ExecutedEventHandler (line 89) | private static void ExecutedEventHandler(Interactive? control, Execute...
    method CanExecute (line 123) | public bool CanExecute(object? parameter, IInputElement? target)
    method CanExecute (line 133) | bool ICommand.CanExecute(object? parameter)
    method Execute (line 141) | public void Execute(object? parameter, IInputElement? target)
    method Execute (line 150) | void ICommand.Execute(object? parameter)
    method GetCommandBindings (line 164) | internal static IList<CommandBinding>? GetCommandBindings(Interactive ...
    method SetCommandBindings (line 167) | internal static void SetCommandBindings(Interactive elem, IList<Comman...

FILE: Nodify/Compatibility/Commands/RoutedUICommand.cs
  class RoutedUICommand (line 3) | public class RoutedUICommand : RoutedCommand
    method RoutedUICommand (line 7) | public RoutedUICommand(string text, string name, Type? ownerType) : ba...
    method RoutedUICommand (line 12) | public RoutedUICommand(string text, string name, Type? ownerType, Inpu...
    method RoutedUICommand (line 17) | public RoutedUICommand(string text, string name, Type? ownerType, Inpu...

FILE: Nodify/Compatibility/Controls/GroupStyle.cs
  class GroupStyle (line 3) | public class GroupStyle

FILE: Nodify/Compatibility/Controls/MultiSelector.cs
  class MultiSelector (line 3) | public class MultiSelector : SelectingItemsControl
    method MultiSelector (line 7) | public MultiSelector()
    method OnSelectionChanged (line 13) | private void OnSelectionChanged(object? sender, SelectionModelSelectio...
    method OnSelectionChanged (line 18) | protected virtual void OnSelectionChanged(SelectionModelSelectionChang...
    method BeginUpdateSelectedItems (line 26) | protected void BeginUpdateSelectedItems()
    method EndUpdateSelectedItems (line 31) | protected void EndUpdateSelectedItems()
    method UnselectAll (line 36) | public void UnselectAll()
    method SelectAll (line 47) | public void SelectAll()
    method GetContainerForItemOverride (line 52) | protected virtual DependencyObject GetContainerForItemOverride()
    method CreateContainerForItemOverride (line 57) | protected override Control CreateContainerForItemOverride(object? item...
    method NeedsContainerOverride (line 62) | protected override bool NeedsContainerOverride(object? item, int index...
    method IsItemItsOwnContainerOverride (line 68) | protected virtual bool IsItemItsOwnContainerOverride(object item)

FILE: Nodify/Compatibility/Controls/Primitives/IScrollInfo.cs
  type IScrollInfo (line 3) | public interface IScrollInfo : ILogicalScrollable
    method LineUp (line 16) | void LineUp();
    method LineDown (line 21) | void LineDown();
    method LineLeft (line 26) | void LineLeft();
    method LineRight (line 31) | void LineRight();
    method PageUp (line 37) | void PageUp();
    method PageDown (line 42) | void PageDown();
    method PageLeft (line 47) | void PageLeft();
    method PageRight (line 52) | void PageRight();
    method MouseWheelUp (line 58) | void MouseWheelUp();
    method MouseWheelDown (line 63) | void MouseWheelDown();
    method MouseWheelLeft (line 68) | void MouseWheelLeft();
    method MouseWheelRight (line 73) | void MouseWheelRight();
    method SetHorizontalOffset (line 79) | void SetHorizontalOffset(double offset);
    method SetVerticalOffset (line 85) | void SetVerticalOffset(double offset);
    method MakeVisible (line 98) | Rect MakeVisible(Visual visual, Rect rectangle);

FILE: Nodify/Compatibility/Controls/WpfControl.cs
  class WpfControl (line 8) | public class WpfControl : TemplatedControl
    method OnPointerEntered (line 12) | protected override void OnPointerEntered(PointerEventArgs e)
    method OnPointerExited (line 21) | protected override  void OnPointerExited(PointerEventArgs e)
    method OnPointerMoved (line 30) | protected override  void OnPointerMoved(PointerEventArgs e)
    method OnPointerPressed (line 39) | protected override void OnPointerPressed(PointerPressedEventArgs e)
    method OnPointerReleased (line 48) | protected override  void OnPointerReleased(PointerReleasedEventArgs e)
    method OnMouseEnter (line 57) | protected virtual void OnMouseEnter(PointerEventArgs e)
    method OnMouseLeave (line 61) | protected virtual void OnMouseLeave(PointerEventArgs e)
    method OnMouseMove (line 65) | protected virtual void OnMouseMove(MouseEventArgs e)
    method OnMouseDown (line 69) | protected virtual void OnMouseDown(MouseButtonEventArgs e)
    method OnMouseUp (line 73) | protected virtual void OnMouseUp(MouseButtonEventArgs e)
    method CaptureMouseSafe (line 77) | protected void CaptureMouseSafe()
    method ReleaseMouseCapture (line 85) | protected virtual void ReleaseMouseCapture()

FILE: Nodify/Compatibility/Controls/WpfShape.cs
  class WpfShape (line 8) | public class WpfShape : Panel
    method AffectsGeometry (line 29) | protected static void AffectsGeometry<TShape>(params AvaloniaProperty[...
    method AffectsRender (line 35) | protected new static void AffectsRender<T>(params AvaloniaProperty[] p...
    method AffectsGeometryInvalidate (line 41) | private static void AffectsGeometryInvalidate(WpfShape control, Avalon...
    method WpfShape (line 49) | public WpfShape()
    method InvalidateGeometry (line 67) | private void InvalidateGeometry() => _shape?.InvalidateGeometry();
    method OnCreateDefiningGeometry (line 69) | private Geometry? OnCreateDefiningGeometry() => CreateDefiningGeometry();
    method InvalidateVisual (line 71) | private new void InvalidateVisual() => _renderer?.InvalidateVisual();
    method OnRender (line 73) | private void OnRender(DrawingContext drawingContext) => Render(drawing...
    method CreateDefiningGeometry (line 75) | protected virtual Geometry? CreateDefiningGeometry() => null;
    method Render (line 77) | protected new virtual void Render(DrawingContext drawingContext) { }
    class InnerShape (line 149) | private class InnerShape : Shape
      method CreateDefiningGeometry (line 153) | protected override Geometry? CreateDefiningGeometry()
      method InvalidateGeometry (line 158) | public new void InvalidateGeometry()
    class InnerRenderer (line 164) | private class InnerRenderer : Control
      method Render (line 168) | public override void Render(DrawingContext context)

FILE: Nodify/Compatibility/DefaultStyleKeyProperty.cs
  class DefaultStyleKeyProperty (line 5) | internal class DefaultStyleKeyProperty
    method OverrideMetadata (line 7) | public static void OverrideMetadata(Type control, FrameworkPropertyMet...
  class FrameworkPropertyMetadata (line 15) | internal class FrameworkPropertyMetadata
    method FrameworkPropertyMetadata (line 17) | public FrameworkPropertyMetadata(Type type)

FILE: Nodify/Compatibility/Dragging/DragCompletedEventArgs.cs
  class DragCompletedEventArgs (line 13) | public class DragCompletedEventArgs : RoutedEventArgs
    method DragCompletedEventArgs (line 20) | public DragCompletedEventArgs(double horizontalChange, double vertical...

FILE: Nodify/Compatibility/Dragging/DragDeltaEventArgs.cs
  class DragDeltaEventArgs (line 13) | public class DragDeltaEventArgs : RoutedEventArgs
    method DragDeltaEventArgs (line 20) | public DragDeltaEventArgs(double horizontalChange, double verticalChan...

FILE: Nodify/Compatibility/Dragging/DragStartedEventArgs.cs
  class DragStartedEventArgs (line 13) | public class DragStartedEventArgs : RoutedEventArgs
    method DragStartedEventArgs (line 20) | public DragStartedEventArgs(double horizontalOffset, double verticalOf...

FILE: Nodify/Compatibility/EmptyNamespaces.cs
  class Empty (line 8) | internal class Empty { }
  class Empty (line 13) | internal class Empty { }
  class Empty (line 18) | internal class Empty { }
  class Empty (line 23) | internal class Empty { }
  class Empty (line 28) | internal class Empty { }
  class Empty (line 33) | internal class Empty { }
  class Empty (line 38) | internal class Empty { }
  class Empty (line 43) | internal class Empty { }
  class Empty (line 48) | internal class Empty { }
  class Empty (line 53) | internal class Empty { }
  class ThemeInfoAttribute (line 58) | internal class ThemeInfoAttribute : Attribute
    method ThemeInfoAttribute (line 60) | public ThemeInfoAttribute(ResourceDictionaryLocation a, ResourceDictio...
  type ResourceDictionaryLocation (line 66) | internal enum ResourceDictionaryLocation

FILE: Nodify/Compatibility/Extensions/ControlCaptureExtensions.cs
  class ControlCaptureExtensions (line 3) | internal static class ControlCaptureExtensions
    method PropagateMouseCapturedWithin (line 5) | internal static void PropagateMouseCapturedWithin(this IInputElement s...

FILE: Nodify/Compatibility/Extensions/PointExtensions.cs
  class PointExtensions (line 6) | internal static class PointExtensions
    method LengthSquared (line 8) | public static double LengthSquared(this Point point)
    method Length (line 13) | public static double Length(this Point point)

FILE: Nodify/Compatibility/Extensions/SizeExtensions.cs
  class SizeExtensions (line 5) | internal static class SizeExtensions
    method ToVector (line 7) | public static Vector ToVector(this Size size) => new Vector(size.Width...

FILE: Nodify/Compatibility/Extensions/StreamGeometryContextExtensions.cs
  class StreamGeometryContextExtensions (line 3) | internal static class StreamGeometryContextExtensions
    method LineTo (line 5) | public static void LineTo(this StreamGeometryContext context, Point po...
    method BezierTo (line 10) | public static void BezierTo(this StreamGeometryContext context,
    method QuadraticBezierTo (line 17) | public static void QuadraticBezierTo(this StreamGeometryContext context,
    method BeginFigure (line 23) | public static System.IDisposable BeginFigure(this StreamGeometryContex...
    type EndFigureOnDispose (line 29) | private struct EndFigureOnDispose : System.IDisposable
      method EndFigureOnDispose (line 34) | public EndFigureOnDispose(StreamGeometryContext context, bool isClosed)
      method Dispose (line 40) | public void Dispose()

FILE: Nodify/Compatibility/Extensions/VisualExtensions.cs
  class VisualExtensions (line 3) | internal static class VisualExtensions
    method IsAncestorOf (line 5) | public static bool IsAncestorOf(this Visual visual, Visual target)

FILE: Nodify/Compatibility/Input/InputGesture.cs
  class InputGesture (line 10) | public abstract class InputGesture
    method Matches (line 36) | public abstract bool Matches(object targetElement, EventArgs inputEven...

FILE: Nodify/Compatibility/Input/InputGestureCollection.cs
  class InputGestureCollection (line 3) | public class InputGestureCollection : AvaloniaList<InputGesture>

FILE: Nodify/Compatibility/Input/InputKeyGesture.cs
  class InputKeyGesture (line 6) | public class InputKeyGesture : InputGesture
    method InputKeyGesture (line 10) | public InputKeyGesture(Key key, KeyModifiers modifiers = KeyModifiers....
    method InputKeyGesture (line 15) | public InputKeyGesture(KeyGesture gesture)
    method Matches (line 20) | public override bool Matches(object targetElement, EventArgs inputEven...

FILE: Nodify/Compatibility/Input/MouseAction.cs
  type MouseAction (line 3) | public enum MouseAction : byte

FILE: Nodify/Compatibility/Input/MouseButtonEventArgs.cs
  class MouseButtonEventArgs (line 3) | public class MouseButtonEventArgs : MouseEventArgs
    method MouseButtonEventArgs (line 7) | internal MouseButtonEventArgs(PointerEventArgs pointerArgs)
    method MouseButtonEventArgs (line 28) | public MouseButtonEventArgs(PointerReleasedEventArgs releasedEventArgs)
    method Capture (line 81) | public IDisposable Capture(IInputElement element)
    type ReleaseMouseCaptureOperation (line 99) | private struct ReleaseMouseCaptureOperation : IDisposable
      method ReleaseMouseCaptureOperation (line 104) | public ReleaseMouseCaptureOperation(IPointer pointer, IInputElement ...
      method Dispose (line 110) | public void Dispose()
    type EmptyDisposable (line 120) | private struct EmptyDisposable : IDisposable
      method Dispose (line 124) | public void Dispose() { }
    method GetPosition (line 127) | public override Point GetPosition(Visual? relativeTo)

FILE: Nodify/Compatibility/Input/MouseButtonState.cs
  type MouseButtonState (line 3) | public enum MouseButtonState

FILE: Nodify/Compatibility/Input/MouseEventArgs.cs
  class MouseEventArgs (line 3) | public abstract class MouseEventArgs : EventArgs
    method GetPosition (line 11) | public abstract Point GetPosition(Visual? relativeTo);

FILE: Nodify/Compatibility/Input/MouseGesture.cs
  class MouseGesture (line 7) | public class MouseGesture : InputGesture
    method MouseGesture (line 19) | public MouseGesture()   // Mouse action
    method MouseGesture (line 27) | public MouseGesture(MouseAction mouseAction): this(mouseAction, KeyMod...
    method MouseGesture (line 36) | public MouseGesture( MouseAction mouseAction,KeyModifiers modifiers)  ...
    method Matches (line 102) | public override bool Matches(object targetElement, EventArgs inputEven...
    method IsDefinedMouseAction (line 118) | internal static bool IsDefinedMouseAction(MouseAction mouseAction)
    method OnPropertyChanged (line 134) | internal virtual void OnPropertyChanged(string propertyName)
    method GetMouseAction (line 151) | internal static MouseAction GetMouseAction(EventArgs inputArgs)

FILE: Nodify/Compatibility/Input/MouseMoveEventArgs.cs
  class MouseMoveEventArgs (line 3) | public class MouseMoveEventArgs : MouseEventArgs
    method MouseMoveEventArgs (line 7) | internal MouseMoveEventArgs(PointerEventArgs e)
    method GetPosition (line 22) | public override Point GetPosition(Visual? relativeTo)

FILE: Nodify/Compatibility/Input/MouseWheelEventArgs.cs
  class MouseWheelEventArgs (line 3) | public class MouseWheelEventArgs : MouseEventArgs
    method MouseWheelEventArgs (line 7) | public MouseWheelEventArgs()
    method MouseWheelEventArgs (line 11) | public MouseWheelEventArgs(PointerWheelEventArgs args)
    method GetPosition (line 35) | public override Point GetPosition(Visual? relativeTo)

FILE: Nodify/Compatibility/PanelUtilities.cs
  class PanelUtilities (line 9) | internal static class PanelUtilities
    method AffectsParentArrangeInvalidate (line 11) | private static void AffectsParentArrangeInvalidate<TPanel>(AvaloniaPro...
    method AffectsParentArrange (line 19) | public static void AffectsParentArrange<TPanel>(params AvaloniaPropert...
    class AnonuymousObserver (line 28) | private class AnonuymousObserver<T> : IObserver<T>
      method AnonuymousObserver (line 34) | public AnonuymousObserver(Action<T> onNext, Action<Exception>? onErr...
      method OnCompleted (line 41) | public void OnCompleted() => _onCompleted?.Invoke();
      method OnError (line 42) | public void OnError(Exception error) => _onError?.Invoke(error);
      method OnNext (line 43) | public void OnNext(T value) => _onNext?.Invoke(value);

FILE: Nodify/Compatibility/VisualTreeHelper.cs
  class VisualTreeHelper (line 3) | internal static class VisualTreeHelper
    method GetParent (line 5) | public static DependencyObject? GetParent(DependencyObject? x)
    method HitTest (line 10) | public static void HitTest(UIElement element,
    method HitTest (line 26) | public static void HitTest(UIElement element,
  class PointHitTestParameters (line 35) | internal class PointHitTestParameters
    method PointHitTestParameters (line 37) | public PointHitTestParameters(Point position)
  type HitTestFilterBehavior (line 45) | internal enum HitTestFilterBehavior
  class GeometryHitTestParameters (line 54) | internal class GeometryHitTestParameters
    method GeometryHitTestParameters (line 56) | public GeometryHitTestParameters(Geometry geometry)
  type HitTestResultBehavior (line 64) | internal enum HitTestResultBehavior
  class HitTestResult (line 70) | internal class HitTestResult
    method HitTestResult (line 72) | public HitTestResult(Visual visualHit)

FILE: Nodify/Connections/BaseConnection.Avalonia.cs
  class BaseConnection (line 5) | public partial class BaseConnection
    method BaseConnection (line 9) | static BaseConnection()

FILE: Nodify/Connections/BaseConnection.cs
  type ConnectionOffsetMode (line 16) | public enum ConnectionOffsetMode
  type ConnectionDirection (line 47) | public enum ConnectionDirection
  type ArrowHeadEnds (line 63) | public enum ArrowHeadEnds
  type ArrowHeadShape (line 89) | public enum ArrowHeadShape
  class BaseConnection (line 110) | public abstract partial class BaseConnection : WpfShape
    method OnIsSelectedChanged (line 146) | private static void OnIsSelectedChanged(DependencyObject d, Dependency...
    method GetIsSelectable (line 155) | public static bool GetIsSelectable(UIElement elem)
    method SetIsSelectable (line 158) | public static void SetIsSelectable(UIElement elem, bool value)
    method GetIsSelected (line 161) | public static bool GetIsSelected(UIElement elem)
    method SetIsSelected (line 164) | public static void SetIsSelected(UIElement? elem, bool value)
    method OnIsAnimatingDirectionalArrowsChanged (line 167) | private static void OnIsAnimatingDirectionalArrowsChanged(DependencyOb...
    method OnDirectionalArrowsAnimationDurationChanged (line 180) | private static void OnDirectionalArrowsAnimationDurationChanged(Depend...
    method OnOutlinePenChanged (line 189) | private static void OnOutlinePenChanged(DependencyObject d, Dependency...
    method CreateDefiningGeometry (line 481) | protected override Geometry CreateDefiningGeometry()
    method DrawLineGeometry (line 522) | protected abstract ((Point ArrowStartSource, Point ArrowStartTarget), ...
    method DrawDirectionalArrowsGeometry (line 524) | protected virtual void DrawDirectionalArrowsGeometry(StreamGeometryCon...
    method DrawDirectionalArrowheadGeometry (line 526) | protected virtual void DrawDirectionalArrowheadGeometry(StreamGeometry...
    method DrawArrowGeometry (line 543) | protected virtual void DrawArrowGeometry(StreamGeometryContext context...
    method DrawDefaultArrowhead (line 560) | protected virtual void DrawDefaultArrowhead(StreamGeometryContext cont...
    method DrawRectangleArrowhead (line 590) | protected virtual void DrawRectangleArrowhead(StreamGeometryContext co...
    method DrawEllipseArrowhead (line 626) | protected virtual void DrawEllipseArrowhead(StreamGeometryContext cont...
    method GetOffset (line 661) | protected virtual (Vector SourceOffset, Vector TargetOffset) GetOffset()
    method GetTextPosition (line 743) | protected virtual Point GetTextPosition(FormattedText text, Point sour...
    method StartAnimation (line 757) | public void StartAnimation(double duration = 1.5d)
    method StopAnimation (line 765) | public void StopAnimation()
    method OnPointerPressed (line 770) | protected override void OnPointerPressed(PointerPressedEventArgs e)
    method OnSplit (line 793) | protected internal void OnSplit(Point splitLocation)
    method OnDisconnect (line 811) | protected internal void OnDisconnect()
    method OnPointerReleased (line 828) | protected override void OnPointerReleased(PointerReleasedEventArgs e)
    method GetOutlinePen (line 837) | private Pen GetOutlinePen()
    method Render (line 842) | protected override void Render(DrawingContext drawingContext)

FILE: Nodify/Connections/CircuitConnection.cs
  class CircuitConnection (line 11) | public class CircuitConnection : LineConnection
    method CircuitConnection (line 26) | static CircuitConnection()
    method DrawLineGeometry (line 33) | protected override ((Point ArrowStartSource, Point ArrowStartTarget), ...
    method GetTextPosition (line 60) | protected override Point GetTextPosition(FormattedText text, Point sou...
    method DrawDirectionalArrowsGeometry (line 75) | protected override void DrawDirectionalArrowsGeometry(StreamGeometryCo...
    method GetLinePoints (line 90) | private (Point P0, Point P1, Point P2) GetLinePoints(in Point source, ...
    method GetControlPoint (line 111) | private Point GetControlPoint(in Point source, in Point target)

FILE: Nodify/Connections/Connection.cs
  class Connection (line 11) | public class Connection : BaseConnection
    method Connection (line 13) | static Connection()
    method DrawLineGeometry (line 22) | protected override ((Point ArrowStartSource, Point ArrowStartTarget), ...
    method DrawDirectionalArrowsGeometry (line 34) | protected override void DrawDirectionalArrowsGeometry(StreamGeometryCo...
    method GetTextPosition (line 49) | protected override Point GetTextPosition(FormattedText text, Point sou...
    method GetBezierControlPoints (line 56) | private (Point P0, Point P1, Point P2, Point P3) GetBezierControlPoint...
    method GetBezierTangent (line 93) | private static Vector GetBezierTangent(Point P0, Point P1, Point P2, P...
    method InterpolateCubicBezier (line 102) | protected static Point InterpolateCubicBezier(Point P0, Point P1, Poin...

FILE: Nodify/Connections/ConnectionContainer.Avalonia.cs
  class ConnectionContainer (line 3) | internal partial class ConnectionContainer
    method ConnectionContainer (line 5) | static ConnectionContainer()

FILE: Nodify/Connections/ConnectionContainer.cs
  class ConnectionContainer (line 7) | internal partial class ConnectionContainer : ContentPresenter
    method OnIsSelectedChanged (line 14) | private static void OnIsSelectedChanged(DependencyObject d, Dependency...
    method ConnectionContainer (line 75) | internal ConnectionContainer(ConnectionsMultiSelector selector)
    method OnSelectedChanged (line 85) | protected void OnSelectedChanged(bool newValue)
    method OnPointerPressed (line 92) | protected override void OnPointerPressed(PointerPressedEventArgs e)
    method OnPointerReleased (line 100) | protected override void OnPointerReleased(PointerReleasedEventArgs e)

FILE: Nodify/Connections/ConnectionsMultiSelector.Avalonia.cs
  class ConnectionsMultiSelector (line 3) | internal partial class ConnectionsMultiSelector
    method ConnectionsMultiSelector (line 5) | static ConnectionsMultiSelector()

FILE: Nodify/Connections/ConnectionsMultiSelector.cs
  class ConnectionsMultiSelector (line 9) | internal partial class ConnectionsMultiSelector : MultiSelector
    method OnCanSelectMultipleItemsChanged (line 14) | private static void OnCanSelectMultipleItemsChanged(DependencyObject d...
    method CoerceCanSelectMultipleItems (line 17) | private static bool CoerceCanSelectMultipleItems(DependencyObject d, b...
    method OnSelectedItemsSourceChanged (line 20) | private static void OnSelectedItemsSourceChanged(DependencyObject d, D...
    method GetContainerForItemOverride (line 47) | protected override DependencyObject GetContainerForItemOverride()
    method IsItemItsOwnContainerOverride (line 52) | protected override bool IsItemItsOwnContainerOverride(object item)
    method OnSelectedItemsSourceChanged (line 55) | private void OnSelectedItemsSourceChanged(IList oldValue, IList newValue)
    method OnSelectedItemsChanged (line 81) | private void OnSelectedItemsChanged(object? sender, NotifyCollectionCh...
    method OnSelectionChanged (line 118) | protected override void OnSelectionChanged(SelectionModelSelectionChan...

FILE: Nodify/Connections/Connector.Avalonia.cs
  class Connector (line 6) | public partial class Connector
    method OnPropertyChanged (line 28) | protected override void OnPropertyChanged(AvaloniaPropertyChangedEvent...
    method ReleaseMouseCapture (line 35) | protected override void ReleaseMouseCapture()

FILE: Nodify/Connections/Connector.cs
  class Connector (line 11) | [TemplatePart(Name = ElementConnector, Type = typeof(FrameworkElement))]
    method Connector (line 103) | static Connector()
    method OnApplyTemplate (line 159) | protected override void OnApplyTemplate(TemplateAppliedEventArgs e)
    method TrySetAnchorUpdateEvents (line 175) | private void TrySetAnchorUpdateEvents(bool value)
    method OnContainerSizeChanged (line 201) | private void OnContainerSizeChanged(object? sender, SizeChangedEventAr...
    method OnConnectorLoaded (line 204) | private void OnConnectorLoaded(object? sender, RoutedEventArgs? e)
    method OnConnectorUnloaded (line 207) | private void OnConnectorUnloaded(object? sender, RoutedEventArgs e)
    method OnIsConnectedChanged (line 210) | private static void OnIsConnectedChanged(DependencyObject d, Dependenc...
    method OnSizeChanged (line 221) | protected override void OnSizeChanged(SizeChangedInfo sizeInfo)
    method OnLocationChanged (line 237) | private void OnLocationChanged(object? sender, RoutedEventArgs e)
    method OnViewportUpdated (line 240) | private void OnViewportUpdated(object? sender, RoutedEventArgs args)
    method UpdateAnchorOptimized (line 252) | protected void UpdateAnchorOptimized(Point location)
    method UpdateAnchorBasedOnLocation (line 270) | private void UpdateAnchorBasedOnLocation(NodifyEditor editor, Point lo...
    method UpdateAnchor (line 288) | protected void UpdateAnchor(Point location)
    method UpdateAnchor (line 304) | public void UpdateAnchor()
    method OnPointerCaptureLost (line 317) | protected override void OnPointerCaptureLost(PointerCaptureLostEventAr...
    method OnMouseDown (line 329) | protected override void OnMouseDown(MouseButtonEventArgs e)
    method OnMouseUp (line 357) | protected override void OnMouseUp(MouseButtonEventArgs e)
    method OnKeyUp (line 400) | protected override void OnKeyUp(KeyEventArgs e)
    method OnMouseMove (line 411) | protected override void OnMouseMove(MouseEventArgs e)
    method OnConnectorDrag (line 420) | protected virtual void OnConnectorDrag(Vector offset, MouseEventArgs e)
    method OnConnectorDragStarted (line 434) | protected virtual void OnConnectorDragStarted(MouseButtonEventArgs e)
    method OnConnectorDragCompleted (line 457) | protected virtual void OnConnectorDragCompleted(bool cancel = false, M...
    method OnDisconnect (line 477) | protected virtual void OnDisconnect()

FILE: Nodify/Connections/CuttingLine.cs
  class CuttingLine (line 7) | public class CuttingLine : WpfShape
    method GetIsOverElement (line 17) | public static bool GetIsOverElement(UIElement elem)
    method SetIsOverElement (line 20) | public static void SetIsOverElement(UIElement elem, bool value)
    method CreateDefiningGeometry (line 46) | protected override Geometry? CreateDefiningGeometry()
    method CuttingLine (line 62) | static CuttingLine()
    method Render (line 70) | protected override void Render(DrawingContext drawingContext)

FILE: Nodify/Connections/LineConnection.cs
  class LineConnection (line 11) | public class LineConnection : BaseConnection
    method LineConnection (line 24) | static LineConnection()
    method DrawLineGeometry (line 31) | protected override ((Point ArrowStartSource, Point ArrowStartTarget), ...
    method DrawDefaultArrowhead (line 51) | protected override void DrawDefaultArrowhead(StreamGeometryContext con...
    method DrawDirectionalArrowsGeometry (line 76) | protected override void DrawDirectionalArrowsGeometry(StreamGeometryCo...
    method GetLinePoints (line 91) | private (Point P0, Point P1) GetLinePoints(Point source, Point target)
    method InterpolateLineSegment (line 103) | protected static Point InterpolateLineSegment(Point p0, Point p1, doub...
    method InterpolateLine (line 108) | protected static ((Point SegmentStart, Point SegmentEnd), Point Interp...
    method InterpolateLine (line 132) | protected static ((Point SegmentStart, Point SegmentEnd), Point Interp...
    method AddSmoothCorner (line 150) | protected static void AddSmoothCorner(StreamGeometryContext context, P...

FILE: Nodify/Connections/PendingConnection.Avalonia.cs
  class PendingConnection (line 6) | public partial class PendingConnection
    method OnPropertyChanged (line 8) | protected override void OnPropertyChanged(AvaloniaPropertyChangedEvent...

FILE: Nodify/Connections/PendingConnection.cs
  class PendingConnection (line 12) | public partial class PendingConnection : ContentControl
    method GetAllowOnlyConnectorsAttached (line 158) | internal static bool GetAllowOnlyConnectorsAttached(UIElement elem)
    method SetAllowOnlyConnectorsAttached (line 161) | internal static void SetAllowOnlyConnectorsAttached(UIElement elem, bo...
    method GetIsOverElement (line 164) | public static bool GetIsOverElement(UIElement elem)
    method SetIsOverElement (line 167) | public static void SetIsOverElement(UIElement elem, bool value)
    method OnAllowOnlyConnectorsChanged (line 170) | private static void OnAllowOnlyConnectorsChanged(DependencyObject d, D...
    method PendingConnection (line 222) | static PendingConnection()
    method OnApplyTemplate (line 234) | protected override void OnApplyTemplate(TemplateAppliedEventArgs e)
    method OnPendingConnectionStarted (line 251) | protected virtual void OnPendingConnectionStarted(object? sender, Pend...
    method OnPendingConnectionDrag (line 276) | protected virtual void OnPendingConnectionDrag(object? sender, Pending...
    method OnPendingConnectionCompleted (line 321) | protected virtual void OnPendingConnectionCompleted(object? sender, Pe...
    method GetPotentialConnector (line 360) | internal static FrameworkElement? GetPotentialConnector(NodifyEditor e...

FILE: Nodify/Connections/StepConnection.cs
  type ConnectorPosition (line 8) | public enum ConnectorPosition
  class StepConnection (line 16) | public class StepConnection : LineConnection
    method OnConnectorPositionChanged (line 21) | private static void OnConnectorPositionChanged(DependencyObject d, Dep...
    method StepConnection (line 29) | static StepConnection()
    method CoerceSourceOrientation (line 40) | private static Orientation CoerceSourceOrientation(DependencyObject d,...
    method CoerceTargetOrientation (line 48) | private static Orientation CoerceTargetOrientation(DependencyObject d,...
    method CoerceConnectionDirection (line 56) | private static ConnectionDirection CoerceConnectionDirection(Dependenc...
    method DrawLineGeometry (line 82) | protected override ((Point ArrowStartSource, Point ArrowStartTarget), ...
    method GetTextPosition (line 133) | protected override Point GetTextPosition(FormattedText text, Point sou...
    method DrawDirectionalArrowsGeometry (line 158) | protected override void DrawDirectionalArrowsGeometry(StreamGeometryCo...
    method GetLinePoints (line 173) | private (Point P0, Point P1, Point P2, Point P3) GetLinePoints(Point s...

FILE: Nodify/DecoratorContainer.cs
  class DecoratorContainer (line 9) | public class DecoratorContainer : ContentControl, INodifyCanvasItem
    method OnLocationChanged (line 34) | private static void OnLocationChanged(DependencyObject d, DependencyPr...
    method OnLocationChanged (line 58) | protected void OnLocationChanged()
    method DecoratorContainer (line 65) | static DecoratorContainer()
    method OnSizeChanged (line 73) | protected override void OnSizeChanged(SizeChangedInfo sizeInfo)

FILE: Nodify/DecoratorsControl.cs
  class DecoratorsControl (line 9) | internal class DecoratorsControl : ItemsControl
    method NeedsContainerOverride (line 14) | protected override bool NeedsContainerOverride(object? item, int index...
    method CreateContainerForItemOverride (line 18) | protected override Control CreateContainerForItemOverride(object? item...

FILE: Nodify/EditorCommands.cs
  class EditorCommands (line 11) | public static class EditorCommands
    type Alignment (line 16) | public enum Alignment
    method Register (line 70) | internal static void Register(Type type)
    method OnQueryAlignStatus (line 80) | private static void OnQueryAlignStatus(object? sender, CanExecuteRoute...
    method OnAlign (line 88) | private static void OnAlign(object? sender, ExecutedRoutedEventArgs e)
    method AlignContainers (line 128) | private static void AlignContainers(List<ItemContainer> containers, Al...
    method OnQueryBringIntoViewStatus (line 167) | private static void OnQueryBringIntoViewStatus(object? sender, CanExec...
    method OnBringIntoView (line 175) | private static void OnBringIntoView(object? sender, ExecutedRoutedEven...
    method OnQueryFitToScreenStatus (line 194) | private static void OnQueryFitToScreenStatus(object? sender, CanExecut...
    method OnFitToScreen (line 202) | private static void OnFitToScreen(object? sender, ExecutedRoutedEventA...
    method OnQuerySelectAllStatus (line 210) | private static void OnQuerySelectAllStatus(object? sender, CanExecuteR...
    method OnSelectAll (line 218) | private static void OnSelectAll(object? sender, ExecutedRoutedEventArg...
    method OnQueryStatusZoomIn (line 226) | private static void OnQueryStatusZoomIn(object? sender, CanExecuteRout...
    method OnZoomIn (line 234) | private static void OnZoomIn(object? sender, ExecutedRoutedEventArgs e)
    method OnQueryStatusZoomOut (line 242) | private static void OnQueryStatusZoomOut(object? sender, CanExecuteRou...
    method OnZoomOut (line 250) | private static void OnZoomOut(object? sender, ExecutedRoutedEventArgs e)

FILE: Nodify/EditorGestures.cs
  class EditorGestures (line 6) | public class EditorGestures
    class SelectionGestures (line 11) | public class SelectionGestures
      method SelectionGestures (line 16) | public SelectionGestures(MouseAction mouseAction)
      method SelectionGestures (line 26) | public SelectionGestures() : this(MouseAction.LeftClick)
      method Apply (line 55) | public void Apply(SelectionGestures gestures)
    class ItemContainerGestures (line 67) | public class ItemContainerGestures
      method ItemContainerGestures (line 69) | public ItemContainerGestures()
      method Apply (line 99) | public void Apply(ItemContainerGestures gestures)
    class NodifyEditorGestures (line 108) | public class NodifyEditorGestures
      method NodifyEditorGestures (line 110) | public NodifyEditorGestures()
      method Apply (line 183) | public void Apply(NodifyEditorGestures gestures)
    class ConnectorGestures (line 202) | public class ConnectorGestures
      method ConnectorGestures (line 204) | public ConnectorGestures()
      method Apply (line 225) | public void Apply(ConnectorGestures gestures)
    class ConnectionGestures (line 234) | public class ConnectionGestures
      method ConnectionGestures (line 236) | public ConnectionGestures()
      method Apply (line 256) | public void Apply(ConnectionGestures gestures)
    class GroupingNodeGestures (line 265) | public class GroupingNodeGestures
      method Apply (line 275) | public void Apply(GroupingNodeGestures gestures)
    class MinimapGestures (line 282) | public class MinimapGestures
      method MinimapGestures (line 284) | public MinimapGestures()
      method Apply (line 299) | public void Apply(MinimapGestures gestures)
    method Apply (line 326) | public void Apply(EditorGestures gestures)

FILE: Nodify/EditorStates/ContainerDefaultState.cs
  class ContainerDefaultState (line 6) | public class ContainerDefaultState : ContainerState
    method ContainerDefaultState (line 13) | public ContainerDefaultState(ItemContainer container) : base(container)
    method ReEnter (line 18) | public override void ReEnter(ContainerState from)
    method HandleMouseDown (line 30) | public override void HandleMouseDown(MouseButtonEventArgs e)
    method HandleMouseUp (line 48) | public override void HandleMouseUp(MouseButtonEventArgs e)
    method HandleMouseMove (line 88) | public override void HandleMouseMove(MouseEventArgs e)

FILE: Nodify/EditorStates/ContainerDraggingState.cs
  class ContainerDraggingState (line 8) | public class ContainerDraggingState : ContainerState
    method ContainerDraggingState (line 17) | public ContainerDraggingState(ItemContainer container) : base(container)
    method Enter (line 22) | public override void Enter(ContainerState? from, MouseEventArgs? e)
    method Exit (line 37) | public override void Exit()
    method HandleMouseMove (line 48) | public override void HandleMouseMove(MouseEventArgs e)
    method HandleMouseUp (line 61) | public override void HandleMouseUp(MouseButtonEventArgs e)
    method HandleKeyUp (line 87) | public override void HandleKeyUp(KeyEventArgs e)

FILE: Nodify/EditorStates/ContainerState.cs
  class ContainerState (line 6) | public abstract class ContainerState
    method ContainerState (line 10) | public ContainerState(ItemContainer container)
    method HandleMouseDown (line 22) | public virtual void HandleMouseDown(MouseButtonEventArgs e) { }
    method HandleMouseUp (line 25) | public virtual void HandleMouseUp(MouseButtonEventArgs e) { }
    method HandleMouseMove (line 28) | public virtual void HandleMouseMove(MouseEventArgs e) { }
    method HandleMouseWheel (line 31) | public virtual void HandleMouseWheel(MouseWheelEventArgs e) { }
    method HandleKeyUp (line 34) | public virtual void HandleKeyUp(KeyEventArgs e) { }
    method HandleKeyDown (line 37) | public virtual void HandleKeyDown(KeyEventArgs e) { }
    method Enter (line 41) | public virtual void Enter(ContainerState? from, MouseEventArgs? e) { }
    method Exit (line 44) | public virtual void Exit() { }
    method ReEnter (line 48) | public virtual void ReEnter(ContainerState from) { }
    method PushState (line 53) | public virtual void PushState(ContainerState newState, MouseEventArgs ...
    method PopState (line 56) | public virtual void PopState() => Container.PopState();

FILE: Nodify/EditorStates/EditorCuttingState.cs
  class EditorCuttingState (line 8) | public class EditorCuttingState : EditorState
    method EditorCuttingState (line 15) | public EditorCuttingState(NodifyEditor editor) : base(editor)
    method Enter (line 19) | public override void Enter(EditorState? from, MouseEventArgs e)
    method Exit (line 30) | public override void Exit()
    method HandleMouseUp (line 45) | public override void HandleMouseUp(MouseButtonEventArgs e)
    method HandleMouseMove (line 61) | public override void HandleMouseMove(MouseEventArgs e)
    method ResetConnectionStyle (line 80) | private void ResetConnectionStyle()
    method HandleKeyUp (line 91) | public override void HandleKeyUp(KeyEventArgs e)

FILE: Nodify/EditorStates/EditorDefaultState.cs
  class EditorDefaultState (line 23) | public class EditorDefaultState : EditorState
    method EditorDefaultState (line 27) | public EditorDefaultState(NodifyEditor editor) : base(editor)
    method HandleMouseDown (line 32) | public override void HandleMouseDown(MouseButtonEventArgs e)
    method HandleMouseWheel (line 55) | public override void HandleMouseWheel(MouseWheelEventArgs e)

FILE: Nodify/EditorStates/EditorPanningState.cs
  class EditorPanningState (line 7) | public class EditorPanningState : EditorState
    method EditorPanningState (line 15) | public EditorPanningState(NodifyEditor editor) : base(editor)
    method Exit (line 20) | public override void Exit()
    method Enter (line 24) | public override void Enter(EditorState? from, MouseEventArgs e)
    method HandleMouseMove (line 33) | public override void HandleMouseMove(MouseEventArgs e)
    method HandleMouseUp (line 41) | public override void HandleMouseUp(MouseButtonEventArgs e)

FILE: Nodify/EditorStates/EditorPushingItemsState.cs
  class EditorPushingItemsState (line 8) | public class EditorPushingItemsState : EditorState
    method EditorPushingItemsState (line 15) | public EditorPushingItemsState(NodifyEditor editor) : base(editor)
    method Enter (line 19) | public override void Enter(EditorState? from, MouseEventArgs e)
    method Exit (line 26) | public override void Exit()
    method HandleMouseMove (line 43) | public override void HandleMouseMove(MouseEventArgs e)
    method HandleMouseUp (line 63) | public override void HandleMouseUp(MouseButtonEventArgs e)
    method HandleKeyUp (line 79) | public override void HandleKeyUp(KeyEventArgs e)

FILE: Nodify/EditorStates/EditorSelectingState.cs
  class EditorSelectingState (line 7) | public class EditorSelectingState : EditorState
    method EditorSelectingState (line 18) | public EditorSelectingState(NodifyEditor editor, SelectionType type) :...
    method Enter (line 25) | public override void Enter(EditorState? from, MouseEventArgs e)
    method Exit (line 34) | public override void Exit()
    method HandleMouseMove (line 47) | public override void HandleMouseMove(MouseEventArgs e)
    method HandleMouseDown (line 51) | public override void HandleMouseDown(MouseButtonEventArgs e)
    method HandleMouseUp (line 60) | public override void HandleMouseUp(MouseButtonEventArgs e)
    method HandleAutoPanning (line 74) | public override void HandleAutoPanning(MouseEventArgs e)
    method HandleKeyUp (line 77) | public override void HandleKeyUp(KeyEventArgs e)

FILE: Nodify/EditorStates/EditorState.cs
  class EditorState (line 6) | public abstract class EditorState
    method EditorState (line 10) | public EditorState(NodifyEditor editor)
    method HandleMouseDown (line 19) | public virtual void HandleMouseDown(MouseButtonEventArgs e) { }
    method HandleMouseUp (line 22) | public virtual void HandleMouseUp(MouseButtonEventArgs e) { }
    method HandleMouseMove (line 25) | public virtual void HandleMouseMove(MouseEventArgs e) { }
    method HandleMouseWheel (line 28) | public virtual void HandleMouseWheel(MouseWheelEventArgs e) { }
    method HandleAutoPanning (line 32) | public virtual void HandleAutoPanning(MouseEventArgs e) { }
    method HandleKeyUp (line 35) | public virtual void HandleKeyUp(KeyEventArgs e) { }
    method HandleKeyDown (line 38) | public virtual void HandleKeyDown(KeyEventArgs e) { }
    method Enter (line 42) | public virtual void Enter(EditorState? from, MouseEventArgs e) { }
    method Exit (line 45) | public virtual void Exit() { }
    method ReEnter (line 49) | public virtual void ReEnter(EditorState from) { }
    method PushState (line 53) | public virtual void PushState(EditorState newState, MouseEventArgs e) ...
    method PopState (line 56) | public virtual void PopState() => Editor.PopState();

FILE: Nodify/Events/ConnectionEventArgs.cs
  class ConnectionEventArgs (line 16) | public class ConnectionEventArgs : RoutedEventArgs
    method ConnectionEventArgs (line 22) | public ConnectionEventArgs(object connection)

FILE: Nodify/Events/ConnectorEventArgs.cs
  class ConnectorEventArgs (line 16) | public class ConnectorEventArgs : RoutedEventArgs
    method ConnectorEventArgs (line 22) | public ConnectorEventArgs(object connector)

FILE: Nodify/Events/PendingConnectionEventArgs.cs
  class PendingConnectionEventArgs (line 16) | public class PendingConnectionEventArgs : RoutedEventArgs
    method PendingConnectionEventArgs (line 24) | public PendingConnectionEventArgs(object sourceConnector, MouseEventAr...
    method GetPosition (line 60) | public Point GetPosition(Visual? relativeTo)

FILE: Nodify/Events/ResizeEventArgs.cs
  class ResizeEventArgs (line 16) | public class ResizeEventArgs : RoutedEventArgs
    method ResizeEventArgs (line 23) | public ResizeEventArgs(Size previousSize, Size newSize)

FILE: Nodify/Helpers/BindableStyleClasses.cs
  class BindableStyleClasses (line 3) | internal class BindableStyleClasses
    method BindableStyleClasses (line 5) | static BindableStyleClasses()
    method HandleClassesChanged (line 13) | private static void HandleClassesChanged(StyledElement element, Avalon...
    method SetClasses (line 20) | public static void SetClasses(StyledElement element, object? classes)
    method GetClasses (line 26) | public static object? GetClasses(StyledElement element)

FILE: Nodify/Helpers/BoxValue.cs
  class BoxValue (line 5) | public static class BoxValue

FILE: Nodify/Helpers/DependencyObjectExtensions.cs
  class DependencyObjectExtensions (line 11) | internal static class DependencyObjectExtensions
    method GetParentOfType (line 13) | public static T? GetParentOfType<T>(this DependencyObject child)
    method GetChildOfType (line 31) | public static T? GetChildOfType<T>(this DependencyObject? depObj) wher...
    method GetElementUnderMouse (line 44) | public static T? GetElementUnderMouse<T>(this UIElement container, Poi...
    method GetIntersectingElements (line 75) | public static List<FrameworkElement> GetIntersectingElements(this UIEl...
    method StartAnimation (line 102) | public static async System.Threading.Tasks.Task StartAnimation<T>(this...
    method StartLoopingAnimation (line 127) | public static void StartLoopingAnimation<T>(this UIElement animatableE...
    method CancelAnimation (line 150) | public static void CancelAnimation<T>(this UIElement animatableElement...

FILE: Nodify/Helpers/DraggingOptimized.cs
  class DraggingOptimized (line 11) | internal sealed class DraggingOptimized : IDraggingStrategy
    method DraggingOptimized (line 17) | public DraggingOptimized(IEnumerable<ItemContainer> containers, uint g...
    method Abort (line 23) | public void Abort()
    method End (line 39) | public void End()
    method Update (line 64) | public void Update(Vector change)

FILE: Nodify/Helpers/DraggingSimple.cs
  type IDraggingStrategy (line 7) | internal interface IDraggingStrategy
    method Update (line 9) | void Update(Vector change);
    method End (line 10) | void End();
    method Abort (line 11) | void Abort();
  class DraggingSimple (line 14) | internal sealed class DraggingSimple : IDraggingStrategy
    method DraggingSimple (line 21) | public DraggingSimple(IEnumerable<ItemContainer> containers, uint grid...
    method Abort (line 27) | public void Abort()
    method End (line 38) | public void End()
    method Update (line 59) | public void Update(Vector change)

FILE: Nodify/Helpers/MathExtensions.cs
  class MathExtensions (line 3) | internal static class MathExtensions
    method WrapToRange (line 6) | public static double WrapToRange(this double value, double min, double...
    method Clamp (line 14) | public static double Clamp(this double value, double min, double max)

FILE: Nodify/Helpers/MultiGesture.cs
  class MultiGesture (line 6) | public class MultiGesture : InputGesture
    type Match (line 11) | public enum Match
    method MultiGesture (line 25) | public MultiGesture(Match match, params InputGesture[] gestures)
    method Matches (line 32) | public override bool Matches(object targetElement, EventArgs inputEven...
    method MatchesAll (line 42) | private bool MatchesAll(object targetElement, EventArgs inputEventArgs)
    method MatchesAny (line 55) | private bool MatchesAny(object targetElement, EventArgs inputEventArgs)
  class AnyGesture (line 70) | public sealed class AnyGesture : MultiGesture
    method AnyGesture (line 72) | public AnyGesture(params InputGesture[] gestures) : base(Match.Any, ge...
  class AllGestures (line 78) | public sealed class AllGestures : MultiGesture
    method AllGestures (line 80) | public AllGestures(params InputGesture[] gestures) : base(Match.All, g...
  class InputGestureRef (line 89) | public sealed class InputGestureRef : InputGesture
    method InputGestureRef (line 94) | private InputGestureRef() { }
    method Matches (line 96) | public override bool Matches(object targetElement, EventArgs inputEven...

FILE: Nodify/Helpers/PushItemsStrategy.cs
  type IPushStrategy (line 9) | internal interface IPushStrategy
    method Start (line 11) | Rect Start(Point position);
    method Push (line 12) | Rect Push(Vector amount);
    method End (line 13) | Rect End();
    method Cancel (line 14) | Rect Cancel();
    method OnViewportChanged (line 15) | Rect OnViewportChanged();
  class BasePushStrategy (line 18) | internal abstract class BasePushStrategy : IPushStrategy
    method BasePushStrategy (line 28) | public BasePushStrategy(NodifyEditor editor)
    method Start (line 33) | public Rect Start(Point position)
    method Push (line 44) | public Rect Push(Vector amount)
    method End (line 60) | public Rect End()
    method Cancel (line 67) | public Rect Cancel()
    method GetFilteredContainers (line 74) | protected abstract IEnumerable<ItemContainer> GetFilteredContainers(Po...
    method GetInitialPosition (line 75) | protected abstract double GetInitialPosition(Point position);
    method GetPushOffset (line 76) | protected abstract Vector GetPushOffset(Vector offset);
    method CalculatePushedArea (line 77) | protected abstract Rect CalculatePushedArea(double position, double of...
    method OnViewportChanged (line 78) | public abstract Rect OnViewportChanged();
  class HorizontalPushStrategy (line 81) | internal sealed class HorizontalPushStrategy : BasePushStrategy
    method HorizontalPushStrategy (line 83) | public HorizontalPushStrategy(NodifyEditor editor) : base(editor)
    method GetFilteredContainers (line 87) | protected override IEnumerable<ItemContainer> GetFilteredContainers(Po...
    method GetInitialPosition (line 90) | protected override double GetInitialPosition(Point position)
    method GetPushOffset (line 93) | protected override Vector GetPushOffset(Vector offset)
    method CalculatePushedArea (line 96) | protected override Rect CalculatePushedArea(double position, double of...
    method OnViewportChanged (line 99) | public override Rect OnViewportChanged()
  class VerticalPushStrategy (line 103) | internal sealed class VerticalPushStrategy : BasePushStrategy
    method VerticalPushStrategy (line 105) | public VerticalPushStrategy(NodifyEditor editor) : base(editor)
    method GetFilteredContainers (line 109) | protected override IEnumerable<ItemContainer> GetFilteredContainers(Po...
    method GetInitialPosition (line 112) | protected override double GetInitialPosition(Point position)
    method GetPushOffset (line 115) | protected override Vector GetPushOffset(Vector offset)
    method CalculatePushedArea (line 118) | protected override Rect CalculatePushedArea(double position, double of...
    method OnViewportChanged (line 121) | public override Rect OnViewportChanged()

FILE: Nodify/Helpers/SelectionHelper.cs
  class SelectionHelper (line 12) | public sealed class SelectionHelper
    method SelectionHelper (line 22) | public SelectionHelper(NodifyEditor host)
    type SelectionType (line 26) | public enum SelectionType
    method Start (line 42) | public void Start(Point location, SelectionType selectionType)
    method Update (line 59) | public void Update(Point endLocation)
    method End (line 75) | public void End()
    method Abort (line 87) | public void Abort()
    method PreviewSelection (line 96) | private void PreviewSelection(Rect area)
    method PreviewUnselectAll (line 129) | private void PreviewUnselectAll()
    method PreviewSelectArea (line 139) | private void PreviewSelectArea(Rect area, bool append = false, bool fi...
    method PreviewUnselectArea (line 160) | private void PreviewUnselectArea(Rect area, bool fit = false)
    method PreviewSelectContainers (line 173) | private static void PreviewSelectContainers(IReadOnlyList<ItemContaine...
    method PreviewInvertSelection (line 181) | private void PreviewInvertSelection(Rect area, bool fit = false)
    method GetSelectionType (line 194) | internal static SelectionType GetSelectionType(MouseButtonEventArgs e)

FILE: Nodify/Helpers/UnscaleTransformConverter.cs
  class UnscaleTransformConverter (line 9) | internal class UnscaleTransformConverter : IValueConverter
    method Convert (line 11) | public object Convert(object value, Type targetType, object parameter,...
    method ConvertBack (line 18) | public object ConvertBack(object value, Type targetType, object parame...
  class ScaleDoubleConverter (line 24) | internal class ScaleDoubleConverter : IMultiValueConverter
    method Convert (line 26) | public object Convert(IList<object?> values, Type targetType, object p...
    method ConvertBack (line 33) | public object[] ConvertBack(object value, Type[] targetTypes, object p...
  class ScalePointConverter (line 39) | internal class ScalePointConverter : IMultiValueConverter
    method Convert (line 41) | public object? Convert(IList<object?> values, Type targetType, object?...
    method ConvertBack (line 49) | public object[] ConvertBack(object value, Type[] targetTypes, object p...

FILE: Nodify/ItemContainer.Avalonia.cs
  class ItemContainer (line 6) | public partial class ItemContainer
    method OnPropertyChanged (line 8) | protected override void OnPropertyChanged(AvaloniaPropertyChangedEvent...
    method UpdatePseudoClasses (line 17) | private void UpdatePseudoClasses()

FILE: Nodify/ItemContainer.cs
  class ItemContainer (line 19) | public partial class ItemContainer : ContentControl, INodifyCanvasItem, ...
    method OnLocationChanged (line 138) | private static void OnLocationChanged(DependencyObject d, DependencyPr...
    method OnLocationChanged (line 217) | protected void OnLocationChanged()
    method OnSelectedChanged (line 228) | protected void OnSelectedChanged(bool newValue)
    method OnIsSelectedChanged (line 237) | private static void OnIsSelectedChanged(DependencyObject d, Dependency...
    method OnPreviewLocationChanged (line 279) | protected internal void OnPreviewLocationChanged(Point newLocation)
    method ItemContainer (line 285) | static ItemContainer()
    method ItemContainer (line 300) | public ItemContainer(NodifyEditor editor)
    method OnApplyTemplate (line 307) | protected override void OnApplyTemplate(TemplateAppliedEventArgs e)
    method OnSizeChanged (line 315) | protected override void OnSizeChanged(SizeChangedInfo sizeInfo)
    method IsSelectableLocation (line 326) | protected virtual bool IsSelectableLocation(Point position)
    method IsSelectableInArea (line 338) | public virtual bool IsSelectableInArea(Rect area, bool isContained)
    method GetInitialState (line 353) | protected virtual ContainerState GetInitialState()
    method PushState (line 359) | public void PushState(ContainerState state, MouseEventArgs? e)
    method PopState (line 371) | public void PopState()
    method PopAllStates (line 384) | public void PopAllStates()
    method OnPointerPressed (line 393) | protected override void OnPointerPressed(PointerPressedEventArgs e)
    method OnPointerReleased (line 407) | protected override void OnPointerReleased(PointerReleasedEventArgs e)
    method OnPointerMoved (line 423) | protected override void OnPointerMoved(PointerEventArgs e)
    method OnPointerWheelChanged (line 429) | protected override void OnPointerWheelChanged(PointerWheelEventArgs e)
    method OnPointerCaptureLost (line 435) | protected override void OnPointerCaptureLost(PointerCaptureLostEventAr...
    method OnKeyUp (line 438) | protected override void OnKeyUp(KeyEventArgs e)
    method OnKeyDown (line 441) | protected override void OnKeyDown(KeyEventArgs e)

FILE: Nodify/Minimap/Minimap.Avalonia.cs
  class Minimap (line 3) | public partial class Minimap
    method NeedsContainerOverride (line 7) | protected override bool NeedsContainerOverride(object? item, int index...
    method CreateContainerForItemOverride (line 13) | protected override Control CreateContainerForItemOverride(object? item...

FILE: Nodify/Minimap/Minimap.cs
  class Minimap (line 13) | [StyleTypedProperty(Property = nameof(ViewportStyle), StyleTargetType = ...
    method Minimap (line 101) | static Minimap()
    method OnApplyTemplate (line 107) | protected override void OnApplyTemplate(TemplateAppliedEventArgs e)
    method OnPointerPressed (line 116) | protected override void OnPointerPressed(PointerPressedEventArgs e)
    method OnPointerMoved (line 131) | protected override void OnPointerMoved(PointerEventArgs e)
    method SetViewportLocation (line 139) | private void SetViewportLocation(Point location)
    method OnPointerReleased (line 157) | protected override void OnPointerReleased(PointerReleasedEventArgs e)
    method OnPointerWheelChanged (line 173) | protected override void OnPointerWheelChanged(PointerWheelEventArgs e)
    method GetContainerForItemOverride (line 191) | protected DependencyObject GetContainerForItemOverride()
    method IsItemItsOwnContainerOverride (line 194) | protected bool IsItemItsOwnContainerOverride(object item)

FILE: Nodify/Minimap/MinimapItem.cs
  class MinimapItem (line 6) | public class MinimapItem : ContentControl
    method MinimapItem (line 19) | static MinimapItem()

FILE: Nodify/Minimap/MinimapPanel.Avalonia.cs
  class MinimapPanel (line 3) | internal partial class MinimapPanel
    method MinimapPanel (line 7) | static MinimapPanel()

FILE: Nodify/Minimap/MinimapPanel.cs
  class MinimapPanel (line 7) | internal partial class MinimapPanel : Panel
    method MeasureOverride (line 50) | protected override Size MeasureOverride(Size availableSize)
    method ArrangeOverride (line 107) | protected override Size ArrangeOverride(Size finalSize)

FILE: Nodify/Minimap/SubtractConverter.cs
  class SubtractConverter (line 7) | internal class SubtractConverter : IMultiValueConverter
    method Convert (line 9) | public object? Convert(IList<object?> values, Type targetType, object?...
    method ConvertBack (line 17) | public object[] ConvertBack(object value, Type[] targetTypes, object p...

FILE: Nodify/Minimap/ZoomEventArgs.cs
  class ZoomEventArgs (line 16) | public class ZoomEventArgs : RoutedEventArgs
    method ZoomEventArgs (line 21) | public ZoomEventArgs(double zoom, Point location)

FILE: Nodify/Nodes/GroupingNode.cs
  type GroupingMovementMode (line 13) | public enum GroupingMovementMode
  class GroupingNode (line 29) | [TemplatePart(Name = ElementResizeThumb, Type = typeof(FrameworkElement))]
    method OnActualSizeChanged (line 74) | private static void OnActualSizeChanged(AvaloniaObject d, AvaloniaProp...
    method GroupingNode (line 172) | static GroupingNode()
    method OnZIndexPropertyChanged (line 180) | private static void OnZIndexPropertyChanged(DependencyObject d, Depend...
    method GroupingNode (line 192) | public GroupingNode()
    method OnNodeLoaded (line 202) | private void OnNodeLoaded(object? sender, RoutedEventArgs e)
    method OnNodeUnloaded (line 212) | private void OnNodeUnloaded(object? sender, RoutedEventArgs e)
    method OnHeaderMouseDown (line 221) | private void OnHeaderMouseDown(object? sender, PointerPressedEventArgs e)
    method OnApplyTemplate (line 272) | protected override void OnApplyTemplate(TemplateAppliedEventArgs e)
    method OnResize (line 289) | private void OnResize(object? sender, VectorEventArgs e)
    method OnResizeStarted (line 311) | private void OnResizeStarted(object? sender, VectorEventArgs e)
    method OnResizeCompleted (line 329) | private void OnResizeCompleted(object? sender, VectorEventArgs e)
    method OnHeaderSizeChanged (line 350) | private void OnHeaderSizeChanged(object? sender, SizeChangedEventArgs e)
    method CalculateDesiredHeaderSize (line 353) | private void CalculateDesiredHeaderSize()

FILE: Nodify/Nodes/KnotNode.cs
  class KnotNode (line 9) | public class KnotNode : ContentControl
    method KnotNode (line 11) | static KnotNode()

FILE: Nodify/Nodes/Node.Avalonia.cs
  class Node (line 6) | public partial class Node
    method OnPropertyChanged (line 8) | protected override void OnPropertyChanged(AvaloniaPropertyChangedEvent...

FILE: Nodify/Nodes/Node.cs
  class Node (line 13) | [TemplatePart(Name = ElementInputItemsControl, Type = typeof(ItemsContro...
    method OnFooterChanged (line 149) | private static void OnFooterChanged(DependencyObject d, DependencyProp...
    method Node (line 165) | static Node()
    method Node (line 171) | public Node()
    method OnApplyTemplate (line 177) | protected override void OnApplyTemplate(TemplateAppliedEventArgs e)
    method OnInputGroupStyleCollectionChanged (line 203) | private void OnInputGroupStyleCollectionChanged(object? sender, Notify...
    method OnOutputGroupStyleCollectionChanged (line 212) | private void OnOutputGroupStyleCollectionChanged(object? sender, Notif...
    method SynchronizeCollection (line 221) | private static void SynchronizeCollection(ObservableCollection<GroupSt...

FILE: Nodify/Nodes/NodeInput.Avalonia.cs
  class NodeInput (line 3) | public partial class NodeInput
    method NodeInput (line 6) | public NodeInput()
    method OnPropertyChanged (line 12) | protected override void OnPropertyChanged(AvaloniaPropertyChangedEvent...
    method UpdatePseudoClasses (line 19) | private void UpdatePseudoClasses()

FILE: Nodify/Nodes/NodeInput.cs
  class NodeInput (line 9) | public partial class NodeInput : Connector
    method NodeInput (line 54) | static NodeInput()

FILE: Nodify/Nodes/NodeOutput.Avalonia.cs
  class NodeOutput (line 3) | public partial class NodeOutput
    method NodeOutput (line 6) | public NodeOutput()
    method OnPropertyChanged (line 12) | protected override void OnPropertyChanged(AvaloniaPropertyChangedEvent...
    method UpdatePseudoClasses (line 19) | private void UpdatePseudoClasses()

FILE: Nodify/Nodes/NodeOutput.cs
  class NodeOutput (line 9) | public partial class NodeOutput : Connector
    method NodeOutput (line 54) | static NodeOutput()

FILE: Nodify/Nodes/StateNode.cs
  class StateNode (line 11) | [TemplatePart(Name = ElementContent, Type = typeof(UIElement))]
    method StateNode (line 56) | static StateNode()
    method OnApplyTemplate (line 62) | protected override void OnApplyTemplate(TemplateAppliedEventArgs e)
    method OnMouseDown (line 70) | protected override void OnMouseDown(MouseButtonEventArgs e)
    method OnMouseUp (line 80) | protected override void OnMouseUp(MouseButtonEventArgs e)

FILE: Nodify/NodifyCanvas.cs
  type INodifyCanvasItem (line 7) | public interface INodifyCanvasItem
    method Arrange (line 16) | void Arrange(Rect rect);
  class NodifyCanvas (line 20) | public class NodifyCanvas : Panel
    method ArrangeOverride (line 32) | protected override Size ArrangeOverride(Size arrangeSize)
    method MeasureOverride (line 79) | protected override Size MeasureOverride(Size constraint)
    method NodifyCanvas (line 92) | static NodifyCanvas()

FILE: Nodify/NodifyEditor.Avalonia.cs
  class NodifyEditor (line 3) | public partial class NodifyEditor
    method OnPropertyChanged (line 9) | protected override void OnPropertyChanged(AvaloniaPropertyChangedEvent...
    method OnPointerTouchPadGestureMagnify (line 25) | private void OnPointerTouchPadGestureMagnify(object? sender, PointerDe...
    method OnSourceReset (line 42) | private void OnSourceReset(object sender, EventArgs e)
    method OnPreviewPointerPressed (line 47) | private void OnPreviewPointerPressed(object sender, PointerPressedEven...
    method OnDataContextEndUpdate (line 67) | protected override void OnDataContextEndUpdate()
    method BringIntoView (line 103) | public bool BringIntoView(Control target, Rect targetRect) => false;
    method GetControlInDirection (line 105) | public Control? GetControlInDirection(NavigationDirection direction, C...
    method RaiseScrollInvalidated (line 107) | public void RaiseScrollInvalidated(EventArgs e) => ScrollInvalidated?....

FILE: Nodify/NodifyEditor.PushingItems.cs
  class NodifyEditor (line 9) | [StyleTypedProperty(Property = nameof(PushedAreaStyle), StyleTargetType ...
    method OnIsPushingItemsChanged (line 20) | private static void OnIsPushingItemsChanged(DependencyObject d, Depend...
    method OnItemsPushCompleted (line 34) | private void OnItemsPushCompleted()
    method OnItemsPushStarted (line 40) | private void OnItemsPushStarted()
    method StartPushingItems (line 97) | protected internal void StartPushingItems(Point location, Orientation ...
    method CancelPushingItems (line 113) | protected internal void CancelPushingItems()
    method PushItems (line 133) | protected internal void PushItems(Vector amount)
    method EndPushingItems (line 142) | protected internal void EndPushingItems()
    method UpdatePushedArea (line 153) | private void UpdatePushedArea()
    method CreatePushStrategy (line 161) | private IPushStrategy CreatePushStrategy(Orientation orientation)

FILE: Nodify/NodifyEditor.Scrolling.cs
  class NodifyEditor (line 10) | public partial class NodifyEditor : IScrollInfo
    method LineUp (line 41) | void IScrollInfo.LineUp()
    method LineDown (line 44) | void IScrollInfo.LineDown()
    method LineLeft (line 47) | void IScrollInfo.LineLeft()
    method LineRight (line 50) | void IScrollInfo.LineRight()
    method MouseWheelUp (line 53) | void IScrollInfo.MouseWheelUp() => ScrollInfo.LineUp();
    method MouseWheelDown (line 54) | void IScrollInfo.MouseWheelDown() => ScrollInfo.LineDown();
    method MouseWheelLeft (line 55) | void IScrollInfo.MouseWheelLeft() => ScrollInfo.LineLeft();
    method MouseWheelRight (line 56) | void IScrollInfo.MouseWheelRight() => ScrollInfo.LineRight();
    method PageUp (line 58) | void IScrollInfo.PageUp()
    method PageDown (line 61) | void IScrollInfo.PageDown()
    method PageLeft (line 64) | void IScrollInfo.PageLeft()
    method PageRight (line 67) | void IScrollInfo.PageRight()
    method MakeVisible (line 70) | Rect IScrollInfo.MakeVisible(Visual visual, Rect rectangle)
    method SetHorizontalOffset (line 86) | void IScrollInfo.SetHorizontalOffset(double offset)
    method SetVerticalOffset (line 92) | void IScrollInfo.SetVerticalOffset(double offset)
    method UpdateViewportLocationOnScroll (line 98) | private void UpdateViewportLocationOnScroll()
    method UpdateScrollbars (line 115) | private void UpdateScrollbars()

FILE: Nodify/NodifyEditor.cs
  class NodifyEditor (line 20) | [TemplatePart(Name = ElementItemsHost, Type = typeof(Panel))]
    method UpdateViewportTransform (line 50) | private static void UpdateViewportTransform(NodifyEditor editor)
    method OnItemsExtentChanged (line 65) | private static void OnItemsExtentChanged(DependencyObject d, Dependenc...
    method OnViewportLocationChanged (line 71) | private static void OnViewportLocationChanged(DependencyObject d, Depe...
    method OnViewportZoomChanged (line 91) | private static void OnViewportZoomChanged(DependencyObject d, Dependen...
    method OnMinViewportZoomChanged (line 109) | private static void OnMinViewportZoomChanged(DependencyObject d, Depen...
    method CoerceMinViewportZoom (line 116) | private static double CoerceMinViewportZoom(DependencyObject d, double...
    method OnMaxViewportZoomChanged (line 119) | private static void OnMaxViewportZoomChanged(DependencyObject d, Depen...
    method CoerceMaxViewportZoom (line 125) | private static double CoerceMaxViewportZoom(DependencyObject d, double...
    method ConstrainViewportZoomToRange (line 133) | private static double ConstrainViewportZoomToRange(DependencyObject d,...
    method OnViewportUpdated (line 166) | protected void OnViewportUpdated()
    method ApplyRenderingOptimizations (line 284) | private void ApplyRenderingOptimizations()
    method OnDisableAutoPanningChanged (line 319) | private static void OnDisableAutoPanningChanged(DependencyObject d, De...
    method OnIsSelectingChanged (line 449) | private static void OnIsSelectingChanged(DependencyObject d, Dependenc...
    method OnItemsSelectCompleted (line 458) | private void OnItemsSelectCompleted()
    method OnItemsSelectStarted (line 464) | private void OnItemsSelectStarted()
    method OnIsCuttingChanged (line 470) | private static void OnIsCuttingChanged(DependencyObject d, DependencyP...
    method OnCuttingCompleted (line 479) | private void OnCuttingCompleted()
    method OnCuttingStarted (line 485) | private void OnCuttingStarted()
    method OnCanSelectMultipleItemsChanged (line 583) | private static void OnCanSelectMultipleItemsChanged(DependencyObject d...
    method CoerceCanSelectMultipleItems (line 586) | private static bool CoerceCanSelectMultipleItems(DependencyObject d, b...
    method OnSelectedItemsSourceChanged (line 589) | private static void OnSelectedItemsSourceChanged(DependencyObject d, D...
    method OnCoerceGridCellSize (line 592) | private static uint OnCoerceGridCellSize(DependencyObject d, uint value)
    method OnGridCellSizeChanged (line 595) | private static void OnGridCellSizeChanged(DependencyObject d, Dependen...
    method OnDisablePanningChanged (line 597) | private static void OnDisablePanningChanged(DependencyObject d, Depend...
    method NodifyEditor (line 946) | static NodifyEditor()
    method NodifyEditor (line 970) | public NodifyEditor()
    method OnApplyTemplate (line 993) | protected override void OnApplyTemplate(TemplateAppliedEventArgs e)
    method GetContainerForItemOverride (line 1006) | protected override DependencyObject GetContainerForItemOverride()
    method IsItemItsOwnContainerOverride (line 1014) | protected override bool IsItemItsOwnContainerOverride(object item)
    method ZoomIn (line 1026) | public void ZoomIn() => ZoomAtPosition(Math.Pow(2.0, 120.0 / 3.0 / Mou...
    method ZoomOut (line 1031) | public void ZoomOut() => ZoomAtPosition(Math.Pow(2.0, -120.0 / 3.0 / M...
    method ZoomAtPosition (line 1038) | public void ZoomAtPosition(double zoom, Point location)
    method BringIntoView (line 1066) | public void BringIntoView(Point point, bool animated = true, Action? o...
    method BringIntoView (line 1103) | public new void BringIntoView(Rect area)
    method FitToScreen (line 1110) | public void FitToScreen(Rect? area = null)
    method HandleAutoPanning (line 1132) | private void HandleAutoPanning(object? sender, EventArgs e)
    method OnDisableAutoPanningChanged (line 1174) | protected virtual void OnDisableAutoPanningChanged(bool shouldDisable)
    method OnConnectorDisconnected (line 1196) | private void OnConnectorDisconnected(object? sender, ConnectorEventArg...
    method OnConnectionStarted (line 1205) | private void OnConnectionStarted(object? sender, PendingConnectionEven...
    method OnConnectionCompleted (line 1217) | private void OnConnectionCompleted(object? sender, PendingConnectionEv...
    method OnRemoveConnection (line 1229) | private void OnRemoveConnection(object? sender, ConnectionEventArgs e)
    method OnRemoveConnection (line 1234) | protected void OnRemoveConnection(object? dataContext)
    method GetInitialState (line 1253) | protected virtual EditorState GetInitialState()
    method PushState (line 1259) | public void PushState(EditorState state, MouseEventArgs e)
    method PopState (line 1271) | public void PopState()
    method PopAllStates (line 1284) | public void PopAllStates()
    method OnPointerPressed (line 1293) | protected override void OnPointerPressed(PointerPressedEventArgs e)
    method OnPointerReleased (line 1308) | protected override void OnPointerReleased(PointerReleasedEventArgs e)
    method OnPointerMoved (line 1333) | protected override void OnPointerMoved(PointerEventArgs e)
    method OnPointerCaptureLost (line 1356) | protected override void OnPointerCaptureLost(PointerCaptureLostEventAr...
    method OnPointerWheelChanged (line 1360) | protected override void OnPointerWheelChanged(PointerWheelEventArgs e)
    method OnKeyUp (line 1379) | protected override void OnKeyUp(KeyEventArgs e)
    method OnKeyDown (line 1382) | protected override void OnKeyDown(KeyEventArgs e)
    method OnSelectedItemsSourceChanged (line 1389) | private void OnSelectedItemsSourceChanged(IList oldValue, IList newValue)
    method OnSelectedItemsChanged (line 1413) | private void OnSelectedItemsChanged(object? sender, NotifyCollectionCh...
    method OnSelectionChanged (line 1452) | protected override void OnSelectionChanged(SelectionModelSelectionChan...
    method ApplyPreviewingSelection (line 1482) | internal void ApplyPreviewingSelection()
    method ClearPreviewingSelection (line 1505) | internal void ClearPreviewingSelection()
    method InvertSelection (line 1520) | public void InvertSelection(Rect area, bool fit = false)
    method SelectArea (line 1553) | public void SelectArea(Rect area, bool append = false, bool fit = false)
    method UnselectArea (line 1581) | public void UnselectArea(Rect area, bool fit = false)
    method UnselectAllConnection (line 1602) | public void UnselectAllConnection()
    method SelectAllConnections (line 1613) | public void SelectAllConnections()
    method OnItemsDragDelta (line 1625) | private void OnItemsDragDelta(object? sender, DragDeltaEventArgs e)
    method OnItemsDragCompleted (line 1630) | private void OnItemsDragCompleted(object? sender, DragCompletedEventAr...
    method OnItemsDragStarted (line 1654) | private void OnItemsDragStarted(object? sender, DragStartedEventArgs e)
    method CreateDraggingStrategy (line 1669) | internal IDraggingStrategy CreateDraggingStrategy(IEnumerable<ItemCont...
    method StartCutting (line 1686) | protected internal void StartCutting(Point location)
    method CancelCutting (line 1696) | protected internal void CancelCutting()
    method EndCutting (line 1707) | protected internal void EndCutting(Point location)
    method OnSizeChanged (line 1738) | protected override void OnSizeChanged(SizeChangedInfo sizeInfo)
    method GetLocationInsideEditor (line 1756) | public Point GetLocationInsideEditor(Point location, UIElement relativ...
    method GetLocationInsideEditor (line 1764) | public Point GetLocationInsideEditor(DragEventArgs args)
    method GetLocationInsideEditor (line 1772) | public Point GetLocationInsideEditor(PointerEventArgs args)
    method SnapToGrid (line 1780) | public double SnapToGrid(double value)
Condensed preview — 389 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,911K chars).
[
  {
    "path": ".editorconfig",
    "chars": 2351,
    "preview": "\n[*.{c,c++,cc,cginc,compute,cp,cpp,cu,cuh,cxx,h,hh,hlsl,hlsli,hlslinc,hpp,hxx,inc,inl,ino,ipp,mpp,mq4,mq5,mqh,tpp,usf,us"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 145,
    "preview": "# These are supported funding model platforms\n\ngithub: miroiu\ncustom: [\"https://www.buymeacoffee.com/miroiu\", \"https://p"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/ask-a-question.md",
    "chars": 128,
    "preview": "---\nname: \"❓ Ask a question\"\nabout: Need help or have a question?\ntitle: \"[Question]\"\nlabels: question\nassignees: miroiu"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "chars": 857,
    "preview": "---\nname: \"\\U0001F41B Bug report\"\nabout: Create a bug report to help this project improve\ntitle: \"[Bug]\"\nlabels: bug\nass"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 163,
    "preview": "blank_issues_enabled: false\ncontact_links:\n    - name: 📝 Read the docs\n      url: https://github.com/miroiu/nodify/wiki\n"
  },
  {
    "path": ".github/workflows/build.yml",
    "chars": 484,
    "preview": "name: Build\n\non:\n  push:\n    branches: [\"master\", \"release-v*\", \"avalonia_port\"]\n    paths-ignore:\n      - \"docs/**\"\n  p"
  },
  {
    "path": ".github/workflows/codeql-analysis.yml",
    "chars": 876,
    "preview": "name: \"CodeQL\"\n\non:\n  push:\n    branches: [\"master\", \"release-v*\", \"avalonia_port\"]\n    paths:\n      - Nodify/**\n  pull_"
  },
  {
    "path": ".github/workflows/create-release-branch.yml",
    "chars": 815,
    "preview": "name: Create release branch\n\non:\n  push:\n    tags:\n      - \"v*.0.0\"\n\njobs:\n  create-release:\n    runs-on: ubuntu-latest\n"
  },
  {
    "path": ".github/workflows/publish-package.yml",
    "chars": 647,
    "preview": "name: Publish package\n\non:\n  workflow_dispatch:\n  push:\n    tags:\n      - \"v*.*.*\"\n\njobs:\n  publish:\n    runs-on: ubuntu"
  },
  {
    "path": ".github/workflows/sync-docs.yml",
    "chars": 430,
    "preview": "name: Documentation\n\non:\n  push:\n    branches:\n      - master\n    paths:\n      - \"docs/**\"\n  workflow_dispatch:\n\njobs:\n "
  },
  {
    "path": ".gitignore",
    "chars": 6008,
    "preview": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n##\n## G"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 13057,
    "preview": "## Changelog\n\n#### **In development**\n\n> - Breaking Changes:\n> - Features:\n> - Bugfixes:\n\t\n#### **Version 6.6.0**\n\n> - B"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 3356,
    "preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, w"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 3171,
    "preview": "# 👋 **Welcome to Nodify!** 👋\n\n👍🎉 First off, thanks for taking the time to contribute! Your contributions help make Nodif"
  },
  {
    "path": "Directory.Build.props",
    "chars": 226,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msb"
  },
  {
    "path": "Examples/Nodify.Calculator/App.xaml",
    "chars": 1082,
    "preview": "<Application xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n"
  },
  {
    "path": "Examples/Nodify.Calculator/App.xaml.cs",
    "chars": 750,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.Data;\nusing System.Linq;\nusing"
  },
  {
    "path": "Examples/Nodify.Calculator/ApplicationViewModel.cs",
    "chars": 2597,
    "preview": "using System;\nusing System.Linq;\nusing System.Windows.Input;\n\nnamespace Nodify.Calculator\n{\n    public class Applicatio"
  },
  {
    "path": "Examples/Nodify.Calculator/AssemblyInfo.cs",
    "chars": 595,
    "preview": "using System.Windows;\n\n[assembly: ThemeInfo(\n    ResourceDictionaryLocation.None, //where theme specific resource dictio"
  },
  {
    "path": "Examples/Nodify.Calculator/CalculatorInputOperationViewModel.cs",
    "chars": 971,
    "preview": "namespace Nodify.Calculator\n{\n    public class CalculatorInputOperationViewModel : OperationViewModel\n    {\n        pub"
  },
  {
    "path": "Examples/Nodify.Calculator/CalculatorOperationViewModel.cs",
    "chars": 1629,
    "preview": "using System.Windows;\n\nnamespace Nodify.Calculator\n{\n    public class CalculatorOperationViewModel : OperationViewModel"
  },
  {
    "path": "Examples/Nodify.Calculator/CalculatorViewModel.cs",
    "chars": 5950,
    "preview": "using System.Linq;\nusing System.Windows;\n\nnamespace Nodify.Calculator\n{\n    public class CalculatorViewModel : Observab"
  },
  {
    "path": "Examples/Nodify.Calculator/ConnectionViewModel.cs",
    "chars": 490,
    "preview": "namespace Nodify.Calculator\n{\n    public class ConnectionViewModel : ObservableObject\n    {\n        private ConnectorVi"
  },
  {
    "path": "Examples/Nodify.Calculator/ConnectorViewModel.cs",
    "chars": 1356,
    "preview": "using System.Collections.Generic;\nusing System.Windows;\n\nnamespace Nodify.Calculator\n{\n    public class ConnectorViewMo"
  },
  {
    "path": "Examples/Nodify.Calculator/Converters/ItemToListConverter.cs",
    "chars": 864,
    "preview": "using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Wind"
  },
  {
    "path": "Examples/Nodify.Calculator/CreateOperationInfoViewModel.cs",
    "chars": 373,
    "preview": "using System.Windows;\n\nnamespace Nodify.Calculator\n{\n    public class CreateOperationInfoViewModel\n    {\n        public"
  },
  {
    "path": "Examples/Nodify.Calculator/EditorView.xaml",
    "chars": 26648,
    "preview": "<UserControl x:Class=\"Nodify.Calculator.EditorView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xml"
  },
  {
    "path": "Examples/Nodify.Calculator/EditorView.xaml.cs",
    "chars": 3266,
    "preview": "using System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Input;\n\nnamespace Nodify.Calculator\n{\n    pub"
  },
  {
    "path": "Examples/Nodify.Calculator/EditorViewModel.cs",
    "chars": 1095,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Windows.Input;\n\nnamespace Nodify.Calculator\n{\n    public c"
  },
  {
    "path": "Examples/Nodify.Calculator/ExpandoOperationViewModel.cs",
    "chars": 1265,
    "preview": "namespace Nodify.Calculator\n{\n    public class ExpandoOperationViewModel : OperationViewModel\n    {\n        public Expa"
  },
  {
    "path": "Examples/Nodify.Calculator/ExpressionOperationViewModel.cs",
    "chars": 1613,
    "preview": "using StringMath;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace Nodify.Calculator\n{\n    public class "
  },
  {
    "path": "Examples/Nodify.Calculator/GlobalUsings.cs",
    "chars": 380,
    "preview": "global using Avalonia.Controls;\nglobal using Avalonia;\nglobal using Avalonia.Data.Converters;\nglobal using Avalonia.Mark"
  },
  {
    "path": "Examples/Nodify.Calculator/MainWindow.xaml",
    "chars": 6611,
    "preview": "<Window x:Class=\"Nodify.Calculator.MainWindow\"\n        xmlns=\"https://github.com/avaloniaui\"\n        xmlns:x=\"http://sc"
  },
  {
    "path": "Examples/Nodify.Calculator/MainWindow.xaml.cs",
    "chars": 275,
    "preview": "using System.Windows;\n\nnamespace Nodify.Calculator\n{\n    public partial class MainWindow : Window\n    {\n        public "
  },
  {
    "path": "Examples/Nodify.Calculator/Nodify.Calculator.csproj",
    "chars": 1398,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>WinExe</OutputType>\n    <TargetFrameworks>net9</Ta"
  },
  {
    "path": "Examples/Nodify.Calculator/OperationGraphViewModel.cs",
    "chars": 1137,
    "preview": "using System.Windows;\n\nnamespace Nodify.Calculator\n{\n    public class OperationGraphViewModel : CalculatorOperationViewM"
  },
  {
    "path": "Examples/Nodify.Calculator/OperationGroupViewModel.cs",
    "chars": 282,
    "preview": "using System.Windows;\n\nnamespace Nodify.Calculator\n{\n    public class OperationGroupViewModel : OperationViewModel\n    {"
  },
  {
    "path": "Examples/Nodify.Calculator/OperationInfoViewModel.cs",
    "chars": 560,
    "preview": "using System.Collections.Generic;\n\nnamespace Nodify.Calculator\n{\n    public enum OperationType\n    {\n        Normal,\n  "
  },
  {
    "path": "Examples/Nodify.Calculator/OperationViewModel.cs",
    "chars": 2576,
    "preview": "using System.ComponentModel;\nusing System.Linq;\nusing System.Windows;\n\nnamespace Nodify.Calculator\n{\n    public class O"
  },
  {
    "path": "Examples/Nodify.Calculator/Operations/BinaryOperation.cs",
    "chars": 363,
    "preview": "using System;\n\nnamespace Nodify.Calculator\n{\n    public class BinaryOperation : IOperation\n    {\n        private readon"
  },
  {
    "path": "Examples/Nodify.Calculator/Operations/IOperation.cs",
    "chars": 127,
    "preview": "namespace Nodify.Calculator\n{\n    public interface IOperation\n    {\n        double Execute(params double[] operands);\n "
  },
  {
    "path": "Examples/Nodify.Calculator/Operations/OperationFactory.cs",
    "chars": 5537,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reflection;\nusing System.Windows;\n\nname"
  },
  {
    "path": "Examples/Nodify.Calculator/Operations/OperationsContainer.cs",
    "chars": 1167,
    "preview": "using System;\nusing System.Linq;\n\nnamespace Nodify.Calculator\n{\n    public static class OperationsContainer\n    {\n     "
  },
  {
    "path": "Examples/Nodify.Calculator/Operations/ParamsOperation.cs",
    "chars": 335,
    "preview": "using System;\n\nnamespace Nodify.Calculator\n{\n    public class ParamsOperation : IOperation\n    {\n        private readon"
  },
  {
    "path": "Examples/Nodify.Calculator/Operations/UnaryOperation.cs",
    "chars": 332,
    "preview": "using System;\n\nnamespace Nodify.Calculator\n{\n    public class UnaryOperation : IOperation\n    {\n        private readonl"
  },
  {
    "path": "Examples/Nodify.Calculator/Operations/ValueOperation.cs",
    "chars": 298,
    "preview": "using System;\n\nnamespace Nodify.Calculator\n{\n    public class ValueOperation : IOperation\n    {\n        private readonl"
  },
  {
    "path": "Examples/Nodify.Calculator/OperationsExtensions.cs",
    "chars": 1537,
    "preview": "using System.Collections.Generic;\nusing System.Windows;\n\nnamespace Nodify.Calculator\n{\n    public static class Operatio"
  },
  {
    "path": "Examples/Nodify.Calculator/OperationsMenuView.xaml",
    "chars": 3907,
    "preview": "<UserControl x:Class=\"Nodify.Calculator.OperationsMenuView\"\n             xmlns=\"https://github.com/avaloniaui\"\n        "
  },
  {
    "path": "Examples/Nodify.Calculator/OperationsMenuView.xaml.cs",
    "chars": 226,
    "preview": "using System.Windows.Controls;\n\nnamespace Nodify.Calculator\n{\n    public partial class OperationsMenuView : UserControl"
  },
  {
    "path": "Examples/Nodify.Calculator/OperationsMenuViewModel.cs",
    "chars": 2945,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Windows;\n\nnamespace Nodify.Calculator\n{"
  },
  {
    "path": "Examples/Nodify.Calculator/PendingConnectionViewModel.cs",
    "chars": 878,
    "preview": "using System.Windows;\n\nnamespace Nodify.Calculator\n{\n    public class PendingConnectionViewModel : ObservableObject\n   "
  },
  {
    "path": "Examples/Nodify.Calculator/Program.cs",
    "chars": 665,
    "preview": "using System;\nusing Avalonia;\n\nnamespace Nodify.Calculator;\n\nclass Program\n{\n    // Initialization code. Don't use any "
  },
  {
    "path": "Examples/Nodify.Calculator/Themes/Dark.xaml",
    "chars": 157,
    "preview": "<ResourceDictionary xmlns=\"https://github.com/avaloniaui\"\n                    xmlns:x=\"http://schemas.microsoft.com/win"
  },
  {
    "path": "Examples/Nodify.Calculator/Themes/Light.xaml",
    "chars": 157,
    "preview": "<ResourceDictionary xmlns=\"https://github.com/avaloniaui\"\n                    xmlns:x=\"http://schemas.microsoft.com/win"
  },
  {
    "path": "Examples/Nodify.Calculator/Themes/Nodify.xaml",
    "chars": 157,
    "preview": "<ResourceDictionary xmlns=\"https://github.com/avaloniaui\"\n                    xmlns:x=\"http://schemas.microsoft.com/win"
  },
  {
    "path": "Examples/Nodify.Playground/App.xaml",
    "chars": 1270,
    "preview": "<Application x:Class=\"Nodify.Playground.App\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"h"
  },
  {
    "path": "Examples/Nodify.Playground/App.xaml.cs",
    "chars": 750,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.Data;\nusing System.Linq;\nusing"
  },
  {
    "path": "Examples/Nodify.Playground/AssemblyInfo.cs",
    "chars": 595,
    "preview": "using System.Windows;\n\n[assembly: ThemeInfo(\n    ResourceDictionaryLocation.None, //where theme specific resource dictio"
  },
  {
    "path": "Examples/Nodify.Playground/BaseSettingViewModel.cs",
    "chars": 1317,
    "preview": "using System;\n\nnamespace Nodify.Playground\n{\n    public class BaseSettingViewModel<T> : ObservableObject, ISettingViewM"
  },
  {
    "path": "Examples/Nodify.Playground/Converters/FlowToConnectorPositionConverter.cs",
    "chars": 1885,
    "preview": "using System;\nusing System.Globalization;\nusing System.Windows.Controls;\nusing System.Windows.Data;\n\nnamespace Nodify.P"
  },
  {
    "path": "Examples/Nodify.Playground/Converters/FlowToDirectionConverter.cs",
    "chars": 843,
    "preview": "using System;\nusing System.Globalization;\nusing System.Windows.Data;\n\nnamespace Nodify.Playground\n{\n    public class Fl"
  },
  {
    "path": "Examples/Nodify.Playground/Converters/UIntToRectConverter.cs",
    "chars": 799,
    "preview": "using System;\nusing System.Globalization;\nusing System.Windows;\nusing System.Windows.Data;\nusing System.Windows.Markup;"
  },
  {
    "path": "Examples/Nodify.Playground/Converters/UIntToRelativeRectConverter.cs",
    "chars": 1196,
    "preview": "using System;\nusing System.Globalization;\nusing System.Windows;\nusing System.Windows.Data;\nusing System.Windows.Markup;"
  },
  {
    "path": "Examples/Nodify.Playground/Editor/CommentNodeViewModel.cs",
    "chars": 431,
    "preview": "using System.Windows;\n\nnamespace Nodify.Playground\n{\n    public class CommentNodeViewModel : NodeViewModel\n    {\n      "
  },
  {
    "path": "Examples/Nodify.Playground/Editor/ConnectionViewModel.cs",
    "chars": 1377,
    "preview": "using System.Windows;\nusing System.Windows.Input;\n\nnamespace Nodify.Playground\n{\n    public class ConnectionViewModel :"
  },
  {
    "path": "Examples/Nodify.Playground/Editor/ConnectorViewModel.cs",
    "chars": 2759,
    "preview": "using System.Linq;\nusing System.Windows;\n\nnamespace Nodify.Playground\n{\n    public enum ConnectorFlow\n    {\n        Inp"
  },
  {
    "path": "Examples/Nodify.Playground/Editor/FlowNodeViewModel.cs",
    "chars": 973,
    "preview": "using System.Windows.Controls;\n\nnamespace Nodify.Playground\n{\n    public class FlowNodeViewModel : NodeViewModel\n    {\n"
  },
  {
    "path": "Examples/Nodify.Playground/Editor/GraphSchema.cs",
    "chars": 3860,
    "preview": "using System.Collections.Generic;\nusing System.Linq;\nusing System.Windows;\n\nnamespace Nodify.Playground\n{\n    public cl"
  },
  {
    "path": "Examples/Nodify.Playground/Editor/KnotNodeViewModel.cs",
    "chars": 715,
    "preview": "using System.Windows.Controls;\n\nnamespace Nodify.Playground\n{\n    public class KnotNodeViewModel : NodeViewModel\n    {\n"
  },
  {
    "path": "Examples/Nodify.Playground/Editor/NodeViewModel.cs",
    "chars": 806,
    "preview": "using System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Input;\n\nnamespace Nodify.Playground\n{\n    pub"
  },
  {
    "path": "Examples/Nodify.Playground/Editor/NodifyEditorView.xaml",
    "chars": 47233,
    "preview": "<UserControl x:Class=\"Nodify.Playground.NodifyEditorView\"\n             xmlns=\"https://github.com/avaloniaui\"\n          "
  },
  {
    "path": "Examples/Nodify.Playground/Editor/NodifyEditorView.xaml.cs",
    "chars": 427,
    "preview": "using System.Windows.Controls;\n\nnamespace Nodify.Playground\n{\n    public partial class NodifyEditorView : UserControl\n "
  },
  {
    "path": "Examples/Nodify.Playground/Editor/NodifyEditorViewModel.cs",
    "chars": 4533,
    "preview": "using System.Linq;\nusing System.Windows;\nusing System.Windows.Input;\n\nnamespace Nodify.Playground\n{\n    public class No"
  },
  {
    "path": "Examples/Nodify.Playground/Editor/PendingConnectionViewModel.cs",
    "chars": 2485,
    "preview": "using System.Windows.Controls;\n\nnamespace Nodify.Playground\n{\n    public class PendingConnectionViewModel : ObservableO"
  },
  {
    "path": "Examples/Nodify.Playground/Editor/VerticalNodeViewModel.cs",
    "chars": 243,
    "preview": "using System.Windows.Controls;\n\nnamespace Nodify.Playground\n{\n    public class VerticalNodeViewModel : FlowNodeViewMode"
  },
  {
    "path": "Examples/Nodify.Playground/Editor/WpfComboBox.cs",
    "chars": 1136,
    "preview": "using System;\nusing Avalonia.Controls.Primitives;\nusing Avalonia.Input;\nusing Avalonia.VisualTree;\n\nnamespace Nodify.Pla"
  },
  {
    "path": "Examples/Nodify.Playground/EditorInputMode.cs",
    "chars": 3409,
    "preview": "using System.Windows.Input;\n\nnamespace Nodify.Playground\n{\n    public enum EditorInputMode\n    {\n        Default,\n     "
  },
  {
    "path": "Examples/Nodify.Playground/EditorSettings.cs",
    "chars": 29405,
    "preview": "using System.Collections.Generic;\nusing System.Windows;\n\nnamespace Nodify.Playground\n{\n    public enum ConnectionStyle\n"
  },
  {
    "path": "Examples/Nodify.Playground/EditorSettingsView.xaml",
    "chars": 2465,
    "preview": "<UserControl x:Class=\"Nodify.Playground.EditorSettingsView\"\n             xmlns=\"https://github.com/avaloniaui\"\n        "
  },
  {
    "path": "Examples/Nodify.Playground/EditorSettingsView.xaml.cs",
    "chars": 619,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Windows;\nusing System.Windows.Controls;"
  },
  {
    "path": "Examples/Nodify.Playground/GlobalUsings.cs",
    "chars": 437,
    "preview": "global using Avalonia.Controls;\nglobal using Avalonia;\nglobal using Avalonia.Data.Converters;\nglobal using Avalonia.Mark"
  },
  {
    "path": "Examples/Nodify.Playground/Helpers/NodeViewModelExtensions.cs",
    "chars": 2302,
    "preview": "using System.Collections.Generic;\nusing System.Windows;\n\nnamespace Nodify.Playground\n{\n    public static class NodeView"
  },
  {
    "path": "Examples/Nodify.Playground/Helpers/RandomNodesGenerator.cs",
    "chars": 7295,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Windows;\n\nnamespace Nodify.Playground\n{"
  },
  {
    "path": "Examples/Nodify.Playground/ISettingViewModel.cs",
    "chars": 448,
    "preview": "namespace Nodify.Playground\n{\n    public enum SettingsType\n    {\n        Boolean,\n        Number,\n        Option,\n     "
  },
  {
    "path": "Examples/Nodify.Playground/MainWindow.xaml",
    "chars": 14928,
    "preview": "<Window x:Class=\"Nodify.Playground.MainWindow\"\n        xmlns=\"https://github.com/avaloniaui\"\n        xmlns:x=\"http://sc"
  },
  {
    "path": "Examples/Nodify.Playground/MainWindow.xaml.cs",
    "chars": 2649,
    "preview": "using System;\nusing System.Diagnostics;\nusing System.Threading;\nusing System.Windows;\nusing System.Windows.Media;\n\nname"
  },
  {
    "path": "Examples/Nodify.Playground/Nodify.Playground.csproj",
    "chars": 1420,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>WinExe</OutputType>\n    <TargetFrameworks>net9</Ta"
  },
  {
    "path": "Examples/Nodify.Playground/PlaygroundSettings.cs",
    "chars": 8491,
    "preview": "using System.Collections.Generic;\nusing System.Linq;\nusing System.Windows;\n\nnamespace Nodify.Playground\n{\n    public cl"
  },
  {
    "path": "Examples/Nodify.Playground/PlaygroundViewModel.cs",
    "chars": 6030,
    "preview": "using System;\nusing System.Collections;\nusing System.Threading.Tasks;\nusing System.Windows.Data;\nusing System.Windows.I"
  },
  {
    "path": "Examples/Nodify.Playground/PointEditor.cs",
    "chars": 1916,
    "preview": "using System.Windows;\n\nnamespace Nodify.Playground\n{\n    public class PointEditor : ObservableObject\n    {\n        publ"
  },
  {
    "path": "Examples/Nodify.Playground/PointEditorView.xaml",
    "chars": 1678,
    "preview": "<UserControl x:Class=\"Nodify.Playground.PointEditorView\"\n             xmlns=\"https://github.com/avaloniaui\"\n           "
  },
  {
    "path": "Examples/Nodify.Playground/PointEditorView.xaml.cs",
    "chars": 220,
    "preview": "using System.Windows.Controls;\n\nnamespace Nodify.Playground\n{\n    public partial class PointEditorView : UserControl\n  "
  },
  {
    "path": "Examples/Nodify.Playground/Program.cs",
    "chars": 649,
    "preview": "using System;\n\nnamespace Nodify.Playground;\n\nclass Program\n{\n    // Initialization code. Don't use any Avalonia, third-"
  },
  {
    "path": "Examples/Nodify.Playground/ProxySettingViewModel.cs",
    "chars": 560,
    "preview": "using System;\n\nnamespace Nodify.Playground\n{\n    public class ProxySettingViewModel<T> : BaseSettingViewModel<T>\n    {\n"
  },
  {
    "path": "Examples/Nodify.Playground/SettingsView.xaml",
    "chars": 5258,
    "preview": "<UserControl x:Class=\"Nodify.Playground.SettingsView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             x"
  },
  {
    "path": "Examples/Nodify.Playground/SettingsView.xaml.cs",
    "chars": 666,
    "preview": "using System.Collections.Generic;\nusing System.Windows;\nusing System.Windows.Controls;\n\nnamespace Nodify.Playground\n{\n "
  },
  {
    "path": "Examples/Nodify.Playground/Themes/Brushes.xaml",
    "chars": 418,
    "preview": "<ResourceDictionary xmlns=\"https://github.com/avaloniaui\"\n                    xmlns:x=\"http://schemas.microsoft.com/win"
  },
  {
    "path": "Examples/Nodify.Playground/Themes/Dark.xaml",
    "chars": 366,
    "preview": "<ResourceDictionary xmlns=\"https://github.com/avaloniaui\"\n                    xmlns:x=\"http://schemas.microsoft.com/win"
  },
  {
    "path": "Examples/Nodify.Playground/Themes/Light.xaml",
    "chars": 358,
    "preview": "<ResourceDictionary xmlns=\"https://github.com/avaloniaui\"\n                    xmlns:x=\"http://schemas.microsoft.com/win"
  },
  {
    "path": "Examples/Nodify.Playground/Themes/Nodify.xaml",
    "chars": 366,
    "preview": "<ResourceDictionary xmlns=\"https://github.com/avaloniaui\"\n                    xmlns:x=\"http://schemas.microsoft.com/win"
  },
  {
    "path": "Examples/Nodify.Shapes/App.xaml",
    "chars": 11188,
    "preview": "<Application x:Class=\"Nodify.Shapes.App\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http:"
  },
  {
    "path": "Examples/Nodify.Shapes/App.xaml.cs",
    "chars": 1155,
    "preview": "using System.Windows;\nusing System.Windows.Input;\n\nnamespace Nodify.Shapes\n{\n    /// <summary>\n    /// Interaction logi"
  },
  {
    "path": "Examples/Nodify.Shapes/AppShellViewModel.cs",
    "chars": 196,
    "preview": "using Nodify.Shapes.Canvas;\n\nnamespace Nodify.Shapes\n{\n    public class AppShellViewModel : ObservableObject\n    {\n    "
  },
  {
    "path": "Examples/Nodify.Shapes/AssemblyInfo.cs",
    "chars": 634,
    "preview": "using System.Windows;\n\n[assembly: ThemeInfo(\n    ResourceDictionaryLocation.None,            //where theme specific reso"
  },
  {
    "path": "Examples/Nodify.Shapes/Avalonia/Cursors.cs",
    "chars": 146,
    "preview": "namespace Nodify.Shapes.Controls;\n\npublic static class Cursors\n{\n    public static Cursor Arrow { get; } = new Cursor(St"
  },
  {
    "path": "Examples/Nodify.Shapes/Avalonia/ToolItemSelector.cs",
    "chars": 1019,
    "preview": "using System;\nusing Avalonia.Controls.Templates;\nusing Nodify.Shapes.Canvas;\n\nnamespace Nodify.Shapes.Controls;\n\npublic "
  },
  {
    "path": "Examples/Nodify.Shapes/Canvas/CanvasToolbarViewModel.cs",
    "chars": 2918,
    "preview": "using System;\nusing System.Linq;\nusing System.Windows;\nusing System.Windows.Input;\n\nnamespace Nodify.Shapes.Canvas\n{\n  "
  },
  {
    "path": "Examples/Nodify.Shapes/Canvas/CanvasView.xaml",
    "chars": 41137,
    "preview": "<UserControl x:Class=\"Nodify.Shapes.Canvas.CanvasView\"\n             xmlns=\"https://github.com/avaloniaui\"\n             "
  },
  {
    "path": "Examples/Nodify.Shapes/Canvas/CanvasView.xaml.cs",
    "chars": 3813,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windo"
  },
  {
    "path": "Examples/Nodify.Shapes/Canvas/CanvasViewModel.cs",
    "chars": 9757,
    "preview": "using Nodify.Shapes.Canvas.UndoRedo;\nusing Nodify.UndoRedo;\nusing System;\nusing System.Collections.Generic;\nusing Syste"
  },
  {
    "path": "Examples/Nodify.Shapes/Canvas/ConnectionViewModel.cs",
    "chars": 524,
    "preview": "using System;\n\nnamespace Nodify.Shapes.Canvas\n{\n    public class ConnectionViewModel : IEquatable<ConnectionViewModel>\n"
  },
  {
    "path": "Examples/Nodify.Shapes/Canvas/ConnectorViewModel.cs",
    "chars": 453,
    "preview": "using System.Windows;\n\nnamespace Nodify.Shapes.Canvas\n{\n    public class ConnectorViewModel : ObservableObject\n    {\n  "
  },
  {
    "path": "Examples/Nodify.Shapes/Canvas/Decorators/ICanvasDecorator.cs",
    "chars": 146,
    "preview": "using System.Windows;\n\nnamespace Nodify.Shapes.Canvas\n{\n    public interface ICanvasDecorator\n    {\n        Point Locat"
  },
  {
    "path": "Examples/Nodify.Shapes/Canvas/Decorators/ShapeToolbarViewModel.cs",
    "chars": 1809,
    "preview": "using System.ComponentModel;\nusing System.Windows;\n\nnamespace Nodify.Shapes.Canvas\n{\n    public class ShapeToolbarViewM"
  },
  {
    "path": "Examples/Nodify.Shapes/Canvas/Decorators/UserCursorViewModel.cs",
    "chars": 425,
    "preview": "using System.Windows;\nusing System.Windows.Media;\n\nnamespace Nodify.Shapes.Canvas\n{\n    public class UserCursorViewMode"
  },
  {
    "path": "Examples/Nodify.Shapes/Canvas/Gestures/DrawingGesturesMappings.cs",
    "chars": 453,
    "preview": "using System.Windows.Input;\n\nnamespace Nodify.Shapes.Canvas\n{\n    public class DrawingGesturesMappings : EditorGestures"
  },
  {
    "path": "Examples/Nodify.Shapes/Canvas/Gestures/LockedGestureMappings.cs",
    "chars": 512,
    "preview": "using System.Windows.Input;\n\nnamespace Nodify.Shapes.Canvas\n{\n    public class LockedGestureMappings : EditorGestures\n "
  },
  {
    "path": "Examples/Nodify.Shapes/Canvas/Gestures/UnboundGestureMappings.cs",
    "chars": 506,
    "preview": "namespace Nodify.Shapes.Canvas\n{\n    public class UnboundGestureMappings : EditorGestures\n    {\n        public static r"
  },
  {
    "path": "Examples/Nodify.Shapes/Canvas/Shapes/EllipseViewModel.cs",
    "chars": 260,
    "preview": "using System.Windows.Media;\n\nnamespace Nodify.Shapes.Canvas\n{\n    public class EllipseViewModel : ShapeViewModel\n    {\n"
  },
  {
    "path": "Examples/Nodify.Shapes/Canvas/Shapes/RectangleViewModel.cs",
    "chars": 267,
    "preview": "using System.Windows.Media;\n\nnamespace Nodify.Shapes.Canvas\n{\n    public class RectangleViewModel : ShapeViewModel\n    "
  },
  {
    "path": "Examples/Nodify.Shapes/Canvas/Shapes/ShapeViewModel.cs",
    "chars": 2572,
    "preview": "using Nodify.UndoRedo;\nusing System.Collections.Generic;\nusing System.Windows;\nusing System.Windows.Media;\n\nnamespace N"
  },
  {
    "path": "Examples/Nodify.Shapes/Canvas/Shapes/TriangleViewModel.cs",
    "chars": 264,
    "preview": "using System.Windows.Media;\n\nnamespace Nodify.Shapes.Canvas\n{\n    public class TriangleViewModel : ShapeViewModel\n    {"
  },
  {
    "path": "Examples/Nodify.Shapes/Canvas/UndoRedo/MoveShapesAction.cs",
    "chars": 1057,
    "preview": "using Nodify.UndoRedo;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Windows;\n\nnamespace Nodify.Sha"
  },
  {
    "path": "Examples/Nodify.Shapes/Canvas/UndoRedo/ResizeShapesAction.cs",
    "chars": 1565,
    "preview": "using System.Collections.Generic;\nusing System.Linq;\nusing System.Windows;\nusing Nodify.UndoRedo;\n\nnamespace Nodify.Sha"
  },
  {
    "path": "Examples/Nodify.Shapes/Canvas/UndoRedo/SelectShapesAction.cs",
    "chars": 1084,
    "preview": "using Nodify.UndoRedo;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace Nodify.Shapes.Canvas.UndoRedo\n{\n"
  },
  {
    "path": "Examples/Nodify.Shapes/Controls/ResizableContainer.cs",
    "chars": 1010,
    "preview": "using System.Windows;\n\nnamespace Nodify.Shapes.Controls\n{\n    internal class ResizableContainer : ResizablePanel\n    {\n"
  },
  {
    "path": "Examples/Nodify.Shapes/GlobalUsings.cs",
    "chars": 498,
    "preview": "global using Avalonia.Controls;\nglobal using Avalonia;\nglobal using Avalonia.Data.Converters;\nglobal using Avalonia.Mark"
  },
  {
    "path": "Examples/Nodify.Shapes/MainView.axaml",
    "chars": 1235,
    "preview": "<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n "
  },
  {
    "path": "Examples/Nodify.Shapes/MainView.axaml.cs",
    "chars": 208,
    "preview": "using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Markup.Xaml;\n\nnamespace Nodify.Shapes;\n\npublic partial class Mai"
  },
  {
    "path": "Examples/Nodify.Shapes/MainWindow.xaml",
    "chars": 1342,
    "preview": "<Window x:Class=\"Nodify.Shapes.MainWindow\"\n        xmlns=\"https://github.com/avaloniaui\"\n        xmlns:x=\"http://schema"
  },
  {
    "path": "Examples/Nodify.Shapes/MainWindow.xaml.cs",
    "chars": 274,
    "preview": "using System.Windows;\n\nnamespace Nodify.Shapes\n{\n    /// <summary>\n    /// Interaction logic for MainWindow.xaml\n    //"
  },
  {
    "path": "Examples/Nodify.Shapes/Nodify.Shapes.csproj",
    "chars": 1312,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFrameworks>net9</TargetFrameworks>\n    <Nullable>enable"
  },
  {
    "path": "Examples/Nodify.Shapes.Desktop/Nodify.Shapes.Desktop.csproj",
    "chars": 1592,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>WinExe</OutputType>\n    <TargetFrameworks>net9</Ta"
  },
  {
    "path": "Examples/Nodify.Shapes.Desktop/Program.cs",
    "chars": 669,
    "preview": "using System;\nusing Avalonia;\n\nnamespace Nodify.Shapes.Desktop;\n\nclass Program\n{\n    // Initialization code. Don't use "
  },
  {
    "path": "Examples/Nodify.Shapes.Web/AppBundle/app.css",
    "chars": 1290,
    "preview": ":root {\n    --sat: env(safe-area-inset-top);\n    --sar: env(safe-area-inset-right);\n    --sab: env(safe-area-inset-bott"
  },
  {
    "path": "Examples/Nodify.Shapes.Web/AppBundle/index.html",
    "chars": 932,
    "preview": "<!DOCTYPE html>\n<html>\n\n<head>\n    <title>Nodify.Shapes</title>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" con"
  },
  {
    "path": "Examples/Nodify.Shapes.Web/AppBundle/main.js",
    "chars": 475,
    "preview": "import { dotnet } from './_framework/dotnet.js'\n\nconst is_browser = typeof window != \"undefined\";\nif (!is_browser) thro"
  },
  {
    "path": "Examples/Nodify.Shapes.Web/Nodify.Shapes.Web.csproj",
    "chars": 757,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <TargetFramework>net9.0-browser</TargetFramework>\n    <RuntimeI"
  },
  {
    "path": "Examples/Nodify.Shapes.Web/Program.cs",
    "chars": 390,
    "preview": "using System.Threading.Tasks;\nusing Avalonia;\nusing Avalonia.Browser;\n\nnamespace Nodify.Shapes.Web;\n\ninternal partial cl"
  },
  {
    "path": "Examples/Nodify.Shapes.Web/Properties/launchSettings.json",
    "chars": 372,
    "preview": "{\n  \"profiles\": {\n    \"Nodify.Shapes\": {\n      \"commandName\": \"Project\",\n      \"launchBrowser\": false,\n      \"environmen"
  },
  {
    "path": "Examples/Nodify.Shapes.Web/runtimeconfig.template.json",
    "chars": 166,
    "preview": "{\n  \"wasmHostProperties\": {\n    \"perHostConfig\": [\n      {\n        \"name\": \"browser\",\n        \"html-path\": \"index.html\","
  },
  {
    "path": "Examples/Nodify.Shared/Behaviours/DataTrigger.cs",
    "chars": 8529,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Diagnostics.CodeAnalysis;\nusing System.Globalization;\nusing"
  },
  {
    "path": "Examples/Nodify.Shared/Behaviours/PropertySetter.cs",
    "chars": 14036,
    "preview": "using System;\nusing System.ComponentModel;\nusing System.Diagnostics.CodeAnalysis;\nusing System.Globalization;\nusing Syst"
  },
  {
    "path": "Examples/Nodify.Shared/Behaviours/WpfBtn.cs",
    "chars": 2860,
    "preview": "using System;\nusing Avalonia.LogicalTree;\n\nnamespace Nodify.Shared.Behaviours;\n\n/// <summary>\n/// Button with CommandTar"
  },
  {
    "path": "Examples/Nodify.Shared/BindingProxy.cs",
    "chars": 441,
    "preview": "using System.Windows;\nusing Avalonia;\n\nnamespace Nodify\n{\n    public class BindingProxy : AvaloniaObject\n    {\n        p"
  },
  {
    "path": "Examples/Nodify.Shared/BoxValue.cs",
    "chars": 692,
    "preview": "using System.Windows;\n\nnamespace Nodify.Shared\n{\n    public static class BoxValue\n    {\n        public static readonly "
  },
  {
    "path": "Examples/Nodify.Shared/Controls/EditableTextBlock.cs",
    "chars": 7947,
    "preview": "using System.Windows;\nusing System.Windows.Input;\nusing Nodify.Compatibility;\nusing Nodify.Shared;\n\nnamespace Nodify\n{\n"
  },
  {
    "path": "Examples/Nodify.Shared/Controls/ResizablePanel.cs",
    "chars": 6429,
    "preview": "using System;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Controls.Primitives;\nusing Syst"
  },
  {
    "path": "Examples/Nodify.Shared/Controls/Swatches.xaml.cs",
    "chars": 1590,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windo"
  },
  {
    "path": "Examples/Nodify.Shared/Controls/TabControlEx.cs",
    "chars": 2230,
    "preview": "using System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Input;\n\nnamespace Nodify\n{\n    [TemplatePart("
  },
  {
    "path": "Examples/Nodify.Shared/Controls/TabItemEx.cs",
    "chars": 1078,
    "preview": "using System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Input;\n\nnamespace Nodify\n{\n    public class T"
  },
  {
    "path": "Examples/Nodify.Shared/Converters/BooleanToVisibilityConverter.cs",
    "chars": 1175,
    "preview": "using System;\nusing System.Globalization;\nusing System.Windows;\nusing System.Windows.Data;\nusing System.Windows.Markup;"
  },
  {
    "path": "Examples/Nodify.Shared/Converters/ColorToSolidColorBrushConverter.cs",
    "chars": 860,
    "preview": "using System;\nusing System.Globalization;\nusing System.Windows.Data;\nusing System.Windows.Media;\n\nnamespace Nodify\n{\n  "
  },
  {
    "path": "Examples/Nodify.Shared/Converters/DebugConverter.cs",
    "chars": 737,
    "preview": "using System;\nusing System.Globalization;\nusing System.Windows.Data;\nusing System.Windows.Markup;\n\nnamespace Nodify\n{\n "
  },
  {
    "path": "Examples/Nodify.Shared/Converters/EnumValuesConverter.cs",
    "chars": 1350,
    "preview": "using System;\nusing System.Globalization;\nusing System.Windows.Data;\nusing System.Windows.Markup;\n\nnamespace Nodify\n{\n "
  },
  {
    "path": "Examples/Nodify.Shared/Converters/InverseBooleanConverter.cs",
    "chars": 740,
    "preview": "using System;\nusing System.Globalization;\nusing System.Windows.Data;\n\nnamespace Nodify\n{\n    public class InverseBoolea"
  },
  {
    "path": "Examples/Nodify.Shared/Converters/MultiValueEqualityConverter.cs",
    "chars": 1061,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Linq;\nusing System.Windows.Dat"
  },
  {
    "path": "Examples/Nodify.Shared/Converters/RandomBrushConverter.cs",
    "chars": 941,
    "preview": "using System;\nusing System.Globalization;\nusing System.Windows.Data;\nusing System.Windows.Media;\n\nnamespace Nodify\n{\n  "
  },
  {
    "path": "Examples/Nodify.Shared/Converters/ResizeDirectionToVisiblityConverter.cs",
    "chars": 830,
    "preview": "using System;\nusing System.Globalization;\nusing System.Windows;\nusing System.Windows.Data;\n\nnamespace Nodify\n{\n    inte"
  },
  {
    "path": "Examples/Nodify.Shared/Converters/StringToVisibilityConverter.cs",
    "chars": 719,
    "preview": "using System;\nusing System.Globalization;\nusing System.Windows;\nusing System.Windows.Data;\nusing System.Windows.Markup;"
  },
  {
    "path": "Examples/Nodify.Shared/Converters/ToStringConverter.cs",
    "chars": 849,
    "preview": "using System;\nusing System.Globalization;\nusing System.Windows;\nusing System.Windows.Data;\n\nnamespace Nodify\n{\n    publ"
  },
  {
    "path": "Examples/Nodify.Shared/DelegateCommand.cs",
    "chars": 1947,
    "preview": "using System;\nusing System.Windows.Input;\n\nnamespace Nodify\n{\n    public interface INodifyCommand : ICommand\n    {\n    "
  },
  {
    "path": "Examples/Nodify.Shared/FluentSyntax.cs",
    "chars": 1860,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace Nodify\n{\n    public static class FluentSy"
  },
  {
    "path": "Examples/Nodify.Shared/GlobalUsings.cs",
    "chars": 568,
    "preview": "global using Avalonia.Controls;\nglobal using Avalonia;\nglobal using Avalonia.Data.Converters;\nglobal using Avalonia.Mark"
  },
  {
    "path": "Examples/Nodify.Shared/Nodify.Shared.csproj",
    "chars": 670,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFrameworks>net9</TargetFrameworks>\n    <Nullable>enable"
  },
  {
    "path": "Examples/Nodify.Shared/NodifyObservableCollection.cs",
    "chars": 6924,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.Collections.Speciali"
  },
  {
    "path": "Examples/Nodify.Shared/ObservableObject.cs",
    "chars": 2160,
    "preview": "using System.Collections.Generic;\nusing System;\nusing System.ComponentModel;\nusing System.Runtime.CompilerServices;\nusi"
  },
  {
    "path": "Examples/Nodify.Shared/Properties/AssemblyInfo.cs",
    "chars": 2257,
    "preview": "using System.Windows;\n\n[assembly: ThemeInfo(\n    ResourceDictionaryLocation.None, //where theme specific resource dictio"
  },
  {
    "path": "Examples/Nodify.Shared/RequeryCommand.cs",
    "chars": 2010,
    "preview": "using System;\nusing System.Windows.Input;\n\nnamespace Nodify\n{\n    public class RequeryCommand : INodifyCommand\n    {\n  "
  },
  {
    "path": "Examples/Nodify.Shared/StringExtensions.cs",
    "chars": 469,
    "preview": "using System.Collections.Generic;\n\nnamespace Nodify\n{\n    public static class StringExtensions\n    {\n        public sta"
  },
  {
    "path": "Examples/Nodify.Shared/ThemeManager.cs",
    "chars": 4618,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Reflection;\nusing System.Windows;\nusing System.Windows.Inp"
  },
  {
    "path": "Examples/Nodify.Shared/Themes/Brushes.xaml",
    "chars": 1457,
    "preview": "<ResourceDictionary xmlns=\"https://github.com/avaloniaui\"\n                    xmlns:x=\"http://schemas.microsoft.com/win"
  },
  {
    "path": "Examples/Nodify.Shared/Themes/Controls.xaml",
    "chars": 48517,
    "preview": "<ResourceDictionary xmlns=\"https://github.com/avaloniaui\"\n                    xmlns:x=\"http://schemas.microsoft.com/win"
  },
  {
    "path": "Examples/Nodify.Shared/Themes/Dark.xaml",
    "chars": 894,
    "preview": "<ResourceDictionary xmlns=\"https://github.com/avaloniaui\"\n                    xmlns:x=\"http://schemas.microsoft.com/win"
  },
  {
    "path": "Examples/Nodify.Shared/Themes/Generic.xaml",
    "chars": 23346,
    "preview": "<ResourceDictionary xmlns=\"https://github.com/avaloniaui\"\n                    xmlns:x=\"http://schemas.microsoft.com/win"
  },
  {
    "path": "Examples/Nodify.Shared/Themes/Icons.xaml",
    "chars": 38412,
    "preview": "<ResourceDictionary xmlns=\"https://github.com/avaloniaui\"\n                    xmlns:x=\"http://schemas.microsoft.com/win"
  },
  {
    "path": "Examples/Nodify.Shared/Themes/Light.xaml",
    "chars": 890,
    "preview": "<ResourceDictionary xmlns=\"https://github.com/avaloniaui\"\n                    xmlns:x=\"http://schemas.microsoft.com/win"
  },
  {
    "path": "Examples/Nodify.Shared/Themes/Nodify.xaml",
    "chars": 906,
    "preview": "<ResourceDictionary xmlns=\"https://github.com/avaloniaui\"\n                    xmlns:x=\"http://schemas.microsoft.com/win"
  },
  {
    "path": "Examples/Nodify.Shared/UndoRedo/ActionsHistory.cs",
    "chars": 5973,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\n\nnamespace Nodify.UndoRedo\n{\n    public in"
  },
  {
    "path": "Examples/Nodify.Shared/UndoRedo/BatchAction.cs",
    "chars": 803,
    "preview": "using System.Collections.Generic;\nusing System.Linq;\n\nnamespace Nodify.UndoRedo\n{\n    public class BatchAction : IActio"
  },
  {
    "path": "Examples/Nodify.Shared/UndoRedo/DelegateAction.cs",
    "chars": 553,
    "preview": "using System;\n\nnamespace Nodify.UndoRedo\n{\n    public class DelegateAction : IAction\n    {\n        private readonly Act"
  },
  {
    "path": "Examples/Nodify.Shared/UndoRedo/PropertyCache.cs",
    "chars": 2911,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Reflection;\n\nnamespace Nodify.UndoRedo\n{\n    public interf"
  },
  {
    "path": "Examples/Nodify.Shared/UndoRedo/Undoable.cs",
    "chars": 2637,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq.Expressions;\nusing System.Runtime.CompilerServices;\nu"
  },
  {
    "path": "Examples/Nodify.StateMachine/App.xaml",
    "chars": 1242,
    "preview": "<Application x:Class=\"Nodify.StateMachine.App\"\n             xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x="
  },
  {
    "path": "Examples/Nodify.StateMachine/App.xaml.cs",
    "chars": 752,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.Data;\nusing System.Linq;\nusing"
  },
  {
    "path": "Examples/Nodify.StateMachine/BlackboardItemReferenceViewModel.cs",
    "chars": 231,
    "preview": "using System;\n\nnamespace Nodify.StateMachine\n{\n    // Condition or Action reference\n    public class BlackboardItemRefe"
  },
  {
    "path": "Examples/Nodify.StateMachine/BlackboardItemViewModel.cs",
    "chars": 1443,
    "preview": "using System;\n\nnamespace Nodify.StateMachine\n{\n    public class BlackboardItemViewModel : ObservableObject\n    {\n      "
  },
  {
    "path": "Examples/Nodify.StateMachine/BlackboardKeyEditorView.xaml",
    "chars": 8325,
    "preview": "<UserControl x:Class=\"Nodify.StateMachine.BlackboardKeyEditorView\"\n             xmlns=\"https://github.com/avaloniaui\"\n "
  },
  {
    "path": "Examples/Nodify.StateMachine/BlackboardKeyEditorView.xaml.cs",
    "chars": 238,
    "preview": "using System.Windows.Controls;\n\nnamespace Nodify.StateMachine\n{\n    public partial class BlackboardKeyEditorView : User"
  },
  {
    "path": "Examples/Nodify.StateMachine/BlackboardKeyEditorViewModel.cs",
    "chars": 1181,
    "preview": "using System.Collections.Generic;\n\nnamespace Nodify.StateMachine\n{\n    public class BlackboardKeyEditorViewModel : Obse"
  },
  {
    "path": "Examples/Nodify.StateMachine/BlackboardKeyViewModel.cs",
    "chars": 3131,
    "preview": "using System.Collections.Generic;\n\nnamespace Nodify.StateMachine\n{\n    public class BlackboardKeyViewModel : Observable"
  },
  {
    "path": "Examples/Nodify.StateMachine/BlackboardViewModel.cs",
    "chars": 1771,
    "preview": "using System.Linq;\n\nnamespace Nodify.StateMachine\n{\n    public class BlackboardViewModel : ObservableObject\n    {\n     "
  },
  {
    "path": "Examples/Nodify.StateMachine/Converters/BlackboardKeyEditorConverter.cs",
    "chars": 1371,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Windows.Data;\nusing System.Win"
  },
  {
    "path": "Examples/Nodify.StateMachine/Converters/ConnectorOffsetConverter.cs",
    "chars": 966,
    "preview": "using System;\nusing System.Windows;\nusing System.Globalization;\nusing System.Windows.Data;\n\nnamespace Nodify.StateMachi"
  },
  {
    "path": "Examples/Nodify.StateMachine/Converters/DrawingBrushToRectangleConverter.cs",
    "chars": 811,
    "preview": "using System;\nusing System.Globalization;\nusing Avalonia.Controls.Shapes;\nusing Avalonia.Media;\n\nnamespace Nodify.StateM"
  },
  {
    "path": "Examples/Nodify.StateMachine/Converters/FilterBlackboardKeysConverter.cs",
    "chars": 969,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Linq;\nusing System.Windows.Dat"
  },
  {
    "path": "Examples/Nodify.StateMachine/GlobalUsings.cs",
    "chars": 253,
    "preview": "global using Avalonia.Controls;\nglobal using Avalonia;\nglobal using Avalonia.Data.Converters;\nglobal using Avalonia.Mark"
  },
  {
    "path": "Examples/Nodify.StateMachine/Helpers/BlackboardDescriptor.cs",
    "chars": 4681,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reflection;\n\nnamespace Nodify.StateMach"
  },
  {
    "path": "Examples/Nodify.StateMachine/MainWindow.xaml",
    "chars": 51925,
    "preview": "<Window x:Class=\"Nodify.StateMachine.MainWindow\"\n        xmlns=\"https://github.com/avaloniaui\"\n        xmlns:x=\"http://"
  },
  {
    "path": "Examples/Nodify.StateMachine/MainWindow.xaml.cs",
    "chars": 1831,
    "preview": "using System.Windows;\nusing Avalonia.Input;\nusing MouseWheelEventArgs = Avalonia.Input.PointerWheelEventArgs;\nusing Mod"
  }
]

// ... and 189 more files (download for full content)

About this extraction

This page contains the full source code of the BAndysc/nodify-avalonia GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 389 files (1.7 MB), approximately 384.5k tokens, and a symbol index with 1459 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.

Copied to clipboard!