From 8ba976b0ba8e811a981bdd2e70d805ac5c61ac33 Mon Sep 17 00:00:00 2001 From: Misaki Date: Sat, 28 Mar 2026 12:31:52 +0900 Subject: [PATCH] feat(dock): add core data models for docking system --- .../Internal/Docking/DockGroupNode.cs | 27 +++++++++++++++++++ .../Controls/Internal/Docking/DockNode.cs | 9 +++++++ .../Internal/Docking/DockPanelNode.cs | 15 +++++++++++ 3 files changed, 51 insertions(+) create mode 100644 src/Editor/Ghost.Editor.Core/Controls/Internal/Docking/DockGroupNode.cs create mode 100644 src/Editor/Ghost.Editor.Core/Controls/Internal/Docking/DockNode.cs create mode 100644 src/Editor/Ghost.Editor.Core/Controls/Internal/Docking/DockPanelNode.cs diff --git a/src/Editor/Ghost.Editor.Core/Controls/Internal/Docking/DockGroupNode.cs b/src/Editor/Ghost.Editor.Core/Controls/Internal/Docking/DockGroupNode.cs new file mode 100644 index 0000000..02ea774 --- /dev/null +++ b/src/Editor/Ghost.Editor.Core/Controls/Internal/Docking/DockGroupNode.cs @@ -0,0 +1,27 @@ +using System.Collections.ObjectModel; +using CommunityToolkit.Mvvm.ComponentModel; +using Microsoft.UI.Xaml.Controls; + +namespace Ghost.Editor.Core.Controls.Internal.Docking; + +public partial class DockGroupNode : DockNode +{ + [ObservableProperty] + private Orientation _orientation = Orientation.Horizontal; + + public ObservableCollection Children { get; } = new(); + + public void AddChild(DockNode node) + { + node.Parent = this; + Children.Add(node); + } + + public void RemoveChild(DockNode node) + { + if (Children.Remove(node)) + { + node.Parent = null; + } + } +} diff --git a/src/Editor/Ghost.Editor.Core/Controls/Internal/Docking/DockNode.cs b/src/Editor/Ghost.Editor.Core/Controls/Internal/Docking/DockNode.cs new file mode 100644 index 0000000..ba0aa3a --- /dev/null +++ b/src/Editor/Ghost.Editor.Core/Controls/Internal/Docking/DockNode.cs @@ -0,0 +1,9 @@ +using CommunityToolkit.Mvvm.ComponentModel; + +namespace Ghost.Editor.Core.Controls.Internal.Docking; + +public abstract partial class DockNode : ObservableObject +{ + [ObservableProperty] + private DockGroupNode? _parent; +} diff --git a/src/Editor/Ghost.Editor.Core/Controls/Internal/Docking/DockPanelNode.cs b/src/Editor/Ghost.Editor.Core/Controls/Internal/Docking/DockPanelNode.cs new file mode 100644 index 0000000..6d3f471 --- /dev/null +++ b/src/Editor/Ghost.Editor.Core/Controls/Internal/Docking/DockPanelNode.cs @@ -0,0 +1,15 @@ +using System.Collections.ObjectModel; +using CommunityToolkit.Mvvm.ComponentModel; + +namespace Ghost.Editor.Core.Controls.Internal.Docking; + +public partial class DockPanelNode : DockNode +{ + public ObservableCollection Items { get; } = new(); + + [ObservableProperty] + private int _selectedIndex = -1; + + [ObservableProperty] + private object? _selectedItem; +}