Skip to content

Commit 3888620

Browse files
author
wonder
committedDec 3, 2006
Fix for ticket #415.
Mouse wheel action made configurable: zoom (default), zoom and recenter, do nothing. Also made zoom factor configurable. git-svn-id: http://svn.osgeo.org/qgis/trunk/qgis@6177 c8812cc2-4d05-0410-92ff-de0c093fc19c

File tree

5 files changed

+147
-44
lines changed

5 files changed

+147
-44
lines changed
 

‎src/gui/qgisapp.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1126,6 +1126,10 @@ void QgisApp::createOverview()
11261126
QSettings mySettings;
11271127
mMapCanvas->enableAntiAliasing(mySettings.value("/qgis/enable_anti_aliasing",false).toBool());
11281128
mMapCanvas->useQImageToRender(mySettings.value("/qgis/use_qimage_to_render",false).toBool());
1129+
1130+
int action = mySettings.value("/qgis/wheel_action", 0).toInt();
1131+
double zoomFactor = mySettings.value("/qgis/zoom_factor", 2).toDouble();
1132+
mMapCanvas->setWheelAction((QgsMapCanvas::WheelAction) action, zoomFactor);
11291133
}
11301134

11311135

@@ -4127,6 +4131,10 @@ void QgisApp::options()
41274131
QSettings mySettings;
41284132
mMapCanvas->enableAntiAliasing(mySettings.value("/qgis/enable_anti_aliasing").toBool());
41294133
mMapCanvas->useQImageToRender(mySettings.value("/qgis/use_qimage_to_render").toBool());
4134+
4135+
int action = mySettings.value("/qgis/wheel_action", 0).toInt();
4136+
double zoomFactor = mySettings.value("/qgis/zoom_factor", 2).toDouble();
4137+
mMapCanvas->setWheelAction((QgsMapCanvas::WheelAction) action, zoomFactor);
41304138
}
41314139
}
41324140

‎src/gui/qgsmapcanvas.cpp

Lines changed: 42 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -76,10 +76,6 @@ class QgsMapCanvas::CanvasProperties
7676

7777

7878

79-
// But the static members must be initialised outside the class! (or GCC 4 dies)
80-
const double QgsMapCanvas::scaleDefaultMultiple = 2.0;
81-
82-
8379
/** note this is private and so shouldn't be accessible */
8480
QgsMapCanvas::QgsMapCanvas()
8581
{}
@@ -102,6 +98,8 @@ QgsMapCanvas::QgsMapCanvas()
10298
mFrozen = false;
10399
mDirty = true;
104100

101+
setWheelAction(WheelZoom);
102+
105103
// by default, the canvas is rendered
106104
mRenderFlag = true;
107105

@@ -740,20 +738,55 @@ void QgsMapCanvas::updateCanvasItemsPositions()
740738
void QgsMapCanvas::wheelEvent(QWheelEvent *e)
741739
{
742740
// Zoom the map canvas in response to a mouse wheel event. Moving the
743-
// wheel forward (away) from the user zooms in by a factor of 2.
744-
// TODO The scale factor needs to be customizable by the user.
741+
// wheel forward (away) from the user zooms in
745742
#ifdef QGISDEBUG
746743
std::cout << "Wheel event delta " << e->delta() << std::endl;
747744
#endif
748745

749-
// change extent
750-
zoomWithCenter(e->x(), e->y(), e->delta() > 0);
746+
switch (mWheelAction)
747+
{
748+
case WheelZoom:
749+
// zoom without changing extent
750+
zoom(e->delta() > 0);
751+
break;
752+
753+
case WheelZoomAndRecenter:
754+
// zoom and don't change extent
755+
zoomWithCenter(e->x(), e->y(), e->delta() > 0);
756+
break;
757+
758+
case WheelNothing:
759+
// well, nothing!
760+
break;
761+
}
762+
}
751763

764+
void QgsMapCanvas::setWheelAction(WheelAction action, double factor)
765+
{
766+
mWheelAction = action;
767+
mWheelZoomFactor = factor;
768+
}
769+
770+
void QgsMapCanvas::zoom(bool zoomIn)
771+
{
772+
double scaleFactor = (zoomIn ? 1/mWheelZoomFactor : mWheelZoomFactor);
773+
774+
QgsRect r = mMapRender->extent();
775+
r.scale(scaleFactor);
776+
setExtent(r);
777+
refresh();
752778
}
753779

