1 #include "MosaicZoomTool.h" 
    7 #include <QDoubleSpinBox> 
    8 #include <QGraphicsSceneMouseEvent> 
   13 #include <QToolButton> 
   16 #include "MosaicGraphicsView.h" 
   17 #include "MosaicSceneWidget.h" 
   18 #include "Projection.h" 
   30     m_zoomInAction = 
new QAction(
this);
 
   31     m_zoomInAction->setIcon(
getIcon(
"viewmag+.png"));
 
   32     m_zoomInAction->setText(
"Zoom In");
 
   33     m_zoomInAction->setToolTip(
"Zoom in on the mosaic scene");
 
   34     m_zoomInAction->setShortcut(Qt::Key_Plus);
 
   36       "<b>Function:</b> Zoom in 2X at the center of the active viewport \ 
   37       <p><b>Shortcut:</b>  +</p> \ 
   38       <p><b>Mouse:</b>  LeftButton zooms in 2X under pointer</p> \ 
   39       <p><b>Modifiers:</b>  Shortcuts and mouse clicks can be augmented \ 
   40       using the Ctrl or Alt key for 4X and 8X zooms, respectively</p> \ 
   41       <p><b>Hint:</b>  Left click and drag for a local zoom which scales data \ 
   42       in the marquee to the view</p>";
 
   43     m_zoomInAction->setWhatsThis(text);
 
   44     connect(m_zoomInAction, SIGNAL(triggered()), 
this, SLOT(
zoomIn2X()));
 
   46     m_zoomOutAction = 
new QAction(
this);
 
   47     m_zoomOutAction->setIcon(
getIcon(
"viewmag-.png"));
 
   48     m_zoomOutAction->setText(
"Zoom Out");
 
   49     m_zoomOutAction->setToolTip(
"Zoom out on the mosaic scene");
 
   50     m_zoomOutAction->setShortcut(Qt::Key_Minus);
 
   52       "<b>Function:</b> Zoom out 2X at the center of the view \ 
   53       <p><b>Shortcut:</b>  +</p> \ 
   54       <p><b>Mouse:</b>  RightButton zooms out 2X under pointer</p> \ 
   55       <p><b>Modifiers:</b>  Shortcuts and mouse clicks can be augmented \ 
   56       using the Ctrl or Alt key for 4X and 8X zooms, respectively</p> \ 
   57       <p><b>Hint:</b>  Left click and drag for a local zoom which scales data \ 
   58       in the marquee to the view</p>";
 
   59     m_zoomOutAction->setWhatsThis(text);
 
   60     connect(m_zoomOutAction, SIGNAL(triggered()), 
this, SLOT(
zoomOut2X()));
 
   62     m_zoomFitAction = 
