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,108 @@
using Lattice.Core.Docking.Models;
namespace Lattice.UI.Docking.Abstractions;
/// <summary>
/// Определяет контракт для UI-контрола, который отображает группу разделения (DockGroup).
/// Этот контрол управляет отображением двух дочерних элементов с разделителем между ними.
/// </summary>
/// <remarks>
/// Реализации этого интерфейса должны обеспечивать возможность изменения соотношения сторон
/// через перетаскивание разделителя и корректное отображение ориентации разделения.
/// </remarks>
public interface IDockGroupControl : IDockControl
{
/// <summary>
/// Получает или задает ориентацию разделения группы.
/// </summary>
/// <value>
/// Направление разделения (горизонтальное или вертикальное).
/// </value>
SplitDirection Orientation { get; set; }
/// <summary>
/// Получает или задает соотношение разделения между первым и вторым элементами.
/// </summary>
/// <value>
/// Значение от 0.0 до 1.0, где 0.5 означает равное разделение.
/// </value>
double SplitRatio { get; set; }
/// <summary>
/// Получает или задает минимальный размер разделителя.
/// </summary>
/// <value>
/// Минимальный размер разделителя в пикселях.
/// </value>
double SplitterSize { get; set; }
/// <summary>
/// Получает контрол для первого дочернего элемента.
/// </summary>
/// <value>
/// Контрол, отображающий первый дочерний элемент.
/// </value>
IDockControl? FirstChild { get; }
/// <summary>
/// Получает контрол для второго дочернего элемента.
/// </summary>
/// <value>
/// Контрол, отображающий второй дочерний элемент.
/// </value>
IDockControl? SecondChild { get; }
/// <summary>
/// Устанавливает дочерние контролы для отображения.
/// </summary>
/// <param name="firstChild">Контрол для первого элемента.</param>
/// <param name="secondChild">Контрол для второго элемента.</param>
void SetChildren(IDockControl? firstChild, IDockControl? secondChild);
/// <summary>
/// Событие, возникающее при изменении соотношения разделения.
/// </summary>
event EventHandler<SplitRatioChangedEventArgs> SplitRatioChanged;
}
/// <summary>
/// Аргументы события изменения соотношения разделения.
/// </summary>
public class SplitRatioChangedEventArgs : EventArgs
{
/// <summary>
/// Новое соотношение разделения.
/// </summary>
public double NewRatio { get; }
/// <summary>
/// Источник изменения (пользователь или программа).
/// </summary>
public SplitRatioChangeSource Source { get; }
/// <summary>
/// Инициализирует новый экземпляр класса <see cref="SplitRatioChangedEventArgs"/>.
/// </summary>
/// <param name="newRatio">Новое соотношение разделения.</param>
/// <param name="source">Источник изменения.</param>
public SplitRatioChangedEventArgs(double newRatio, SplitRatioChangeSource source)
{
NewRatio = newRatio;
Source = source;
}
}
/// <summary>
/// Источник изменения соотношения разделения.
/// </summary>
public enum SplitRatioChangeSource
{
/// <summary>Изменение выполнено пользователем.</summary>
User,
/// <summary>Изменение выполнено программой.</summary>
Programmatic,
/// <summary>Изменение выполнено при восстановлении состояния.</summary>
Restore
}