754780
void QgsMapCanvas::zoomWithCenter(int x, int y, bool zoomIn)
755781
{
756-
zoomByScale(x, y, (zoomIn ? 1/scaleDefaultMultiple : scaleDefaultMultiple));
782+
double scaleFactor = (zoomIn ? 1/mWheelZoomFactor : mWheelZoomFactor);
783+
784+
// transform the mouse pos to map coordinates
785+
QgsPoint center = getCoordinateTransform()->toMapPoint(x, y);
786+
QgsRect r = mMapRender->extent();
787+
r.scale(scaleFactor, &center);
788+
setExtent(r);
789+
refresh();
757790
}
758791

759792

@@ -777,19 +810,6 @@ void QgsMapCanvas::contentsMouseMoveEvent(QMouseEvent * e)
777810
} // mouseMoveEvent
778811

779812

780-
/**
781-
* Zooms at the given screen x and y by the given scale (< 1, zoom out, > 1, zoom in)
782-
*/
783-
void QgsMapCanvas::zoomByScale(int x, int y, double scaleFactor)
784-
{
785-
// transform the mouse pos to map coordinates
786-
QgsPoint center = getCoordinateTransform()->toMapPoint(x, y);
787-
QgsRect r = mMapRender->extent();
788-
r.scale(scaleFactor, &center);
789-
setExtent(r);
790-
refresh();
791-
}
792-
793813

794814
/** Sets the map tool currently being used on the canvas */
795815
void QgsMapCanvas::setMapTool(QgsMapTool* tool)

‎src/gui/qgsmapcanvas.h

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,10 @@ class QgsMapCanvas : public Q3CanvasView
6464
{
6565
Q_OBJECT;
6666

67-
public:
67+
public:
68+
69+
enum WheelAction { WheelZoom, WheelZoomAndRecenter, WheelNothing };
70+
6871
//! Constructor
6972
QgsMapCanvas(QWidget * parent = 0, const char *name = 0);
7073

@@ -186,8 +189,14 @@ class QgsMapCanvas : public Q3CanvasView
186189

187190
//! returns current layer (set by legend widget)
188191
QgsMapLayer* currentLayer();
192+
193+
//! set wheel action and zoom factor (should be greater than 1)
194+
void setWheelAction(WheelAction action, double factor = 2);
189195

190-
//! Zooms in/out with a given center (uses zoomByScale)
196+
//! Zooms in/out preserving
197+
void zoom(bool zoomIn);
198+
199+
//! Zooms in/out with a given center
191200
void zoomWithCenter(int x, int y, bool zoomIn);
192201

193202
//! used to determine if anti-aliasing is enabled or not
@@ -340,9 +349,6 @@ class QgsMapCanvas : public Q3CanvasView
340349
//! Overridden draw contents from canvas view
341350
void drawContents(QPainter * p, int cx, int cy, int cw, int ch);
342351

343-
//! Zooms to a given center and scale
344-
void zoomByScale(int x, int y, double scaleFactor);
345-
346352
//! called when panning is in action, reset indicates end of panning
347353
void moveCanvasContents(bool reset = FALSE);
348354

@@ -372,8 +378,10 @@ class QgsMapCanvas : public Q3CanvasView
372378
QgsRect mLastExtent;
373379

374380
//! Scale factor multiple for default zoom in/out
375-
// TODO Make this customisable by the user
376-
static const double scaleDefaultMultiple;
381+
double mWheelZoomFactor;
382+
383+
//! Mouse wheel action
384+
WheelAction mWheelAction;
377385

378386
}; // class QgsMapCanvas
379387

‎src/gui/qgsoptions.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,9 @@ QgsOptions::QgsOptions(QWidget *parent, Qt::WFlags fl) :
138138
pbnCanvasColor->setPalette( QColor(myRed,myGreen,myBlue) );
139139

140140
capitaliseCheckBox->setChecked(settings.value("qgis/capitaliseLayerName", QVariant(false)).toBool());
141+
142+
cmbWheelAction->setCurrentIndex(settings.value("/qgis/wheel_action", 0).toInt());
143+
spinZoomFactor->setValue(settings.value("/qgis/zoom_factor", 2).toDouble());
141144
}
142145

143146
//! Destructor
@@ -243,6 +246,9 @@ void QgsOptions::saveOptions()
243246
myGreen = settings.writeEntry("/qgis/default_canvas_color_green",myColor.green());
244247
myBlue = settings.writeEntry("/qgis/default_canvas_color_blue",myColor.blue());
245248

