Compare commits

...

9 Commits

Author SHA1 Message Date
15b0344dc8 hide cursor on marks page
Some checks failed
/ sync-to-origin (push) Has been cancelled
2025-06-18 17:32:46 +02:00
73fed3df0e version 0.8.2
Some checks failed
/ sync-to-origin (push) Has been cancelled
2025-05-24 12:29:19 +02:00
6b3d47ceed add color help for timetable
Some checks are pending
/ sync-to-origin (push) Waiting to run
2025-05-24 12:27:41 +02:00
89c67035ca fix menu disappearing after exiting any page 2025-05-24 10:22:07 +02:00
0486d9fb22 fix space before operator warning 2025-05-24 10:18:59 +02:00
e51088eb26 add download progress bar
Some checks failed
/ sync-to-origin (push) Has been cancelled
2025-04-14 20:03:48 +02:00
ad6f748899 add homework checkbox to README
Some checks are pending
/ sync-to-origin (push) Waiting to run
2025-04-14 07:26:06 +00:00
1d0d4e2362 update README to reflect new aditions
Some checks are pending
/ sync-to-origin (push) Waiting to run
2025-04-14 09:24:23 +02:00
a35242b420 fix attachment window not disapearing 2025-04-14 09:22:39 +02:00
6 changed files with 100 additions and 21 deletions

View File

@ -10,5 +10,6 @@
> - [x] Login > - [x] Login
> - [x] Marks > - [x] Marks
> - [x] Timetable > - [x] Timetable
> - [ ] Komens > - [x] Komens
> - [ ] Absence > - [ ] Absence
> - [ ] Homework

View File

@ -1,7 +1,7 @@
#include <string_view> #include <string_view>
#ifndef VERSION #ifndef VERSION
#define VERSION "0.8.1" #define VERSION "0.8.2"
#define NAME "bakatui" #define NAME "bakatui"
inline constexpr auto hash_djb2a(const std::string_view sv) { inline constexpr auto hash_djb2a(const std::string_view sv) {
@ -12,7 +12,7 @@ inline constexpr auto hash_djb2a(const std::string_view sv) {
return hash; return hash;
} }
inline constexpr auto operator"" _sh(const char *str, size_t len) { inline constexpr auto operator""_sh(const char *str, size_t len) {
return hash_djb2a(std::string_view{str, len}); return hash_djb2a(std::string_view{str, len});
} }

View File

@ -5,10 +5,12 @@
#include "types.h" #include "types.h"
#include <cmath> #include <cmath>
#include <cstddef> #include <cstddef>
#include <cstdint>
#include <cstdlib> #include <cstdlib>
#include <cstring> #include <cstring>
#include <curses.h> #include <curses.h>
#include <cwchar> #include <cwchar>
#include <future>
#include <menu.h> #include <menu.h>
#include <ncurses.h> #include <ncurses.h>
#include <nlohmann/json.hpp> #include <nlohmann/json.hpp>
@ -199,12 +201,42 @@ void komens_page(koment_type type) {
clrtoeol(); clrtoeol();
refresh(); refresh();
char progress_bar[20];
std::fill(progress_bar, progress_bar + 20, '.');
LimitedInt progress_index(0, 0, sizeof(progress_bar) - 1);
// Download the attachment // Download the attachment
bakaapi::download_attachment( auto future = std::async(
std::launch::async, bakaapi::download_attachment,
resp_from_api["Messages"][item_index(current_item( resp_from_api["Messages"][item_index(current_item(
komens_choise_menu.menu))]["Attachments"][index]["Id"] komens_choise_menu.menu))]["Attachments"][index]["Id"]
.get<std::string>(), .get<std::string>(),
path); path);
while (true) {
if (future.wait_for(std::chrono::seconds(1)) ==
std::future_status::ready) {
// Future has completed
int result = future.get();
if (result != 0) {
attron(COLOR_PAIR(COLOR_RED));
mvprintw(LINES - 1, 0, "Download failed with error code: %d",
result);
attroff(COLOR_PAIR(COLOR_RED));
} else {
attron(COLOR_PAIR(COLOR_GREEN));
mvprintw(LINES - 1, 0, "Download completed successfully");
attroff(COLOR_PAIR(COLOR_GREEN));
}
break;
} else {
progress_bar[progress_index] = '#';
// Future is still running
mvprintw(LINES - 1, 0, "%s", progress_bar);
progress_bar[progress_index] = '.';
progress_index++;
}
}
komens_print_usage_message(); komens_print_usage_message();
} }
} }
@ -273,7 +305,7 @@ void insert_content(WINDOW *content_win, WINDOW *attachment_win,
mvwprintw(attachment_win, j + 1, 0, "%zu>", j + 1); mvwprintw(attachment_win, j + 1, 0, "%zu>", j + 1);
wattroff(attachment_win, COLOR_PAIR(COLOR_MAGENTA)); wattroff(attachment_win, COLOR_PAIR(COLOR_MAGENTA));
} }
{ // remove duplicating spaces { // remove duplicating edges
unsigned short attachment_win_top, attachment_win_left, unsigned short attachment_win_top, attachment_win_left,
attachment_win_height, attachment_win_width; attachment_win_height, attachment_win_width;
getbegyx(attachment_win, attachment_win_top, attachment_win_left); getbegyx(attachment_win, attachment_win_top, attachment_win_left);
@ -284,6 +316,10 @@ void insert_content(WINDOW *content_win, WINDOW *attachment_win,
} }
refresh(); refresh();
wrefresh(attachment_win);
} else {
// remove attachment window if there are no attachments
wclear(attachment_win);
wrefresh(attachment_win); wrefresh(attachment_win);
} }
} }

