From 43d53629ca9f95eeb25b95478cbf92c775c5c082 Mon Sep 17 00:00:00 2001 From: PoliEcho Date: Sun, 9 Mar 2025 09:07:54 +0100 Subject: [PATCH] add selector to timetable. --CONTAINS BUGS-- --- src/const.h | 2 +- src/helper_funcs.cpp | 15 ++++- src/timetable.cpp | 104 +++++++++++++++++++++++++++++-- src/types.h | 142 ++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 254 insertions(+), 9 deletions(-) diff --git a/src/const.h b/src/const.h index 48cc631..2a811fa 100644 --- a/src/const.h +++ b/src/const.h @@ -1,7 +1,7 @@ #include #ifndef VERSION -#define VERSION "0.5" +#define VERSION "0.6" #define NAME "bakatui" inline constexpr auto hash_djb2a(const std::string_view sv) { diff --git a/src/helper_funcs.cpp b/src/helper_funcs.cpp index 89ee8ba..bab3284 100644 --- a/src/helper_funcs.cpp +++ b/src/helper_funcs.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -217,4 +218,16 @@ std::wstring string_to_wstring(const std::string &str) { std::string wstring_to_string(const std::wstring &wstr) { std::wstring_convert> converter; return converter.to_bytes(wstr); -} \ No newline at end of file +} + +void move_panel_relative(PANEL *panel, int dy, int dx) { + WINDOW *win = panel_window(panel); + int y, x; + + getbegyx(win, y, x); + + int new_y = y + dy; + int new_x = x + dx; + + move_panel(panel, new_y, new_x); +} diff --git a/src/timetable.cpp b/src/timetable.cpp index e2dcc84..6ceb52e 100644 --- a/src/timetable.cpp +++ b/src/timetable.cpp @@ -3,6 +3,7 @@ #include "const.h" #include "helper_funcs.h" #include "net.h" +#include "types.h" #include #include #include @@ -10,6 +11,7 @@ #include #include #include +#include #include #include @@ -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())) { 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 selector_windows; + std::array 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(); diff --git a/src/types.h b/src/types.h index 376f699..4e18694 100644 --- a/src/types.h +++ b/src/types.h @@ -2,8 +2,146 @@ #ifndef _ba_ty_hg_ #define _ba_ty_hg_ +#include struct Config { - bool verbose = false; - bool ignoressl = false; + bool verbose = false; + bool ignoressl = false; }; + +class LimitedInt { +private: + int value; + const int min_value; + const int max_value; + + void setValue(int new_value) { + int range = max_value - min_value + 1; + if (new_value < min_value || new_value > max_value) { + new_value = ((new_value - min_value) % range + range) % range + min_value; + } + value = new_value; + } + +public: + // Constructors + LimitedInt(int initial_value = 0, int min = std::numeric_limits::min(), + int max = std::numeric_limits::max()) + : min_value(min), max_value(max) { + if (min >= max) + throw std::invalid_argument("Min must be less than max"); + setValue(initial_value); + } + + // Conversion operators + operator int() const { return value; } // Implicit conversion to int + + // Assignment operators + LimitedInt &operator=(int rhs) { + setValue(rhs); + return *this; + } + + // Compound assignment with BoundedInt + LimitedInt &operator+=(const LimitedInt &rhs) { + setValue(value + rhs.value); + return *this; + } + + // Compound assignment with int + LimitedInt &operator+=(int rhs) { + setValue(value + rhs); + return *this; + } + + // Similarly define -=, *=, /=, %=, &=, |=, ^=, <<=, >>= for both types + + // Increment/decrement + LimitedInt &operator++() { // Prefix ++ + setValue(value + 1); + return *this; + } + + LimitedInt operator++(int) { // Postfix ++ + LimitedInt temp = *this; + setValue(value + 1); + return temp; + } + + LimitedInt &operator--() { // Prefix -- + setValue(value - 1); + return *this; + } + + LimitedInt operator--(int) { // Postfix -- + LimitedInt temp = *this; + setValue(value - 1); + return temp; + } + + // Binary arithmetic operators + friend LimitedInt operator+(const LimitedInt &lhs, const LimitedInt &rhs) { + LimitedInt result = lhs; + result += rhs; + return result; + } + + friend LimitedInt operator+(const LimitedInt &lhs, int rhs) { + LimitedInt result = lhs; + result += rhs; + return result; + } + + friend LimitedInt operator+(int lhs, const LimitedInt &rhs) { + LimitedInt result(lhs, rhs.min_value, rhs.max_value); + result += rhs; + return result; + } + + // Similarly define -, *, /, %, &, |, ^, <<, >> for all combinations + + // Unary operators + LimitedInt operator-() const { + return LimitedInt(-value, min_value, max_value); + } + + LimitedInt operator+() const { return *this; } + + // Comparison operators + friend bool operator==(const LimitedInt &lhs, const LimitedInt &rhs) { + return lhs.value == rhs.value; + } + + friend bool operator!=(const LimitedInt &lhs, const LimitedInt &rhs) { + return lhs.value != rhs.value; + } + + friend bool operator<(const LimitedInt &lhs, const LimitedInt &rhs) { + return lhs.value < rhs.value; + } + + // Similarly define >, <=, >= for both BoundedInt and int comparisons + + // Stream operators + friend std::ostream &operator<<(std::ostream &os, const LimitedInt &bi) { + os << bi.value; + return os; + } + + friend std::istream &operator>>(std::istream &is, LimitedInt &bi) { + int temp; + is >> temp; + bi.setValue(temp); + return is; + } +}; + +struct SelectorType { + LimitedInt x; + LimitedInt y; + + SelectorType(int xArg, int yArg, int min_limit_x, int max_limit_x, + int min_limit_y, int max_limit_y) + : x(xArg, min_limit_x, max_limit_x), y(yArg, min_limit_y, max_limit_y) {} +}; + #endif \ No newline at end of file