diff --git a/juci/notebook.cc b/juci/notebook.cc index 51a10ed..0d358f0 100644 --- a/juci/notebook.cc +++ b/juci/notebook.cc @@ -28,8 +28,10 @@ Notebook::Controller::Controller() : }); view.notebook.signal_switch_page().connect([this](Gtk::Widget* page, guint page_num) { if(search_entry_shown && entry_box.labels.size()>0 && CurrentPage()!=-1) { + CurrentSourceView()->update_search_occurrences=[this](int number){ + entry_box.labels.begin()->update(0, std::to_string(number)); + }; CurrentSourceView()->search_highlight(last_search, case_sensitive_search, regex_search); - entry_box.labels.back().update(0, std::to_string(CurrentSourceView()->get_search_occurences())); } }); INFO("Notebook Controller Success"); @@ -117,14 +119,14 @@ void Notebook::Controller::show_search_and_replace() { entry_box.clear(); entry_box.labels.emplace_back(); auto label_it=entry_box.labels.begin(); - label_it->update=[this, label_it](int state, const std::string& message){ + label_it->update=[label_it](int state, const std::string& message){ if(state==0) { int number=stoi(message); - if(number<1) + if(number==0) label_it->set_text(""); else if(number==1) label_it->set_text("1 result found"); - else + else if(number>1) label_it->set_text(std::to_string(number)+" results found"); } }; @@ -135,14 +137,10 @@ void Notebook::Controller::show_search_and_replace() { auto search_entry_it=entry_box.entries.begin(); search_entry_it->set_placeholder_text("Find"); if(CurrentPage()!=-1) { + CurrentSourceView()->update_search_occurrences=[label_it](int number){ + label_it->update(0, std::to_string(number)); + }; CurrentSourceView()->search_highlight(search_entry_it->get_text(), case_sensitive_search, regex_search); - 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) { @@ -151,21 +149,13 @@ void Notebook::Controller::show_search_and_replace() { } return false; }); - search_entry_it->signal_changed().connect([this, search_entry_it, label_it](){ + search_entry_it->signal_changed().connect([this, search_entry_it](){ 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); - 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); - } }); - entry_box.entries.emplace_back(last_replace, [this, label_it](const std::string &content){ + entry_box.entries.emplace_back(last_replace, [this](const std::string &content){ if(CurrentPage()!=-1) CurrentSourceView()->replace_forward(content); }); @@ -191,27 +181,21 @@ void Notebook::Controller::show_search_and_replace() { if(CurrentPage()!=-1) CurrentSourceView()->replace_forward(replace_entry_it->get_text()); }); - entry_box.buttons.emplace_back("Replace all", [this, replace_entry_it, label_it](){ - if(CurrentPage()!=-1) { + entry_box.buttons.emplace_back("Replace all", [this, replace_entry_it](){ + if(CurrentPage()!=-1) CurrentSourceView()->replace_all(replace_entry_it->get_text()); - label_it->update(0, std::to_string(CurrentSourceView()->get_search_occurences())); - } }); entry_box.toggle_buttons.emplace_back("Match case"); entry_box.toggle_buttons.back().set_active(case_sensitive_search); - entry_box.toggle_buttons.back().on_activate=[this, search_entry_it, label_it](){ + entry_box.toggle_buttons.back().on_activate=[this, search_entry_it](){ case_sensitive_search=!case_sensitive_search; - if(CurrentPage()!=-1) { + 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())); - } }; - entry_box.toggle_buttons.emplace_back("Use regex", [this, search_entry_it, label_it](){ + entry_box.toggle_buttons.emplace_back("Use regex", [this, search_entry_it](){ regex_search=!regex_search; - if(CurrentPage()!=-1) { + 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())); - } }); entry_box.signal_hide().connect([this]() { for(int c=0;cget_buffer()->signal_end_user_action().connect([this, this_view](){ - if(this_view==CurrentSourceView() && search_entry_shown && entry_box.labels.size()>0) { - entry_box.labels.back().update(0, std::to_string(this_view->get_search_occurences())); - } - }); } void Notebook::Controller::OnCloseCurrentPage() { diff --git a/juci/source.cc b/juci/source.cc index 95056af..a1a064c 100644 --- a/juci/source.cc +++ b/juci/source.cc @@ -58,6 +58,14 @@ file_path(file_path), project_path(project_path) { //TODO: We can drop this, only work on newer versions of gtksourceview. //search_match_style=(GtkSourceStyle*)g_object_new(GTK_SOURCE_TYPE_STYLE, "background-set", 1, "background", "#00FF00", NULL); //gtk_source_search_context_set_match_style(search_context, search_match_style); + + g_signal_connect(search_context, "notify::occurrences-count", G_CALLBACK(search_occurrences_updated), this); +} + +void Source::View::search_occurrences_updated(GtkWidget* widget, GParamSpec* property, gpointer data) { + auto view=(Source::View*)data; + if(view->update_search_occurrences) + view->update_search_occurrences(gtk_source_search_context_get_occurrences_count(view->search_context)); } Source::View::~View() { @@ -69,12 +77,7 @@ 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()); -} - -int Source::View::get_search_occurences() { - 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); + search_occurrences_updated(NULL, NULL, this); } void Source::View::search_forward() { diff --git a/juci/source.h b/juci/source.h index c5d01b2..cfb80fa 100644 --- a/juci/source.h +++ b/juci/source.h @@ -51,7 +51,7 @@ public: ~View(); void search_highlight(const std::string &text, bool case_sensitive, bool regex); - int get_search_occurences(); + std::function update_search_occurrences; void search_forward(); void search_backward(); void replace_forward(const std::string &replacement); @@ -71,6 +71,7 @@ public: private: GtkSourceSearchContext *search_context; GtkSourceSearchSettings *search_settings; + static void search_occurrences_updated(GtkWidget* widget, GParamSpec* property, gpointer data); }; // class View class GenericView : public View {