View File

@ -99,8 +99,9 @@ void main_menu() {
choicesFuncs[item_index(current_item(main_menu.menu))](); choicesFuncs[item_index(current_item(main_menu.menu))]();
current_allocated = &main_menu_allocated; current_allocated = &main_menu_allocated;
pos_menu_cursor(main_menu.menu); pos_menu_cursor(main_menu.menu);
refresh();
wrefresh(main_menu.win); wrefresh(main_menu.win);
refresh();
redrawwin(main_menu.win);
break; break;
} }
wrefresh(main_menu.win); wrefresh(main_menu.win);

View File

@ -38,6 +38,7 @@ void win_show(WINDOW *win, const wchar_t *label, const int label_color,
void marks_page() { void marks_page() {
current_allocated = &marks_allocated; current_allocated = &marks_allocated;
curs_set(0);
// thanks to lambda i can make this const // thanks to lambda i can make this const
const json resp_from_api = [&]() -> json { const json resp_from_api = [&]() -> json {
@ -132,6 +133,7 @@ void marks_page() {
endwin(); endwin();
clear(); clear();
delete_all(&marks_allocated); delete_all(&marks_allocated);
curs_set(1);
} }
/* Put all the windows */ /* Put all the windows */

View File

@ -6,6 +6,7 @@
#include "net.h" #include "net.h"
#include "types.h" #include "types.h"
#include <bits/chrono.h> #include <bits/chrono.h>
#include <climits>
#include <cstdint> #include <cstdint>
#include <cstdio> #include <cstdio>
#include <ctime> #include <ctime>
@ -26,6 +27,16 @@ using nlohmann::json;
#define DEFAULT_OFFSET 3 #define DEFAULT_OFFSET 3
#define REMOVED_COLOR_PAIR COLOR_GREEN
#define ROOMCHANGED_COLOR_PAIR COLOR_MAGENTA
#define SUBSTITUTION_COLOR_PAIR COLOR_YELLOW
#define ADDED_COLOR_PAIR COLOR_BLUE
#define HELP_TEXT \
"Arrows/hjkl to select | ENTER to show info | p/n to select weeks |F1 to " \
"exit"
#define HELP_TEXT_LENGTH sizeof(HELP_TEXT) - 1
std::vector<allocation> timetable_allocated; std::vector<allocation> timetable_allocated;
const wchar_t *day_abriviations[] = {nullptr, L"Mo", L"Tu", L"We", const wchar_t *day_abriviations[] = {nullptr, L"Mo", L"Tu", L"We",
@ -279,9 +290,32 @@ reload_for_new_week:
} }
} }
attron(COLOR_PAIR(COLOR_BLUE)); attron(COLOR_PAIR(COLOR_BLUE));
mvprintw(LINES - 2, 0, mvprintw(LINES - 2, 0, HELP_TEXT);
"Arrows/hjkl to select | ENTER to show info | p/n to select weeks " attroff(COLOR_PAIR(COLOR_BLUE));
"|F1 to exit");
{
constexpr char *change_types[] = {"Canceled/Removed", "RoomChanged",
"Substitution", "Added"};
constexpr uint8_t change_types_colors[] = {
REMOVED_COLOR_PAIR, ROOMCHANGED_COLOR_PAIR, SUBSTITUTION_COLOR_PAIR,
ADDED_COLOR_PAIR};
for (uint8_t i = 0; i < ARRAY_SIZE(change_types); i++) {
init_pair(UCHAR_MAX - i, COLOR_BLACK, change_types_colors[i]);
}
uint8_t text_offset = 1;
for (uint8_t i = 0; i < ARRAY_SIZE(change_types); i++) {
attron(COLOR_PAIR(UCHAR_MAX - i));
mvprintw(LINES - 2, HELP_TEXT_LENGTH + text_offset, "%s",
change_types[i]);
attroff(COLOR_PAIR(UCHAR_MAX - i));
text_offset += strlen(change_types[i]) + 1;
}
}
attron(COLOR_PAIR(COLOR_BLUE));
{ {
std::tm end_week = local_time; std::tm end_week = local_time;
std::tm start_week = local_time; std::tm start_week = local_time;
@ -296,13 +330,14 @@ reload_for_new_week:
.get<uint8_t>(); .get<uint8_t>();
// Calculate days back to start day (handles week wraparound) // Calculate days back to start day (handles week wraparound)
int days_back = (current_wday >= start_day) uint8_t days_back = (current_wday >= start_day)
? (current_wday - start_day) ? (current_wday - start_day)
: (current_wday + 7 - start_day); : (current_wday + 7 - start_day);
// Calculate days forward to end day (handles week wraparound) // Calculate days forward to end day (handles week wraparound)
int days_forward = (current_wday <= end_day) ? (end_day - current_wday) uint8_t days_forward = (current_wday <= end_day)
: (end_day + 7 - current_wday); ? (end_day - current_wday)
: (end_day + 7 - current_wday);
// Adjust dates // Adjust dates
start_week.tm_mday -= days_back; start_week.tm_mday -= days_back;
@ -619,20 +654,24 @@ void draw_cells(uint8_t num_of_columns, uint8_t num_of_days,
hash_djb2a(atom->at("Change")["ChangeType"].get<std::string>())) { hash_djb2a(atom->at("Change")["ChangeType"].get<std::string>())) {
case "Canceled"_sh: case "Canceled"_sh:
case "Removed"_sh: case "Removed"_sh:
wattron(cells[i][j], COLOR_PAIR(COLOR_GREEN)); wattron(cells[i][j], COLOR_PAIR(REMOVED_COLOR_PAIR));
box(cells[i][j], 0, 0); box(cells[i][j], 0, 0);
wattroff(cells[i][j], COLOR_PAIR(COLOR_GREEN)); wattroff(cells[i][j], COLOR_PAIR(REMOVED_COLOR_PAIR));
break; break;
case "RoomChanged"_sh: case "RoomChanged"_sh:
case "Substitution"_sh: wattron(cells[i][j], COLOR_PAIR(ROOMCHANGED_COLOR_PAIR));
wattron(cells[i][j], COLOR_PAIR(COLOR_YELLOW));
box(cells[i][j], 0, 0); box(cells[i][j], 0, 0);
wattroff(cells[i][j], COLOR_PAIR(COLOR_YELLOW)); wattroff(cells[i][j], COLOR_PAIR(ROOMCHANGED_COLOR_PAIR));
break;
case "Substitution"_sh:
wattron(cells[i][j], COLOR_PAIR(SUBSTITUTION_COLOR_PAIR));
box(cells[i][j], 0, 0);
wattroff(cells[i][j], COLOR_PAIR(SUBSTITUTION_COLOR_PAIR));
break; break;
case "Added"_sh: case "Added"_sh:
wattron(cells[i][j], COLOR_PAIR(COLOR_BLUE)); wattron(cells[i][j], COLOR_PAIR(ADDED_COLOR_PAIR));
box(cells[i][j], 0, 0); box(cells[i][j], 0, 0);
wattroff(cells[i][j], COLOR_PAIR(COLOR_BLUE)); wattroff(cells[i][j], COLOR_PAIR(ADDED_COLOR_PAIR));
break; break;
default: default:
// TODO add error handling // TODO add error handling