Mercurial > octave
view libgui/graphics/Figure.cc @ 21301:40de9f8f23a6
Use '#include "config.h"' rather than <config.h>.
* mk-octave-config-h.sh, mk-opts.pl, Backend.cc, BaseControl.cc,
ButtonControl.cc, Canvas.cc, CheckBoxControl.cc, Container.cc, ContextMenu.cc,
EditControl.cc, Figure.cc, FigureWindow.cc, GLCanvas.cc, KeyMap.cc,
ListBoxControl.cc, Logger.cc, Menu.cc, MouseModeActionGroup.cc, Object.cc,
ObjectFactory.cc, ObjectProxy.cc, Panel.cc, PopupMenuControl.cc,
PushButtonControl.cc, PushTool.cc, QtHandlesUtils.cc, RadioButtonControl.cc,
SliderControl.cc, TextControl.cc, TextEdit.cc, ToggleButtonControl.cc,
ToggleTool.cc, ToolBar.cc, ToolBarButton.cc, __init_qt__.cc,
annotation-dialog.cc, gl-select.cc, module.mk, kpty.cpp, color-picker.cc,
dialog.cc, documentation-dock-widget.cc, files-dock-widget.cc,
find-files-dialog.cc, find-files-model.cc, history-dock-widget.cc,
file-editor-tab.cc, file-editor-tab.h, file-editor.cc, find-dialog.cc,
marker.cc, octave-qscintilla.cc, octave-txt-lexer.cc, main-window.cc,
octave-cmd.cc, octave-dock-widget.cc, octave-gui.cc, octave-interpreter.cc,
octave-qt-link.cc, parser.cc, webinfo.cc, resource-manager.cc,
settings-dialog.cc, shortcut-manager.cc, terminal-dock-widget.cc,
thread-manager.cc, welcome-wizard.cc, workspace-model.cc, workspace-view.cc,
build-env-features.sh, build-env.in.cc, Cell.cc, __contourc__.cc,
__dispatch__.cc, __dsearchn__.cc, __ichol__.cc, __ilu__.cc, __lin_interpn__.cc,
__pchip_deriv__.cc, __qp__.cc, balance.cc, besselj.cc, betainc.cc, bitfcns.cc,
bsxfun.cc, c-file-ptr-stream.cc, cdisplay.c, cellfun.cc, coct-hdf5-types.c,
colloc.cc, comment-list.cc, conv2.cc, daspk.cc, dasrt.cc, dassl.cc, data.cc,
debug.cc, defaults.cc, defun.cc, det.cc, dirfns.cc, display.cc, dlmread.cc,
dot.cc, dynamic-ld.cc, eig.cc, ellipj.cc, error.cc, errwarn.cc, event-queue.cc,
fft.cc, fft2.cc, fftn.cc, file-io.cc, filter.cc, find.cc, ft-text-renderer.cc,
gammainc.cc, gcd.cc, getgrent.cc, getpwent.cc, getrusage.cc, givens.cc,
gl-render.cc, gl2ps-print.cc, graphics.cc, gripes.cc, hash.cc, help.cc,
hess.cc, hex2num.cc, hook-fcn.cc, input.cc, inv.cc, jit-ir.cc, jit-typeinfo.cc,
jit-util.cc, kron.cc, load-path.cc, load-save.cc, lookup.cc,
ls-ascii-helper.cc, ls-hdf5.cc, ls-mat-ascii.cc, ls-mat4.cc, ls-mat5.cc,
ls-oct-binary.cc, ls-oct-text.cc, ls-utils.cc, lsode.cc, lu.cc, luinc.cc,
mappers.cc, matrix_type.cc, max.cc, mex.cc, mgorth.cc, nproc.cc,
oct-errno.in.cc, oct-fstrm.cc, oct-hdf5-types.cc, oct-hist.cc, oct-iostrm.cc,
oct-lvalue.cc, oct-map.cc, oct-prcstrm.cc, oct-procbuf.cc, oct-stream.cc,
oct-strstrm.cc, oct-tex-lexer.in.ll, oct-tex-parser.in.yy, octave-link.cc,
ordschur.cc, pager.cc, pinv.cc, pr-output.cc, procstream.cc, profiler.cc,
psi.cc, pt-jit.cc, quad.cc, quadcc.cc, qz.cc, rand.cc, rcond.cc, regexp.cc,
schur.cc, sighandlers.cc, siglist.c, sparse-xdiv.cc, sparse-xpow.cc, sparse.cc,
spparms.cc, sqrtm.cc, str2double.cc, strfind.cc, strfns.cc, sub2ind.cc, svd.cc,
sylvester.cc, symtab.cc, syscalls.cc, sysdep.cc, text-renderer.cc, time.cc,
toplev.cc, tril.cc, tsearch.cc, txt-eng.cc, typecast.cc, urlwrite.cc, utils.cc,
variables.cc, xdiv.cc, xgl2ps.c, xnorm.cc, xpow.cc, zfstream.cc,
__delaunayn__.cc, __eigs__.cc, __fltk_uigetfile__.cc, __glpk__.cc,
__init_fltk__.cc, __init_gnuplot__.cc, __magick_read__.cc, __osmesa_print__.cc,
__voronoi__.cc, amd.cc, audiodevinfo.cc, audioread.cc, ccolamd.cc, chol.cc,
colamd.cc, convhulln.cc, dmperm.cc, fftw.cc, qr.cc, symbfact.cc, symrcm.cc,
mkbuiltins, mkops, ov-base-diag.cc, ov-base-int.cc, ov-base-mat.cc,
ov-base-scalar.cc, ov-base-sparse.cc, ov-base.cc, ov-bool-mat.cc,
ov-bool-sparse.cc, ov-bool.cc, ov-builtin.cc, ov-cell.cc, ov-ch-mat.cc,
ov-class.cc, ov-classdef.cc, ov-colon.cc, ov-complex.cc, ov-cs-list.cc,
ov-cx-diag.cc, ov-cx-mat.cc, ov-cx-sparse.cc, ov-dld-fcn.cc, ov-fcn-handle.cc,
ov-fcn-inline.cc, ov-fcn.cc, ov-float.cc, ov-flt-complex.cc, ov-flt-cx-diag.cc,
ov-flt-cx-mat.cc, ov-flt-re-diag.cc, ov-flt-re-mat.cc, ov-int16.cc,
ov-int32.cc, ov-int64.cc, ov-int8.cc, ov-java.cc, ov-lazy-idx.cc,
ov-mex-fcn.cc, ov-null-mat.cc, ov-oncleanup.cc, ov-perm.cc, ov-range.cc,
ov-re-diag.cc, ov-re-mat.cc, ov-re-sparse.cc, ov-scalar.cc, ov-str-mat.cc,
ov-struct.cc, ov-typeinfo.cc, ov-uint16.cc, ov-uint32.cc, ov-uint64.cc,
ov-uint8.cc, ov-usr-fcn.cc, ov.cc, ovl.cc, octave.cc, op-b-b.cc, op-b-bm.cc,
op-b-sbm.cc, op-bm-b.cc, op-bm-bm.cc, op-bm-sbm.cc, op-cdm-cdm.cc, op-cell.cc,
op-chm.cc, op-class.cc, op-cm-cm.cc, op-cm-cs.cc, op-cm-m.cc, op-cm-s.cc,
op-cm-scm.cc, op-cm-sm.cc, op-cs-cm.cc, op-cs-cs.cc, op-cs-m.cc, op-cs-s.cc,
op-cs-scm.cc, op-cs-sm.cc, op-dm-dm.cc, op-dm-scm.cc, op-dm-sm.cc,
op-dm-template.cc, op-dms-template.cc, op-double-conv.cc, op-fcdm-fcdm.cc,
op-fcdm-fdm.cc, op-fcm-fcm.cc, op-fcm-fcs.cc, op-fcm-fm.cc, op-fcm-fs.cc,
op-fcn.cc, op-fcs-fcm.cc, op-fcs-fcs.cc, op-fcs-fm.cc, op-fcs-fs.cc,
op-fdm-fdm.cc, op-float-conv.cc, op-fm-fcm.cc, op-fm-fcs.cc, op-fm-fm.cc,
op-fm-fs.cc, op-fs-fcm.cc, op-fs-fcs.cc, op-fs-fm.cc, op-fs-fs.cc,
op-i16-i16.cc, op-i32-i32.cc, op-i64-i64.cc, op-i8-i8.cc, op-int-concat.cc,
op-int-conv.cc, op-m-cm.cc, op-m-cs.cc, op-m-m.cc, op-m-s.cc, op-m-scm.cc,
op-m-sm.cc, op-pm-pm.cc, op-pm-scm.cc, op-pm-sm.cc, op-pm-template.cc,
op-range.cc, op-s-cm.cc, op-s-cs.cc, op-s-m.cc, op-s-s.cc, op-s-scm.cc,
op-s-sm.cc, op-sbm-b.cc, op-sbm-bm.cc, op-sbm-sbm.cc, op-scm-cm.cc,
op-scm-cs.cc, op-scm-m.cc, op-scm-s.cc, op-scm-scm.cc, op-scm-sm.cc,
op-sm-cm.cc, op-sm-cs.cc, op-sm-m.cc, op-sm-s.cc, op-sm-scm.cc, op-sm-sm.cc,
op-str-m.cc, op-str-s.cc, op-str-str.cc, op-struct.cc, op-ui16-ui16.cc,
op-ui32-ui32.cc, op-ui64-ui64.cc, op-ui8-ui8.cc, lex.ll, oct-parse.in.yy,
pt-arg-list.cc, pt-array-list.cc, pt-assign.cc, pt-binop.cc, pt-bp.cc,
pt-cbinop.cc, pt-cell.cc, pt-check.cc, pt-classdef.cc, pt-cmd.cc, pt-colon.cc,
pt-const.cc, pt-decl.cc, pt-eval.cc, pt-except.cc, pt-exp.cc, pt-fcn-handle.cc,
pt-funcall.cc, pt-id.cc, pt-idx.cc, pt-jump.cc, pt-loop.cc, pt-mat.cc,
pt-misc.cc, pt-pr-code.cc, pt-select.cc, pt-stmt.cc, pt-unop.cc, pt.cc,
token.cc, Array-jit.cc, Array-os.cc, Array-sym.cc, Array-tc.cc, version.cc,
Array-C.cc, Array-b.cc, Array-ch.cc, Array-d.cc, Array-f.cc, Array-fC.cc,
Array-i.cc, Array-idx-vec.cc, Array-s.cc, Array-str.cc, Array-util.cc,
Array-voidp.cc, Array.cc, CColVector.cc, CDiagMatrix.cc, CMatrix.cc,
CNDArray.cc, CRowVector.cc, CSparse.cc, DiagArray2.cc, MArray-C.cc,
MArray-d.cc, MArray-f.cc, MArray-fC.cc, MArray-i.cc, MArray-s.cc, MArray.cc,
MDiagArray2.cc, MSparse-C.cc, MSparse-d.cc, MatrixType.cc, PermMatrix.cc,
Range.cc, Sparse-C.cc, Sparse-b.cc, Sparse-d.cc, Sparse.cc, boolMatrix.cc,
boolNDArray.cc, boolSparse.cc, chMatrix.cc, chNDArray.cc, dColVector.cc,
dDiagMatrix.cc, dMatrix.cc, dNDArray.cc, dRowVector.cc, dSparse.cc,
dim-vector.cc, fCColVector.cc, fCDiagMatrix.cc, fCMatrix.cc, fCNDArray.cc,
fCRowVector.cc, fColVector.cc, fDiagMatrix.cc, fMatrix.cc, fNDArray.cc,
fRowVector.cc, idx-vector.cc, int16NDArray.cc, int32NDArray.cc,
int64NDArray.cc, int8NDArray.cc, intNDArray.cc, uint16NDArray.cc,
uint32NDArray.cc, uint64NDArray.cc, uint8NDArray.cc, blaswrap.c, cquit.c,
f77-extern.cc, f77-fcn.c, lo-error.c, quit.cc, CollocWt.cc, DASPK.cc, DASRT.cc,
DASSL.cc, EIG.cc, LSODE.cc, ODES.cc, Quad.cc, aepbalance.cc, chol.cc,
eigs-base.cc, fEIG.cc, gepbalance.cc, hess.cc, lo-mappers.cc, lo-specfun.cc,
lu.cc, oct-convn.cc, oct-fftw.cc, oct-norm.cc, oct-rand.cc, oct-spparms.cc,
qr.cc, qrp.cc, randgamma.c, randmtzig.c, randpoisson.c, schur.cc,
sparse-chol.cc, sparse-dmsolve.cc, sparse-lu.cc, sparse-qr.cc, svd.cc,
mk-ops.awk, dir-ops.cc, file-ops.cc, file-stat.cc, lo-sysdep.cc, mach-info.cc,
oct-env.cc, oct-group.cc, oct-passwd.cc, oct-syscalls.cc, oct-time.cc,
oct-uname.cc, cmd-edit.cc, cmd-hist.cc, data-conv.cc, f2c-main.c,
glob-match.cc, kpse.cc, lo-array-errwarn.cc, lo-array-gripes.cc, lo-cutils.c,
lo-ieee.cc, lo-regexp.cc, lo-utils.cc, oct-base64.cc, oct-glob.cc,
oct-inttypes.cc, oct-locbuf.cc, oct-mutex.cc, oct-rl-edit.c, oct-rl-hist.c,
oct-shlib.cc, oct-sort.cc, pathsearch.cc, singleton-cleanup.cc, sparse-sort.cc,
sparse-util.cc, str-vec.cc, unwind-prot.cc, url-transfer.cc,
display-available.c, main-cli.cc, main-gui.cc, main.in.cc, mkoctfile.in.cc,
octave-config.in.cc:
Use '#include "config.h"' rather than <config.h>.
author | Rik <rik@octave.org> |
---|---|
date | Thu, 18 Feb 2016 13:34:50 -0800 |
parents | 710e700cdd7f |
children | 5b9868c2e212 |
line wrap: on
line source
/* Copyright (C) 2011-2015 Michael Goffioul This file is part of Octave. Octave is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. Octave is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Octave; see the file COPYING. If not, see <http://www.gnu.org/licenses/>. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include <QAction> #include <QActionEvent> #include <QActionGroup> #include <QApplication> #include <QClipboard> #include <QEvent> #include <QFileDialog> #include <QFileInfo> #include <QFrame> #include <QImage> #include <QMainWindow> #include <QMenu> #include <QMenuBar> #include <QMessageBox> #include <QtDebug> #include <QTimer> #include <QToolBar> #include "Canvas.h" #include "Container.h" #include "Figure.h" #include "FigureWindow.h" #include "MouseModeActionGroup.h" #include "QtHandlesUtils.h" #include "file-ops.h" #include "unwind-prot.h" #include "utils.h" #include "octave-qt-link.h" #include "builtin-defun-decls.h" namespace QtHandles { #define ABOUT_TEXT "<b>QtHandles</b> - a Qt-based toolkit for <a href=\"http://www.octave.org\">Octave</a>.<br><br>Copyright (C) 2011-2015 Michael Goffioul" DECLARE_GENERICEVENTNOTIFY_SENDER(MenuBar, QMenuBar); static bool hasUiControlChildren (const figure::properties& fp) { gh_manager::auto_lock lock; Matrix kids = fp.get_all_children (); for (int i = 0; i < kids.numel (); i++) { graphics_object go (gh_manager::get_object (kids(i))); if (go && (go.isa ("uicontrol") || go.isa ("uipanel") || go.isa ("uibuttongroup"))) return true; } return false; } static bool hasUiMenuChildren (const figure::properties& fp) { gh_manager::auto_lock lock; Matrix kids = fp.get_all_children (); for (int i = 0; i < kids.numel (); i++) { graphics_object go (gh_manager::get_object (kids(i))); if (go && go.isa ("uimenu")) return true; } return false; } static QRect boundingBoxToRect (const Matrix& bb) { QRect r; if (bb.numel () == 4) { r = QRect (xround (bb(0)), xround (bb(1)), xround (bb(2)), xround (bb(3))); if (! r.isValid ()) r = QRect (); } return r; } Figure* Figure::create (const graphics_object& go) { return new Figure (go, new FigureWindow ()); } Figure::Figure (const graphics_object& go, FigureWindow* win) : Object (go, win), m_blockUpdates (false), m_figureToolBar (0), m_menuBar (0), m_innerRect (), m_outerRect (), m_mouseModeGroup (0) { m_container = new Container (win); win->setCentralWidget (m_container); figure::properties& fp = properties<figure> (); // Status bar m_statusBar = win->statusBar (); int boffset = 0; // Toolbar and menubar createFigureToolBarAndMenuBar (); int toffset = 0; if (fp.toolbar_is ("figure") || (fp.toolbar_is ("auto") && fp.menubar_is ("figure") && ! hasUiControlChildren (fp))) { toffset += m_figureToolBar->sizeHint ().height (); boffset += m_statusBar->sizeHint ().height (); } else { m_figureToolBar->hide (); m_statusBar->hide (); } if (fp.menubar_is ("figure") || hasUiMenuChildren (fp)) toffset += m_menuBar->sizeHint ().height () + 1; else m_menuBar->hide (); m_innerRect = boundingBoxToRect (fp.get_boundingbox (true)); m_outerRect = boundingBoxToRect (fp.get_boundingbox (false)); win->setGeometry (m_innerRect.adjusted (0, -toffset, 0, boffset)); // Enable mouse tracking unconditionally enableMouseTracking (); // When this constructor gets called all properties are already // set, even non default. We force "update" here to get things right. // Figure title update (figure::properties::ID_NUMBERTITLE); // Decide what keyboard events we listen to m_container->canvas (m_handle)->setEventMask (0); update (figure::properties::ID_KEYPRESSFCN); update (figure::properties::ID_KEYRELEASEFCN); // Visibility update (figure::properties::ID_VISIBLE); connect (this, SIGNAL (asyncUpdate (void)), this, SLOT (updateContainer (void))); win->addReceiver (this); m_container->addReceiver (this); } Figure::~Figure (void) { } static std::string mouse_mode_to_string (MouseMode mode) { switch (mode) { case NoMode: return "none"; case RotateMode: return "rotate"; case ZoomInMode: return "zoom in"; case ZoomOutMode: return "zoom out"; case PanMode: return "pan"; case TextMode: return "text"; case SelectMode: return "select"; default: break; } return "none"; } static MouseMode mouse_mode_from_string (const std::string& mode) { if (mode == "none") return NoMode; else if (mode == "rotate") return RotateMode; else if (mode == "zoom in") return ZoomInMode; else if (mode == "zoom out") return ZoomOutMode; else if (mode == "pan") return PanMode; else if (mode == "text") return TextMode; else if (mode == "select") return SelectMode; else return NoMode; } QString Figure::fileName (void) { gh_manager::auto_lock lock; const figure::properties& fp = properties<figure> (); std::string name = fp.get_filename (); return QString::fromStdString (name); } void Figure::setFileName (const QString& name) { gh_manager::auto_lock lock; figure::properties& fp = properties<figure> (); fp.set_filename (name.toStdString ()); } MouseMode Figure::mouseMode (void) { gh_manager::auto_lock lock; const figure::properties& fp = properties<figure> (); std::string mode = fp.get___mouse_mode__ (); if (mode == "zoom") { octave_scalar_map zm = fp.get___zoom_mode__ ().scalar_map_value (); std::string direction = zm.getfield ("Direction").string_value (); mode += " " + direction; } return mouse_mode_from_string (mode); } void Figure::createFigureToolBarAndMenuBar (void) { QMainWindow* win = qWidget<QMainWindow> (); m_figureToolBar = win->addToolBar (tr ("Figure ToolBar")); m_figureToolBar->setMovable (false); m_figureToolBar->setFloatable (false); m_mouseModeGroup = new MouseModeActionGroup (win); connect (m_mouseModeGroup, SIGNAL (modeChanged (MouseMode)), SLOT (setMouseMode (MouseMode))); m_figureToolBar->addActions (m_mouseModeGroup->actions ()); QAction *toggle_axes = m_figureToolBar->addAction (tr ("Axes")); connect (toggle_axes, SIGNAL (triggered (void)), this, SLOT (toggleAxes (void))); QAction *toggle_grid = m_figureToolBar->addAction (tr ("Grid")); connect (toggle_grid, SIGNAL (triggered (void)), this, SLOT (toggleGrid (void))); QAction *auto_axes = m_figureToolBar->addAction (tr ("Autoscale")); connect (auto_axes, SIGNAL (triggered (void)), this, SLOT (autoAxes (void))); m_menuBar = new MenuBar (win); win->setMenuBar (m_menuBar); QMenu* fileMenu = m_menuBar->addMenu (tr ("&File")); fileMenu->menuAction ()->setObjectName ("builtinMenu"); fileMenu->addAction (tr ("&Save"), this, SLOT (fileSaveFigure (bool))); fileMenu->addAction (tr ("Save &As"), this, SLOT (fileSaveFigureAs (void))); fileMenu->addSeparator (); fileMenu->addAction (tr ("&Close Figure"), this, SLOT (fileCloseFigure (void)), Qt::CTRL|Qt::Key_W); QMenu* editMenu = m_menuBar->addMenu (tr ("&Edit")); editMenu->menuAction ()->setObjectName ("builtinMenu"); editMenu->addAction (tr ("Cop&y"), this, SLOT (editCopy (bool)), Qt::CTRL|Qt::Key_C); editMenu->addSeparator (); editMenu->addActions (m_mouseModeGroup->actions ()); QMenu* helpMenu = m_menuBar->addMenu (tr ("&Help")); helpMenu->menuAction ()->setObjectName ("builtinMenu"); helpMenu->addAction (tr ("&About QtHandles"), this, SLOT (helpAboutQtHandles (void))); helpMenu->addAction (tr ("About &Qt"), qApp, SLOT (aboutQt (void))); m_menuBar->addReceiver (this); } void Figure::updateFigureToolBarAndMenuBar (void) { if (m_mouseModeGroup) { m_blockUpdates = true; m_mouseModeGroup->setMode (mouseMode ()); m_blockUpdates = false; } } Container* Figure::innerContainer (void) { return m_container; } void Figure::redraw (void) { Canvas* canvas = m_container->canvas (m_handle); if (canvas) { canvas->redraw (); //canvas->setMouseMode (RotateMode); } foreach (QFrame* frame, qWidget<QWidget> ()->findChildren<QFrame*> ("UIPanel")) { Object* obj = Object::fromQObject (frame); if (obj) obj->slotRedraw (); } updateFigureToolBarAndMenuBar (); } void Figure::print (const QString& file_cmd, const QString& term) { Canvas* canvas = m_container->canvas (m_handle); if (canvas) canvas->print (file_cmd, term); } void Figure::beingDeleted (void) { Canvas* canvas = m_container->canvas (m_handle.value (), false); if (canvas) canvas->blockRedraw (true); m_menuBar->removeReceiver (this); m_container->removeReceiver (this); qWidget<FigureWindow> ()->removeReceiver (this); } void Figure::update (int pId) { if (m_blockUpdates) return; figure::properties& fp = properties<figure> (); QMainWindow* win = qWidget<QMainWindow> (); m_blockUpdates = true; switch (pId) { case figure::properties::ID_POSITION: { m_innerRect = boundingBoxToRect (fp.get_boundingbox (true)); int toffset = 0; int boffset = 0; foreach (QToolBar* tb, win->findChildren<QToolBar*> ()) if (! tb->isHidden ()) toffset += tb->sizeHint ().height (); if (! m_menuBar->isHidden ()) toffset += m_menuBar->sizeHint ().height () + 1; if (! m_statusBar->isHidden ()) boffset += m_statusBar->sizeHint ().height () + 1; win->setGeometry (m_innerRect.adjusted (0, -toffset, 0, boffset)); } break; case figure::properties::ID_NAME: case figure::properties::ID_NUMBERTITLE: win->setWindowTitle (Utils::fromStdString (fp.get_title ())); break; case figure::properties::ID_VISIBLE: if (fp.is_visible ()) QTimer::singleShot (0, win, SLOT (show ())); else win->hide (); break; case figure::properties::ID_TOOLBAR: if (fp.toolbar_is ("none")) showFigureToolBar (false); else if (fp.toolbar_is ("figure")) showFigureToolBar (true); else // "auto" showFigureToolBar (! hasUiControlChildren (fp) && fp.menubar_is ("figure")); break; case figure::properties::ID_MENUBAR: showMenuBar (fp.menubar_is ("figure")); if (fp.toolbar_is ("auto")) showFigureToolBar (fp.menubar_is ("figure")); break; case figure::properties::ID_KEYPRESSFCN: if (fp.get_keypressfcn ().is_empty ()) m_container->canvas (m_handle)->clearEventMask (Canvas::KeyPress); else m_container->canvas (m_handle)->addEventMask (Canvas::KeyPress); break; case figure::properties::ID_KEYRELEASEFCN: if (fp.get_keyreleasefcn ().is_empty ()) m_container->canvas (m_handle)->clearEventMask (Canvas::KeyRelease); else m_container->canvas (m_handle)->addEventMask (Canvas::KeyRelease); break; default: break; } m_blockUpdates = false; } void Figure::showFigureToolBar (bool visible) { if ((! m_figureToolBar->isHidden ()) != visible) { int dy1 = m_figureToolBar->sizeHint ().height (); int dy2 = m_statusBar->sizeHint ().height (); QRect r = qWidget<QWidget> ()->geometry (); if (! visible) r.adjust (0, dy1, 0, -dy2); else r.adjust (0, -dy1, 0, dy2); m_blockUpdates = true; qWidget<QWidget> ()->setGeometry (r); m_figureToolBar->setVisible (visible); m_statusBar->setVisible (visible); m_blockUpdates = false; updateBoundingBox (false); } } void Figure::showMenuBar (bool visible) { int h1 = m_menuBar->sizeHint ().height (); foreach (QAction* a, m_menuBar->actions ()) if (a->objectName () == "builtinMenu") a->setVisible (visible); int h2 = m_menuBar->sizeHint ().height (); if (! visible) visible = hasUiMenuChildren (properties<figure> ()); if ((! m_menuBar->isHidden ()) != visible) { int dy = qMax (h1, h2) + 1; QRect r = qWidget<QWidget> ()->geometry (); //qDebug () << "Figure::showMenuBar:" << r; if (! visible) r.adjust (0, dy, 0, 0); else r.adjust (0, -dy, 0, 0); //qDebug () << "Figure::showMenuBar(adjusted):" << r; m_blockUpdates = true; qWidget<QWidget> ()->setGeometry (r); m_menuBar->setVisible (visible); m_blockUpdates = false; updateBoundingBox (false); } } void Figure::updateMenuBar (void) { gh_manager::auto_lock lock; graphics_object go = object (); if (go.valid_object ()) showMenuBar (Utils::properties<figure> (go).menubar_is ("figure")); } void Figure::updateStatusBar (ColumnVector pt) { if (! m_statusBar->isHidden ()) m_statusBar->showMessage (QString ("(%1, %2)") .arg (pt(0), 0, 'g', 5) .arg (pt(1), 0, 'g', 5)); } QWidget* Figure::menu (void) { return qWidget<QMainWindow> ()->menuBar (); } struct UpdateBoundingBoxData { Matrix m_bbox; bool m_internal; graphics_handle m_handle; Figure* m_figure; }; void Figure::updateBoundingBoxHelper (void* data) { gh_manager::auto_lock lock; UpdateBoundingBoxData* d = reinterpret_cast<UpdateBoundingBoxData*> (data); graphics_object go = gh_manager::get_object (d->m_handle); if (go.valid_object ()) { figure::properties& fp = Utils::properties<figure> (go); fp.set_boundingbox (d->m_bbox, d->m_internal, false); } delete d; } void Figure::updateBoundingBox (bool internal, int flags) { QWidget* win = qWidget<QWidget> (); Matrix bb (1, 4); if (internal) { QRect r = m_innerRect; if (flags & UpdateBoundingBoxPosition) r.moveTopLeft (win->mapToGlobal (m_container->pos ())); if (flags & UpdateBoundingBoxSize) r.setSize (m_container->size ()); if (r.isValid () && r != m_innerRect) { m_innerRect = r; bb(0) = r.x (); bb(1) = r.y (); bb(2) = r.width (); bb(3) = r.height (); } else return; } else { QRect r = m_outerRect; if (flags & UpdateBoundingBoxPosition) r.moveTopLeft (win->pos ()); if (flags & UpdateBoundingBoxSize) r.setSize (win->frameGeometry ().size ()); if (r.isValid () && r != m_outerRect) { m_outerRect = r; bb(0) = r.x (); bb(1) = r.y (); bb(2) = r.width (); bb(3) = r.height (); } else return; } UpdateBoundingBoxData* d = new UpdateBoundingBoxData (); d->m_bbox = bb; d->m_internal = internal; d->m_handle = m_handle; d->m_figure = this; gh_manager::post_function (Figure::updateBoundingBoxHelper, d); } bool Figure::eventNotifyBefore (QObject* obj, QEvent* xevent) { if (! m_blockUpdates) { if (obj == m_container) { // Do nothing... } else if (obj == m_menuBar) { switch (xevent->type ()) { case QEvent::ActionRemoved: { QAction* a = dynamic_cast<QActionEvent*> (xevent)->action (); if (! a->isSeparator () && a->objectName () != "builtinMenu") updateMenuBar (); } break; default: break; } } else { switch (xevent->type ()) { case QEvent::Close: xevent->ignore (); gh_manager::post_callback (m_handle, "closerequestfcn"); return true; default: break; } } } return false; } void Figure::eventNotifyAfter (QObject* watched, QEvent* xevent) { if (! m_blockUpdates) { if (watched == m_container) { switch (xevent->type ()) { case QEvent::Resize: updateBoundingBox (true, UpdateBoundingBoxSize); break; case QEvent::ChildAdded: if (dynamic_cast<QChildEvent*> (xevent)->child ()->isWidgetType()) { gh_manager::auto_lock lock; update (figure::properties::ID_TOOLBAR); enableMouseTracking (); } case QEvent::ChildRemoved: if (dynamic_cast<QChildEvent*> (xevent)->child ()->isWidgetType()) { gh_manager::auto_lock lock; update (figure::properties::ID_TOOLBAR); } default: break; } } else if (watched == m_menuBar) { switch (xevent->type ()) { case QEvent::ActionAdded: { QAction* a = dynamic_cast<QActionEvent*> (xevent)->action (); if (! a->isSeparator () && a->objectName () != "builtinMenu") updateMenuBar (); } break; default: break; } } else { switch (xevent->type ()) { case QEvent::Move: updateBoundingBox (false, UpdateBoundingBoxPosition); updateBoundingBox (true, UpdateBoundingBoxPosition); break; case QEvent::Resize: updateBoundingBox (false, UpdateBoundingBoxSize); break; default: break; } } } } void Figure::helpAboutQtHandles (void) { QMessageBox::about (qWidget<QMainWindow> (), tr ("About QtHandles"), ABOUT_TEXT); } void Figure::setMouseMode (MouseMode mode) { if (m_blockUpdates) return; gh_manager::auto_lock lock; figure::properties& fp = properties<figure> (); fp.set___mouse_mode__ (mouse_mode_to_string (mode)); Canvas* canvas = m_container->canvas (m_handle); if (canvas) canvas->setCursor (mode); } void Figure::fileSaveFigure (bool prompt) { QString file = fileName (); if (file.isEmpty ()) { prompt = true; file = "untitled.pdf"; } if (prompt || file.isEmpty ()) { QFileInfo finfo (file); file = QFileDialog::getSaveFileName (qWidget<FigureWindow> (), tr ("Save Figure As"), finfo.absoluteFilePath (), 0, 0, QFileDialog::DontUseNativeDialog); } if (! file.isEmpty ()) { QFileInfo finfo (file); setFileName (finfo.absoluteFilePath ()); octave_link::post_event (this, &Figure::save_figure_callback, file.toStdString ()); } } void Figure::save_figure_callback (const std::string& file) { figure::properties& fp = properties<figure> (); octave_value fnum = fp.get___myhandle__ ().as_octave_value (); Ffeval (ovl ("print", fnum, file)); } void Figure::copy_figure_callback (const std::string& format) { std::string msg; std::string file = octave_tempnam ("", "oct-", msg) + "." + format; if (file.empty ()) { // Report error? return; } save_figure_callback (file); octave_link::copy_image_to_clipboard (file); } void Figure::fileSaveFigureAs (void) { fileSaveFigure (true); } void Figure::fileCloseFigure (void) { qWidget<QMainWindow> ()->close (); } void Figure::editCopy (bool /* choose_format */) { QString format = "png"; #if 0 // FIXME: allow choice of image formats. if (choose_format) { QFileInfo finfo (file); format = QFileDialog::getSaveFileName (qWidget<FigureWindow> (), tr ("Save Figure As"), finfo.absoluteFilePath (), 0, 0, QFileDialog::DontUseNativeDialog); } #endif octave_link::post_event (this, &Figure::copy_figure_callback, format.toStdString ()); } void Figure::addCustomToolBar (QToolBar* bar, bool visible) { QMainWindow* win = qWidget<QMainWindow> (); if (! visible) win->addToolBar (bar); else { QSize sz = bar->sizeHint (); QRect r = win->geometry (); //qDebug () << "Figure::addCustomToolBar:" << r; r.adjust (0, -sz.height (), 0, 0); m_blockUpdates = true; win->setGeometry (r); win->addToolBarBreak (); win->addToolBar (bar); m_blockUpdates = false; //qDebug () << "Figure::addCustomToolBar:" << win->geometry (); updateBoundingBox (false); } } void Figure::showCustomToolBar (QToolBar* bar, bool visible) { QMainWindow* win = qWidget<QMainWindow> (); if ((! bar->isHidden ()) != visible) { QSize sz = bar->sizeHint (); QRect r = win->geometry (); if (visible) r.adjust (0, -sz.height (), 0, 0); else r.adjust (0, sz.height (), 0, 0); m_blockUpdates = true; win->setGeometry (r); bar->setVisible (visible); m_blockUpdates = false; updateBoundingBox (false); } } void Figure::updateContainer (void) { redraw (); } void Figure::toggleAxes (void) { Canvas* canvas = m_container->canvas (m_handle); if (canvas) canvas->toggleAxes (m_handle); } void Figure::toggleGrid (void) { Canvas* canvas = m_container->canvas (m_handle); if (canvas) canvas->toggleGrid (m_handle); } void Figure::autoAxes (void) { Canvas* canvas = m_container->canvas (m_handle); if (canvas) canvas->autoAxes (m_handle); } void Figure::enableMouseTracking (void) { // Enable mouse tracking on every widgets m_container->setMouseTracking (true); m_container->canvas (m_handle)->qWidget ()->setMouseTracking (true); foreach (QWidget* w, m_container->findChildren<QWidget*> ()) { w->setMouseTracking (true); } } }; // namespace QtHandles