From 57705cfa7b7de84d4d05d8621eb893ea6dcb416c Mon Sep 17 00:00:00 2001 From: eidheim Date: Fri, 1 Nov 2019 10:57:55 +0100 Subject: [PATCH] Fixes #416 : Added Show Breakpoints to the Debug menu --- CMakeLists.txt | 2 +- src/files.h | 1 + src/menu.cc | 4 +++ src/source_base.h | 3 +++ src/window.cc | 67 +++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 76 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ab8198a..d67c97c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required (VERSION 2.8.8) project(juci) -set(JUCI_VERSION "1.5.0.1") +set(JUCI_VERSION "1.5.0.2") set(CPACK_PACKAGE_NAME "jucipp") set(CPACK_PACKAGE_CONTACT "Ole Christian Eidheim ") diff --git a/src/files.h b/src/files.h index 2e1b73e..83af234 100644 --- a/src/files.h +++ b/src/files.h @@ -140,6 +140,7 @@ const std::string default_config_file = R"RAW({ "debug_show_variables": "b", "debug_run_command": "Return", "debug_toggle_breakpoint": "b", + "debug_show_breakpoints": "b", "debug_goto_stop": "l",)RAW" #ifdef __linux R"RAW( diff --git a/src/menu.cc b/src/menu.cc index ec378fe..497337e 100644 --- a/src/menu.cc +++ b/src/menu.cc @@ -455,6 +455,10 @@ const Glib::ustring menu_xml = R"RAW( _Toggle _Breakpoint app.debug_toggle_breakpoint + + _Show _Breakpoints + app.debug_show_breakpoints +
diff --git a/src/source_base.h b/src/source_base.h index 548a1f2..a74502f 100644 --- a/src/source_base.h +++ b/src/source_base.h @@ -113,10 +113,13 @@ namespace Source { /// Note that smart end goes FIRST to end of line to avoid hiding empty chars after expressions. Gtk::TextIter get_smart_end_iter(const Gtk::TextIter &iter); + public: std::string get_line(const Gtk::TextIter &iter); std::string get_line(const Glib::RefPtr &mark); std::string get_line(int line_nr); std::string get_line(); + + protected: std::string get_line_before(const Gtk::TextIter &iter); std::string get_line_before(const Glib::RefPtr &mark); std::string get_line_before(); diff --git a/src/window.cc b/src/window.cc index 3bb0d07..70a3860 100644 --- a/src/window.cc +++ b/src/window.cc @@ -1329,6 +1329,73 @@ void Window::set_menu_actions() { view->toggle_breakpoint(view->get_buffer()->get_insert()->get_iter().get_line()); } }); + menu.add_action("debug_show_breakpoints", [] { + auto current_view = Notebook::get().get_current_view(); + if(!current_view) { + Info::get().print("No breakpoints found"); + return; + } + + auto dialog_iter = current_view->get_iter_for_dialog(); + SelectionDialog::create(current_view, current_view->get_buffer()->create_mark(dialog_iter), true); + + std::vector rows; + + // Place breakpoints in current view first + auto views = Notebook::get().get_views(); + bool insert_current_view = false; + for(auto it = views.begin(); it != views.end();) { + if(*it == current_view) { + it = views.erase(it); + insert_current_view = true; + } + else + ++it; + } + if(insert_current_view) + views.insert(views.begin(), current_view); + + auto insert_iter = current_view->get_buffer()->get_insert()->get_iter(); + for(auto &view : views) { + auto iter = view->get_buffer()->begin(); + + do { + if(view->get_source_buffer()->get_source_marks_at_iter(iter, "debug_breakpoint").size()) { + rows.emplace_back(iter.get_line(), 0, view->file_path); + std::string row; + if(view != current_view) + row += view->file_path.filename().string() + ':'; + auto source = view->get_line(iter); + int tabs = 0; + for(auto chr : source) { + if(chr == ' ' || chr == '\t') + ++tabs; + else + break; + } + SelectionDialog::get()->add_row(row + std::to_string(iter.get_line() + 1) + ": " + source.substr(tabs)); + if(view == current_view && insert_iter.get_line() >= iter.get_line()) + SelectionDialog::get()->set_cursor_at_last_row(); + } + } while(view->get_source_buffer()->forward_iter_to_source_mark(iter, "debug_breakpoint")); + } + + if(rows.empty()) { + Info::get().print("No breakpoints found"); + return; + } + + SelectionDialog::get()->on_select = [rows = std::move(rows)](unsigned int index, const std::string &text, bool hide_window) { + if(index >= rows.size()) + return; + Notebook::get().open(rows[index].file_path); + auto view = Notebook::get().get_current_view(); + view->place_cursor_at_line_pos(rows[index].line, rows[index].index); + view->scroll_to_cursor_delayed(view, true, false); + }; + + SelectionDialog::get()->show(); + }); menu.add_action("debug_goto_stop", []() { if(Project::debugging) { if(!Project::debug_stop.first.empty()) {