Website Summary Files Commits Branches @commit @diff @stats
path: root / src / Generic / ConsoleInterface / Toolbox.cpp
blob: ca739f02c22297592d4bc4fa8886f2821106c59a (plain) (blame)
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
#include "Toolbox.hpp"

/* Input line boxes */

void __inputLineBoxGetInput(char* output, unsigned maxWidth, bool ignore) {
	if (ignore)
		std::cin.ignore();
	std::cin.getline(output, maxWidth);
}

/*! \param label C-style string, there are no size check so it could wrap
 *  \param output Pointer to a char array
 *  \param maxWidth Maximum count of characters to read from user input. output MUST be able to hold that many characters!
 *  \param ignore Whether or not to ignore the first new-line delimiter.
 *         true by default, should be set to false only when an inputLineBox/SubBox has been issued directly prior or when it's the very first issued box command.
 *
 *  Prints "(+)" before the label.
 */
void inputLineBox(char* output, unsigned maxWidth, bool ignore) {
	print("> ");
	__inputLineBoxGetInput(output, maxWidth, ignore);
}

/* Table */

void __printTableHeaderNumber(unsigned number) {
	std::cout << ":" << ((number < 100) ? " " : "") << number << ((number < 10) ? " " : "");
}

void __printTableColumnHeader(unsigned count, unsigned start = 1) {
	std::cout << ":   ";
	for (unsigned i = 0; i < count; i++)
		__printTableHeaderNumber(start++);
	std::cout << ":" << std::endl;

	for (unsigned i = 0; i <= count; i++)
		std::cout << "====";
	std::cout << "=" << std::endl;
}

void __printTableLine(unsigned columns) {
	std::cout << ":===";
	for (unsigned i = 0; i < columns; i++)
		std::cout << "+---";
	std::cout << ":" << std::endl;
}

void __printPadded(const String& str, unsigned width) {
	while (width - str.get_length() > 0) {
		width--;
		print(" ");
	}
	print(str.get_cstr());
}

/*! \param startNumber The number by which column and row enumeration begins
 *  \param columns How many columns the table should have
 *  \param items C-style string, each cell is a single character from the string
 *
 * Prints a string as a grid/table of characters from top to bottom, left to right.
 * The first character is on the top left, the last one is on the bottom right.
 *
 * Table is printed until a terminating zero is encountered.
 * The rows are "calculated" from the columns count and the items length.
 */
void printTable(const List<String>& items, unsigned columns) {
	unsigned *colWidths = new unsigned[columns];
	for (unsigned i = 0; i < columns; i++)
		colWidths[i] = 0;

	for (unsigned i = 0; i < items.get_count(); i++) {
		if (colWidths[i % columns] < items[i].get_length())
			colWidths[i % columns] = items[i].get_length();
	}

	// __printTableColumnHeader(columns);

	for (unsigned i = 0; i < items.get_count(); i++) {
		__printPadded(items[i], colWidths[i % columns]);
		if (i % columns == columns - 1)
			printLine("");
		else
			print("|");
	}

	delete[] colWidths;
}