1
/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
3
* Copyright (C) 1997 Josef Wilgen
4
* Copyright (C) 2002 Uwe Rathmann
6
* This library is free software; you can redistribute it and/or
7
* modify it under the terms of the Qwt License, Version 1.0
8
*****************************************************************************/
10
#include "qwt_magnifier.h"
15
class QwtMagnifier::PrivateData
21
wheelButtonState( Qt::NoButton ),
23
mouseButton( Qt::RightButton ),
24
mouseButtonState( Qt::NoButton ),
26
zoomInKey( Qt::Key_Plus ),
27
zoomOutKey( Qt::Key_Minus ),
28
zoomInKeyModifiers( Qt::NoModifier ),
29
zoomOutKeyModifiers( Qt::NoModifier ),
46
int zoomInKeyModifiers;
47
int zoomOutKeyModifiers;
50
bool hasMouseTracking;
56
\param parent Widget to be magnified
58
QwtMagnifier::QwtMagnifier( QWidget *parent ):
61
d_data = new PrivateData();
66
QwtMagnifier::~QwtMagnifier()
72
\brief En/disable the magnifier
74
When enabled is true an event filter is installed for
75
the observed widget, otherwise the event filter is removed.
77
\param on true or false
78
\sa isEnabled(), eventFilter()
80
void QwtMagnifier::setEnabled( bool on )
82
if ( d_data->isEnabled != on )
84
d_data->isEnabled = on;
86
QObject *o = parent();
89
if ( d_data->isEnabled )
90
o->installEventFilter( this );
92
o->removeEventFilter( this );
98
\return true when enabled, false otherwise
99
\sa setEnabled(), eventFilter()
101
bool QwtMagnifier::isEnabled() const
103
return d_data->isEnabled;
107
\brief Change the wheel factor
109
The wheel factor defines the ratio between the current range
110
on the parent widget and the zoomed range for each step of the wheel.
111
The default value is 0.9.
113
\param factor Wheel factor
114
\sa wheelFactor(), setWheelButtonState(),
115
setMouseFactor(), setKeyFactor()
117
void QwtMagnifier::setWheelFactor( double factor )
119
d_data->wheelFactor = factor;
126
double QwtMagnifier::wheelFactor() const
128
return d_data->wheelFactor;
132
Assign a mandatory button state for zooming in/out using the wheel.
133
The default button state is Qt::NoButton.
135
\param buttonState Button state
136
\sa wheelButtonState()
138
void QwtMagnifier::setWheelButtonState( int buttonState )
140
d_data->wheelButtonState = buttonState;
144
\return Wheel button state
145
\sa setWheelButtonState()
147
int QwtMagnifier::wheelButtonState() const
149
return d_data->wheelButtonState;
153
\brief Change the mouse factor
155
The mouse factor defines the ratio between the current range
156
on the parent widget and the zoomed range for each vertical mouse movement.
157
The default value is 0.95.
159
\param factor Wheel factor
160
\sa mouseFactor(), setMouseButton(), setWheelFactor(), setKeyFactor()
162
void QwtMagnifier::setMouseFactor( double factor )
164
d_data->mouseFactor = factor;
171
double QwtMagnifier::mouseFactor() const
173
return d_data->mouseFactor;
177
Assign the mouse button, that is used for zooming in/out.
178
The default value is Qt::RightButton.
181
\param buttonState Button state
184
void QwtMagnifier::setMouseButton( int button, int buttonState )
186
d_data->mouseButton = button;
187
d_data->mouseButtonState = buttonState;
190
//! \sa setMouseButton()
191
void QwtMagnifier::getMouseButton(
192
int &button, int &buttonState ) const
194
button = d_data->mouseButton;
195
buttonState = d_data->mouseButtonState;
199
\brief Change the key factor
201
The key factor defines the ratio between the current range
202
on the parent widget and the zoomed range for each key press of
203
the zoom in/out keys. The default value is 0.9.
205
\param factor Key factor
206
\sa keyFactor(), setZoomInKey(), setZoomOutKey(),
207
setWheelFactor, setMouseFactor()
209
void QwtMagnifier::setKeyFactor( double factor )
211
d_data->keyFactor = factor;
218
double QwtMagnifier::keyFactor() const
220
return d_data->keyFactor;
224
Assign the key, that is used for zooming in.
225
The default combination is Qt::Key_Plus + Qt::NoModifier.
229
\sa getZoomInKey(), setZoomOutKey()
231
void QwtMagnifier::setZoomInKey( int key, int modifiers )
233
d_data->zoomInKey = key;
234
d_data->zoomInKeyModifiers = modifiers;
237
//! \sa setZoomInKey()
238
void QwtMagnifier::getZoomInKey( int &key, int &modifiers ) const
240
key = d_data->zoomInKey;
241
modifiers = d_data->zoomInKeyModifiers;
245
Assign the key, that is used for zooming out.
246
The default combination is Qt::Key_Minus + Qt::NoModifier.
250
\sa getZoomOutKey(), setZoomOutKey()
252
void QwtMagnifier::setZoomOutKey( int key, int modifiers )
254
d_data->zoomOutKey = key;
255
d_data->zoomOutKeyModifiers = modifiers;
258
//! \sa setZoomOutKey()
259
void QwtMagnifier::getZoomOutKey( int &key, int &modifiers ) const
261
key = d_data->zoomOutKey;
262
modifiers = d_data->zoomOutKeyModifiers;
268
When isEnabled() the mouse events of the observed widget are filtered.
270
\sa widgetMousePressEvent(), widgetMouseReleaseEvent(),
271
widgetMouseMoveEvent(), widgetWheelEvent(), widgetKeyPressEvent()
272
widgetKeyReleaseEvent()
274
bool QwtMagnifier::eventFilter( QObject *o, QEvent *e )
276
if ( o && o == parent() )
280
case QEvent::MouseButtonPress:
282
widgetMousePressEvent( ( QMouseEvent * )e );
285
case QEvent::MouseMove:
287
widgetMouseMoveEvent( ( QMouseEvent * )e );
290
case QEvent::MouseButtonRelease:
292
widgetMouseReleaseEvent( ( QMouseEvent * )e );
297
widgetWheelEvent( ( QWheelEvent * )e );
300
case QEvent::KeyPress:
302
widgetKeyPressEvent( ( QKeyEvent * )e );
305
case QEvent::KeyRelease:
307
widgetKeyReleaseEvent( ( QKeyEvent * )e );
313
return QObject::eventFilter( o, e );
317
Handle a mouse press event for the observed widget.
319
\param me Mouse event
320
\sa eventFilter(), widgetMouseReleaseEvent(), widgetMouseMoveEvent()
322
void QwtMagnifier::widgetMousePressEvent( QMouseEvent *me )
324
if ( me->button() != d_data->mouseButton || parentWidget() == NULL )
327
if ( ( me->modifiers() & Qt::KeyboardModifierMask ) !=
328
( int )( d_data->mouseButtonState & Qt::KeyboardModifierMask ) )
333
d_data->hasMouseTracking = parentWidget()->hasMouseTracking();
334
parentWidget()->setMouseTracking( true );
335
d_data->mousePos = me->pos();
336
d_data->mousePressed = true;
340
Handle a mouse release event for the observed widget.
341
\sa eventFilter(), widgetMousePressEvent(), widgetMouseMoveEvent(),
343
void QwtMagnifier::widgetMouseReleaseEvent( QMouseEvent * )
345
if ( d_data->mousePressed && parentWidget() )
347
d_data->mousePressed = false;
348
parentWidget()->setMouseTracking( d_data->hasMouseTracking );
353
Handle a mouse move event for the observed widget.
355
\param me Mouse event
356
\sa eventFilter(), widgetMousePressEvent(), widgetMouseReleaseEvent(),
358
void QwtMagnifier::widgetMouseMoveEvent( QMouseEvent *me )
360
if ( !d_data->mousePressed )
363
const int dy = me->pos().y() - d_data->mousePos.y();
366
double f = d_data->mouseFactor;
373
d_data->mousePos = me->pos();
377
Handle a wheel event for the observed widget.
379
\param wheelEvent Wheel event
382
void QwtMagnifier::widgetWheelEvent( QWheelEvent *wheelEvent )
384
if ( ( wheelEvent->modifiers() & Qt::KeyboardModifierMask ) !=
385
( int )( d_data->wheelButtonState & Qt::KeyboardModifierMask ) )
390
if ( d_data->wheelFactor != 0.0 )
393
A positive delta indicates that the wheel was
394
rotated forwards away from the user; a negative
395
value indicates that the wheel was rotated
396
backwards toward the user.
397
Most mouse types work in steps of 15 degrees,
398
in which case the delta value is a multiple
401
double f = qPow( d_data->wheelFactor,
402
qAbs( wheelEvent->delta() / 120 ) );
404
if ( wheelEvent->delta() > 0 )
412
Handle a key press event for the observed widget.
414
\param keyEvent Key event
415
\sa eventFilter(), widgetKeyReleaseEvent()
417
void QwtMagnifier::widgetKeyPressEvent( QKeyEvent *keyEvent )
419
const int key = keyEvent->key();
420
const int state = keyEvent->modifiers();
422
if ( key == d_data->zoomInKey &&
423
state == d_data->zoomInKeyModifiers )
425
rescale( d_data->keyFactor );
427
else if ( key == d_data->zoomOutKey &&
428
state == d_data->zoomOutKeyModifiers )
430
rescale( 1.0 / d_data->keyFactor );
435
Handle a key release event for the observed widget.
437
\param keyEvent Key event
438
\sa eventFilter(), widgetKeyReleaseEvent()
440
void QwtMagnifier::widgetKeyReleaseEvent( QKeyEvent *keyEvent )
442
Q_UNUSED( keyEvent );
445
//! \return Parent widget, where the rescaling happens
446
QWidget *QwtMagnifier::parentWidget()
448
if ( parent()->inherits( "QWidget" ) )
449
return ( QWidget * )parent();
454
//! \return Parent widget, where the rescaling happens
455
const QWidget *QwtMagnifier::parentWidget() const
457
if ( parent()->inherits( "QWidget" ) )
458
return ( const QWidget * )parent();