# HG changeset patch # User Jacob Dawid # Date 1341214290 -7200 # Node ID eae0e9f2a8c6c0e2c41851a9816cadd41d219ef7 # Parent 9c0959a1dc7bc920f6c3a6c5e83cc6689598426b Added menus, markers and methods to visualize debugging in the editor and add, remove and navigate breakpoints* . * arrow_right.png: Icon to indicate debugger position. * redled.png: Icon for a breakpoint. * file-editor-tab: Added methods to add/remove breakpoints and menu entries. * file-editor: Added methods to add/remove breakpoints and menu entries. * resource.qrc: Added new icons to resource file. diff --git a/gui/src/icons/arrow_right.png b/gui/src/icons/arrow_right.png new file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..5587ddee1c2a3b144104b36b6165d7f571ae4136 GIT binary patch literal 3324 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 diff --git a/gui/src/m-editor/file-editor-tab.cc b/gui/src/m-editor/file-editor-tab.cc --- a/gui/src/m-editor/file-editor-tab.cc +++ b/gui/src/m-editor/file-editor-tab.cc @@ -30,10 +30,14 @@ _edit_area = new QsciScintilla (this); _edit_area->setLexer (fileEditor->lexer ()); - // markers + // symbols _edit_area->setMarginType (1, QsciScintilla::SymbolMargin); _edit_area->setMarginSensitivity (1, true); - _edit_area->markerDefine (QsciScintilla::RightTriangle, MARKER_BOOKMARK); + _edit_area->markerDefine (QsciScintilla::RightTriangle, bookmark); + _edit_area->markerDefine (QImage (":/actions/icons/redled.png"), breakpoint); + _edit_area->markerDefine (QImage (":/actions/icons/arrow_right.png"), + debugger_position); + connect (_edit_area, SIGNAL (marginClicked (int, int, Qt::KeyboardModifiers)), this, SLOT (handle_margin_clicked (int, int, Qt::KeyboardModifiers))); @@ -47,8 +51,8 @@ _edit_area->setMarginsFont( marginFont ); QFontMetrics metrics(marginFont); _edit_area->setMarginType (2, QsciScintilla::TextMargin); - _edit_area->setMarginWidth(2, metrics.width("99999")); - _edit_area->setMarginLineNumbers(2, true); + _edit_area->setMarginWidth(2, metrics.width("9999")); + _edit_area->setMarginLineNumbers (2, true); } // code folding @@ -150,13 +154,24 @@ file_editor_tab::handle_margin_clicked(int margin, int line, Qt::KeyboardModifiers state) { Q_UNUSED (state); - if (margin == 1) // marker margin + if (margin == 1) { unsigned int mask = _edit_area->markersAtLine (line); - if (mask && (1 << MARKER_BOOKMARK)) - _edit_area->markerDelete(line,MARKER_BOOKMARK); + + if (state & Qt::ControlModifier) + { + if (mask && (1 << bookmark)) + _edit_area->markerDelete(line,bookmark); + else + _edit_area->markerAdd(line,bookmark); + } else - _edit_area->markerAdd(line,MARKER_BOOKMARK); + { + if (mask && (1 << breakpoint)) + _edit_area->markerDelete(line,breakpoint); + else + _edit_area->markerAdd(line,breakpoint); + } } } @@ -271,40 +286,79 @@ void file_editor_tab::remove_bookmark () { - _edit_area->markerDeleteAll(MARKER_BOOKMARK); + _edit_area->markerDeleteAll (bookmark); } void file_editor_tab::toggle_bookmark () { - int line,cur; - _edit_area->getCursorPosition(&line,&cur); - if ( _edit_area->markersAtLine (line) && (1 << MARKER_BOOKMARK) ) - _edit_area->markerDelete(line,MARKER_BOOKMARK); + int line, cur; + _edit_area->getCursorPosition (&line,&cur); + if ( _edit_area->markersAtLine (line) && (1 << bookmark) ) + _edit_area->markerDelete (line, bookmark); else - _edit_area->markerAdd(line,MARKER_BOOKMARK); + _edit_area->markerAdd (line, bookmark); } void -file_editor_tab::next_bookmark () +file_editor_tab::next_bookmark() { - int line,cur,nextline; - _edit_area->getCursorPosition(&line,&cur); - if ( _edit_area->markersAtLine(line) && (1 << MARKER_BOOKMARK) ) - line++; // we have a bookmark here, so start search from next line - nextline = _edit_area->markerFindNext(line,(1 << MARKER_BOOKMARK)); - _edit_area->setCursorPosition(nextline,0); + int line, cur, nextline; + _edit_area->getCursorPosition (&line, &cur); + if ( _edit_area->markersAtLine (line) && (1 << bookmark) ) + line++; // we have a breakpoint here, so start search from next line + nextline = _edit_area->markerFindNext (line, (1 << bookmark)); + _edit_area->setCursorPosition (nextline, 0); } void file_editor_tab::previous_bookmark () { - int line,cur,prevline; - _edit_area->getCursorPosition(&line,&cur); - if ( _edit_area->markersAtLine(line) && (1 << MARKER_BOOKMARK) ) - line--; // we have a bookmark here, so start search from prev line - prevline = _edit_area->markerFindPrevious(line,(1 << MARKER_BOOKMARK)); - _edit_area->setCursorPosition(prevline,0); + int line, cur, prevline; + _edit_area->getCursorPosition (&line, &cur); + if ( _edit_area->markersAtLine (line) && (1 << bookmark) ) + line--; // we have a breakpoint here, so start search from prev line + prevline = _edit_area->markerFindPrevious (line, (1 << bookmark)); + _edit_area->setCursorPosition (prevline, 0); +} + +void +file_editor_tab::remove_breakpoint () +{ + _edit_area->markerDeleteAll (breakpoint); +} + +void +file_editor_tab::toggle_breakpoint () +{ + int line, cur; + _edit_area->getCursorPosition (&line,&cur); + if ( _edit_area->markersAtLine (line) && (1 << breakpoint) ) + _edit_area->markerDelete (line, breakpoint); + else + _edit_area->markerAdd (line, breakpoint); +} + +void +file_editor_tab::next_breakpoint () +{ + int line, cur, nextline; + _edit_area->getCursorPosition (&line, &cur); + if ( _edit_area->markersAtLine (line) && (1 << breakpoint) ) + line++; // we have a breakpoint here, so start search from next line + nextline = _edit_area->markerFindNext (line, (1 << breakpoint)); + _edit_area->setCursorPosition (nextline, 0); +} + +void +file_editor_tab::previous_breakpoint () +{ + int line, cur, prevline; + _edit_area->getCursorPosition (&line, &cur); + if ( _edit_area->markersAtLine (line) && (1 << breakpoint) ) + line--; // we have a breakpoint here, so start search from prev line + prevline = _edit_area->markerFindPrevious (line, (1 << breakpoint)); + _edit_area->setCursorPosition (prevline, 0); } void @@ -338,6 +392,16 @@ } void +file_editor_tab::set_debugger_position (int line) +{ + _edit_area->markerDeleteAll (debugger_position); + if (line > 0) + { + _edit_area->markerAdd (line, debugger_position); + } +} + +void file_editor_tab::set_modified (bool modified) { _edit_area->setModified (modified); diff --git a/gui/src/m-editor/file-editor-tab.h b/gui/src/m-editor/file-editor-tab.h --- a/gui/src/m-editor/file-editor-tab.h +++ b/gui/src/m-editor/file-editor-tab.h @@ -46,11 +46,16 @@ void toggle_bookmark (); void next_bookmark (); void previous_bookmark (); + void remove_breakpoint (); + void toggle_breakpoint (); + void next_breakpoint (); + void previous_breakpoint (); void cut (); void copy (); void paste (); void undo (); void redo (); + void set_debugger_position (int line); void set_modified (bool modified = true); diff --git a/gui/src/m-editor/file-editor.cc b/gui/src/m-editor/file-editor.cc --- a/gui/src/m-editor/file-editor.cc +++ b/gui/src/m-editor/file-editor.cc @@ -202,6 +202,38 @@ } void +file_editor::request_toggle_breakpoint () +{ + file_editor_tab *activeFileEditorTab = active_editor_tab (); + if (activeFileEditorTab) + activeFileEditorTab->toggle_breakpoint (); +} + +void +file_editor::request_next_breakpoint () +{ + file_editor_tab *activeFileEditorTab = active_editor_tab (); + if (activeFileEditorTab) + activeFileEditorTab->next_breakpoint (); +} + +void +file_editor::request_previous_breakpoint () +{ + file_editor_tab *activeFileEditorTab = active_editor_tab (); + if (activeFileEditorTab) + activeFileEditorTab->previous_breakpoint (); +} + +void +file_editor::request_remove_breakpoint () +{ + file_editor_tab *activeFileEditorTab = active_editor_tab (); + if (activeFileEditorTab) + activeFileEditorTab->remove_breakpoint (); +} + +void file_editor::request_comment_selected_text () { file_editor_tab *activeFileEditorTab = active_editor_tab (); @@ -319,6 +351,12 @@ QAction *previous_bookmark_action = new QAction (tr ("Pre&vious Bookmark"),_tool_bar); QAction *toggle_bookmark_action = new QAction (tr ("Toggle &Bookmark"),_tool_bar); QAction *remove_bookmark_action = new QAction (tr ("&Remove All Bookmarks"),_tool_bar); + + QAction *next_breakpoint_action = new QAction (tr ("&Next breakpoint"),_tool_bar); + QAction *previous_breakpoint_action = new QAction (tr ("Pre&vious breakpoint"),_tool_bar); + QAction *toggle_breakpoint_action = new QAction (tr ("Toggle &breakpoint"),_tool_bar); + QAction *remove_breakpoint_action = new QAction (tr ("&Remove All breakpoints"),_tool_bar); + QAction *comment_selection_action = new QAction (tr ("&Comment Selected Text"),_tool_bar); QAction *uncomment_selection_action = new QAction (tr ("&Uncomment Selected Text"),_tool_bar); @@ -403,6 +441,12 @@ _menu_bar->addMenu (editMenu); _debug_menu = new QMenu (tr ("&Debug"), _menu_bar); + _debug_menu->addAction (toggle_breakpoint_action); + _debug_menu->addAction (next_breakpoint_action); + _debug_menu->addAction (previous_breakpoint_action); + _debug_menu->addAction (remove_breakpoint_action); + _debug_menu->addSeparator (); + // The other debug actions will be added by the main window. _menu_bar->addMenu (_debug_menu); QMenu *runMenu = new QMenu (tr ("&Run"), _menu_bar); @@ -431,6 +475,10 @@ connect (next_bookmark_action, SIGNAL (triggered ()), this, SLOT (request_next_bookmark ())); connect (previous_bookmark_action, SIGNAL (triggered ()), this, SLOT (request_previous_bookmark ())); connect (remove_bookmark_action, SIGNAL (triggered ()), this, SLOT (request_remove_bookmark ())); + connect (toggle_breakpoint_action, SIGNAL (triggered ()), this, SLOT (request_toggle_breakpoint ())); + connect (next_breakpoint_action, SIGNAL (triggered ()), this, SLOT (request_next_breakpoint ())); + connect (previous_breakpoint_action, SIGNAL (triggered ()), this, SLOT (request_previous_breakpoint ())); + connect (remove_breakpoint_action, SIGNAL (triggered ()), this, SLOT (request_remove_breakpoint ())); connect (comment_selection_action, SIGNAL (triggered ()), this, SLOT (request_comment_selected_text ())); connect (uncomment_selection_action, SIGNAL (triggered ()), this, SLOT (request_uncomment_selected_text ())); connect (_tab_widget, SIGNAL (tabCloseRequested (int)), this, SLOT (handle_tab_close_request (int))); diff --git a/gui/src/m-editor/file-editor.h b/gui/src/m-editor/file-editor.h --- a/gui/src/m-editor/file-editor.h +++ b/gui/src/m-editor/file-editor.h @@ -35,10 +35,11 @@ const char UNNAMED_FILE[] = ""; const char SAVE_FILE_FILTER[] = "Octave Files (*.m);;All Files (*.*)"; -enum MARKER +enum editor_markers { - MARKER_BOOKMARK, - MARKER_BREAKPOINT + bookmark, + breakpoint, + debugger_position }; class file_editor : public file_editor_interface @@ -73,6 +74,12 @@ void request_next_bookmark (); void request_previous_bookmark (); void request_remove_bookmark (); + + void request_toggle_breakpoint (); + void request_next_breakpoint (); + void request_previous_breakpoint (); + void request_remove_breakpoint (); + void request_comment_selected_text (); void request_uncomment_selected_text (); @@ -93,7 +100,7 @@ QAction* _copy_action; QAction* _cut_action; QTabWidget * _tab_widget; - int _marker_bookmark; + int _marker_breakpoint; lexer_octave_gui *_lexer; QsciAPIs * _lexer_api; }; diff --git a/gui/src/resource.qrc b/gui/src/resource.qrc --- a/gui/src/resource.qrc +++ b/gui/src/resource.qrc @@ -13,5 +13,7 @@ icons/up.png icons/configure.png icons/filesaveas.png + icons/redled.png + icons/arrow_right.png