changeset 14825:eae0e9f2a8c6 gui

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.
author Jacob Dawid <jacob.dawid@googlemail.com>
date Mon, 02 Jul 2012 09:31:30 +0200
parents 9c0959a1dc7b
children ed0f820c7ce0
files gui/src/icons/arrow_right.png gui/src/icons/redled.png gui/src/m-editor/file-editor-tab.cc gui/src/m-editor/file-editor-tab.h gui/src/m-editor/file-editor.cc gui/src/m-editor/file-editor.h gui/src/resource.qrc
diffstat 7 files changed, 157 insertions(+), 31 deletions(-) [+]
line wrap: on
line diff
Binary file gui/src/icons/arrow_right.png has changed
Binary file gui/src/icons/redled.png has changed
--- a/gui/src/m-editor/file-editor-tab.cc	Mon Jul 02 07:56:07 2012 +0200
+++ b/gui/src/m-editor/file-editor-tab.cc	Mon Jul 02 09:31:30 2012 +0200
@@ -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);
--- a/gui/src/m-editor/file-editor-tab.h	Mon Jul 02 07:56:07 2012 +0200
+++ b/gui/src/m-editor/file-editor-tab.h	Mon Jul 02 09:31:30 2012 +0200
@@ -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);
 
--- a/gui/src/m-editor/file-editor.cc	Mon Jul 02 07:56:07 2012 +0200
+++ b/gui/src/m-editor/file-editor.cc	Mon Jul 02 09:31:30 2012 +0200
@@ -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)));
--- a/gui/src/m-editor/file-editor.h	Mon Jul 02 07:56:07 2012 +0200
+++ b/gui/src/m-editor/file-editor.h	Mon Jul 02 09:31:30 2012 +0200
@@ -35,10 +35,11 @@
 
 const char UNNAMED_FILE[]     = "<unnamed>";
 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;
 };
--- a/gui/src/resource.qrc	Mon Jul 02 07:56:07 2012 +0200
+++ b/gui/src/resource.qrc	Mon Jul 02 09:31:30 2012 +0200
@@ -13,5 +13,7 @@
         <file>icons/up.png</file>
         <file>icons/configure.png</file>
         <file>icons/filesaveas.png</file>
+        <file>icons/redled.png</file>
+        <file>icons/arrow_right.png</file>
     </qresource>
 </RCC>