Mercurial > hg > octave-nkf
changeset 20317: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 +++ b/libgui/graphics/Canvas.cc @@ -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 +++ b/libgui/graphics/Canvas.h @@ -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 +++ b/libgui/graphics/annotation-dialog.ui @@ -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">