diff options
| author | Maxime Coste <frrrwww@gmail.com> | 2013-11-14 21:12:59 +0000 |
|---|---|---|
| committer | Maxime Coste <frrrwww@gmail.com> | 2013-11-14 21:12:59 +0000 |
| commit | 8c25d62056d51a0575dda4abc1c541fb2f330f19 (patch) | |
| tree | 8d6909e142d27a9c5753518b9ae0fa1e76ab7a05 /src/input_handler.hh | |
| parent | f8cadc0c573b0e91b7542f26415e5c5cddcc5305 (diff) | |
extract InputHandler to input_handler.{cc,hh}
Diffstat (limited to 'src/input_handler.hh')
| -rw-r--r-- | src/input_handler.hh | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/src/input_handler.hh b/src/input_handler.hh new file mode 100644 index 00000000..a1a461a4 --- /dev/null +++ b/src/input_handler.hh @@ -0,0 +1,100 @@ +#ifndef input_handler_hh_INCLUDED +#define input_handler_hh_INCLUDED + +#include "color.hh" +#include "completion.hh" +#include "context.hh" +#include "editor.hh" +#include "keys.hh" +#include "string.hh" +#include "utils.hh" + +namespace Kakoune +{ + +class Editor; + +enum class MenuEvent +{ + Select, + Abort, + Validate +}; +using MenuCallback = std::function<void (int, MenuEvent, Context&)>; + +enum class PromptEvent +{ + Change, + Abort, + Validate +}; +using PromptCallback = std::function<void (const String&, PromptEvent, Context&)>; +using KeyCallback = std::function<void (Key, Context&)>; + +class InputMode; +enum class InsertMode : unsigned; + +class InputHandler : public SafeCountable +{ +public: + InputHandler(Editor& editor, String name = ""); + ~InputHandler(); + + // switch to insert mode + void insert(InsertMode mode); + // repeat last insert mode key sequence + void repeat_last_insert(); + + // enter prompt mode, callback is called on each change, + // abort or validation with corresponding PromptEvent value + // returns to normal mode after validation if callback does + // not change the mode itself + void prompt(const String& prompt, ColorPair prompt_colors, + Completer completer, PromptCallback callback); + void set_prompt_colors(ColorPair prompt_colors); + + // enter menu mode, callback is called on each selection change, + // abort or validation with corresponding MenuEvent value + // returns to normal mode after validation if callback does + // not change the mode itself + void menu(memoryview<String> choices, + MenuCallback callback); + + // execute callback on next keypress and returns to normal mode + // if callback does not change the mode itself + void on_next_key(KeyCallback callback); + + // process the given key + void handle_key(Key key); + + void start_recording(char reg); + bool is_recording() const; + void stop_recording(); + char recording_reg() const { return m_recording_reg; } + + void reset_normal_mode(); + + Context& context() { return m_context; } + const Context& context() const { return m_context; } + + String mode_string() const; + void clear_mode_trash(); +private: + Context m_context; + + friend class InputMode; + std::unique_ptr<InputMode> m_mode; + std::vector<std::unique_ptr<InputMode>> m_mode_trash; + + void change_input_mode(InputMode* new_mode); + + using Insertion = std::pair<InsertMode, std::vector<Key>>; + Insertion m_last_insert = {InsertMode::Insert, {}}; + + char m_recording_reg = 0; + String m_recorded_keys; +}; + +} + +#endif // input_handler_hh_INCLUDED |
