You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
222 lines
4.7 KiB
222 lines
4.7 KiB
#include <cstdio> |
|
|
|
#include "gamestate.h" |
|
#include "window.h" |
|
|
|
Window::Window(int rows, int cols, int y, int x) : |
|
rows(rows), |
|
cols(cols), |
|
y(0), |
|
x(0), |
|
window(newwin(rows, cols, y, x)) { |
|
} |
|
|
|
Window::~Window() { |
|
delwin(this->window); |
|
} |
|
|
|
void Window::initialize() { |
|
// Start curses mode |
|
initscr(); |
|
// Disable line buffering |
|
cbreak(); |
|
// Enable reading of function keys |
|
keypad(stdscr, TRUE); |
|
// Dont echo while reading input |
|
noecho(); |
|
// Disable cursor visibility |
|
curs_set(0); |
|
|
|
// If terminal supports colors |
|
if(!has_colors()) { |
|
printw("Your terminal does not support color\n"); |
|
} |
|
else { |
|
start_color(); |
|
use_default_colors(); |
|
|
|
init_pair(PAIR_WHITE_BLACK, COLOR_WHITE, COLOR_BLACK); |
|
init_pair(PAIR_WHITE_BRIGHT_BLACK, COLOR_WHITE_BRIGHT, COLOR_BLACK); |
|
init_pair(PAIR_RED_BLACK, COLOR_RED, COLOR_BLACK); |
|
init_pair(PAIR_BLUE_BLACK, COLOR_BLUE, COLOR_BLACK); |
|
init_pair(PAIR_GRAY_BLACK_BRIGHT, COLOR_GRAY, COLOR_BLACK_BRIGHT); |
|
} |
|
|
|
// Add bright colors, intensity range: 0-1000 |
|
if(!can_change_color()) { |
|
printw("Your terminal does not support changing colors\n"); |
|
} |
|
else { |
|
init_color(COLOR_BLACK, 0, 0, 0); |
|
init_color(COLOR_WHITE, 680, 680, 680); |
|
init_color(COLOR_GRAY, 380, 380, 380); |
|
|
|
init_color(COLOR_BLACK_BRIGHT, 110, 110, 110); // 0, 0, 0 |
|
init_color(COLOR_RED_BRIGHT, 900, 0, 0); // 680, 0, 0 |
|
init_color(COLOR_GREEN_BRIGHT, 0, 900, 0); // 0, 680, 0 |
|
init_color(COLOR_YELLOW_BRIGHT, 900, 900, 0); // 680, 680, 0 |
|
init_color(COLOR_BLUE_BRIGHT, 0, 0, 900); // 0, 0, 680 |
|
init_color(COLOR_MAGENTA_BRIGHT, 900, 0, 900); // 680, 0, 680 |
|
init_color(COLOR_CYAN_BRIGHT, 0, 900, 900); // 0, 680, 680 |
|
init_color(COLOR_WHITE_BRIGHT, 900, 900, 900); // 680, 680, 680 |
|
} |
|
} |
|
|
|
void Window::update() { |
|
Window::getMaXYZ(stdscr, this->maxRows, this->maxCols); |
|
} |
|
|
|
void Window::render() { |
|
box(this->window, 0, 0); |
|
wrefresh(this->window); |
|
} |
|
|
|
void Window::destroy() { |
|
// Restore line buffering |
|
nocbreak(); |
|
// Restore cursor |
|
curs_set(1); |
|
// End curses mode |
|
endwin(); |
|
} |
|
|
|
void Window::clear() { |
|
this->setYX(0, 0); |
|
|
|
// Set background color |
|
// wbkgdset(this->window, COLOR_PAIR(3)); |
|
|
|
// Copy blanks to every position in the window, clearing the screen |
|
werase(this->window); |
|
} |
|
|
|
void Window::resize() { |
|
wresize(this->window, this->rows, this->cols); |
|
mvwin(this->window, this->y, this->x); |
|
} |
|
|
|
void Window::print(std::string str, char newLine) { |
|
this->print(str, this->y, this->x); |
|
this->x += str.length(); |
|
if (newLine == 1) { |
|
this->x = 0; |
|
this->y++; |
|
} |
|
} |
|
|
|
void Window::print(std::string str, int y, int x) { |
|
this->y = y; |
|
this->x = x; |
|
mvwprintw(this->window, y + 1, x + 1, str.c_str()); |
|
} |
|
|
|
void Window::print(std::string str, int y, int x, int attribute) { |
|
wattron(this->window, attribute); |
|
this->print(str, y, x); |
|
wattroff(this->window, attribute); |
|
} |
|
|
|
void Window::printCenter(std::string str) { |
|
int halfBoard = this->cols / 2; |
|
int halfStr = str.length() / 2; |
|
this->print(str, this->y, halfBoard - halfStr - 1); |
|
} |
|
|
|
void Window::printCenter(std::string str, int attribute) { |
|
wattron(this->window, attribute); |
|
this->printCenter(str); |
|
wattroff(this->window, attribute); |
|
} |
|
|
|
void Window::printSide(std::string left, std::string right) { |
|
this->print(left, this->y, 1); |
|
this->print(right, this->y, this->cols - right.length() - 3); |
|
} |
|
|
|
void Window::getYX(int &y, int &x) { |
|
getyx(this->window, y, x); |
|
} |
|
|
|
void Window::setYX(int y, int x) { |
|
this->y = y; |
|
this->x = x; |
|
wmove(this->window, y, x); |
|
} |
|
|
|
void Window::getMaXYZ(int &rows, int &cols) { |
|
getmaxyx(this->window, rows, cols); |
|
} |
|
|
|
void Window::getMaXYZ(WINDOW *window, int &rows, int &cols) { |
|
getmaxyx(window, rows, cols); |
|
} |
|
|
|
std::string Window::getStr() { |
|
curs_set(1); |
|
echo(); |
|
char *tmp = new char(); |
|
wgetstr(this->window, tmp); |
|
noecho(); |
|
curs_set(0); |
|
return std::string(tmp); |
|
} |
|
|
|
int Window::getMaxRows() { |
|
return this->maxRows; |
|
} |
|
|
|
int Window::getMaxCols() { |
|
return this->maxCols; |
|
} |
|
|
|
int Window::getRows() { |
|
return this->rows; |
|
} |
|
|
|
void Window::setRows(int rows) { |
|
this->rows = rows; |
|
} |
|
|
|
int Window::getCols() { |
|
return this->cols; |
|
} |
|
|
|
void Window::setCols(int cols) { |
|
this->cols = cols; |
|
} |
|
|
|
int Window::getY() { |
|
return this->y; |
|
} |
|
|
|
void Window::setY(int y) { |
|
this->y = y; |
|
} |
|
|
|
int Window::getX() { |
|
return this->x; |
|
} |
|
|
|
void Window::setX(int x) { |
|
this->x = x; |
|
} |
|
|
|
void Window::setWindow(int rows, int cols, int y, int x) { |
|
this->setRows(rows); |
|
this->setCols(cols); |
|
this->setY(y); |
|
this->setX(x); |
|
if (this->window == nullptr) { |
|
this->window = newwin(rows, cols, y, x); |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------// |
|
|
|
Window::Window() : |
|
rows(0), |
|
cols(0), |
|
y(0), |
|
x(0), |
|
window(nullptr) { |
|
}
|
|
|