249+
settings.writeEntry("/qgis/wheel_action", cmbWheelAction->currentIndex());
250+
settings.writeEntry("/qgis/zoom_factor", spinZoomFactor->value());
251+
246252
//all done
247253
accept();
248254
}

‎src/ui/qgsoptionsbase.ui

Lines changed: 76 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,17 @@
1818
<property name="sizeGripEnabled" >
1919
<bool>true</bool>
2020
</property>
21-
<layout class="QGridLayout" >
21+
<layout class="QVBoxLayout" >
2222
<property name="margin" >
2323
<number>9</number>
2424
</property>
2525
<property name="spacing" >
2626
<number>6</number>
2727
</property>
28-
<item row="0" column="0" >
28+
<item>
2929
<widget class="QTabWidget" name="tabWidget" >
3030
<property name="currentIndex" >
31-
<number>0</number>
31+
<number>2</number>
3232
</property>
3333
<widget class="QWidget" name="tabAppearance" >
3434
<attribute name="title" >
@@ -389,7 +389,7 @@
389389
</widget>
390390
<widget class="QWidget" name="tabMap" >
391391
<attribute name="title" >
392-
<string>&amp;Selection &amp;&amp; Measuring</string>
392+
<string>&amp;Map tools</string>
393393
</attribute>
394394
<layout class="QGridLayout" >
395395
<property name="margin" >
@@ -398,6 +398,19 @@
398398
<property name="spacing" >
399399
<number>6</number>
400400
</property>
401+
<item row="3" column="0" >
402+
<spacer>
403+
<property name="orientation" >
404+
<enum>Qt::Vertical</enum>
405+
</property>
406+
<property name="sizeHint" >
407+
<size>
408+
<width>20</width>
409+
<height>40</height>
410+
</size>
411+
</property>
412+
</spacer>
413+
</item>
401414
<item row="0" column="0" >
402415
<widget class="QGroupBox" name="groupBox_7" >
403416
<property name="title" >
@@ -482,17 +495,65 @@ p, li { white-space: pre-wrap; }
482495
</widget>
483496
</item>
484497
<item row="2" column="0" >
485-
<spacer>
486-
<property name="orientation" >
487-
<enum>Qt::Vertical</enum>
488-
</property>
489-
<property name="sizeHint" >
490-
<size>
491-
<width>20</width>
492-
<height>40</height>
493-
</size>
498+
<widget class="QGroupBox" name="groupBox_10" >
499+
<property name="title" >
500+
<string>Panning and zooming</string>
494501
</property>
495-
</spacer>
502+
<layout class="QGridLayout" >
503+
<property name="margin" >
504+
<number>9</number>
505+
</property>
506+
<property name="spacing" >
507+
<number>6</number>
508+
</property>
509+
<item row="0" column="1" >
510+
<widget class="QComboBox" name="cmbWheelAction" >
511+
<item>
512+
<property name="text" >
513+
<string>Zoom</string>
514+
</property>
515+
</item>
516+
<item>
517+
<property name="text" >
518+
<string>Zoom and recenter</string>
519+
</property>
520+
</item>
521+
<item>
522+
<property name="text" >
523+
<string>Nothing</string>
524+
</property>
525+
</item>
526+
</widget>
527+
</item>
528+
<item row="1" column="0" >
529+
<widget class="QLabel" name="label_3" >
530+
<property name="text" >
531+
<string>Zoom factor:</string>
532+
</property>
533+
</widget>
534+
</item>
535+
<item row="0" column="0" >
536+
<widget class="QLabel" name="label_2" >
537+
<property name="text" >
538+
<string>Mouse wheel action:</string>
539+
</property>
540+
</widget>
541+
</item>
542+
<item row="1" column="1" >
543+
<widget class="QDoubleSpinBox" name="spinZoomFactor" >
544+
<property name="decimals" >
545+
<number>1</number>
546+
</property>
547+
<property name="minimum" >
548+
<double>1.100000000000000</double>
549+
</property>
550+
<property name="value" >
551+
<double>2.000000000000000</double>
552+
</property>
553+
</widget>
554+
</item>
555+
</layout>
556+
</widget>
496557
</item>
497558
</layout>
498559
</widget>
@@ -671,7 +732,7 @@ p, li { white-space: pre-wrap; }
671732
</widget>
672733
</widget>
673734
</item>
674-
<item row="1" column="0" >
735+
<item>
675736
<layout class="QHBoxLayout" >
676737
<property name="margin" >
677738
<number>0</number>

0 commit comments

Comments
 (0)
Please sign in to comment.