From b9f7c2eeebbe24c57dffbedfb7b9f9ed77146dd1 Mon Sep 17 00:00:00 2001 From: osamu-kj <64986162+0xdeadbeer@users.noreply.github.com> Date: Sun, 7 May 2023 18:42:14 +0200 Subject: [PATCH] Vipe: Finish basic prototype Map data structure which maps dates to std::string events --- README.md | 15 ++++---- src/calendar/calendar.hpp | 7 ++++ src/engine/engine.cpp | 81 ++++++++++++++++++++++----------------- src/engine/engine.hpp | 12 ++++++ src/main.cpp | 7 ++-- 5 files changed, 77 insertions(+), 45 deletions(-) diff --git a/README.md b/README.md index 875b3cc..abf4f72 100644 --- a/README.md +++ b/README.md @@ -39,13 +39,14 @@ This will open the default view mode (month) and display the current month's cal The following is a list of things that have been/still have to be completed. - - basic prototype with vipe (in memory only) - - writing a calendar to file - - reading a calendar from a file - - alerting function - - logging - - read input from stdin - - set reminder + - Basic prototype with vipe (in memory only) + - Finish all the basic shortcuts + - Ability to write a calendar to a file + - Ability to read a calendar from a file + - Alerting function for errors and issues + - Logging / Debug flag + - Read input from stdin + - Set reminders # Contributions diff --git a/src/calendar/calendar.hpp b/src/calendar/calendar.hpp index 9049e22..b397e39 100644 --- a/src/calendar/calendar.hpp +++ b/src/calendar/calendar.hpp @@ -1,6 +1,8 @@ #ifndef CALENDAR_HPP #define CALENDAR_HPP +#include + struct calendar_information { int current_day; int current_month; @@ -10,6 +12,11 @@ struct calendar_information { calendar_information(); }; +const bool operator<(const calendar_information& first, const calendar_information& second) { + return std::tie(first.current_day, first.current_month, first.current_month_days, first.current_year) < + std::tie(second.current_day, second.current_month, second.current_month_days, second.current_year); +} + class Calendar { public: static int get_days_in_month(int month, int year); diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 72acfa8..58eff7a 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -1,4 +1,5 @@ #include +#include #include #include #include "engine.hpp" @@ -41,7 +42,6 @@ void Engine::ui_draw(WINDOW *win) { this->ui_top_draw(win); this->ui_bottom_draw(win); wrefresh(win); - } void Engine::ui_month_draw(WINDOW *win) { @@ -79,32 +79,13 @@ void Engine::ui_bottom_draw(WINDOW *win) { if (VIS_COLORING) wattron(win, COLOR_PAIR(1)); calendar_information date_info = this->calendar->get_info(); - mvwprintw(win, LINES-2, 1, "Year: %d, Month: %d, Day: %d", date_info.current_year, date_info.current_month, date_info.current_day); + std::string current_view_mode = calendar_view_mode_str[this->view_mode]; + + mvwprintw(win, LINES-2, 1, "Year: %d, Month: %d, Day: %d, Mode: %s\n", date_info.current_year, date_info.current_month, date_info.current_day, current_view_mode.c_str()); if (VIS_COLORING) wattroff(win, COLOR_PAIR(1)); } -void Engine::ui_dialog_draw(WINDOW *win) { - int lines = LINES/2, cols = COLS/2; - int y_center = (LINES/2)-(lines/2), x_center = (COLS/2)-(cols/2); - - this->dialog = newwin(lines, cols, y_center, x_center); - - box(this->dialog, 0, 0); - - char str[200]; - - mvwprintw(this->dialog, 1, 1, "Enter your name lol: "); - wrefresh(this->dialog); - - mvwgetnstr(this->dialog, 2, 1, str, 200); - - wprintw(this->dialog, "Press q to save or r to retake"); - - wrefresh(this->dialog); - -} - void Engine::input_handle_month(WINDOW *win) { char key = getch(); @@ -162,30 +143,60 @@ void Engine::input_handle_month(WINDOW *win) { this->active_cell = 0; break; - case 'i': - endwin(); - int link[2]; - char foo[4096]; + case 'i': { + int vipe_out[2], vipe_in[2]; + char output_buffer[4096]; + memset(output_buffer, 0, sizeof(output_buffer)); - pipe(link); + pipe(vipe_out); + pipe(vipe_in); pid_t pid = fork(); if (pid == 0) { - dup2(link[1], STDOUT_FILENO); - close(link[0]); - close(link[1]); + dup2(vipe_in[0], STDIN_FILENO); + dup2(vipe_out[1], STDOUT_FILENO); + + close(vipe_in[0]); + close(vipe_in[1]); + close(vipe_out[0]); + close(vipe_out[1]); + system("vipe"); exit(EXIT_FAILURE); } else { - close(link[1]); - int nbytes = read(link[0], foo, sizeof(foo)); - printw("Output of vipe: %s\n", foo); - } + close(vipe_in[0]); + close(vipe_out[1]); + std::string event = this->events_map[this->calendar->get_info()]; + write(vipe_in[1], event.c_str(), event.length()); + close(vipe_in[1]); + + int nbytes = read(vipe_out[0], output_buffer, sizeof(output_buffer)); + this->events_map[this->calendar->get_info()] = output_buffer; + } + + endwin(); + break; + } + case 'g': + this->calendar->set_day(1); + this->active_cell = 0; + break; + case 'G': + this->calendar->set_day(this->calendar->get_info().current_month_days); + this->active_cell = this->calendar->get_info().current_month_days-1; + break; + case 't': + this->view_mode = WEEK_VIEW; + wclear(win); break; } } +void Engine::input_handle_week(WINDOW *win) { + +} + void Engine::input_handle_months(WINDOW *win) { // TODO } diff --git a/src/engine/engine.hpp b/src/engine/engine.hpp index a9b5f92..69b37c6 100644 --- a/src/engine/engine.hpp +++ b/src/engine/engine.hpp @@ -1,8 +1,11 @@ #ifndef ENGINE_HPP #define ENGINE_HPP +#include #include #include +// #include +#include #include "../calendar/calendar.hpp" #include "../global/global.hpp" @@ -17,6 +20,12 @@ enum calendar_view_mode { MONTHS_VIEW }; +std::string calendar_view_mode_str[] = { + "MONTH_VIEW", + "WEEK_VIEW", + "MONTHS_VIEW" +}; + // title: drawing engine // description: use for drawing the TUI and interact with the cells class Engine { @@ -32,9 +41,12 @@ class Engine { void ui_top_draw(WINDOW *win); void input_handle_month(WINDOW *win); + void input_handle_week(WINDOW *win); void input_handle_months(WINDOW *win); Calendar *calendar; + // std::unordered_map events_map; + std::map events_map; int active_cell; calendar_view_mode view_mode; diff --git a/src/main.cpp b/src/main.cpp index dd67ef5..a52a88e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -12,12 +12,14 @@ WINDOW *main_win; void sig_winch(int sig) { if (isendwin()) return; endwin(); + wclear(main_win); wrefresh(main_win); wresize(main_win, LINES, COLS); mvwin(main_win, 0, 0); + // redraw the TUI after the resize signal engine.ui_draw(main_win); @@ -51,14 +53,13 @@ int main() { // handle required signals signals(); - for (;;) { - wclear(main_win); - wrefresh(main_win); engine.ui_draw(main_win); if (engine.view_mode == MONTH_VIEW) engine.input_handle_month(main_win); + if (engine.view_mode == WEEK_VIEW) + engine.input_handle_week(main_win); else if (engine.view_mode == MONTHS_VIEW) engine.input_handle_months(main_win); }