Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
alanthinker opened this issue Apr 4, 2024 · 3 comments

Comments

@alanthinker
Copy link

alanthinker commented Apr 4, 2024

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
Copy link
Author

alanthinker commented Apr 18, 2024

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
Copy link
Author

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(); 
    }
    
}


@wieslawsoltes
Copy link
Owner

You need to use dock state and restore properly it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants