[Add] Command history for terminal.
This commit is contained in:
parent
9fa0b4b097
commit
b150c814fe
@ -11,8 +11,8 @@
|
|||||||
#include "ui/window_action.h"
|
#include "ui/window_action.h"
|
||||||
|
|
||||||
Terminal::Terminal(GameState* game_state)
|
Terminal::Terminal(GameState* game_state)
|
||||||
: _game_state(game_state), _should_close(false), _scroll_offset(0),
|
: _game_state(game_state), _should_close(false), _command_history_index(0),
|
||||||
_prompt(""), _pending_action({ActionType::NONE}) {
|
_scroll_offset(0), _prompt(""), _pending_action({ActionType::NONE}) {
|
||||||
_input_view = std::make_unique<TextView>(&_input_buffer, false, false);
|
_input_view = std::make_unique<TextView>(&_input_buffer, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -54,6 +54,11 @@ WindowAction Terminal::get_pending_action(void) {
|
|||||||
|
|
||||||
void Terminal::_on_ret_press(void) {
|
void Terminal::_on_ret_press(void) {
|
||||||
std::string command = _input_buffer.get_line(0);
|
std::string command = _input_buffer.get_line(0);
|
||||||
|
if(!command.empty()) {
|
||||||
|
_command_history.push_back(command);
|
||||||
|
}
|
||||||
|
_command_history_index = _command_history.size();
|
||||||
|
|
||||||
_input_buffer.clear();
|
_input_buffer.clear();
|
||||||
|
|
||||||
if(command == "clear") {
|
if(command == "clear") {
|
||||||
@ -79,8 +84,32 @@ void Terminal::_on_ret_press(void) {
|
|||||||
|
|
||||||
void Terminal::handle_input(SDL_Event* event, int window_x, int window_y, int window_gl_y) {
|
void Terminal::handle_input(SDL_Event* event, int window_x, int window_y, int window_gl_y) {
|
||||||
/* Pass input to TextView; if true, RET was pressed. */
|
/* Pass input to TextView; if true, RET was pressed. */
|
||||||
|
if(event->type == SDL_EVENT_KEY_DOWN) {
|
||||||
|
switch(event->key.key) {
|
||||||
|
case SDLK_UP:
|
||||||
|
if(!_command_history.empty()) {
|
||||||
|
_command_history_index = std::max(0, _command_history_index-1);
|
||||||
|
_input_buffer.set_text(_command_history[_command_history_index]);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SDLK_DOWN:
|
||||||
|
if(!_command_history.empty()) {
|
||||||
|
_command_history_index =
|
||||||
|
std::min((int)_command_history.size(), _command_history_index+1);
|
||||||
|
if(_command_history_index < (int)_command_history.size()) {
|
||||||
|
_input_buffer.set_text(_command_history[_command_history_index]);
|
||||||
|
} else {
|
||||||
|
_input_buffer.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
if(_input_view->handle_event(event)) { _on_ret_press(); }
|
if(_input_view->handle_event(event)) { _on_ret_press(); }
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
if(_input_view->handle_event(event)) { _on_ret_press(); }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Terminal::scroll(int amount, int win_content_height) {
|
void Terminal::scroll(int amount, int win_content_height) {
|
||||||
/* amount > 0 = scroll up. amount < 0 = scroll down. */
|
/* amount > 0 = scroll up. amount < 0 = scroll down. */
|
||||||
|
|||||||
@ -31,6 +31,8 @@ private:
|
|||||||
void _on_ret_press(void);
|
void _on_ret_press(void);
|
||||||
|
|
||||||
bool _should_close;
|
bool _should_close;
|
||||||
|
std::vector<std::string> _command_history;
|
||||||
|
int _command_history_index;
|
||||||
std::vector<std::string> _history;
|
std::vector<std::string> _history;
|
||||||
int _scroll_offset;
|
int _scroll_offset;
|
||||||
std::string _prompt;
|
std::string _prompt;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user