From 28eaf0652e846616e538649d5e12d5121e97aebb Mon Sep 17 00:00:00 2001 From: eidheim Date: Sun, 4 Sep 2016 12:24:22 +0200 Subject: [PATCH] Completed toggle breakpoint on click --- src/notebook.cc | 19 +++++++++++++++++++ src/source.cc | 28 ++++++++-------------------- src/source.h | 5 +++-- src/window.cc | 25 +++---------------------- 4 files changed, 33 insertions(+), 44 deletions(-) diff --git a/src/notebook.cc b/src/notebook.cc index 9053ac1..509a1d0 100644 --- a/src/notebook.cc +++ b/src/notebook.cc @@ -221,6 +221,25 @@ void Notebook::open(const boost::filesystem::path &file_path, size_t notebook_in return false; }); +#ifdef JUCI_ENABLE_DEBUG + if(dynamic_cast(source_view)) { + source_view->toggle_breakpoint=[source_view](int line_nr) { + if(source_view->get_source_buffer()->get_source_marks_at_line(line_nr, "debug_breakpoint").size()>0) { + auto start_iter=source_view->get_buffer()->get_iter_at_line(line_nr); + auto end_iter=source_view->get_iter_at_line_end(line_nr); + source_view->get_source_buffer()->remove_source_marks(start_iter, end_iter, "debug_breakpoint"); + if(Project::current && Project::debugging) + Project::current->debug_remove_breakpoint(source_view->file_path, line_nr+1, source_view->get_buffer()->get_line_count()+1); + } + else { + source_view->get_source_buffer()->create_source_mark("debug_breakpoint", source_view->get_buffer()->get_iter_at_line(line_nr)); + if(Project::current && Project::debugging) + Project::current->debug_add_breakpoint(source_view->file_path, line_nr+1); + } + }; + } +#endif + if(notebook_index==static_cast(-1)) { if(!split) notebook_index=0; diff --git a/src/source.cc b/src/source.cc index 2cacc5b..ef96fab 100644 --- a/src/source.cc +++ b/src/source.cc @@ -4,7 +4,6 @@ #include "terminal.h" #include "info.h" #include "directories.h" -#include "project.h" #include #include #include @@ -147,11 +146,14 @@ Source::View::View(const boost::filesystem::path &file_path, Glib::RefPtrget_renderer_at_pos(30, 0); - if(render) - render->signal_activate().connect([this](const Gtk::TextIter& iter, const Gdk::Rectangle&, GdkEvent*) { - Source::View::toggle_breakpoint(iter.get_line()); + auto renderer=gutter->get_renderer_at_pos(15, 0); + if(renderer) { + renderer_activate_connection.disconnect(); + renderer_activate_connection=renderer->signal_activate().connect([this](const Gtk::TextIter& iter, const Gdk::Rectangle&, GdkEvent*) { + if(toggle_breakpoint) + toggle_breakpoint(iter.get_line()); }); + } }); set_tooltip_and_dialog_events(); @@ -532,21 +534,6 @@ void Source::View::configure() { } } -void Source::View::toggle_breakpoint(int line_nr){ - if(get_source_buffer()->get_source_marks_at_line(line_nr, "debug_breakpoint").size()>0) { - auto start_iter=get_buffer()->get_iter_at_line(line_nr); - auto end_iter=get_iter_at_line_end(line_nr); - get_source_buffer()->remove_source_marks(start_iter, end_iter, "debug_breakpoint"); - if(Project::current && Project::debugging) - Project::current->debug_remove_breakpoint(file_path, line_nr+1, get_buffer()->get_line_count()+1); - } - else { - get_source_buffer()->create_source_mark("debug_breakpoint", get_buffer()->get_iter_at_line(line_nr)); - if(Project::current && Project::debugging) - Project::current->debug_add_breakpoint(file_path, line_nr+1); - } -} - void Source::View::set_tooltip_and_dialog_events() { get_buffer()->signal_changed().connect([this] { hide_tooltips(); @@ -635,6 +622,7 @@ Source::View::~View() { g_clear_object(&search_settings); delayed_tooltips_connection.disconnect(); + renderer_activate_connection.disconnect(); } void Source::View::search_highlight(const std::string &text, bool case_sensitive, bool regex) { diff --git a/src/source.h b/src/source.h index 4ad3938..22f4cfc 100644 --- a/src/source.h +++ b/src/source.h @@ -46,8 +46,6 @@ namespace Source { virtual bool save(const std::vector &views); void configure() override; - void toggle_breakpoint(int line_nr); - void search_highlight(const std::string &text, bool case_sensitive, bool regex); std::function update_search_occurrences; void search_forward(); @@ -73,6 +71,7 @@ namespace Source { std::function()> get_fix_its; std::function toggle_comments; std::function add_documentation; + std::function toggle_breakpoint; std::unique_ptr autocomplete_dialog; std::unique_ptr selection_dialog; @@ -154,6 +153,8 @@ namespace Source { GtkSourceSearchContext *search_context; GtkSourceSearchSettings *search_settings; static void search_occurrences_updated(GtkWidget* widget, GParamSpec* property, gpointer data); + + sigc::connection renderer_activate_connection; }; class GenericView : public View { diff --git a/src/window.cc b/src/window.cc index dc20a36..521687e 100644 --- a/src/window.cc +++ b/src/window.cc @@ -999,20 +999,8 @@ void Window::set_menu_actions() { }); menu.add_action("debug_toggle_breakpoint", [this](){ if(auto view=Notebook::get().get_current_view()) { - auto line_nr=view->get_buffer()->get_insert()->get_iter().get_line(); - - if(view->get_source_buffer()->get_source_marks_at_line(line_nr, "debug_breakpoint").size()>0) { - auto start_iter=view->get_buffer()->get_iter_at_line(line_nr); - auto end_iter=view->get_iter_at_line_end(line_nr); - view->get_source_buffer()->remove_source_marks(start_iter, end_iter, "debug_breakpoint"); - if(Project::current && Project::debugging) - Project::current->debug_remove_breakpoint(view->file_path, line_nr+1, view->get_buffer()->get_line_count()+1); - } - else { - view->get_source_buffer()->create_source_mark("debug_breakpoint", view->get_buffer()->get_insert()->get_iter()); - if(Project::current && Project::debugging) - Project::current->debug_add_breakpoint(view->file_path, line_nr+1); - } + if(view->toggle_breakpoint) + view->toggle_breakpoint(view->get_buffer()->get_insert()->get_iter().get_line()); } }); menu.add_action("debug_goto_stop", [this](){ @@ -1077,14 +1065,7 @@ void Window::activate_menu_items(bool activate) { menu.actions["source_goto_next_diagnostic"]->set_enabled(activate ? static_cast(notebook.get_current_view()->goto_next_diagnostic) : false); menu.actions["source_apply_fix_its"]->set_enabled(activate ? static_cast(notebook.get_current_view()->get_fix_its) : false); #ifdef JUCI_ENABLE_DEBUG - if(auto view=notebook.get_current_view()) { - if(view->language && (view->language->get_id()=="c" || view->language->get_id()=="cpp" || view->language->get_id()=="objc" || view->language->get_id()=="chdr" || view->language->get_id()=="cpphdr")) - menu.actions["debug_toggle_breakpoint"]->set_enabled(true); - else - menu.actions["debug_toggle_breakpoint"]->set_enabled(false); - } - else - menu.actions["debug_toggle_breakpoint"]->set_enabled(false); + menu.actions["debug_toggle_breakpoint"]->set_enabled(activate ? static_cast(notebook.get_current_view()->toggle_breakpoint) : false); #endif }