changeset 20142:f1f6d5eab46f

Draw a zoom-like box when creating an annotation interactively * Canvas.h: new private state variable m_rectMode * Canvas.cc (Canvas::canvasMousePressEvent): in text mode, initialize m_mouseAnchor, m_mouseCurrent, m_mouseAxes m_mouseMode = newMouseMode, m_rectMode = true for drawing the box; Remove call to anno_dlg. * Canvas.cc (Canvas::canvasMouseMoveEvent): track mouse position as in zoom mode * Canvas.cc (Canvas::canvasMouseReleaseEvent): use the anchor and current mouse coordoinates to define the position, and then call annot_dlg. * annotation-dialog.ui: allow negative values for width and height
author Pantxo Diribarne <pantxo.diribarne@gmail.com>
date Mon, 20 Apr 2015 22:13:09 +0200
parents 8eb72c4ed457
children de1377a638d7
files libgui/graphics/Canvas.cc libgui/graphics/Canvas.h libgui/graphics/annotation-dialog.ui
diffstat 3 files changed, 80 insertions(+), 33 deletions(-) [+]
line wrap: on
line diff
--- a/libgui/graphics/Canvas.cc	Mon Apr 20 09:26:13 2015 +0200
+++ b/libgui/graphics/Canvas.cc	Mon Apr 20 22:13:09 2015 +0200
@@ -278,7 +278,7 @@
 
       draw (m_handle);
 
-      if (m_mouseMode == ZoomInMode && m_mouseAxes.ok ())
+      if ((m_mouseMode == ZoomInMode && m_mouseAxes.ok ()) || m_rectMode)
         drawZoomBox (m_mouseAnchor, m_mouseCurrent);
     }
 }
@@ -379,7 +379,7 @@
             redraw (true);
           }
           break;
-
+        case TextMode:
         case ZoomInMode:
         case ZoomOutMode:
           m_mouseCurrent = event->pos ();
@@ -571,32 +571,18 @@
 
         case TextMode:
           {
-            QWidget *w = qWidget ();
-
-            if (! w)
-              break;
-
-            Matrix bb = axesObj.get_properties ().get_boundingbox (false);
-            Matrix position (1, 4);
-
-            QPoint pos = event->pos ();
-
-            position(0) = pos.x () / bb(2);
-            position(1) = 1.0 - (pos.y () / bb(3));
-            position(2) = pos.x () / bb(2);
-            position(3) = 1.0 - (pos.y () / bb(3));
-
-            octave_value_list props = ovl("textbox", position);
-
-            annotation_dialog anno_dlg (w, props);
-            
-            if (anno_dlg.exec () == QDialog::Accepted)
+            if (event->modifiers () == Qt::NoModifier)
               {
-                props = anno_dlg.get_properties ();
-
-                octave_link::post_event (this, &Canvas::annotation_callback,
-                  props);
+                switch (event->buttons ())
+                  {
+                  case Qt::LeftButton:
+                    m_mouseAnchor = m_mouseCurrent = event->pos ();
+                    m_mouseAxes = axesObj.get_handle ();
+                    m_mouseMode = newMouseMode;
+                    m_rectMode = true;
+                  }
               }
+            redraw (false);
           }
           break;
 
@@ -751,7 +737,38 @@
                                      "windowbuttonupfcn");
         }
     }
+  else if (m_mouseMode == TextMode)
+    {
+      gh_manager::auto_lock lock;
+      
+      graphics_object figObj = 
+        gh_manager::get_object (m_handle).get_ancestor ("figure");
+      if (figObj.valid_object ())
+        {          
+          QWidget *w = qWidget ();
+          if (w)
+            {
+              Matrix bb = figObj.get ("position").matrix_value ();
+              bb(0) = m_mouseAnchor.x () / bb(2);
+              bb(1) = 1.0 - (m_mouseAnchor.y () / bb(3));
+              bb(2) = (event->x () - m_mouseAnchor.x ()) / bb(2);
+              bb(3) = (m_mouseAnchor.y () - event->y ()) / bb(3);
 
+              octave_value_list props = ovl("textbox", bb);
+
+              annotation_dialog anno_dlg (w, props);
+            
+              if (anno_dlg.exec () == QDialog::Accepted)
+                {
+                  props = anno_dlg.get_properties ();
+
+                  octave_link::post_event (this, &Canvas::annotation_callback,
+                                           props);
+                }
+            }
+        }
+    }
+  m_rectMode = false;
   m_mouseAxes = graphics_handle ();
   m_mouseMode = NoMode;
 }
--- a/libgui/graphics/Canvas.h	Mon Apr 20 09:26:13 2015 +0200
+++ b/libgui/graphics/Canvas.h	Mon Apr 20 22:13:09 2015 +0200
@@ -84,7 +84,8 @@
       m_redrawBlocked (false),
       m_mouseMode (NoMode),
       m_clickMode (false),
-      m_eventMask (0)
+      m_eventMask (0),
+      m_rectMode (false)
     { }
 
   void canvasToggleAxes (const graphics_handle& handle);
@@ -113,6 +114,7 @@
   QPoint m_mouseCurrent;
   graphics_handle m_mouseAxes;
   int m_eventMask;
+  bool m_rectMode;
 };
 
 }; // namespace QtHandles
--- a/libgui/graphics/annotation-dialog.ui	Mon Apr 20 09:26:13 2015 +0200
+++ b/libgui/graphics/annotation-dialog.ui	Mon Apr 20 22:13:09 2015 +0200
@@ -9,8 +9,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>450</width>
-    <height>368</height>
+    <width>621</width>
+    <height>401</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -625,7 +625,14 @@
        </widget>
       </item>
       <item row="0" column="1">
-       <widget class="QDoubleSpinBox" name="sb_x"/>
+       <widget class="QDoubleSpinBox" name="sb_x">
+        <property name="minimum">
+         <double>0.000000000000000</double>
+        </property>
+        <property name="singleStep">
+         <double>0.010000000000000</double>
+        </property>
+       </widget>
       </item>
       <item row="0" column="2">
        <widget class="QLabel" name="label_22">
@@ -638,7 +645,14 @@
        </widget>
       </item>
       <item row="0" column="3">
-       <widget class="QDoubleSpinBox" name="sb_y"/>
+       <widget class="QDoubleSpinBox" name="sb_y">
+        <property name="minimum">
+         <double>0.000000000000000</double>
+        </property>
+        <property name="singleStep">
+         <double>0.010000000000000</double>
+        </property>
+       </widget>
       </item>
       <item row="0" column="4">
        <widget class="QLabel" name="label_23">
@@ -648,7 +662,14 @@
        </widget>
       </item>
       <item row="0" column="5">
-       <widget class="QDoubleSpinBox" name="sb_width"/>
+       <widget class="QDoubleSpinBox" name="sb_width">
+        <property name="minimum">
+         <double>-99.989999999999995</double>
+        </property>
+        <property name="singleStep">
+         <double>0.010000000000000</double>
+        </property>
+       </widget>
       </item>
       <item row="0" column="6">
        <widget class="QLabel" name="label_24">
@@ -658,7 +679,14 @@
        </widget>
       </item>
       <item row="0" column="7">
-       <widget class="QDoubleSpinBox" name="sb_height"/>
+       <widget class="QDoubleSpinBox" name="sb_height">
+        <property name="minimum">
+         <double>-99.000000000000000</double>
+        </property>
+        <property name="singleStep">
+         <double>0.010000000000000</double>
+        </property>
+       </widget>
       </item>
       <item row="1" column="0">
        <widget class="QLabel" name="label_18">