Dock icon indicating copy to clipboard operation
Dock copied to clipboard

After Restore layout in DockXamlSample, the methods InsertDockable and RemoveDockable not work.

Open alanthinker opened this issue 10 months ago • 2 comments

Before call OpenLayout() in the DockXamlSample, the methods InsertDockable and RemoveDockable all ok. but After Restore layout by call OpenLayout() in DockXamlSample, the methods InsertDockable and RemoveDockable not work

This is the code I added:

 private void miAdd_Click(object? sender, Avalonia.Interactivity.RoutedEventArgs e)
 {
     Dock.Factory.InsertDockable(ErrorList.Owner as IDock, Output, 0);
 }

 private void miRemove_Click(object? sender, Avalonia.Interactivity.RoutedEventArgs e)
 {
     Dock.Factory.RemoveDockable(Output, true);
 }

alanthinker avatar Apr 04 '24 15:04 alanthinker

And after restored layout, set title not work too.

private void miSetTitle_Click(object? sender, Avalonia.Interactivity.RoutedEventArgs e)
{
    Document1.Title = DateTime.Now.ToString();
}

alanthinker avatar Apr 18 '24 08:04 alanthinker

Fixed it by use my own _dockState;

    private void miAdd_Click(object? sender, Avalonia.Interactivity.RoutedEventArgs e)
    {
        var dock = this.FindControl<DockControl>("Dock");
        dock.Layout.Factory.InsertDockable((_dockState.Tools[ErrorList.Id]).Owner as IDock, Output, 0);
    }

    private void miRemove_Click(object? sender, Avalonia.Interactivity.RoutedEventArgs e)
    {
        var dock = this.FindControl<DockControl>("Dock");
        dock.Layout.Factory.RemoveDockable(_dockState.Tools[Output.Id], true);
    }

    private void miSetTitle_Click(object? sender, Avalonia.Interactivity.RoutedEventArgs e)
    {
        _dockState.Documents[Document1.Id].Title= DateTime.Now.ToString(); 
    }
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.Json;
using System.Threading.Tasks;
using Avalonia.Collections;
using Avalonia.Controls;
using Avalonia.Interactivity;
using Avalonia.LogicalTree;
using Avalonia.Markup.Xaml;
using Avalonia.Platform.Storage;
using Dock.Avalonia.Controls;
using Dock.Model;
using Dock.Model.Avalonia.Controls;
using Dock.Model.Avalonia.Json;
using Dock.Model.Core;
using Dock.Serializer;

namespace DockXamlSample;

public partial class MainView : UserControl
{
    private readonly IDockSerializer _serializer;
    private readonly MyDockState _dockState;

    public MainView()
    {
        InitializeComponent();

        _serializer = new DockSerializer(typeof(AvaloniaList<>));
        // _serializer = new AvaloniaDockSerializer();

        _dockState = new MyDockState();

        if (Dock is { })
        {
            var layout = Dock.Layout;
            if (layout is { })
            {
                _dockState.Save(layout);
            }

            Dock.Factory.WindowMoveDragEnd += Factory_WindowMoveDragEnd;
        }
    }

    private void Factory_WindowMoveDragEnd(object? sender, Dock.Model.Core.Events.WindowMoveDragEndEventArgs e)
    {
         
    }

    private void InitializeComponent()
    {
        AvaloniaXamlLoader.Load(this);
    }

    private List<FilePickerFileType> GetOpenOpenLayoutFileTypes()
    {
        return new List<FilePickerFileType>
        {
            StorageService.Json,
            StorageService.All
        };
    }

    private List<FilePickerFileType> GetSaveOpenLayoutFileTypes()
    {
        return new List<FilePickerFileType>
        {
            StorageService.Json,
            StorageService.All
        };
    }

