8 #include "MarbleWidgetInputHandler.h"
10 #include <QRubberBand>
15 #include "MarbleGlobal.h"
16 #include "MarbleDebug.h"
20 #include "AbstractDataPluginItem.h"
21 #include "MarbleAbstractPresenter.h"
22 #include "MarbleWidgetPopupMenu.h"
23 #include "PopupLayer.h"
24 #include "RenderPlugin.h"
25 #include "RoutingLayer.h"
30 class MarbleWidgetInputHandlerPrivate
32 class MarbleWidgetSelectionRubber :
public AbstractSelectionRubber
35 explicit MarbleWidgetSelectionRubber(MarbleWidget *widget)
41 void show()
override { m_rubberBand.show(); }
42 void hide()
override { m_rubberBand.hide(); }
43 bool isVisible()
const override {
return m_rubberBand.isVisible(); }
44 const QRect &geometry()
const override {
return m_rubberBand.geometry(); }
45 void setGeometry(
const QRect &geometry)
override { m_rubberBand.setGeometry(geometry); }
52 MarbleWidgetInputHandlerPrivate(MarbleWidgetInputHandler *handler, MarbleWidget *widget,
53 MarbleAbstractPresenter *presenter)
54 : m_inputHandler(handler)
55 ,m_marbleWidget(widget)
56 ,m_marblePresenter(presenter)
57 ,m_selectionRubber(widget)
58 ,m_debugModeEnabled(false)
60 for(RenderPlugin *renderPlugin: widget->renderPlugins())
62 if(renderPlugin->isInitialized())
64 installPluginEventFilter(renderPlugin);
70 void setCursor(
const QCursor &cursor)
72 m_marbleWidget->setCursor(cursor);
77 if (m_marbleWidget->popupLayer()->eventFilter(o, e))
82 if (m_marbleWidget->routingLayer()->eventFilter(o, e))
90 void installPluginEventFilter(RenderPlugin *renderPlugin)
92 m_marbleWidget->installEventFilter(renderPlugin);
95 MarbleWidgetInputHandler *m_inputHandler;
96 MarbleWidget *m_marbleWidget;
97 MarbleAbstractPresenter *m_marblePresenter;
98 MarbleWidgetSelectionRubber m_selectionRubber;
99 bool m_debugModeEnabled;
100 bool m_pinchDetected =
false;
101 bool m_panDetected =
false;
105 void MarbleWidgetInputHandler::setCursor(
const QCursor &cursor)
107 d->setCursor(cursor);
110 bool MarbleWidgetInputHandler::handleKeyPress(
QKeyEvent *event)
112 if (d->m_debugModeEnabled) {
114 switch(
event->key()) {
116 d->m_marbleWidget->setLevelToDebug(0);
119 d->m_marbleWidget->setLevelToDebug(1);
122 d->m_marbleWidget->setLevelToDebug(2);
125 d->m_marbleWidget->setLevelToDebug(3);
128 d->m_marbleWidget->setLevelToDebug(4);
131 d->m_marbleWidget->setLevelToDebug(5);
134 d->m_marbleWidget->setLevelToDebug(6);
137 d->m_marbleWidget->setLevelToDebug(7);
140 d->m_marbleWidget->setLevelToDebug(8);
143 d->m_marbleWidget->setLevelToDebug(9);
146 d->m_marbleWidget->setLevelToDebug(d->m_marbleWidget->levelToDebug() + 1);
149 d->m_marbleWidget->setLevelToDebug(d->m_marbleWidget->levelToDebug() - 1);
153 switch(
event->key()) {
158 d->m_marbleWidget->setShowRuntimeTrace(!d->m_marbleWidget->showRuntimeTrace());
161 d->m_marbleWidget->setShowDebugPlacemarks(!d->m_marbleWidget->showDebugPlacemarks());
164 d->m_marbleWidget->setShowDebugPolygons(!d->m_marbleWidget->showDebugPolygons());
167 d->m_marbleWidget->setShowDebugBatchRender(!d->m_marbleWidget->showDebugBatchRender());
170 d->m_marbleWidget->setDebugLevelTags(!d->m_marbleWidget->debugLevelTags());
175 return MarbleDefaultInputHandler::handleKeyPress(event);
178 bool MarbleWidgetInputHandler::handleTouch(
QTouchEvent *event)
182 if (
event->touchPoints().count() == 1)
187 d->m_pinchDetected =
false;
188 d->m_panDetected =
false;
191 handleMouseEvent(&press);
195 if (!d->m_pinchDetected)
197 d->m_panDetected =
true;
200 handleMouseEvent(&move);
206 if (d->m_pinchDetected || d->m_panDetected)
213 if (d->m_pinchDetected || d->m_panDetected)
215 if (d->m_pinchDetected)
216 stopInertialEarthRotation();
225 bool MarbleWidgetInputHandler::handleGesture(
QGestureEvent *e)
228 if (pinch && !d->m_panDetected)
230 d->m_pinchDetected =
true;
231 handlePinchGesture(pinch);
238 void MarbleWidgetInputHandler::handlePinchGesture(
QPinchGesture *pinch)
240 MarbleAbstractPresenter *marblePresenter = d->m_marblePresenter;
242 switch (pinch->
state())
247 marblePresenter->setViewContext(
Animation);
254 if (scaleFactor > 1.0)
256 else if (scaleFactor < 1.0)
260 qreal
zoom = marblePresenter->zoom();
261 bool oldAnim = marblePresenter->animationsEnabled();
262 qreal newDistance = marblePresenter->distanceFromZoom(zoom + 20 * scaleFactor);
263 marblePresenter->setAnimationsEnabled(
false);
264 marblePresenter->zoomAt(center, newDistance);
265 marblePresenter->setAnimationsEnabled(oldAnim);
270 restoreViewContext();
275 AbstractSelectionRubber *MarbleWidgetInputHandler::selectionRubber()
277 return &d->m_selectionRubber;
280 bool MarbleWidgetInputHandler::layersEventFilter(
QObject *o,
QEvent *e)
282 return d->layersEventFilter(o, e);
285 void MarbleWidgetInputHandler::installPluginEventFilter(RenderPlugin *renderPlugin)
287 d->installPluginEventFilter(renderPlugin);
290 MarbleWidgetInputHandler::MarbleWidgetInputHandler(MarbleAbstractPresenter *marblePresenter, MarbleWidget *widget)
291 : MarbleDefaultInputHandler(marblePresenter)
292 ,d(new MarbleWidgetInputHandlerPrivate(this, widget, marblePresenter))
296 void MarbleWidgetInputHandler::setDebugModeEnabled(
bool enabled)
298 d->m_debugModeEnabled = enabled;
302 void MarbleWidgetInputHandler::showLmbMenu(
int x,
int y)
304 if (isMouseButtonPopupEnabled(
Qt::LeftButton) && !d->m_pinchDetected && !d->m_panDetected)
306 d->m_marbleWidget->popupMenu()->showLmbMenu(x, y);
307 toolTipTimer()->stop();
311 void MarbleWidgetInputHandler::showRmbMenu(
int x,
int y)
315 d->m_marbleWidget->popupMenu()->showRmbMenu(x, y);
319 void MarbleWidgetInputHandler::openItemToolTip()
321 if (lastToolTipItem())
324 lastToolTipItem()->toolTip(),
326 lastToolTipItem()->containsRect(toolTipPosition()).toRect());
332 #include "moc_MarbleWidgetInputHandler.cpp"