-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathUpdateString.cs
153 lines (142 loc) · 5.75 KB
/
UpdateString.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
142
143
144
145
146
147
148
149
150
151
152
153
using System;
namespace Carret
{
/// <summary>
/// Класс для вывода строки на том же месте, где она была
/// выведена в первый раз.
/// Удобно использовать, чтобы не плодить строки и обновлять уже существующую информацию.
/// </summary>
public class UpdateString
{
private string[] write;
private int top = -1;
private int latestTop = -1;
private int latestLeft = -1;
private bool firstWrite = true;
/// <summary>
/// Возвращает количество строк для вывода
/// </summary>
public int length { get { return write.Length; } }
/// <summary>
/// Конструктор объекта типа UpdateString.
/// </summary>
/// <param name="write">Набор строк для вывода</param>
public UpdateString(params string[] write)
{
this.write = write;
}
/// <summary>
/// Метод вывода строки в консоль в одном и том же месте.
/// Первый вывод осуществляется на текущем месте каретки (с последующим её переносом на новую строку).
/// Последующие выводы будут осуществлятся на месте первого вывода строки,
/// после чего каретка будет возвращена на место до вызова этого метода.
/// </summary>
/// <param name="write">Строки для вывода</param>
public void Write(params string[] write)
{
if (write.Length > 0)
this.write = write;
latestTop = Console.CursorTop;
latestLeft = Console.CursorLeft;
if (top == -1)
top = latestTop;
else Console.CursorTop = top;
Console.CursorLeft = 0;
string build = "";
foreach (string a in this.write)
{
build += a;
}
int buffer = Console.WindowWidth;
if (build.Length > buffer) build = build.Substring(0, buffer);
else if (build.Length < buffer) build += new string(' ', buffer - build.Length);
if (firstWrite)
{
Console.WriteLine(build);
latestTop++;
firstWrite = false;
}
else Console.Write(build);
Console.CursorTop = latestTop;
Console.CursorLeft = latestLeft;
}
/// <summary>
/// Удаляет строку с заданным индексом.
/// </summary>
/// <param name="index">Индекс строки</param>
public void RemoveIndex(int index)
{
if (index >= 0 && index < write.Length)
{
for (int i = index; i < write.Length - 1; i++)
{
write[i] = write[i + 1];
}
Array.Resize(ref write, write.Length - 1);
}
}
/// <summary>
/// Очищает строку для вывода от всех элементов.
/// </summary>
public void Clear()
{
write = new string[] { };
}
/// <summary>
/// Изменяет количество элементов для вывода.
/// </summary>
/// <param name="newSize">Новое количество элементов</param>
public void Resize(int newSize)
{
Array.Resize(ref write, newSize);
}
/// <summary>
/// Добавить элемент в самом начале.
/// </summary>
/// <param name="value">Значение для добавления в начале строки</param>
public void AddValueFirst(string value)
{
Array.Resize(ref write, write.Length + 1);
for (int i = write.Length - 1; i > 0; i--)
{
write[i] = write[i - 1];
}
write[0] = value;
}
/// <summary>
/// Добавить элемент в самом конце.
/// </summary>
/// <param name="value">Значение для добавления в конец строки</param>
public void AddValueLast(string value)
{
Array.Resize(ref write, write.Length + 1);
write[write.Length - 1] = value;
}
/// <summary>
/// Добавить элементы в самом конце.
/// </summary>
/// <param name="value">Значения для добавления в конце строки</param>
public void AddValueLast(params string[] value)
{
if (value.Length > 0)
{
int lengthLast = write.Length;
Array.Resize(ref write, lengthLast + value.Length);
for (int i = 0; i + lengthLast < write.Length; i++)
{
write[i + lengthLast] = value[i];
}
}
}
/// <summary>
/// Чтение/Запись значения с нужным индексом.
/// </summary>
/// <param name="index">Индекс элемента</param>
/// <returns>подстрока с заданным индексом</returns>
public string this[int index]
{
get { return write[index]; }
set { write[index] = value; }
}
}
}