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.
223 lines
4.7 KiB
223 lines
4.7 KiB
4 years ago
|
#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) {
|
||
|
}
|