add selector to timetable. --CONTAINS BUGS--
/ sync-to-origin (push) Has been cancelled

This commit is contained in:
2025-03-09 09:07:54 +01:00
parent d9fd2d40eb
commit 43d53629ca
4 changed files with 254 additions and 9 deletions
+99 -5
View File
@@ -3,6 +3,7 @@
#include "const.h"
#include "helper_funcs.h"
#include "net.h"
#include "types.h"
#include <cstdint>
#include <curses.h>
#include <cwchar>
@@ -10,6 +11,7 @@
#include <iostream>
#include <ncurses.h>
#include <nlohmann/json.hpp>
#include <panel.h>
#include <string>
#include <vector>
@@ -204,7 +206,7 @@ void timetable_page() {
}
std::cerr << RED "[ERROR]" << RESET " Hour with id " << HourIdLookupTable[i]
<< " not found\n";
goto timetable_error_exit;
safe_exit(128);
hour_id_found:
@@ -241,8 +243,6 @@ void timetable_page() {
try {
if (atom->contains("Change") && !atom->at("Change").is_null()) {
std::clog << "Change: " << atom->at("Change") << "\n";
switch (
hash_djb2a(atom->at("Change")["ChangeType"].get<std::string>())) {
case "Canceled"_sh:
@@ -317,8 +317,102 @@ void timetable_page() {
}
}
refresh();
getch();
timetable_error_exit:
SelectorType selected_cell(0, 0, 0, num_of_columns - 1, 0, num_of_days - 1);
std::array<WINDOW *, 4> selector_windows;
std::array<PANEL *, 4> selector_panels;
{
const chtype corners[] = {
ACS_ULCORNER, /* Upper left corner */
ACS_URCORNER, /* Upper right corner */
ACS_LLCORNER, /* Lower left corner */
ACS_LRCORNER /* Lower right corner */
};
unsigned short x_offset, y_offset;
for (uint8_t i = 0; i < selector_windows.size(); i++) {
if (!(i % 2 == 0)) {
x_offset = cell_width - 1;
} else {
x_offset = 0;
}
if (!(i < 2)) {
y_offset = cell_height - 1;
} else {
y_offset = 0;
}
selector_windows[i] =
newwin(1, 1, DEFAULT_OFFSET + y_offset, DEFAULT_OFFSET + x_offset);
selector_panels[i] = new_panel(selector_windows[i]);
wattron(selector_windows[i], COLOR_PAIR(COLOR_RED));
mvwaddch(selector_windows[i], 0, 0, corners[i]);
wattroff(selector_windows[i], COLOR_PAIR(COLOR_RED));
}
}
update_panels();
doupdate();
int ch;
while ((ch = getch()) != KEY_F(1)) {
run_loop_again:
switch (ch) {
case KEY_UP:
case 'k':
selected_cell.y--;
break;
case KEY_DOWN:
case 'j':
selected_cell.y++;
break;
case KEY_LEFT:
case 'h':
selected_cell.x--;
break;
case KEY_RIGHT:
case 'l':
selected_cell.x++;
break;
}
{ // print selected indicator
chtype top_left_corner =
mvwinch(cells[selected_cell.y][selected_cell.x], 0, 0);
if (!((top_left_corner & A_CHARTEXT) == 32)) {
for (uint8_t i = 0; i < selector_panels.size(); i++) {
unsigned short x_offset, y_offset;
if (!(i % 2 == 0)) {
x_offset = cell_width - 1;
} else {
x_offset = 0;
}
if (!(i < 2)) {
y_offset = cell_height - 1;
} else {
y_offset = 0;
}
move_panel(selector_panels[i],
DEFAULT_OFFSET + y_offset + selected_cell.y * cell_height,
DEFAULT_OFFSET + x_offset + selected_cell.x * cell_width);
}
for (uint8_t i = 0; i < num_of_days; i++) {
for (uint8_t j = 0; j < num_of_columns; j++) {
wrefresh(cells[i][j]);
}
}
update_panels();
doupdate();
} else {
// skip if the cell is empty
goto run_loop_again;
}
}
}
delete[] day_windows;
delete[] lesson_windows;
endwin();