Доработан Docking
This commit is contained in:
@@ -4,20 +4,30 @@ using Lattice.Core.Docking.Models;
|
||||
namespace Lattice.Core.Docking.Engine;
|
||||
|
||||
/// <summary>
|
||||
/// Статический движок для манипуляции иерархией дерева компоновки.
|
||||
/// Содержит чистые алгоритмы трансформации графа.
|
||||
/// Предоставляет статические методы для манипуляции иерархией дерева компоновки.
|
||||
/// Содержит чистые алгоритмы трансформации графа без зависимости от UI.
|
||||
/// </summary>
|
||||
public static class DockOperations
|
||||
{
|
||||
/// <summary>
|
||||
/// Извлекает элемент из дерева. Если родительская группа остается с одним ребенком,
|
||||
/// она удаляется, а ребенок занимает её место.
|
||||
/// Извлекает элемент из дерева компоновки.
|
||||
/// Если родительская группа остается с одним ребенком, она удаляется,
|
||||
/// а оставшийся ребенок занимает её место в иерархии.
|
||||
/// </summary>
|
||||
/// <param name="element">Элемент для удаления.</param>
|
||||
/// <param name="root">Текущий корень дерева.</param>
|
||||
/// <returns>Новый корень дерева после оптимизации.</returns>
|
||||
/// <param name="element">Элемент для удаления из дерева.</param>
|
||||
/// <param name="root">Текущий корневой элемент дерева.</param>
|
||||
/// <returns>
|
||||
/// Новый корневой элемент дерева после удаления и оптимизации структуры.
|
||||
/// Возвращает null, если дерево становится пустым.
|
||||
/// </returns>
|
||||
/// <exception cref="ArgumentNullException">
|
||||
/// Выбрасывается, когда <paramref name="root"/> равен null.
|
||||
/// </exception>
|
||||
public static IDockElement? Remove(IDockElement element, IDockElement root)
|
||||
{
|
||||
if (element == null) throw new ArgumentNullException(nameof(element));
|
||||
if (root == null) throw new ArgumentNullException(nameof(root));
|
||||
|
||||
if (element == root) return null;
|
||||
|
||||
var parent = element.Parent as DockGroup;
|
||||
@@ -43,15 +53,36 @@ public static class DockOperations
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Вставляет элемент в дерево, создавая новую группу разделения или объединяя контент.
|
||||
/// Вставляет элемент в дерево компоновки относительно целевого элемента.
|
||||
/// Создает новую группу разделения или объединяет контент в зависимости от позиции.
|
||||
/// </summary>
|
||||
public static IDockElement Insert(IDockElement target, IDockElement source, DockPosition pos, IDockElement root)
|
||||
/// <param name="target">Целевой элемент, относительно которого выполняется вставка.</param>
|
||||
/// <param name="source">Вставляемый элемент.</param>
|
||||
/// <param name="pos">Позиция вставки относительно целевого элемента.</param>
|
||||
/// <param name="root">Текущий корневой элемент дерева.</param>
|
||||
/// <returns>
|
||||
/// Новый корневой элемент дерева после вставки и оптимизации структуры.
|
||||
/// </returns>
|
||||
/// <exception cref="ArgumentNullException">
|
||||
/// Выбрасывается, когда <paramref name="target"/>, <paramref name="source"/>
|
||||
/// или <paramref name="root"/> равны null.
|
||||
/// </exception>
|
||||
/// <exception cref="ArgumentException">
|
||||
/// Выбрасывается, когда <paramref name="pos"/> имеет недопустимое значение.
|
||||
/// </exception>
|
||||
public static IDockElement Insert(IDockElement target, IDockElement source,
|
||||
DockPosition pos, IDockElement root)
|
||||
{
|
||||
if (target == null) throw new ArgumentNullException(nameof(target));
|
||||
if (source == null) throw new ArgumentNullException(nameof(source));
|
||||
if (root == null) throw new ArgumentNullException(nameof(root));
|
||||
|
||||
// Случай 1: Объединение вкладок в центре
|
||||
if (pos == DockPosition.Center)
|
||||
{
|
||||
if (target is IDockContainer targetContainer && source is IDockContainer sourceContainer)
|
||||
{
|
||||
// Переносим все вкладки из источника в целевой контейнер
|
||||
var items = new List<IDockContent>(sourceContainer.Children);
|
||||
foreach (var item in items)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user