22using System . Windows ;
33using System . Windows . Media ;
44
5- // Represents graphical box that is part of math expression, and can itself contain child boxes.
65namespace MathCore . WPF . TeX ;
76
7+ /// <summary>
8+ /// Визуальный бокс - графический элемент математического выражения, который может содержать дочерние боксы
9+ /// </summary>
10+ /// <remarks>
11+ /// Боксы - это результат преобразования атомов (Atom) в визуальное представление.
12+ /// Каждый бокс содержит:
13+ /// - Размеры (ширину, высоту, глубину)
14+ /// - Визуальные свойства (кисти для переднего плана и фона)
15+ /// - Дочерние боксы (для составных элементов)
16+ ///
17+ /// Различные типы боксов отрисовывают себя по-разному:
18+ /// CharBox отрисовывает символ, HorizontalBox - ряд боксов, FractionBox - дробь и т.д.
19+ /// </remarks>
820public abstract class Box
921{
1022 private readonly List < Box > _Children ;
1123 private readonly ReadOnlyCollection < Box > _ChildrenReadOnly ;
1224
25+ /// <summary>Дочерние боксы, входящие в состав этого бокса</summary>
1326 public ReadOnlyCollection < Box > Children => _ChildrenReadOnly ;
1427
28+ /// <summary>Кисть для отрисовки переднего плана (символы, линии и т.д.)</summary>
1529 public Brush ? Foreground { get ; set ; }
1630
31+ /// <summary>Кисть для отрисовки фонового прямоугольника</summary>
1732 public Brush Background { get ; set ; }
1833
34+ /// <summary>
35+ /// Общая высота бокса (высота над базовой линией + глубина ниже базовой линии)
36+ /// </summary>
1937 public double TotalHeight => Height + Depth ;
2038
39+ /// <summary>Ширина бокса (в единицах относительного размера, масштабируется при рендеринге)</summary>
2140 public double Width { get ; set ; }
2241
42+ /// <summary>Высота бокса выше базовой линии (в единицах относительного размера)</summary>
2343 public double Height { get ; set ; }
2444
45+ /// <summary>Глубина бокса ниже базовой линии (в единицах относительного размера)</summary>
2546 public double Depth { get ; set ; }
2647
48+ /// <summary>Вертикальное смещение бокса от базовой линии (положительное = вверх)</summary>
2749 public double Shift { get ; set ; }
2850
51+ /// <summary>
52+ /// Инициализирует новый экземпляр бокса с использованием визуальных свойств из среды
53+ /// </summary>
54+ /// <param name="environment">Среда рендеринга с информацией о цветах и стилях</param>
2955 internal Box ( TexEnvironment environment ) : this ( environment . Foreground , environment . Background ) { }
3056
57+ /// <summary>Инициализирует новый экземпляр пустого бокса</summary>
3158 protected Box ( ) : this ( null , null ) { }
3259
60+ /// <summary>
61+ /// Инициализирует новый экземпляр бокса с заданными визуальными свойствами
62+ /// </summary>
63+ /// <param name="foreground">Кисть для переднего плана</param>
64+ /// <param name="background">Кисть для фона</param>
3365 protected Box ( Brush foreground , Brush background )
3466 {
3567 _Children = [ ] ;
@@ -38,17 +70,43 @@ protected Box(Brush foreground, Brush background)
3870 Background = background ;
3971 }
4072
73+ /// <summary>
74+ /// Отрисовывает бокс и его дочерние элементы в WPF DrawingContext
75+ /// </summary>
76+ /// <param name="Context">WPF контекст для отрисовки</param>
77+ /// <param name="scale">Коэффициент масштабирования (обычно размер шрифта)</param>
78+ /// <param name="x">Координата X в пиксельных точках</param>
79+ /// <param name="y">Координата Y в пиксельных точках (базовая линия)</param>
80+ /// <remarks>
81+ /// Базовая реализация отрисовывает фоновый прямоугольник, если задана кисть для фона.
82+ /// Подклассы переопределяют этот метод для отрисовки своего специфичного содержимого.
83+ /// </remarks>
4184 public virtual void Draw ( DrawingContext Context , double scale , double x , double y )
4285 {
4386 if ( Background is null ) return ;
44- // Fill background of box with color.
87+ // Отрисовать фон бокса прямоугольником
4588 Context . DrawRectangle ( Background , null , new ( x * scale , ( y - Height ) * scale ,
4689 Width * scale , ( Height + Depth ) * scale ) ) ;
4790 }
4891
92+ /// <summary>Добавляет дочерний бокс в конец списка дочерних элементов</summary>
93+ /// <param name="box">Бокс для добавления</param>
4994 public virtual void Add ( Box box ) => _Children . Add ( box ) ;
5095
96+ /// <summary>
97+ /// Вставляет дочерний бокс в указанную позицию в списке дочерних элементов
98+ /// </summary>
99+ /// <param name="position">Позиция для вставки (0-основана)</param>
100+ /// <param name="box">Бокс для вставки</param>
51101 public virtual void Add ( int position , Box box ) => _Children . Insert ( position , box ) ;
52102
103+ /// <summary>
104+ /// Получает идентификатор последнего используемого шрифта в этом боксе и его дочерних элементах
105+ /// </summary>
106+ /// <returns>Идентификатор шрифта</returns>
107+ /// <remarks>
108+ /// Используется для оптимизации - когда несколько элементов используют один шрифт,
109+ /// можно избежать переключения контекста рендеринга.
110+ /// </remarks>
53111 public abstract int GetLastFontId ( ) ;
54112}
0 commit comments