    private async Task OpenLayout()
    {
        var storageProvider = StorageService.GetStorageProvider();
        if (storageProvider is null)
        {
            return;
        }

        var result = await storageProvider.OpenFilePickerAsync(new FilePickerOpenOptions
        {
            Title = "Open layout",
            FileTypeFilter = GetOpenOpenLayoutFileTypes(),
            AllowMultiple = false
        });

        var file = result.FirstOrDefault();

        if (file is not null)
        {
            try
            {
                await using var stream = await file.OpenReadAsync();
                using var reader = new StreamReader(stream);
                var dock = this.FindControl<DockControl>("Dock");
                if (dock is { })
                {
                    var layout = _serializer.Load<IDock?>(stream);
                    // TODO:
                    // var layout = await JsonSerializer.DeserializeAsync(
                    //     stream, 
                    //     AvaloniaDockSerializer.s_serializerContext.RootDock);
                    if (layout is { })
                    {


                        //var x = (layout as Dock.Model.Avalonia.Controls.RootDock).Find<Document>("Document1");
                        //x.Title = DateTime.Now.ToString();

                        var docPanel = (((((layout as Dock.Model.Avalonia.Controls.RootDock).ActiveDockable as Dock.Model.Avalonia.Controls.ProportionalDock).VisibleDockables[2] as Dock.Model.Avalonia.Controls.ProportionalDock).VisibleDockables[0] as Dock.Model.Avalonia.Controls.ProportionalDock).VisibleDockables[0] as Dock.Model.Avalonia.Controls.DocumentDock);
                        (docPanel.VisibleDockables[0] as Dock.Model.Avalonia.Controls.Document).Title = "999";
                        dock.Layout = layout; 
                        _dockState.Restore(layout);

                        //var x2 = (layout as Dock.Model.Avalonia.Controls.RootDock).FindLogicalDescendantOfType<Document>();
                        //x2.Title = DateTime.Now.ToString();



                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
        }
    }

    private async Task SaveLayout()
    {
        var storageProvider = StorageService.GetStorageProvider();
        if (storageProvider is null)
        {
            return;
        }

        var file = await storageProvider.SaveFilePickerAsync(new FilePickerSaveOptions
        {
            Title = "Save layout",
            FileTypeChoices = GetSaveOpenLayoutFileTypes(),
            SuggestedFileName = "layout",
            DefaultExtension = "json",
            ShowOverwritePrompt = true
        });

        if (file is not null)
        {
            try
            {
                await using var stream = await file.OpenWriteAsync();
                var dock = this.FindControl<DockControl>("Dock");
                if (dock?.Layout is { })
                {
                    _serializer.Save(stream, dock.Layout);
                    // TODO:
                    // await JsonSerializer.SerializeAsync(
                    //     stream, 
                    //     (RootDock)dock.Layout, AvaloniaDockSerializer.s_serializerContext.RootDock);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
        }
    }

    private void CloseLayout()
    {
        var dock = this.FindControl<DockControl>("Dock");
        if (dock is { })
        {
            dock.Layout = null;
        }
    }

    private async void FileOpenLayout_OnClick(object? sender, RoutedEventArgs e)
    {
        await OpenLayout();
    }

    private async void FileSaveLayout_OnClick(object? sender, RoutedEventArgs e)
    {
        await SaveLayout();
    }

    private void FileCloseLayout_OnClick(object? sender, RoutedEventArgs e)
    {
        CloseLayout();
    }

    private void miAdd_Click(object? sender, Avalonia.Interactivity.RoutedEventArgs e)
    {
        var dock = this.FindControl<DockControl>("Dock");
        dock.Layout.Factory.InsertDockable((_dockState.Tools[ErrorList.Id]).Owner as IDock, Output, 0);
    }

    private void miRemove_Click(object? sender, Avalonia.Interactivity.RoutedEventArgs e)
    {
        var dock = this.FindControl<DockControl>("Dock");
        dock.Layout.Factory.RemoveDockable(_dockState.Tools[Output.Id], true);
    }

    private void miSetTitle_Click(object? sender, Avalonia.Interactivity.RoutedEventArgs e)
    {
        _dockState.Documents[Document1.Id].Title= DateTime.Now.ToString(); 
    }
    
}


alanthinker avatar Apr 18 '24 10:04 alanthinker

You need to use dock state and restore properly it.

wieslawsoltes avatar Jun 01 '24 17:06 wieslawsoltes