1 /*
2  * Copyright (C) 2004 Ivo Danihelka (ivo@danihelka.net)
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  */
9 #include "ConsoleInput.h"
10 
11 #include "Keymap.h"
12 #include "KeyConsole.h"
13 
14 #include "Log.h"
15 #include "KeyDesc.h"
16 #include "KeyStroke.h"
17 
18 #include <ctype.h> // isprint()
19 
20 //-----------------------------------------------------------------
ConsoleInput(KeyConsole * console)21 ConsoleInput::ConsoleInput(KeyConsole *console)
22     : StateInput(console)
23 {
24     KeyDesc key_history(KEY_HISTORY, "input history");
25     KeyDesc key_backspace(KEY_BACKSPACE, "backspace");
26     KeyDesc key_clear(KEY_CLEAR, "clear");
27     KeyDesc key_enter(KEY_ENTER, "enter");
28 
29     m_keymap->registerKey(KeyStroke(SDLK_UP, KMOD_NONE), key_history);
30     m_keymap->registerKey(KeyStroke(SDLK_BACKSPACE, KMOD_NONE), key_backspace);
31     m_keymap->registerKey(KeyStroke(SDLK_u, KMOD_LCTRL), key_clear);
32     m_keymap->registerKey(KeyStroke(SDLK_u, KMOD_RCTRL), key_clear);
33     m_keymap->registerKey(KeyStroke(SDLK_RETURN, KMOD_NONE), key_enter);
34 }
35 //-----------------------------------------------------------------
36 KeyConsole *
getConsole()37 ConsoleInput::getConsole()
38 {
39     return dynamic_cast<KeyConsole*>(m_state);
40 }
41 //-----------------------------------------------------------------
42 /**
43  * Toggle console.
44  */
45 void
enableConsole()46 ConsoleInput::enableConsole()
47 {
48     quitState();
49 }
50 //-----------------------------------------------------------------
51     void
specKey(int keyIndex)52 ConsoleInput::specKey(int keyIndex)
53 {
54     //TODO: simulate key repeat in console
55     switch (keyIndex) {
56         case KEY_HISTORY:
57             getConsole()->setInput(m_history);
58             break;
59         case KEY_BACKSPACE:
60             {
61                 std::string input = getConsole()->getInput();
62                 if (!input.empty()) {
63                     input.erase(input.end() - 1);
64                     getConsole()->setInput(input);
65                 }
66             }
67             break;
68         case KEY_CLEAR:
69             getConsole()->setInput("");
70             break;
71         case KEY_ENTER:
72             {
73                 std::string input = getConsole()->getInput();
74                 if (!input.empty()) {
75                     if (getConsole()->sendCommand()) {
76                         m_history = input;
77                         getConsole()->setInput("");
78                     }
79                 }
80                 else {
81                     quitState();
82                 }
83             }
84             break;
85         default:
86             StateInput::specKey(keyIndex);
87             break;
88     }
89 }
90 //-----------------------------------------------------------------
91 void
specStroke(const KeyStroke & stroke)92 ConsoleInput::specStroke(const KeyStroke &stroke)
93 {
94     //TODO: support UTF-8
95     char c = stroke.getUnicode() & 0x7F;
96     if (isprint(c)) {
97         std::string input = getConsole()->getInput();
98         input.append(1, c);
99         getConsole()->setInput(input);
100     }
101 }
102 
103