diff options
author | ouwou <26526779+ouwou@users.noreply.github.com> | 2021-01-08 22:40:00 -0500 |
---|---|---|
committer | ouwou <26526779+ouwou@users.noreply.github.com> | 2021-01-08 22:40:00 -0500 |
commit | 117e5db5646ef74e7f09864d8450bac792e14923 (patch) | |
tree | dac3626d705a0f9647c2de84ffad7020a10370b3 /components | |
parent | 3f31d74cd84143dea4c3af258fd0f8aaa201721a (diff) | |
download | abaddon-portaudio-117e5db5646ef74e7f09864d8450bac792e14923.tar.gz abaddon-portaudio-117e5db5646ef74e7f09864d8450bac792e14923.zip |
make completer work with terms after/before newlines
Diffstat (limited to 'components')
-rw-r--r-- | components/completer.cpp | 38 |
1 files changed, 36 insertions, 2 deletions
diff --git a/components/completer.cpp b/components/completer.cpp index d673d40..f07bee6 100644 --- a/components/completer.cpp +++ b/components/completer.cpp @@ -264,14 +264,48 @@ void Completer::OnTextBufferChanged() { } } +bool MultiBackwardSearch(const Gtk::TextIter &iter, const Glib::ustring &chars, Gtk::TextSearchFlags flags, Gtk::TextBuffer::iterator &out) { + bool any = false; + for (const auto c : chars) { + Glib::ustring tmp(1, c); + Gtk::TextBuffer::iterator tstart, tend; + if (!iter.backward_search(tmp, flags, tstart, tend)) continue; + // if previous found, compare to see if closer to out iter + if (any) { + if (tstart > out) + out = tstart; + } else + out = tstart; + any = true; + } + return any; +} + +bool MultiForwardSearch(const Gtk::TextIter &iter, const Glib::ustring &chars, Gtk::TextSearchFlags flags, Gtk::TextBuffer::iterator &out) { + bool any = false; + for (const auto c : chars) { + Glib::ustring tmp(1, c); + Gtk::TextBuffer::iterator tstart, tend; + if (!iter.forward_search(tmp, flags, tstart, tend)) continue; + // if previous found, compare to see if closer to out iter + if (any) { + if (tstart < out) + out = tstart; + } else + out = tstart; + any = true; + } + return any; +} + Glib::ustring Completer::GetTerm() { const auto iter = m_buf->get_insert()->get_iter(); Gtk::TextBuffer::iterator dummy; - if (!iter.backward_search(" ", Gtk::TEXT_SEARCH_TEXT_ONLY, m_start, dummy)) + if (!MultiBackwardSearch(iter, " \n", Gtk::TEXT_SEARCH_TEXT_ONLY, m_start)) m_buf->get_bounds(m_start, dummy); else m_start.forward_char(); // 1 behind - if (!iter.forward_search(" ", Gtk::TEXT_SEARCH_TEXT_ONLY, dummy, m_end)) + if (!MultiForwardSearch(iter, " \n", Gtk::TEXT_SEARCH_TEXT_ONLY, m_end)) m_buf->get_bounds(dummy, m_end); return m_start.get_text(m_end); } |