#include "view.h" WINDOW* View::win = nullptr; View::View() { if(!win) { B15F::abort("View::win not initialized, missing context"); } getmaxyx(win, height, width); // init width and height keypad(win, TRUE); } View::~View() { } void View::setWinContext(WINDOW* win) { View::win = win; } WINDOW* View::getWinContext() { return win; } // from: https://stackoverflow.com/a/37454181 std::vector View::str_split(const std::string& str, const std::string delim) { std::vector tokens; size_t prev = 0, pos = 0; do { pos = str.find(delim, prev); if (pos == std::string::npos) pos = str.length(); std::string token = str.substr(prev, pos-prev); if (!token.empty()) tokens.push_back(token); prev = pos + delim.length(); } while (pos < str.length() && prev < str.length()); return tokens; } void View::setTitle(std::string title) { this->title = title; } void View::repaint() { // get screen size struct winsize size; if (ioctl(0, TIOCGWINSZ, (char *) &size) < 0) throw std::runtime_error("TIOCGWINSZ error"); start_x = floor((size.ws_col - width) / 2.); start_y = floor((size.ws_row - height) / 2.); mvwin(win, start_y, start_x); clear(); wclear(win); // generic draw box(win, 0, 0); int offset_x = (width - title.length()) / 2; mvwprintw(win, 1, offset_x, "%s", title.c_str()); // specific draw draw(); refresh(); wrefresh(win); }