new QAction(
this);
 
   63     m_zoomFitAction->setIcon(
getIcon(
"viewmagfit.png"));
 
   64     m_zoomFitAction->setText(
"Fit in View");
 
   65     m_zoomFitAction->setToolTip(
"Zoom to where all of the cubes are visible in " 
   67     m_zoomFitAction->setShortcut(Qt::Key_Asterisk);
 
   69       "<b>Function:</b> Fit the entire mosaic inside the view. \ 
   70       <p><b>Shortcut:</b> *</p> \ 
   71       <p><b>Hint:</b>  Many shortcuts for the zoom tool and other tools \ 
   72       are easily available on the numeric keypad </p>";
 
   73     m_zoomFitAction->setWhatsThis(text);
 
   74     connect(m_zoomFitAction, SIGNAL(triggered()), 
this, SLOT(
zoomFit()));
 
   86       QPointF point1 = getWidget()->getView()->mapToScene(0, 0);
 
   87       QPointF point2 = getWidget()->getView()->mapToScene(
 
   88           (
int)getWidget()->getView()->width(), 0);
 
   89       double newWidth = point2.x() - point1.x();
 
   92       p_screenResolution = newWidth / getWidget()->getView()->viewport()->width();
 
   95       p_scaleBox->setValue(p_screenResolution);
 
  100       p_scaleBox->setSingleStep(p_screenResolution * .05);
 
  108     viewActs.append(m_zoomInAction);
 
  109     viewActs.append(m_zoomOutAction);
 
  110     viewActs.append(m_zoomFitAction);
 
  118     action->setIcon(
getIcon(
"viewmag.png"));
 
  119     action->setToolTip(
"Zoom (z)");
 
  120     action->setShortcut(Qt::Key_Z);
 
  122       "<b>Function:</b>  Zoom in or out of the current cube.<br><br>" 
  123       "This tool gives you a <b>click</b> to zoom by 2X and center on the " 
  124       "point you clicked on, a <b>right-click</b> to zoom out by 2X and center " 
  125       "on the point you clicked on, a <b>click and drag</b> box to best fit " 
  126       "the given area into the visible screen, a <b>right-click and drag</b> " 
  127       "box to zoom out and center on the center (smaller box means zoom out " 
  128       "more), and disables context menus on the mosaic scene." 
  129       "<p><b>Shortcut:</b>  z</p> ";
 
  130     action->setWhatsThis(text);
 
  146     QToolButton *zoomInButton = 
new QToolButton(hbox);
 
  147     zoomInButton->setAutoRaise(
true);
 
  148     zoomInButton->setDefaultAction(m_zoomInAction);
 
  149     zoomInButton->setIconSize(QSize(22, 22));
 
  151     QToolButton *zoomOutButton = 
new QToolButton(hbox);
 
  152     zoomOutButton->setAutoRaise(
true);
 
  153     zoomOutButton->setDefaultAction(m_zoomOutAction);
 
  154     zoomOutButton->setIconSize(QSize(22, 22));
 
  156     QToolButton *zoomFitButton = 
new QToolButton(hbox);
 
  157     zoomFitButton->setAutoRaise(
true);
 
  158     zoomFitButton->setDefaultAction(m_zoomFitAction);
 
  159     zoomFitButton->setIconSize(QSize(22, 22));
 
  161     p_scaleBox = 
new QDoubleSpinBox();
 
  162     p_scaleBox->setRange(DBL_MIN, DBL_MAX);
 
  163     p_scaleBox->setDecimals(8);
 
  164     connect(p_scaleBox, SIGNAL(editingFinished()), 
this, SLOT(
zoomManual()));
 
  166     QLabel *resolutionLabel = 
new QLabel(
"Meters per pixel");
 
  168     QHBoxLayout *layout = 
new QHBoxLayout(hbox);
 
  169     layout->setMargin(0);
 
  170     layout->addWidget(zoomInButton);
 
  171     layout->addWidget(zoomOutButton);
 
  177     layout->addWidget(zoomFitButton);
 
  178     layout->addWidget(p_scaleBox);
 
  179     layout->addWidget(resolutionLabel);
 
  180     layout->addStretch(1);
 
  181     hbox->setLayout(layout);
 
  186   void MosaicZoomTool::mouseButtonRelease(QPointF mouseLoc, Qt::MouseButton s) {
 
  190     if(s == Qt::LeftButton)
 
  192     else if(s == Qt::RightButton)
 
  197   void MosaicZoomTool::mouseWheel(QPointF mouseLoc, 
int delta) {
 
  198     static const double sensitivity = 60.0; 
 
  199     double scale = delta / sensitivity;
 
  202       scale = 1.0 / (-delta / sensitivity);
 
  204     scale = limitZoomBy(scale);
 
  206     QPoint screenMouseLoc(getWidget()->getView()->mapFromScene(mouseLoc));
 
  208         getWidget()->getView()->viewport()->size().width() / 2,
 
  209         getWidget()->getView()->viewport()->size().height() / 2);
 
  217     QPoint desiredScreenCenter =
 
  218         screenCenter + (screenCenter - screenMouseLoc);
 
  219     QPointF newCenterPoint =
 
  220         getWidget()->getView()->mapToScene(desiredScreenCenter);
 
  221     getWidget()->getView()->centerOn(newCenterPoint);
 
  239     zoomBy(1.0 / 2.0, center);
 
  252   double MosaicZoomTool::limitZoomBy(
double factor) {
 
  253     QMatrix matrix = getWidget()->getView()->matrix();
 
  254     matrix = matrix.scale(factor, factor).inverted();
 
  256     int smallerDimension = getWidget()->getView()->width();
 
  257     int largerDimension = getWidget()->getView()->height();
 
  259     if(smallerDimension > largerDimension) {
 
  260       int tmp = smallerDimension;
 
  261       smallerDimension = largerDimension;
 
  262       largerDimension = tmp;
 
  265     QPointF point1 = matrix.map(QPointF(0, 0));
 
  266     QPointF point2 = matrix.map(QPointF(smallerDimension, 0));
 
  272     if((point2.x() - point1.x()) < 1) {
 
  273       QMatrix origMatrix = getWidget()->getView()->matrix();
 
  274       factor = smallerDimension / (origMatrix.m11() * 1.0);
 
  277     point1 = matrix.map(QPointF(0, 0));
 
  278     point2 = matrix.map(QPointF(largerDimension, 0));
 
  280     if((point2.x() - point1.x()) > 1E10) {
 
  281       QMatrix origMatrix = getWidget()->getView()->matrix();
 
  282       factor = largerDimension / (origMatrix.m11() * 1E10);
 
  296     factor = limitZoomBy(factor);
 
  298     getWidget()->getView()->scale(factor, factor);
 
  300     if(!center.isNull()) {
 
  301       getWidget()->getView()->centerOn(center);
 
  313     getWidget()->
refit();
 
  348       double x = p_screenResolution / p_scaleBox->value();
 
  361       getWidget()->setCubesSelectable(
false);
 
  362       getWidget()->getView()->setContextMenuPolicy(Qt::NoContextMenu);
 
  363       getWidget()->enableRubberBand(
true);
 
  366       getWidget()->setCubesSelectable(
true);
 
  367       getWidget()->getView()->setContextMenuPolicy(Qt::DefaultContextMenu);
 
  368       getWidget()->enableRubberBand(
false);
 
  386     double meters_pixel = 0.0;
 
  392     if(r.width() > r.height()) {
 
  393       meters_pixel = r.width() / getWidget()->getView()->viewport()->width();
 
  396       meters_pixel = r.height() / getWidget()->getView()->viewport()->height();
 
  400     double scale = p_screenResolution / meters_pixel;
 
  403     if(s == Qt::LeftButton) {
 
  404       zoomBy(scale, r.center());
 
  408     if(s == Qt::RightButton) {
 
  409       zoomBy(1 / scale, r.center());