nuclear@5: #ifndef CONSOLE_H_ nuclear@5: #define CONSOLE_H_ nuclear@5: nuclear@5: #include nuclear@5: #include nuclear@5: #include nuclear@5: #include nuclear@5: #include nuclear@5: nuclear@5: #define INPUTQ_SIZE 64 nuclear@5: nuclear@5: class Console { nuclear@5: public: nuclear@5: enum Anchor {TOP_LEFT, BOTTOM_LEFT, CENTER}; nuclear@5: nuclear@5: private: nuclear@5: bool visible; nuclear@5: int nlines, ncolumns; nuclear@5: int pos_x, pos_y; nuclear@5: Anchor anchor; nuclear@5: nuclear@5: int inpq_front, inpq_back; nuclear@5: int keybuf[INPUTQ_SIZE]; nuclear@5: nuclear@5: std::string prompt; nuclear@5: std::string input; // current input line nuclear@5: int cursor; nuclear@5: int input_win; // first character to show in the input "window" nuclear@5: nuclear@5: // input history nuclear@5: int max_hist_lines; nuclear@5: std::list hist; nuclear@5: bool hist_iter_valid; nuclear@5: std::list::const_reverse_iterator hist_iter; nuclear@5: nuclear@5: // console output nuclear@5: int max_output_lines; nuclear@5: std::vector output; nuclear@5: bool echo; nuclear@5: nuclear@5: std::function cmd_handler; nuclear@5: nuclear@5: int font_size; nuclear@5: dtx_font *font; nuclear@5: nuclear@5: void set_cursor(int x); nuclear@5: int get_cursor() const; nuclear@5: nuclear@5: public: nuclear@5: enum { nuclear@5: KEY_LEFT = 256, nuclear@5: KEY_RIGHT, nuclear@5: KEY_UP, KEY_DOWN, nuclear@5: KEY_INS, nuclear@5: KEY_DEL, nuclear@5: KEY_HOME, nuclear@5: KEY_END, nuclear@5: KEY_PGUP, nuclear@5: KEY_PGDOWN nuclear@5: }; nuclear@5: nuclear@5: Console(); nuclear@5: nuclear@5: void set_font(dtx_font *font, int sz); nuclear@5: void set_history_size(int hsz); nuclear@5: void set_output_buffer_size(int sz); nuclear@5: void set_command_func(std::function func); nuclear@5: nuclear@5: void set_echo(bool echo); nuclear@5: bool get_echo() const; nuclear@5: nuclear@5: void show() { set_visible(true); } nuclear@5: void hide() { set_visible(false); } nuclear@5: void set_visible(bool v); nuclear@5: bool is_visible() const; nuclear@5: nuclear@5: void set_size(int lines, int columns = 80); nuclear@5: int get_size_lines() const; nuclear@5: int get_size_columns() const; nuclear@5: nuclear@5: void set_position(int x, int y, Anchor anchor = TOP_LEFT); nuclear@5: nuclear@5: // update returns true if what it did makes a redraw necessary nuclear@5: bool update(); nuclear@5: void draw() const; nuclear@5: nuclear@5: void input_key(int key); // send a keystroke to the console nuclear@5: nuclear@5: void putchar(char c); nuclear@5: void puts(const char *str); nuclear@5: void printf(const char *fmt, ...); nuclear@5: nuclear@5: void debug(); nuclear@5: }; nuclear@5: nuclear@5: #endif // CONSOLE_H_