summaryrefslogtreecommitdiff
path: root/src/main.cc
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2012-07-27 10:22:33 +0200
committerMaxime Coste <frrrwww@gmail.com>2012-07-27 10:22:33 +0200
commit6bd67c01ccf8d2336400ff2fa394e4edbce73b96 (patch)
treef8db2e50c3782601b25ae423af0f6d1b87df6137 /src/main.cc
parent0e9b0c8b3aaddbad2f2e7d78605ad19ae64aeb2a (diff)
refactor insertion and insertion replay functions
Diffstat (limited to 'src/main.cc')
-rw-r--r--src/main.cc107
1 files changed, 53 insertions, 54 deletions
diff --git a/src/main.cc b/src/main.cc
index ccb51f37..72b06182 100644
--- a/src/main.cc
+++ b/src/main.cc
@@ -41,51 +41,54 @@ struct InsertSequence
InsertSequence last_insert_sequence;
-bool insert_char(IncrementalInserter& inserter, const Key& key)
+template<typename GetKey, typename Redraw>
+void insert_sequence(IncrementalInserter& inserter,
+ GetKey get_key, Redraw redraw)
{
- switch (key.modifiers)
+ while (true)
{
- case Key::Modifiers::None:
- switch (key.key)
- {
- case 27:
- return false;
- default:
- inserter.insert(String() + key.key);
- }
- break;
- case Key::Modifiers::Control:
- switch (key.key)
- {
- case 'r':
+ Key key = get_key();
+ switch (key.modifiers)
{
- Key next_key = get_key();
- last_insert_sequence.keys.push_back(next_key);
- if (next_key.modifiers == Key::Modifiers::None)
- inserter.insert(RegisterManager::instance()[next_key.key]);
- break;
- }
- case 'm':
- inserter.insert(String() + '\n');
- break;
- case 'i':
- inserter.insert(String() + '\t');
- break;
- case 'd':
- inserter.move_cursors({0, -1});
- break;
- case 'e':
- inserter.move_cursors({0, 1});
+ case Key::Modifiers::None:
+ switch (key.key)
+ {
+ case 27:
+ return;
+ default:
+ inserter.insert(String() + key.key);
+ }
break;
- case 'g':
- inserter.erase();
+ case Key::Modifiers::Control:
+ switch (key.key)
+ {
+ case 'r':
+ {
+ Key next_key = get_key();
+ if (next_key.modifiers == Key::Modifiers::None)
+ inserter.insert(RegisterManager::instance()[next_key.key]);
+ break;
+ }
+ case 'm':
+ inserter.insert(String() + '\n');
+ break;
+ case 'i':
+ inserter.insert(String() + '\t');
+ break;
+ case 'd':
+ inserter.move_cursors({0, -1});
+ break;
+ case 'e':
+ inserter.move_cursors({0, 1});
+ break;
+ case 'g':
+ inserter.erase();
+ break;
+ }
break;
}
- break;
- default:
- break;
+ redraw();
}
- return true;
}
void do_insert(Editor& editor, IncrementalInserter::Mode mode)
@@ -94,29 +97,25 @@ void do_insert(Editor& editor, IncrementalInserter::Mode mode)
last_insert_sequence.keys.clear();
IncrementalInserter inserter(editor, mode);
draw_editor_ifn(editor);
- while(true)
- {
- Key key = get_key();
-
- if (not insert_char(inserter, key))
- break;
-
- last_insert_sequence.keys.push_back(key);
- draw_editor_ifn(editor);
- }
+ insert_sequence(inserter,
+ [&]() { Key key = get_key();
+ last_insert_sequence.keys.push_back(key);
+ return key; },
+ [&]() { draw_editor_ifn(editor); });
}
void do_repeat_insert(Editor& editor, int count)
{
+ if (last_insert_sequence.keys.empty())
+ return;
+
IncrementalInserter inserter(editor, last_insert_sequence.mode);
- for (const Key& key : last_insert_sequence.keys)
- {
- insert_char(inserter, key);
- }
- draw_editor_ifn(editor);
+ size_t index = 0;
+ insert_sequence(inserter,
+ [&]() { return last_insert_sequence.keys[index++]; },
+ [](){});
}
-
template<bool append>
void do_go(Editor& editor, int count)
{