Browse Source

Cleaned up code around label showning number of search matches.

merge-requests/365/head
eidheim 11 years ago
parent
commit
c7b03b783d
  1. 58
      juci/notebook.cc
  2. 15
      juci/source.cc
  3. 3
      juci/source.h

58
juci/notebook.cc

@ -28,8 +28,10 @@ Notebook::Controller::Controller() :
}); });
view.notebook.signal_switch_page().connect([this](Gtk::Widget* page, guint page_num) { view.notebook.signal_switch_page().connect([this](Gtk::Widget* page, guint page_num) {
if(search_entry_shown && entry_box.labels.size()>0 && CurrentPage()!=-1) { 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); 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"); INFO("Notebook Controller Success");
@ -117,14 +119,14 @@ void Notebook::Controller::show_search_and_replace() {
entry_box.clear(); entry_box.clear();
entry_box.labels.emplace_back(); entry_box.labels.emplace_back();
auto label_it=entry_box.labels.begin(); 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) { if(state==0) {
int number=stoi(message); int number=stoi(message);
if(number<1) if(number==0)
label_it->set_text(""); label_it->set_text("");
else if(number==1) else if(number==1)
label_it->set_text("1 result found"); label_it->set_text("1 result found");
else else if(number>1)
label_it->set_text(std::to_string(number)+" results found"); 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(); auto search_entry_it=entry_box.entries.begin();
search_entry_it->set_placeholder_text("Find"); search_entry_it->set_placeholder_text("Find");
if(CurrentPage()!=-1) { 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); 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){ 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) {
@ -151,21 +149,13 @@ void Notebook::Controller::show_search_and_replace() {
} }
return false; 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(); 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);
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) if(CurrentPage()!=-1)
CurrentSourceView()->replace_forward(content); CurrentSourceView()->replace_forward(content);
}); });
@ -191,27 +181,21 @@ void Notebook::Controller::show_search_and_replace() {
if(CurrentPage()!=-1) if(CurrentPage()!=-1)
CurrentSourceView()->replace_forward(replace_entry_it->get_text()); CurrentSourceView()->replace_forward(replace_entry_it->get_text());
}); });
entry_box.buttons.emplace_back("Replace all", [this, replace_entry_it, label_it](){ entry_box.buttons.emplace_back("Replace all", [this, replace_entry_it](){
if(CurrentPage()!=-1) { if(CurrentPage()!=-1)
CurrentSourceView()->replace_all(replace_entry_it->get_text()); 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.emplace_back("Match case");
entry_box.toggle_buttons.back().set_active(case_sensitive_search); 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; 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); 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; regex_search=!regex_search;
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()));
}
}); });
entry_box.signal_hide().connect([this]() { entry_box.signal_hide().connect([this]() {
for(int c=0;c<Pages();c++) for(int c=0;c<Pages();c++)
@ -252,12 +236,6 @@ void Notebook::Controller::open_file(std::string path) {
title+="*"; title+="*";
view.notebook.set_tab_label_text(*(view.notebook.get_nth_page(CurrentPage())), title); view.notebook.set_tab_label_text(*(view.notebook.get_nth_page(CurrentPage())), title);
}); });
auto this_view=CurrentSourceView();
CurrentSourceView()->get_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() { void Notebook::Controller::OnCloseCurrentPage() {

15
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. //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); //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); //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() { 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_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());
} search_occurrences_updated(NULL, NULL, this);
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);
} }
void Source::View::search_forward() { void Source::View::search_forward() {

3
juci/source.h

@ -51,7 +51,7 @@ public:
~View(); ~View();
void search_highlight(const std::string &text, bool case_sensitive, bool regex); void search_highlight(const std::string &text, bool case_sensitive, bool regex);
int get_search_occurences(); std::function<void(int number)> update_search_occurrences;
void search_forward(); void search_forward();
void search_backward(); void search_backward();
void replace_forward(const std::string &replacement); void replace_forward(const std::string &replacement);
@ -71,6 +71,7 @@ public:
private: private:
GtkSourceSearchContext *search_context; GtkSourceSearchContext *search_context;
GtkSourceSearchSettings *search_settings; GtkSourceSearchSettings *search_settings;
static void search_occurrences_updated(GtkWidget* widget, GParamSpec* property, gpointer data);
}; // class View }; // class View
class GenericView : public View { class GenericView : public View {

Loading…
Cancel
Save