94 lines
3.8 KiB
C++
94 lines
3.8 KiB
C++
/***************************************************************************
|
|
* Copyright (c) 2015 Pavel Strakhov <ri@idzaaus.org> *
|
|
* Copyright (c) 2015 Eivind Kvedalen <eivind@kvedalen.name> *
|
|
* *
|
|
* This file is part of the FreeCAD CAx development system. *
|
|
* *
|
|
* This library is free software; you can redistribute it and/or *
|
|
* modify it under the terms of the GNU Library General Public *
|
|
* License as published by the Free Software Foundation; either *
|
|
* version 2 of the License, or (at your option) any later version. *
|
|
* *
|
|
* This library 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 Library General Public License for more details. *
|
|
* *
|
|
* You should have received a copy of the GNU Library General Public *
|
|
* License along with this library; see the file COPYING.LIB. If not, *
|
|
* write to the Free Software Foundation, Inc., 59 Temple Place, *
|
|
* Suite 330, Boston, MA 02111-1307, USA *
|
|
* *
|
|
***************************************************************************/
|
|
|
|
/*
|
|
* Based on
|
|
*
|
|
* http://stackoverflow.com/questions/19113532/qgraphicsview-zooming-in-and-out-under-mouse-position-using-mouse-wheel
|
|
*
|
|
* Re-licensed to LGPL after having contacted original author by e-mail.
|
|
*
|
|
*/
|
|
|
|
#ifndef GRAPHICSVIEWZOOM_H
|
|
#define GRAPHICSVIEWZOOM_H
|
|
|
|
#include <QObject>
|
|
#include <QPointF>
|
|
|
|
|
|
/*!
|
|
* This class adds ability to zoom QGraphicsView using mouse wheel. The point under cursor
|
|
* remains motionless while it's possible.
|
|
*
|
|
* Note that it becomes not possible when the scene's
|
|
* size is not large enough comparing to the viewport size. QGraphicsView centers the picture
|
|
* when it's smaller than the view. And QGraphicsView's scrolls boundaries don't allow to
|
|
* put any picture point at any viewport position.
|
|
*
|
|
* When the user starts scrolling, this class remembers original scene position and
|
|
* keeps it until scrolling is completed. It's better than getting original scene position at
|
|
* each scrolling step because that approach leads to position errors due to before-mentioned
|
|
* positioning restrictions.
|
|
*
|
|
* When zommed using scroll, this class emits zoomed() signal.
|
|
*
|
|
* Usage:
|
|
*
|
|
* new GraphicsViewZoom(view);
|
|
*
|
|
* The object will be deleted automatically when the view is deleted.
|
|
*
|
|
* You can set keyboard modifiers used for zooming using set_modified(). Zooming will be
|
|
* performed only on exact match of modifiers combination. The default modifier is Ctrl.
|
|
*
|
|
* You can change zoom velocity by calling set_zoom_factor_base().
|
|
* Zoom coefficient is calculated as zoom_factor_base^angle_delta
|
|
* (see QWheelEvent::angleDelta).
|
|
* The default zoom factor base is 1.0015.
|
|
*/
|
|
|
|
class QGraphicsView;
|
|
|
|
class GraphicsViewZoom : public QObject {
|
|
Q_OBJECT
|
|
public:
|
|
GraphicsViewZoom(QGraphicsView* view);
|
|
void gentle_zoom(double factor);
|
|
void set_modifiers(Qt::KeyboardModifiers modifiers);
|
|
void set_zoom_factor_base(double value);
|
|
void set_zoom_inverted(bool on) {
|
|
m_invert_zoom = on;
|
|
}
|
|
|
|
private:
|
|
QGraphicsView* _view;
|
|
Qt::KeyboardModifiers _modifiers;
|
|
double _zoom_factor_base;
|
|
bool m_invert_zoom;
|
|
QPointF target_scene_pos, target_viewport_pos;
|
|
bool eventFilter(QObject* object, QEvent* event) override;
|
|
};
|
|
|
|
#endif // GRAPHICSVIEWZOOM_H
|