Marble

MarbleInputHandler.h
1 // SPDX-License-Identifier: LGPL-2.1-or-later
2 //
3 // SPDX-FileCopyrightText: 2005-2007 Torsten Rahn <[email protected]>
4 // SPDX-FileCopyrightText: 2007 Inge Wallin <[email protected]>
5 // SPDX-FileCopyrightText: 2014 Adam Dabrowski <[email protected]>
6 //
7 
8 #ifndef MARBLE_MARBLEINPUTHANDLER_H
9 #define MARBLE_MARBLEINPUTHANDLER_H
10 
11 #include <QObject>
12 
13 #include "marble_export.h"
14 #include "GeoDataCoordinates.h"
15 
16 class QEvent;
17 class QKeyEvent;
18 class QMouseEvent;
19 class QTouchEvent;
20 class QWheelEvent;
21 class QGestureEvent;
22 class QCursor;
23 class QTimer;
24 class QString;
25 class QRect;
26 
27 namespace Marble
28 {
29 
30 class MarbleAbstractPresenter;
31 class AbstractDataPluginItem;
32 class RenderPlugin;
33 
34 class MARBLE_EXPORT MarbleInputHandler : public QObject
35 {
36  Q_OBJECT
37 
38  public:
39  explicit MarbleInputHandler( MarbleAbstractPresenter* );
40  ~MarbleInputHandler() override;
41 
42  void setPositionSignalConnected( bool connected );
43  bool isPositionSignalConnected() const;
44 
45  /**
46 //
47 // The MarbleInputHandler handles mouse and keyboard input.
48 //
49 
50  * @brief Set whether a popup menu appears on a click (not drag) with the left mouse button
51  * @param enabled True to enable the popup menu (default), false to disable it
52  */
53  void setMouseButtonPopupEnabled( Qt::MouseButton mouseButton, bool enabled );
54 
55  /**
56  * @brief Return whether the left mouse button popup menu is active
57  * @return True iff a popup menu is shown on left mouse button clicks
58  */
59  bool isMouseButtonPopupEnabled( Qt::MouseButton mouseButton ) const;
60 
61  void setPanViaArrowsEnabled( bool enabled );
62 
63  bool panViaArrowsEnabled() const;
64 
65  void setInertialEarthRotationEnabled( bool enabled );
66 
67  /**
68  * @brief Returns true iff dragging the map with the mouse keeps spinning
69  * in the chosen direction for a slightly longer time than the mouse is
70  * actually performing the drag operation
71  */
72  bool inertialEarthRotationEnabled() const;
73 
74  void setMouseViewRotationEnabled( bool enabled );
75 
76  bool mouseViewRotationEnabled() const;
77 
78  /// should the map do kinetic scrolling, this would stop the operation
79  virtual void stopInertialEarthRotation();
80 
81  Q_SIGNALS:
82  // Mouse button menus
83  void lmbRequest( int, int );
84  void rmbRequest( int, int );
85 
86  //Gps coordinates
87  void mouseClickScreenPosition( int, int );
88  void mouseMoveGeoPosition( const QString& );
89 
90  /*
91  * To detect mouse click followed by mouse move
92  * with no mouse move in between
93  */
94  void mouseClickGeoPosition( qreal, qreal, GeoDataCoordinates::Unit );
95 
96  protected Q_SLOTS:
97  void restoreViewContext();
98 
99  protected:
100  class Protected;
101  Protected * const d;
102 
103  private Q_SLOTS:
104  virtual void installPluginEventFilter( RenderPlugin *renderPlugin ) = 0;
105 
106  private:
107  Q_DISABLE_COPY( MarbleInputHandler )
108 };
109 
110 class AbstractSelectionRubber
111 {
112 public:
113  virtual ~AbstractSelectionRubber() {}
114  virtual void show() = 0;
115  virtual void hide() = 0;
116  virtual bool isVisible() const = 0;
117  virtual const QRect &geometry() const = 0;
118  virtual void setGeometry(const QRect &geometry) = 0;
119 };
120 
121 class MARBLE_EXPORT MarbleDefaultInputHandler : public MarbleInputHandler
122 {
123  Q_OBJECT
124 
125  public:
126  explicit MarbleDefaultInputHandler( MarbleAbstractPresenter* marblePresenter);
127  ~MarbleDefaultInputHandler() override;
128 
129  void stopInertialEarthRotation() override;
130 
131  protected:
132  bool eventFilter( QObject *, QEvent * ) override;
133  bool handleMouseEvent(QMouseEvent *e);
134  bool handlePinch(const QPointF &center, qreal scaleFactor, Qt::GestureState state);
135 
136  //FIXME - refactor (abstraction & composition)
137  const AbstractDataPluginItem *lastToolTipItem() const;
138  QTimer* toolTipTimer();
139  QPoint toolTipPosition() const;
140 
141  virtual bool handleKeyPress(QKeyEvent *e);
142  virtual void handleMouseButtonPressAndHold(const QPoint &position);
143 
144  private Q_SLOTS:
145  void installPluginEventFilter( RenderPlugin *renderPlugin ) override = 0;
146  virtual void showLmbMenu( int, int ) = 0;
147  virtual void showRmbMenu( int, int ) = 0;
148  void handlePressAndHold();
149 
150  virtual void openItemToolTip() = 0;
151  virtual void setCursor(const QCursor &) = 0;
152 
153  void lmbTimeout();
154 
155  private:
156  virtual AbstractSelectionRubber *selectionRubber() = 0;
157  virtual bool layersEventFilter(QObject *, QEvent *) = 0;
158 
159  virtual bool handleTouch(QTouchEvent *e);
160  virtual bool handleDoubleClick(QMouseEvent *e);
161  virtual bool handleWheel(QWheelEvent *e);
162  virtual bool handleGesture(QGestureEvent *e);
163 
164  virtual void handleMouseButtonPress(QMouseEvent *e);
165  virtual void handleLeftMouseButtonPress(QMouseEvent *e);
166  virtual void handleRightMouseButtonPress(QMouseEvent *e);
167  virtual void handleMiddleMouseButtonPress(QMouseEvent *e);
168  virtual void handleMouseButtonRelease(QMouseEvent *e);
169 
170  virtual void hideSelectionIfCtrlReleased(QEvent *e);
171  virtual void checkReleasedMove(QMouseEvent *e);
172 
173  //Returns whatever should be returned from mouse event handling loop
174  virtual bool acceptMouse();
175 
176  void notifyPosition(bool isAboveMap, qreal mouseLon, qreal mouseLat);
177  QPoint mouseMovedOutside(QMouseEvent *event);
178  void adjustCursorShape(const QPoint& mousePosition, const QPoint& mouseDirection);
179 
180  Q_DISABLE_COPY(MarbleDefaultInputHandler)
181  class Private;
182  Private * const d;
183 };
184 
185 }
186 
187 #endif //MARBLE_MARBLEINPUTHANDLER_H
GestureState
MouseButton
Binds a QML item to a specific geodetic location in screen coordinates.
Unit
enum used constructor to specify the units used
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Mon Sep 25 2023 03:50:19 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.