Browse Source

Tabbing to next argument works now after performing a smart insertion

merge-requests/389/head
eidheim 7 years ago
parent
commit
942173cf5c
  1. 8
      src/source.cc
  2. 2
      src/source.h
  3. 32
      src/source_language_protocol.cc
  4. 3
      src/source_language_protocol.h

8
src/source.cc

@ -2439,6 +2439,14 @@ bool Source::View::on_key_press_event_smart_brackets(GdkEventKey *key) {
}
bool Source::View::on_key_press_event_smart_inserts(GdkEventKey *key) {
class Guard {
public:
bool &value;
Guard(bool &value_) : value(value_) { value = true; }
~Guard() { value = false; }
};
Guard guard{keep_argument_marks};
if(get_buffer()->get_has_selection()) {
bool perform_insertion = false;
char left_char, right_char;

2
src/source.h

@ -141,6 +141,8 @@ namespace Source {
char tab_char;
std::string tab;
/// After autocomplete, arguments could be marked so that one can use tab to select the next argument
bool keep_argument_marks = false;
bool interactive_completion = true;
private:

32
src/source_language_protocol.cc

@ -1283,18 +1283,18 @@ void Source::LanguageProtocolView::setup_autocomplete() {
signal_key_press_event().connect([this](GdkEventKey *event) {
if((event->keyval == GDK_KEY_Tab || event->keyval == GDK_KEY_ISO_Left_Tab) && (event->state & GDK_SHIFT_MASK) == 0) {
if(!autocomplete_marks.empty()) {
auto it = autocomplete_marks.begin();
if(!argument_marks.empty()) {
auto it = argument_marks.begin();
auto start = it->first->get_iter();
auto end = it->second->get_iter();
if(start == end)
return false;
autocomplete_keep_marks = true;
keep_argument_marks = true;
get_buffer()->select_range(it->first->get_iter(), it->second->get_iter());
autocomplete_keep_marks = false;
keep_argument_marks = false;
get_buffer()->delete_mark(it->first);
get_buffer()->delete_mark(it->second);
autocomplete_marks.erase(it);
argument_marks.erase(it);
return true;
}
}
@ -1303,22 +1303,22 @@ void Source::LanguageProtocolView::setup_autocomplete() {
get_buffer()->signal_mark_set().connect([this](const Gtk::TextBuffer::iterator &iterator, const Glib::RefPtr<Gtk::TextBuffer::Mark> &mark) {
if(mark->get_name() == "insert") {
if(!autocomplete_keep_marks) {
for(auto &pair : autocomplete_marks) {
if(!keep_argument_marks) {
for(auto &pair : argument_marks) {
get_buffer()->delete_mark(pair.first);
get_buffer()->delete_mark(pair.second);
}
autocomplete_marks.clear();
argument_marks.clear();
}
}
});
autocomplete.on_show = [this] {
for(auto &pair : autocomplete_marks) {
for(auto &pair : argument_marks) {
get_buffer()->delete_mark(pair.first);
get_buffer()->delete_mark(pair.second);
}
autocomplete_marks.clear();
argument_marks.clear();
hide_tooltips();
};
@ -1367,16 +1367,16 @@ void Source::LanguageProtocolView::setup_autocomplete() {
auto end = start;
start.forward_chars(offset.first);
end.forward_chars(offset.second);
autocomplete_marks.emplace_back(get_buffer()->create_mark(start), get_buffer()->create_mark(end));
argument_marks.emplace_back(get_buffer()->create_mark(start), get_buffer()->create_mark(end));
}
if(!autocomplete_marks.empty()) {
auto it = autocomplete_marks.begin();
autocomplete_keep_marks = true;
if(!argument_marks.empty()) {
auto it = argument_marks.begin();
keep_argument_marks = true;
get_buffer()->select_range(it->first->get_iter(), it->second->get_iter());
autocomplete_keep_marks = false;
keep_argument_marks = false;
get_buffer()->delete_mark(it->first);
get_buffer()->delete_mark(it->second);
autocomplete_marks.erase(it);
argument_marks.erase(it);
}
}
else

3
src/source_language_protocol.h

@ -121,8 +121,7 @@ namespace Source {
void setup_autocomplete();
std::vector<std::string> autocomplete_comment;
std::vector<std::string> autocomplete_insert;
std::list<std::pair<Glib::RefPtr<Gtk::TextBuffer::Mark>, Glib::RefPtr<Gtk::TextBuffer::Mark>>> autocomplete_marks;
bool autocomplete_keep_marks = false;
std::list<std::pair<Glib::RefPtr<Gtk::TextBuffer::Mark>, Glib::RefPtr<Gtk::TextBuffer::Mark>>> argument_marks;
boost::filesystem::path flow_coverage_executable;
std::vector<std::pair<Glib::RefPtr<Gtk::TextMark>, Glib::RefPtr<Gtk::TextMark>>> flow_coverage_marks;

Loading…
Cancel
Save