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) { 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()) { if(get_buffer()->get_has_selection()) {
bool perform_insertion = false; bool perform_insertion = false;
char left_char, right_char; char left_char, right_char;

2
src/source.h

@ -141,6 +141,8 @@ namespace Source {
char tab_char; char tab_char;
std::string tab; 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; bool interactive_completion = true;
private: private:

32
src/source_language_protocol.cc

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

3
src/source_language_protocol.h

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

Loading…
Cancel
Save