Browse Source

Fixes #416 : Added Show Breakpoints to the Debug menu

merge-requests/399/head
eidheim 6 years ago
parent
commit
57705cfa7b
  1. 2
      CMakeLists.txt
  2. 1
      src/files.h
  3. 4
      src/menu.cc
  4. 3
      src/source_base.h
  5. 67
      src/window.cc

2
CMakeLists.txt

@ -1,7 +1,7 @@
cmake_minimum_required (VERSION 2.8.8) cmake_minimum_required (VERSION 2.8.8)
project(juci) project(juci)
set(JUCI_VERSION "1.5.0.1") set(JUCI_VERSION "1.5.0.2")
set(CPACK_PACKAGE_NAME "jucipp") set(CPACK_PACKAGE_NAME "jucipp")
set(CPACK_PACKAGE_CONTACT "Ole Christian Eidheim <eidheim@gmail.com>") set(CPACK_PACKAGE_CONTACT "Ole Christian Eidheim <eidheim@gmail.com>")

1
src/files.h

@ -140,6 +140,7 @@ const std::string default_config_file = R"RAW({
"debug_show_variables": "<primary><shift>b", "debug_show_variables": "<primary><shift>b",
"debug_run_command": "<alt><shift>Return", "debug_run_command": "<alt><shift>Return",
"debug_toggle_breakpoint": "<primary>b", "debug_toggle_breakpoint": "<primary>b",
"debug_show_breakpoints": "<primary><shift><alt>b",
"debug_goto_stop": "<primary><shift>l",)RAW" "debug_goto_stop": "<primary><shift>l",)RAW"
#ifdef __linux #ifdef __linux
R"RAW( R"RAW(

4
src/menu.cc

@ -455,6 +455,10 @@ const Glib::ustring menu_xml = R"RAW(<interface>
<attribute name='label' translatable='yes'>_Toggle _Breakpoint</attribute> <attribute name='label' translatable='yes'>_Toggle _Breakpoint</attribute>
<attribute name='action'>app.debug_toggle_breakpoint</attribute> <attribute name='action'>app.debug_toggle_breakpoint</attribute>
</item> </item>
<item>
<attribute name='label' translatable='yes'>_Show _Breakpoints</attribute>
<attribute name='action'>app.debug_show_breakpoints</attribute>
</item>
</section> </section>
<section> <section>
<item> <item>

3
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. /// 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); Gtk::TextIter get_smart_end_iter(const Gtk::TextIter &iter);
public:
std::string get_line(const Gtk::TextIter &iter); std::string get_line(const Gtk::TextIter &iter);
std::string get_line(const Glib::RefPtr<Gtk::TextBuffer::Mark> &mark); std::string get_line(const Glib::RefPtr<Gtk::TextBuffer::Mark> &mark);
std::string get_line(int line_nr); std::string get_line(int line_nr);
std::string get_line(); std::string get_line();
protected:
std::string get_line_before(const Gtk::TextIter &iter); std::string get_line_before(const Gtk::TextIter &iter);
std::string get_line_before(const Glib::RefPtr<Gtk::TextBuffer::Mark> &mark); std::string get_line_before(const Glib::RefPtr<Gtk::TextBuffer::Mark> &mark);
std::string get_line_before(); std::string get_line_before();

67
src/window.cc

@ -1329,6 +1329,73 @@ void Window::set_menu_actions() {
view->toggle_breakpoint(view->get_buffer()->get_insert()->get_iter().get_line()); 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<Source::Offset> 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", []() { menu.add_action("debug_goto_stop", []() {
if(Project::debugging) { if(Project::debugging) {
if(!Project::debug_stop.first.empty()) { if(!Project::debug_stop.first.empty()) {

Loading…
Cancel
Save