From 455de77305d1dff12150fb04dfc5e783e2254683 Mon Sep 17 00:00:00 2001 From: eidheim Date: Sat, 25 Jul 2015 13:36:13 +0200 Subject: [PATCH] Fixed slow responsiveness in search and replace when buffer contains a large file. --- juci/notebook.cc | 16 ++++++++++++++-- juci/notebook.h | 1 + juci/source.cc | 4 ++-- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/juci/notebook.cc b/juci/notebook.cc index bb5a3d9..6a6d8d8 100644 --- a/juci/notebook.cc +++ b/juci/notebook.cc @@ -134,7 +134,13 @@ void Notebook::Controller::show_search_and_replace() { search_entry_it->set_placeholder_text("Find"); if(CurrentPage()!=-1) { CurrentSourceView()->search_highlight(search_entry_it->get_text(), case_sensitive_search, regex_search); - label_it->update(0, std::to_string(CurrentSourceView()->get_search_occurences())); + delayed_search_label_update.disconnect(); + auto this_view=CurrentSourceView(); + delayed_search_label_update=Glib::signal_timeout().connect([this, this_view, label_it]() { + if(this_view==CurrentSourceView() && search_entry_shown && entry_box.labels.size()>0) + label_it->update(0, std::to_string(this_view->get_search_occurences())); + return false; + }, 500); } search_entry_it->signal_key_press_event().connect([this](GdkEventKey* event){ if(event->keyval==GDK_KEY_Return && event->state==GDK_SHIFT_MASK) { @@ -147,7 +153,13 @@ void Notebook::Controller::show_search_and_replace() { last_search=search_entry_it->get_text(); if(CurrentPage()!=-1) { CurrentSourceView()->search_highlight(search_entry_it->get_text(), case_sensitive_search, regex_search); - label_it->update(0, std::to_string(CurrentSourceView()->get_search_occurences())); + delayed_search_label_update.disconnect(); + auto this_view=CurrentSourceView(); + delayed_search_label_update=Glib::signal_timeout().connect([this, this_view, label_it]() { + if(this_view==CurrentSourceView() && search_entry_shown && entry_box.labels.size()>0) + label_it->update(0, std::to_string(this_view->get_search_occurences())); + return false; + }, 500); } }); diff --git a/juci/notebook.h b/juci/notebook.h index c236401..a840a86 100644 --- a/juci/notebook.h +++ b/juci/notebook.h @@ -43,6 +43,7 @@ namespace Notebook { bool case_sensitive_search=true; bool regex_search=false; bool search_entry_shown=false; + sigc::connection delayed_search_label_update; std::vector > source_views; private: diff --git a/juci/source.cc b/juci/source.cc index a07e5c9..c7f48f2 100644 --- a/juci/source.cc +++ b/juci/source.cc @@ -62,6 +62,7 @@ file_path(file_path), project_path(project_path) { search_settings = gtk_source_search_settings_new(); gtk_source_search_settings_set_wrap_around(search_settings, true); search_context = gtk_source_search_context_new(get_source_buffer()->gobj(), search_settings); + gtk_source_search_context_set_highlight(search_context, true); //TODO: why does this not work?: Might be best to use the styles from sourceview. These has to be read from file, search-matches got style "search-match" //TODO: in header if trying again: GtkSourceStyle* search_match_style; //TODO: We can drop this, only work on newer versions of gtksourceview. @@ -78,11 +79,10 @@ void Source::View::search_highlight(const std::string &text, bool case_sensitive gtk_source_search_settings_set_case_sensitive(search_settings, case_sensitive); gtk_source_search_settings_set_regex_enabled(search_settings, regex); gtk_source_search_settings_set_search_text(search_settings, text.c_str()); - gtk_source_search_context_set_highlight(search_context, true); } int Source::View::get_search_occurences() { - while(gtk_events_pending()) + while(gtk_events_pending()) //TODO: need to connect to a signal instead (something like search highlight updated) gtk_main_iteration(); return gtk_source_search_context_get_occurrences_count(search_context); }