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
*****************************************************************************/
16
#include "qwt_magnifier.h"
18
class QwtMagnifier::PrivateData
24
wheelButtonState(Qt::NoButton),
26
mouseButton(Qt::RightButton),
27
mouseButtonState(Qt::NoButton),
29
zoomInKey(Qt::Key_Plus),
30
zoomOutKey(Qt::Key_Minus),
31
#if QT_VERSION < 0x040000
32
zoomInKeyModifiers(Qt::NoButton),
33
zoomOutKeyModifiers(Qt::NoButton),
35
zoomInKeyModifiers(Qt::NoModifier),
36
zoomOutKeyModifiers(Qt::NoModifier),
54
int zoomInKeyModifiers;
55
int zoomOutKeyModifiers;
58
bool hasMouseTracking;
64
\param parent Widget to be magnified
66
QwtMagnifier::QwtMagnifier(QWidget *parent):
69
d_data = new PrivateData();
74
QwtMagnifier::~QwtMagnifier()
80
\brief En/disable the magnifier
82
When enabled is true an event filter is installed for
83
the observed widget, otherwise the event filter is removed.
85
\param on true or false
86
\sa isEnabled(), eventFilter()
88
void QwtMagnifier::setEnabled(bool on)
90
if ( d_data->isEnabled != on )
92
d_data->isEnabled = on;
94
QObject *o = parent();
97
if ( d_data->isEnabled )
98
o->installEventFilter(this);
100
o->removeEventFilter(this);
106
\return true when enabled, false otherwise
107
\sa setEnabled, eventFilter()
109
bool QwtMagnifier::isEnabled() const
111
return d_data->isEnabled;
115
\brief Change the wheel factor
117
The wheel factor defines the ratio between the current range
118
on the parent widget and the zoomed range for each step of the wheel.
119
The default value is 0.9.
121
\param factor Wheel factor
122
\sa wheelFactor(), setWheelButtonState(),
123
setMouseFactor(), setKeyFactor()
125
void QwtMagnifier::setWheelFactor(double factor)
127
d_data->wheelFactor = factor;
134
double QwtMagnifier::wheelFactor() const
136
return d_data->wheelFactor;
140
Assign a mandatory button state for zooming in/out using the wheel.
141
The default button state is Qt::NoButton.
143
\param buttonState Button state
146
void QwtMagnifier::setWheelButtonState(int buttonState)
148
d_data->wheelButtonState = buttonState;
152
\return Wheel button state
153
\sa setWheelButtonState
155
int QwtMagnifier::wheelButtonState() const
157
return d_data->wheelButtonState;
161
\brief Change the mouse factor
163
The mouse factor defines the ratio between the current range
164
on the parent widget and the zoomed range for each vertical mouse movement.
165
The default value is 0.95.
167
\param factor Wheel factor
168
\sa mouseFactor(), setMouseButton(), setWheelFactor(), setKeyFactor()
170
void QwtMagnifier::setMouseFactor(double factor)
172
d_data->mouseFactor = factor;
179
double QwtMagnifier::mouseFactor() const
181
return d_data->mouseFactor;
185
Assign the mouse button, that is used for zooming in/out.
186
The default value is Qt::RightButton.
189
\param buttonState Button state
192
void QwtMagnifier::setMouseButton(int button, int buttonState)
194
d_data->mouseButton = button;
195
d_data->mouseButtonState = buttonState;
198
//! \sa setMouseButton
199
void QwtMagnifier::getMouseButton(
200
int &button, int &buttonState) const
202
button = d_data->mouseButton;
203
buttonState = d_data->mouseButtonState;
207
\brief Change the key factor
209
The key factor defines the ratio between the current range
210
on the parent widget and the zoomed range for each key press of
211
the zoom in/out keys. The default value is 0.9.
213
\param factor Key factor
214
\sa keyFactor(), setZoomInKey(), setZoomOutKey(),
215
setWheelFactor, setMouseFactor()
217
void QwtMagnifier::setKeyFactor(double factor)
219
d_data->keyFactor = factor;
226
double QwtMagnifier::keyFactor() const
228
return d_data->keyFactor;
232
Assign the key, that is used for zooming in.
233
The default combination is Qt::Key_Plus + Qt::NoModifier.
237
\sa getZoomInKey(), setZoomOutKey()
239
void QwtMagnifier::setZoomInKey(int key, int modifiers)
241
d_data->zoomInKey = key;
242
d_data->zoomInKeyModifiers = modifiers;
246
void QwtMagnifier::getZoomInKey(int &key, int &modifiers) const
248
key = d_data->zoomInKey;
249
modifiers = d_data->zoomInKeyModifiers;
253
Assign the key, that is used for zooming out.
254
The default combination is Qt::Key_Minus + Qt::NoModifier.
258
\sa getZoomOutKey(), setZoomOutKey()
260
void QwtMagnifier::setZoomOutKey(int key, int modifiers)
262
d_data->zoomOutKey = key;
263
d_data->zoomOutKeyModifiers = modifiers;
266
//! \sa setZoomOutKey
267
void QwtMagnifier::getZoomOutKey(int &key, int &modifiers) const
269
key = d_data->zoomOutKey;
270
modifiers = d_data->zoomOutKeyModifiers;
276
When isEnabled() the mouse events of the observed widget are filtered.
278
\sa widgetMousePressEvent(), widgetMouseReleaseEvent(),
279
widgetMouseMoveEvent(), widgetWheelEvent(), widgetKeyPressEvent()
280
widgetKeyReleaseEvent()
282
bool QwtMagnifier::eventFilter(QObject *o, QEvent *e)
284
if ( o && o == parent() )
288
case QEvent::MouseButtonPress:
290
widgetMousePressEvent((QMouseEvent *)e);
293
case QEvent::MouseMove:
295
widgetMouseMoveEvent((QMouseEvent *)e);
298
case QEvent::MouseButtonRelease:
300
widgetMouseReleaseEvent((QMouseEvent *)e);
305
widgetWheelEvent((QWheelEvent *)e);
308
case QEvent::KeyPress:
310
widgetKeyPressEvent((QKeyEvent *)e);
313
case QEvent::KeyRelease:
315
widgetKeyReleaseEvent((QKeyEvent *)e);
321
return QObject::eventFilter(o, e);
325
Handle a mouse press event for the observed widget.
327
\param me Mouse event
328
\sa eventFilter(), widgetMouseReleaseEvent(), widgetMouseMoveEvent()
330
void QwtMagnifier::widgetMousePressEvent(QMouseEvent *me)
332
if ( me->button() != d_data->mouseButton || parentWidget() == NULL )
335
#if QT_VERSION < 0x040000
336
if ( (me->state() & Qt::KeyButtonMask) !=
337
(d_data->mouseButtonState & Qt::KeyButtonMask) )
339
if ( (me->modifiers() & Qt::KeyboardModifierMask) !=
340
(int)(d_data->mouseButtonState & Qt::KeyboardModifierMask) )
346
d_data->hasMouseTracking = parentWidget()->hasMouseTracking();
347
parentWidget()->setMouseTracking(true);
348
d_data->mousePos = me->pos();
349
d_data->mousePressed = true;
353
Handle a mouse release event for the observed widget.
354
\sa eventFilter(), widgetMousePressEvent(), widgetMouseMoveEvent(),
356
void QwtMagnifier::widgetMouseReleaseEvent(QMouseEvent *)
358
if ( d_data->mousePressed && parentWidget() )
360
d_data->mousePressed = false;
361
parentWidget()->setMouseTracking(d_data->hasMouseTracking);
366
Handle a mouse move event for the observed widget.
368
\param me Mouse event
369
\sa eventFilter(), widgetMousePressEvent(), widgetMouseReleaseEvent(),
371
void QwtMagnifier::widgetMouseMoveEvent(QMouseEvent *me)
373
if ( !d_data->mousePressed )
376
const int dy = me->pos().y() - d_data->mousePos.y();
379
double f = d_data->mouseFactor;
386
d_data->mousePos = me->pos();
390
Handle a wheel event for the observed widget.
392
\param we Wheel event
395
void QwtMagnifier::widgetWheelEvent(QWheelEvent *we)
397
#if QT_VERSION < 0x040000
398
if ( (we->state() & Qt::KeyButtonMask) !=
399
(d_data->wheelButtonState & Qt::KeyButtonMask) )
401
if ( (we->modifiers() & Qt::KeyboardModifierMask) !=
402
(int)(d_data->wheelButtonState & Qt::KeyboardModifierMask) )
408
if ( d_data->wheelFactor != 0.0 )
411
A positive delta indicates that the wheel was
412
rotated forwards away from the user; a negative
413
value indicates that the wheel was rotated
414
backwards toward the user.
415
Most mouse types work in steps of 15 degrees,
416
in which case the delta value is a multiple
419
double f = ::pow(d_data->wheelFactor,
420
qwtAbs(we->delta() / 120));
421
if ( we->delta() > 0 )
429
Handle a key press event for the observed widget.
432
\sa eventFilter(), widgetKeyReleaseEvent()
434
void QwtMagnifier::widgetKeyPressEvent(QKeyEvent *ke)
436
const int key = ke->key();
437
#if QT_VERSION < 0x040000
438
const int state = ke->state();
440
const int state = ke->modifiers();
443
if ( key == d_data->zoomInKey &&
444
state == d_data->zoomInKeyModifiers )
446
rescale(d_data->keyFactor);
448
else if ( key == d_data->zoomOutKey &&
449
state == d_data->zoomOutKeyModifiers )
451
rescale(1.0 / d_data->keyFactor);
456
Handle a key release event for the observed widget.
459
\sa eventFilter(), widgetKeyReleaseEvent()
461
void QwtMagnifier::widgetKeyReleaseEvent(QKeyEvent *)
465
QWidget *QwtMagnifier::parentWidget()
467
if ( parent()->inherits("QWidget") )
468
return (QWidget *)parent();
473
const QWidget *QwtMagnifier::parentWidget() const
475
if ( parent()->inherits("QWidget") )
476
return (const QWidget *)parent();