Skip to content

ToolDock ItemsSource + Template Parity#1036

Merged
wieslawsoltes merged 5 commits intomasterfrom
feature/tooldock-itemssource-parity
Feb 10, 2026
Merged

ToolDock ItemsSource + Template Parity#1036
wieslawsoltes merged 5 commits intomasterfrom
feature/tooldock-itemssource-parity

Conversation

@wieslawsoltes
Copy link
Owner

PR Summary: ToolDock ItemsSource + Template Parity

Branch

  • feature/tooldock-itemssource-parity

Commits

  1. 7d0330875 feat(model): add ToolDock ItemsSource and template integration
  2. f0da6cbe0 test(avalonia): expand ToolDock ItemsSource interop coverage
  3. ddd46eaaa feat(sample): add DockReactiveUI ItemsSource sample
  4. a7e4df25b docs(docfx): document ToolDock ItemsSource and template support

Goal

Implement full ToolDock ItemsSource parity with existing DocumentDock-style workflows and Actipro-inspired UX expectations:

  • declarative item-driven tool generation
  • template-based rendering
  • correct close/remove lifecycle
  • robust behavior with mixed manual/generated tools
  • full serializer/state integration
  • sample + docs + deep test coverage

What Was Implemented

1) New contracts and Avalonia model types

Added dedicated tool ItemsSource/template contracts mirroring document patterns:

  • src/Dock.Model/Core/IToolItemsSourceDock.cs
  • src/Dock.Model/Controls/IToolDockContent.cs
  • src/Dock.Model/Controls/IToolTemplate.cs
  • src/Dock.Model.Avalonia/Controls/ToolTemplate.cs

2) ToolDock runtime support

ToolDock now supports:

  • ToolTemplate styled property
  • ItemsSource styled property
  • generated tool lifecycle tracking
  • observable collection add/remove/replace/reset handling
  • source removal on close (RemoveItemFromSource)
  • source-origin checks (IsToolFromItemsSource)
  • template-late-binding regeneration (ItemsSource set before ToolTemplate)
  • owner-aware removal after cross-dock moves
  • fallback content generation when template content is missing

Primary file:

  • src/Dock.Model.Avalonia/Controls/ToolDock.cs

3) Close/hide semantics for source-generated dockables

Factory close behavior now treats ItemsSource-generated tool/document dockables as source-owned entries that must be removed, not hidden, to keep source collections and UI synchronized.

Primary file:

  • src/Dock.Model/FactoryBase.Dockable.cs

4) Cross-dock move robustness (source provenance tracking)

When a source-generated dockable is moved to another dock, close/remove still resolves back to its original ItemsSource owner via tracking in factory:

  • new owner mapping API in factory base
  • source owner lookup in close path before fallback scanning

Primary files:

  • src/Dock.Model/FactoryBase.cs
  • src/Dock.Model/FactoryBase.Dockable.cs

5) DocumentDock parity hardening

Aligned document path with the same robustness improvements:

  • owner-aware removal for generated documents
  • value-equality support for source-item matching
  • non-notify source handling on remove
  • removed diagnostic debug traces
  • source-provenance tracking integration

Primary file:

  • src/Dock.Model.Avalonia/Controls/DocumentDock.cs

6) Serialization, state, and fluent API integration

Added/updated support so new ToolTemplate/ItemsSource-related model structure integrates with state capture and serializers:

  • src/Dock.Model/DockState.cs
  • src/Dock.Model/DockService.cs
  • src/Dock.Model/FluentExtensions.cs
  • src/Dock.Model.Avalonia/Json/AvaloniaModelPolymorphicTypeResolver.cs
  • src/Dock.Serializer.SystemTextJson/DockModelPolymorphicTypeResolver.cs
  • src/Dock.Serializer.Xml/DockXmlSerializer.cs
  • src/Dock.Serializer.Yaml/DockYamlSerializer.cs
  • src/Dock.Serializer.Protobuf/ProtobufDockSerializer.cs

Sample App

Added a dedicated sample demonstrating document + tool ItemsSource usage together in ReactiveUI:

  • samples/DockReactiveUIItemsSourceSample/*
  • solution registration in Dock.slnx

Tests Added/Extended

New tests

  • tests/Dock.Model.Avalonia.UnitTests/Controls/ToolDockItemsSourceTests.cs
  • tests/Dock.Avalonia.HeadlessTests/ToolDockItemsSourceTests.cs
  • tests/Dock.Avalonia.HeadlessTests/ToolDockTemplateTests.cs
  • tests/Dock.Avalonia.LeakTests/ToolDockItemsSourceLeakTests.cs
  • tests/Dock.Model.UnitTests/DockStateToolTemplateTests.cs

Updated tests

  • tests/Dock.Model.Avalonia.UnitTests/Controls/DocumentDockItemsSourceSampleTests.cs
  • tests/Dock.Model.Avalonia.UnitTests/AvaloniaDockSerializerTests.cs
  • tests/Dock.Model.Avalonia.UnitTests/Controls/DockControlsTests.cs
  • tests/Dock.Avalonia.HeadlessTests/DockControlsTests.cs
  • tests/Dock.Avalonia.HeadlessTests/FactoryWindowTests.cs

Covered scenarios

  • ItemsSource add/remove/replace/reset
  • close -> source removal synchronization
  • hide-on-close vs source-generated behavior
  • fixed-size/non-removable list safety
  • duplicate source item instances
  • manual + generated interop in one dock
  • source replacement and source clear behavior
  • value-type source item behavior
  • moved generated tool close/remove behavior
  • template assigned after ItemsSource
  • leak safety for collection swaps and generated tool cleanup

Docs Updated

Updated DocFX articles for API and usage guidance:

  • docfx/articles/dock-itemssource.md
  • docfx/articles/dock-content-guide.md
  • docfx/articles/dock-model-controls.md
  • docfx/articles/dock-reference.md
  • docfx/articles/dock-state.md
  • docfx/articles/dock-faq.md
  • docfx/articles/dock-advanced.md
  • docfx/articles/dock-reactiveui.md
  • docfx/articles/dock-reactiveui-di.md
  • docfx/articles/toc.yml
  • docfx/index.md

Validation Executed

Unit/Headless/Leak

  • dotnet test tests/Dock.Model.Avalonia.UnitTests/Dock.Model.Avalonia.UnitTests.csproj -nologo (Passed: 115)
  • dotnet test tests/Dock.Avalonia.HeadlessTests/Dock.Avalonia.HeadlessTests.csproj -nologo (Passed: 512)
  • dotnet test tests/Dock.Avalonia.LeakTests/Dock.Avalonia.LeakTests.csproj -c Release -nologo --filter "FullyQualifiedName~ToolDockItemsSourceLeakTests|FullyQualifiedName~DocumentDockItemsSourceLeakTests" (Passed: 4)
  • dotnet test tests/Dock.Model.UnitTests/Dock.Model.UnitTests.csproj -nologo (Passed: 81)

Build

  • dotnet build Dock.slnx -nologo (Succeeded, warnings only)

Notes for Reviewers

  • This PR intentionally mirrors existing DocumentDock patterns where reasonable while extending ToolDock with equivalent source-driven lifecycle behavior.
  • Source-generated dockables are now first-class citizens for close/remove semantics, including mixed manual/generated and cross-dock move workflows.
  • Sample + docs are included to make behavior discoverable and reproducible.

@wieslawsoltes wieslawsoltes merged commit 422f497 into master Feb 10, 2026
9 checks passed
@wieslawsoltes wieslawsoltes deleted the feature/tooldock-itemssource-parity branch February 10, 2026 18:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant