DragAndDrop core

This commit is contained in:
FrigaT
2026-01-18 16:33:35 +03:00
parent 9ea82af329
commit 79bdd8bc62
229 changed files with 21214 additions and 2494 deletions

View File

@@ -0,0 +1,37 @@
namespace Lattice.Serialization.Docking;
/// <summary>
/// DTO для автоскрываемой панели (AutoHidePanel).
/// </summary>
public class AutoHidePanelDto
{
/// <summary>
/// Уникальный идентификатор панели.
/// </summary>
public string Id { get; set; } = Guid.NewGuid().ToString();
/// <summary>
/// Ссылка на контент панели.
/// </summary>
public ContentReferenceDto Content { get; set; } = null!;
/// <summary>
/// Сторона прикрепления в виде строки.
/// </summary>
public string Side { get; set; } = string.Empty;
/// <summary>
/// Размер панели в пикселях.
/// </summary>
public double Size { get; set; } = 300;
/// <summary>
/// Показывает, видима ли панель.
/// </summary>
public bool IsVisible { get; set; } = false;
/// <summary>
/// Смещение для анимации (0.0 - 1.0).
/// </summary>
public double SlideOffset { get; set; } = 0.0;
}

View File

@@ -0,0 +1,32 @@
namespace Lattice.Serialization.Docking;
/// <summary>
/// DTO для ссылки на контент без сериализации самого контента.
/// </summary>
public class ContentReferenceDto
{
/// <summary>
/// Уникальный идентификатор контента.
/// </summary>
public string Id { get; set; } = string.Empty;
/// <summary>
/// Тип контента (для восстановления через ContentRegistry).
/// </summary>
public string TypeId { get; set; } = string.Empty;
/// <summary>
/// Отображаемое название контента.
/// </summary>
public string Title { get; set; } = string.Empty;
/// <summary>
/// Показывает, можно ли закрыть контент.
/// </summary>
public bool CanClose { get; set; } = true;
/// <summary>
/// Дополнительные свойства контента для восстановления состояния.
/// </summary>
public Dictionary<string, object?> Properties { get; set; } = new();
}

View File

@@ -0,0 +1,37 @@
namespace Lattice.Serialization.Docking;
/// <summary>
/// Базовый DTO для элементов дерева компоновки.
/// </summary>
public abstract class ElementDto
{
/// <summary>
/// Уникальный идентификатор элемента.
/// </summary>
public string Id { get; set; } = Guid.NewGuid().ToString();
/// <summary>
/// Тип элемента (для десериализации).
/// </summary>
public string Type { get; set; } = string.Empty;
/// <summary>
/// Ширина элемента.
/// </summary>
public double Width { get; set; }
/// <summary>
/// Высота элемента.
/// </summary>
public double Height { get; set; }
/// <summary>
/// Минимальная ширина элемента.
/// </summary>
public double MinWidth { get; set; }
/// <summary>
/// Минимальная высота элемента.
/// </summary>
public double MinHeight { get; set; }
}

View File

@@ -0,0 +1,27 @@
namespace Lattice.Serialization.Docking;
/// <summary>
/// DTO для группы разделения (DockGroup).
/// </summary>
public class GroupDto : ElementDto
{
/// <summary>
/// Первый дочерний элемент (левая или верхняя область).
/// </summary>
public ElementDto First { get; set; } = null!;
/// <summary>
/// Второй дочерний элемент (правая или нижняя область).
/// </summary>
public ElementDto Second { get; set; } = null!;
/// <summary>
/// Направление разделения в виде строки.
/// </summary>
public string Orientation { get; set; } = string.Empty;
/// <summary>
/// Соотношение разделения между первым и вторым элементами (0.0 - 1.0).
/// </summary>
public double SplitRatio { get; set; } = 0.5;
}

View File

@@ -0,0 +1,47 @@
namespace Lattice.Serialization.Docking;
/// <summary>
/// Data Transfer Object (DTO) для сериализации состояния макета док-системы.
/// Содержит все необходимые данные для сохранения и восстановления состояния макета.
/// </summary>
/// <remarks>
/// Этот DTO является независимым от формата сериализации (JSON, XML, Binary) и используется
/// как промежуточное представление между объектной моделью и сериализованными данными.
/// </remarks>
public class LayoutDto
{
/// <summary>
/// Версия формата DTO для контроля совместимости.
/// </summary>
public string Version { get; set; } = "1.0";
/// <summary>
/// Дата и время создания DTO в UTC.
/// </summary>
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
/// <summary>
/// Идентификатор приложения, создавшего DTO.
/// </summary>
public string? ApplicationId { get; set; }
/// <summary>
/// Корневой элемент дерева компоновки.
/// </summary>
public ElementDto? Root { get; set; }
/// <summary>
/// Список плавающих окон.
/// </summary>
public List<WindowDto> FloatingWindows { get; set; } = new();
/// <summary>
/// Список автоскрываемых панелей.
/// </summary>
public List<AutoHidePanelDto> AutoHidePanels { get; set; } = new();
/// <summary>
/// Дополнительные метаданные, специфичные для приложения.
/// </summary>
public Dictionary<string, string> Metadata { get; set; } = new();
}

View File

@@ -0,0 +1,22 @@
namespace Lattice.Serialization.Docking;
/// <summary>
/// DTO для контейнера вкладок (DockLeaf).
/// </summary>
public class LeafDto : ElementDto
{
/// <summary>
/// Список ссылок на контент, содержащийся в листе.
/// </summary>
public List<ContentReferenceDto> Contents { get; set; } = new();
/// <summary>
/// Идентификатор активного контента (если есть).
/// </summary>
public string? ActiveContentId { get; set; }
/// <summary>
/// Расположение вкладок в виде строки.
/// </summary>
public string TabPlacement { get; set; } = "Bottom";
}

View File

@@ -0,0 +1,52 @@
namespace Lattice.Serialization.Docking;
/// <summary>
/// DTO для плавающего окна (DockWindow).
/// </summary>
public class WindowDto
{
/// <summary>
/// Уникальный идентификатор окна.
/// </summary>
public string Id { get; set; } = Guid.NewGuid().ToString();
/// <summary>
/// Позиция X окна на экране.
/// </summary>
public double X { get; set; }
/// <summary>
/// Позиция Y окна на экране.
/// </summary>
public double Y { get; set; }
/// <summary>
/// Ширина окна.
/// </summary>
public double Width { get; set; } = 800;
/// <summary>
/// Высота окна.
/// </summary>
public double Height { get; set; } = 600;
/// <summary>
/// Заголовок окна.
/// </summary>
public string Title { get; set; } = "Lattice Tool Window";
/// <summary>
/// Корневой элемент макета внутри окна.
/// </summary>
public ElementDto? Root { get; set; }
/// <summary>
/// Показывает, видимо ли окно.
/// </summary>
public bool IsVisible { get; set; } = true;
/// <summary>
/// Показывает, сфокусировано ли окно.
/// </summary>
public bool IsFocused { get; set; } = false;
}