Browse Source

Improved left/right arrow keys when using multiple cursors, and correctly clear snippet cursors when (main) cursor is moved manually

pipelines/235045657
eidheim 6 years ago
parent
commit
76b9a049df
  1. 31
      src/source_base.cpp

31
src/source_base.cpp

@ -184,6 +184,9 @@ Source::BaseView::BaseView(const boost::filesystem::path &file_path, const Glib:
get_buffer()->signal_mark_set().connect([this](const Gtk::TextIter &iter, const Glib::RefPtr<Gtk::TextBuffer::Mark> &mark) { get_buffer()->signal_mark_set().connect([this](const Gtk::TextIter &iter, const Glib::RefPtr<Gtk::TextBuffer::Mark> &mark) {
if(mark->get_name() == "insert") { if(mark->get_name() == "insert") {
keep_clipboard = false; keep_clipboard = false;
if(!keep_snippet_marks)
clear_snippet_marks();
} }
}); });
@ -1198,19 +1201,29 @@ bool Source::BaseView::on_key_press_event_extra_cursors(GdkEventKey *key) {
} }
// Move cursors left/right of selection // Move cursors left/right of selection
if((key->keyval == GDK_KEY_Left || key->keyval == GDK_KEY_KP_Left) && (key->state & GDK_SHIFT_MASK) == 0 && get_buffer()->get_has_selection()) { if((key->keyval == GDK_KEY_Left || key->keyval == GDK_KEY_KP_Left)) {
enable_multiple_cursors = false; enable_multiple_cursors = false;
bool shift_pressed = (key->state & GDK_SHIFT_MASK) != 0;
for(auto &extra_cursor : extra_cursors) { for(auto &extra_cursor : extra_cursors) {
auto iter = std::min(extra_cursor.insert->get_iter(), extra_cursor.selection_bound->get_iter()); auto iter = extra_cursor.insert->get_iter();
extra_cursor.move(iter, false); if(!shift_pressed && get_buffer()->get_has_selection())
iter = std::min(iter, extra_cursor.selection_bound->get_iter());
else
iter.backward_char();
extra_cursor.move(iter, shift_pressed);
} }
return false; return false;
} }
if((key->keyval == GDK_KEY_Right || key->keyval == GDK_KEY_KP_Right) && (key->state & GDK_SHIFT_MASK) == 0 && get_buffer()->get_has_selection()) { if((key->keyval == GDK_KEY_Right || key->keyval == GDK_KEY_KP_Right)) {
enable_multiple_cursors = false; enable_multiple_cursors = false;
bool shift_pressed = (key->state & GDK_SHIFT_MASK) != 0;
for(auto &extra_cursor : extra_cursors) { for(auto &extra_cursor : extra_cursors) {
auto iter = std::max(extra_cursor.insert->get_iter(), extra_cursor.selection_bound->get_iter()); auto iter = extra_cursor.insert->get_iter();
extra_cursor.move(iter, false); if(!shift_pressed && get_buffer()->get_has_selection())
iter = std::max(iter, extra_cursor.selection_bound->get_iter());
else
iter.forward_char();
extra_cursor.move(iter, shift_pressed);
} }
return false; return false;
} }
@ -1228,11 +1241,7 @@ void Source::BaseView::setup_extra_cursor_signals() {
auto last_insert = get_buffer()->create_mark(get_buffer()->get_insert()->get_iter(), false); auto last_insert = get_buffer()->create_mark(get_buffer()->get_insert()->get_iter(), false);
auto last_selection_bound = get_buffer()->create_mark(get_buffer()->get_selection_bound()->get_iter(), false); auto last_selection_bound = get_buffer()->create_mark(get_buffer()->get_selection_bound()->get_iter(), false);
get_buffer()->signal_mark_set().connect([this, last_insert, last_selection_bound](const Gtk::TextIter &iter, const Glib::RefPtr<Gtk::TextBuffer::Mark> &mark) mutable { get_buffer()->signal_mark_set().connect([this, last_insert, last_selection_bound](const Gtk::TextIter &iter, const Glib::RefPtr<Gtk::TextBuffer::Mark> &mark) mutable {
auto is_insert = mark->get_name() == "insert"; if(mark->get_name() == "insert") {
if(is_insert && !keep_snippet_marks)
clear_snippet_marks();
if(is_insert) {
if(enable_multiple_cursors || enable_multiple_cursors_placements) { if(enable_multiple_cursors || enable_multiple_cursors_placements) {
auto set_enable_multiple_cursors = enable_multiple_cursors; auto set_enable_multiple_cursors = enable_multiple_cursors;
if(set_enable_multiple_cursors) if(set_enable_multiple_cursors)

Loading…
Cancel
Save