Browse Source

Fixed slow responsiveness in search and replace when buffer contains a large file.

merge-requests/365/head
eidheim 11 years ago
parent
commit
455de77305
  1. 16
      juci/notebook.cc
  2. 1
      juci/notebook.h
  3. 4
      juci/source.cc

16
juci/notebook.cc

@ -134,7 +134,13 @@ void Notebook::Controller::show_search_and_replace() {
search_entry_it->set_placeholder_text("Find"); search_entry_it->set_placeholder_text("Find");
if(CurrentPage()!=-1) { if(CurrentPage()!=-1) {
CurrentSourceView()->search_highlight(search_entry_it->get_text(), case_sensitive_search, regex_search); 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){ search_entry_it->signal_key_press_event().connect([this](GdkEventKey* event){
if(event->keyval==GDK_KEY_Return && event->state==GDK_SHIFT_MASK) { 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(); last_search=search_entry_it->get_text();
if(CurrentPage()!=-1) { if(CurrentPage()!=-1) {
CurrentSourceView()->search_highlight(search_entry_it->get_text(), case_sensitive_search, regex_search); 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);
} }
}); });

1
juci/notebook.h

@ -43,6 +43,7 @@ namespace Notebook {
bool case_sensitive_search=true; bool case_sensitive_search=true;
bool regex_search=false; bool regex_search=false;
bool search_entry_shown=false; bool search_entry_shown=false;
sigc::connection delayed_search_label_update;
std::vector<std::unique_ptr<Source> > source_views; std::vector<std::unique_ptr<Source> > source_views;
private: private:

4
juci/source.cc

@ -62,6 +62,7 @@ file_path(file_path), project_path(project_path) {
search_settings = gtk_source_search_settings_new(); search_settings = gtk_source_search_settings_new();
gtk_source_search_settings_set_wrap_around(search_settings, true); gtk_source_search_settings_set_wrap_around(search_settings, true);
search_context = gtk_source_search_context_new(get_source_buffer()->gobj(), search_settings); 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: 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: in header if trying again: GtkSourceStyle* search_match_style;
//TODO: We can drop this, only work on newer versions of gtksourceview. //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_case_sensitive(search_settings, case_sensitive);
gtk_source_search_settings_set_regex_enabled(search_settings, regex); 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_settings_set_search_text(search_settings, text.c_str());
gtk_source_search_context_set_highlight(search_context, true);
} }
int Source::View::get_search_occurences() { 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(); gtk_main_iteration();
return gtk_source_search_context_get_occurrences_count(search_context); return gtk_source_search_context_get_occurrences_count(search_context);
} }

Loading…
Cancel
Save