Main.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. #include <stdio.h>
  2. #include <string.h>
  3. import Core.Terminal;
  4. import Core.TerminalConstants;
  5. import Core.List;
  6. import Core.Math;
  7. import Core.ToString;
  8. import Core.Logger;
  9. using SizeVector = Core::Vector<2, size_t>;
  10. struct Cell {
  11. Core::String<16> content{};
  12. };
  13. static bool running = true;
  14. static SizeVector size = {20, 10};
  15. static Core::List<Cell> cells;
  16. static SizeVector cursorPosition{0, 0};
  17. static void init() {
  18. cells.resize(size[0] * size[1]);
  19. for(Cell& c : cells) {
  20. c.content.format(" ");
  21. }
  22. }
  23. static Cell& getCell(size_t x, size_t y) {
  24. return cells[y * size[0] + x];
  25. }
  26. static Cell& getCell(const SizeVector& v) {
  27. return getCell(v[0], v[1]);
  28. }
  29. static void print(const char* s) {
  30. fputs(s, stdout);
  31. }
  32. static size_t getColumnWidth(size_t x) {
  33. size_t w = 0;
  34. for(size_t y = 0; y < size[1]; y++) {
  35. Cell& c = getCell(x, y);
  36. w = Core::max(w, strlen(c.content));
  37. }
  38. return w;
  39. }
  40. static void render() {
  41. static constexpr const char* lc[2] = {
  42. Core::Terminal::BG_WHITE, Core::Terminal::BG_BRIGHT_WHITE};
  43. Core::clearTerminal();
  44. Core::resetCursor();
  45. Core::List<size_t> columnWidths;
  46. for(size_t x = 0; x < size[0]; x++) {
  47. columnWidths.add(getColumnWidth(x));
  48. }
  49. for(size_t y = 0; y < size[1]; y++) {
  50. print(lc[y & 1]);
  51. print("|");
  52. for(size_t x = 0; x < size[0]; x++) {
  53. Cell& c = getCell(x, y);
  54. if(cursorPosition[0] == x && cursorPosition[1] == y) {
  55. fputs(Core::Terminal::BG_BRIGHT_BLUE, stdout);
  56. }
  57. c.content.print();
  58. size_t filler = columnWidths[x] - strlen(c.content);
  59. while(filler > 0) {
  60. filler--;
  61. putchar(' ');
  62. }
  63. if(cursorPosition[0] == x && cursorPosition[1] == y) {
  64. fputs(lc[y & 1], stdout);
  65. }
  66. print("|");
  67. }
  68. putchar('\n');
  69. }
  70. fputs(Core::Terminal::RESET, stdout);
  71. }
  72. static void loop(u64 input) {
  73. // Core::IntVector2 size = Core::getTerminalSize();
  74. if(input == 'q') {
  75. running = false;
  76. return;
  77. } else if(input == Core::Terminal::KEY_ARROW_LEFT) {
  78. if(cursorPosition[0] > 0) {
  79. cursorPosition += SizeVector{-1, 0};
  80. }
  81. } else if(input == Core::Terminal::KEY_ARROW_RIGHT) {
  82. if(cursorPosition[0] < size[0] - 1) {
  83. cursorPosition += SizeVector{1, 0};
  84. }
  85. } else if(input == Core::Terminal::KEY_ARROW_UP) {
  86. if(cursorPosition[1] > 0) {
  87. cursorPosition += SizeVector{0, -1};
  88. }
  89. } else if(input == Core::Terminal::KEY_ARROW_DOWN) {
  90. if(cursorPosition[1] < size[1] - 1) {
  91. cursorPosition += SizeVector{0, 1};
  92. }
  93. } else {
  94. Cell& c = getCell(cursorPosition);
  95. c.content.add(static_cast<char>(input));
  96. }
  97. render();
  98. }
  99. int main() {
  100. Core::enterAlternativeTerminal();
  101. if(Core::enterRawTerminal()) {
  102. return 0;
  103. }
  104. init();
  105. render();
  106. while(running) {
  107. u64 u = Core::getRawChar();
  108. if(u != 0) {
  109. loop(u);
  110. }
  111. }
  112. if(Core::leaveRawTerminal()) {
  113. puts("Could not reset terminal.");
  114. }
  115. Core::leaveAlternativeTerminal();
  116. return 0;
  117. }