-
Notifications
You must be signed in to change notification settings - Fork 0
/
ColoredChar.cs
141 lines (122 loc) · 4.75 KB
/
ColoredChar.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
using System;
namespace Thuja
{
/// <summary>
/// Стиль символа.
/// </summary>
public readonly struct Style
{
/// <summary>
/// Стиль по-умолчанию.
/// </summary>
public static Style Default = new(MyColor.Default, MyColor.Default);
/// <summary>
/// Стиль активных элементов.
/// </summary>
public static Style Active = new(MyColor.Black, MyColor.White);
/// <summary>
/// Стиль неактивных элементов.
/// </summary>
public static Style Inactive = new(MyColor.Gray, MyColor.DarkGray);
/// <summary>
/// Стиль декоративных элементов.
/// </summary>
public static Style Decoration = new(MyColor.DarkGray, MyColor.Black);
/// <summary>
/// Тёмносерый цвет на фоне по-умолчанию.
/// </summary>
public static Style DarkGrayOnDefault = new(MyColor.DarkGray, MyColor.Default);
/// <summary>
/// Цвет текста.
/// </summary>
public readonly MyColor Foreground;
/// <summary>
/// Цвет фона.
/// </summary>
public readonly MyColor Background;
/// <summary>
/// Создаёт новый стиль с указанными цветами.
/// </summary>
public Style(MyColor foreground, MyColor background)
{
Foreground = foreground;
Background = background;
}
/// <summary>
/// Сравнивает два цвета на равенство.
/// </summary>
/// <param name="other">Стиль, с которым нужно сравнить текущий.</param>
/// <returns>true, если они одинаковы.</returns>
public bool Equals(Style other)
{
return Foreground == other.Foreground && Background == other.Background;
}
/// <inheritdoc />
public override bool Equals(object? obj)
{
return obj is Style other && Equals(other);
}
/// <inheritdoc />
public override int GetHashCode()
{
return HashCode.Combine((int) Foreground, (int) Background);
}
}
/// <summary>
/// Символ, который также содержит его стиль и слой.
/// </summary>
public readonly struct ColoredChar
{
/// <summary>
/// Стиль, с которым должен быть отображен символ.
/// </summary>
public readonly Style Style;
/// <summary>
/// Сам символ.
/// </summary>
public readonly char Char;
/// <summary>
/// Слой, на котором будет отображен символ.
/// Используется для выбора отображаемого символа, если одновременно несколько
/// находятся на одних и тех же координтатх. Выше слой — выше приоритет.
/// </summary>
public readonly int Layer;
/// <summary>
/// Создает новый символ с указанными параметрами.
/// </summary>
public ColoredChar(Style style, char c, int layer = 0)
{
Style = style;
Char = c;
Layer = layer;
}
/// <summary>
/// Сравнивает два символа, независимо от их слоёв.
/// </summary>
/// <param name="other">Символ, на равенство с которым необходимо сравнить этот.</param>
/// <returns>true, если они одинаковы.</returns>
public bool FlatEquals(ColoredChar other)
{
return Style.Equals(other.Style) && Char == other.Char;
}
/// <summary>
/// Сравнивает два символа.
/// </summary>
/// <param name="other">Символ, с которым нужно сравнить текущий.</param>
/// <returns>true, если они одинаковы.</returns>
public bool Equals(ColoredChar other)
{
return FlatEquals(other) && Layer == other.Layer;
}
/// <inheritdoc />
public override bool Equals(object? obj)
{
return obj is ColoredChar other && Equals(other);
}
/// <inheritdoc />
public override int GetHashCode()
{
return HashCode.Combine(Style, Char, Layer);
}
}
}