• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeedu API Reference
  • KDE Home
  • Contact Us
 

marble

  • sources
  • kde-4.14
  • kdeedu
  • marble
  • src
  • lib
  • marble
MarbleQuickItem.cpp
Go to the documentation of this file.
1 //
2 // This file is part of the Marble Virtual Globe.
3 //
4 // This program is free software licensed under the GNU LGPL. You can
5 // find a copy of this license in LICENSE.txt in the top directory of
6 // the source code.
7 //
8 // Copyright 2014 Adam Dabrowski <adamdbrw@gmail.com>
9 //
10 
11 
12 #include <MarbleQuickItem.h>
13 #include <QPainter>
14 #include <QPaintDevice>
15 #include <QtMath>
16 #include <MarbleModel.h>
17 #include <MarbleMap.h>
18 #include <ViewportParams.h>
19 #include <GeoPainter.h>
20 #include <GeoDataLookAt.h>
21 #include <MarbleLocale.h>
22 #include <Planet.h>
23 #include <MarbleAbstractPresenter.h>
24 #include <AbstractFloatItem.h>
25 #include <MarbleInputHandler.h>
26 
27 namespace Marble
28 {
29  //TODO - move to separate files
30  class QuickItemSelectionRubber : public AbstractSelectionRubber
31  { //TODO: support rubber selection in MarbleQuickItem
32  public:
33  void show() { m_visible = true; }
34  void hide() { m_visible = false; }
35  bool isVisible() const { return m_visible; }
36  const QRect &geometry() const { return m_geometry; }
37  void setGeometry(const QRect &/*geometry*/) {}
38  private:
39  QRect m_geometry;
40  bool m_visible;
41  };
42 
43  //TODO - implement missing functionalities
44  class MarbleQuickInputHandler : public MarbleDefaultInputHandler
45  {
46  public:
47  MarbleQuickInputHandler(MarbleAbstractPresenter *marblePresenter, MarbleQuickItem *marbleQuick)
48  : MarbleDefaultInputHandler(marblePresenter)
49  ,m_marbleQuick(marbleQuick)
50  {
51  setInertialEarthRotationEnabled(false); //Disabled by default, it's buggy. TODO - fix
52  }
53 
54  bool acceptMouse()
55  {
56  return true;
57  }
58 
59  void pinch(QPointF center, qreal scale, Qt::GestureState state)
60  { //TODO - this whole thing should be moved to MarbleAbstractPresenter
61  (void)handlePinch(center, scale, state);
62  }
63 
64  private slots:
65  void showLmbMenu(int, int) {}
66  void showRmbMenu(int, int) {}
67  void openItemToolTip() {}
68  void setCursor(const QCursor &cursor)
69  {
70  m_marbleQuick->setCursor(cursor);
71  }
72 
73  private slots:
74  void installPluginEventFilter(RenderPlugin *) {}
75 
76  private:
77  bool layersEventFilter(QObject *, QEvent *)
78  {
79  return false;
80  }
81 
82  //empty - don't check. It would be invalid with quick items
83  void checkReleasedMove(QMouseEvent *) {}
84 
85  bool handleTouch(QTouchEvent *event)
86  {
87  if (event->touchPoints().count() > 1)
88  { //not handling multi-touch at all, let PinchArea or MultiPointTouchArea take care of it
89  return false;
90  }
91 
92  if (event->touchPoints().count() == 1)
93  { //handle - but do not accept. I.e. pinchArea still needs to get this
94  QTouchEvent::TouchPoint p = event->touchPoints().at(0);
95  if (event->type() == QEvent::TouchBegin)
96  {
97  QMouseEvent press(QMouseEvent::MouseButtonPress, p.pos(),
98  Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
99  handleMouseEvent(&press);
100  }
101  else if (event->type() == QEvent::TouchUpdate)
102  {
103  QMouseEvent move(QMouseEvent::MouseMove, p.pos(),
104  Qt::NoButton, Qt::LeftButton, Qt::NoModifier);
105  handleMouseEvent(&move);
106  }
107  else if (event->type() == QEvent::TouchEnd)
108  {
109  QMouseEvent release(QMouseEvent::MouseButtonRelease, p.pos(),
110  Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
111  handleMouseEvent(&release);
112  }
113  }
114  return false;
115  }
116 
117  AbstractSelectionRubber *selectionRubber()
118  {
119  return &m_selectionRubber;
120  }
121 
122  MarbleQuickItem *m_marbleQuick;
123  QuickItemSelectionRubber m_selectionRubber;
124  bool m_usePinchArea;
125  };
126 
127  class MarbleQuickItemPrivate : public MarbleAbstractPresenter
128  {
129  public:
130  MarbleQuickItemPrivate(MarbleQuickItem *marble) : MarbleAbstractPresenter()
131  ,m_marble(marble)
132  ,m_inputHandler(this, marble)
133  {
134  connect(this, SIGNAL(updateRequired()), m_marble, SLOT(update()));
135  }
136 
137  private:
138  MarbleQuickItem *m_marble;
139  friend class MarbleQuickItem;
140 
141  MarbleQuickInputHandler m_inputHandler;
142  };
143 
144  MarbleQuickItem::MarbleQuickItem(QQuickItem *parent) : QQuickPaintedItem(parent)
145  ,d(new MarbleQuickItemPrivate(this))
146  {
147  foreach (AbstractFloatItem *item, d->map()->floatItems())
148  { //TODO: These are not supported in Marble Quick - need refactoring: show them only in
149  //MarbleWidget, MarbleQuickItem should not have them accessible
150  item->hide();
151  }
152 
153  connect(d->map(), SIGNAL(repaintNeeded(QRegion)), this, SLOT(update()));
154  connect(this, SIGNAL(widthChanged()), this, SLOT(resizeMap()));
155  connect(this, SIGNAL(heightChanged()), this, SLOT(resizeMap()));
156 
157  setAcceptedMouseButtons(Qt::AllButtons);
158  installEventFilter(&d->m_inputHandler);
159  }
160 
161  void MarbleQuickItem::resizeMap()
162  {
163  const int minWidth = 100;
164  const int minHeight = 100;
165  int newWidth = width() > minWidth ? (int)width() : minWidth;
166  int newHeight = height() > minHeight ? (int)height() : minHeight;
167 
168  d->map()->setSize(newWidth, newHeight);
169  update();
170  }
171 
172  void MarbleQuickItem::paint(QPainter *painter)
173  { //TODO - much to be done here still, i.e paint !enabled version
174  QPaintDevice *paintDevice = painter->device();
175  QImage image;
176  QRect rect = contentsBoundingRect().toRect();
177 
178  {
179  painter->end();
180  GeoPainter geoPainter(paintDevice, d->map()->viewport(), d->map()->mapQuality());
181  geoPainter.setOpacity(0.9);
182  d->map()->paint(geoPainter, rect);
183  }
184  painter->begin(paintDevice);
185  }
186 
187  void MarbleQuickItem::classBegin()
188  {
189  }
190 
191  void MarbleQuickItem::componentComplete()
192  {
193  }
194 
195  MarbleModel* MarbleQuickItem::model()
196  {
197  return d->model();
198  }
199 
200  const MarbleModel* MarbleQuickItem::model() const
201  {
202  return d->model();
203  }
204 
205  MarbleMap* MarbleQuickItem::map()
206  {
207  return d->map();
208  }
209 
210  const MarbleMap* MarbleQuickItem::map() const
211  {
212  return d->map();
213  }
214 
215  void MarbleQuickItem::setZoom(int newZoom, FlyToMode mode)
216  {
217  d->setZoom(newZoom, mode);
218  }
219 
220  void MarbleQuickItem::centerOn(const GeoDataPlacemark& placemark, bool animated)
221  {
222  d->centerOn(placemark, animated);
223  }
224 
225  void MarbleQuickItem::goHome()
226  {
227  d->goHome();
228  }
229 
230  void MarbleQuickItem::zoomIn(FlyToMode mode)
231  {
232  d->zoomIn(mode);
233  }
234 
235  void MarbleQuickItem::zoomOut(FlyToMode mode)
236  {
237  d->zoomOut(mode);
238  }
239 
240  QObject *MarbleQuickItem::getEventFilter() const
241  { //We would want to install the same event filter for abstract layer QuickItems such as PinchArea
242  return &d->m_inputHandler;
243  }
244 
245  void MarbleQuickItem::pinch(QPointF center, qreal scale, Qt::GestureState state)
246  {
247  d->m_inputHandler.pinch(center, scale, state);
248  }
249 }
Marble::MarbleQuickItem::zoomOut
void zoomOut(FlyToMode mode=Automatic)
Definition: MarbleQuickItem.cpp:235
Marble::MarbleQuickItem::classBegin
void classBegin()
Definition: MarbleQuickItem.cpp:187
Marble::MarbleQuickItem::map
MarbleMap * map()
Definition: MarbleQuickItem.cpp:205
QPainter::setOpacity
void setOpacity(qreal opacity)
QEvent
QTouchEvent::touchPoints
const QList< QTouchEvent::TouchPoint > & touchPoints() const
Marble::MarbleAbstractPresenter::updateRequired
void updateRequired()
QEvent::type
Type type() const
QPainter::end
bool end()
QTouchEvent::TouchPoint::pos
QPointF pos() const
Marble::MarbleDefaultInputHandler::handleMouseEvent
bool handleMouseEvent(QMouseEvent *e)
Definition: MarbleInputHandler.cpp:668
Marble::GeoPainter
A painter that allows to draw geometric primitives on the map.
Definition: GeoPainter.h:98
QPaintDevice
MarbleModel.h
This file contains the headers for MarbleModel.
AbstractFloatItem.h
Marble::MarbleQuickItem::centerOn
void centerOn(const GeoDataPlacemark &placemark, bool animated=false)
Definition: MarbleQuickItem.cpp:220
Marble::MarbleInputHandler::setInertialEarthRotationEnabled
void setInertialEarthRotationEnabled(bool enabled)
Definition: MarbleInputHandler.cpp:116
QMouseEvent
Planet.h
QTouchEvent::TouchPoint
Marble::MarbleDefaultInputHandler::MarbleDefaultInputHandler
MarbleDefaultInputHandler(MarbleAbstractPresenter *marblePresenter)
Definition: MarbleInputHandler.cpp:203
QPointF
Marble::MarbleQuickItem::goHome
void goHome()
Definition: MarbleQuickItem.cpp:225
MarbleQuickItem.h
QRect
MarbleInputHandler.h
MarbleMap.h
This file contains the headers for MarbleMap.
GeoDataLookAt.h
QQuickPaintedItem
QObject
Marble::AbstractFloatItem
The abstract class for float item plugins.
Definition: AbstractFloatItem.h:45
Marble::MarbleQuickItem::MarbleQuickItem
MarbleQuickItem(QQuickItem *parent=0)
Definition: MarbleQuickItem.cpp:144
Marble::MarbleQuickItem::model
MarbleModel * model()
Definition: MarbleQuickItem.cpp:195
QPainter
QPainter::device
QPaintDevice * device() const
MarbleLocale.h
GeoPainter.h
Marble::MarbleQuickItem::setZoom
void setZoom(int zoom, FlyToMode mode=Instant)
Definition: MarbleQuickItem.cpp:215
MarbleAbstractPresenter.h
Marble::MarbleMap
A class that can paint a view of the earth.
Definition: MarbleMap.h:91
ViewportParams.h
This file contains the headers for ViewportParams.
QImage
Marble::FlyToMode
FlyToMode
Describes possible flight mode (interpolation between source and target camera positions) ...
Definition: MarbleGlobal.h:173
Marble::MarbleQuickItem::zoomIn
void zoomIn(FlyToMode mode=Automatic)
Definition: MarbleQuickItem.cpp:230
Marble::MarbleModel
The data model (not based on QAbstractModel) for a MarbleWidget.
Definition: MarbleModel.h:97
Marble::MarbleAbstractPresenter::MarbleAbstractPresenter
MarbleAbstractPresenter()
Definition: MarbleAbstractPresenter.cpp:31
Marble::AbstractFloatItem::hide
void hide()
Hide the item.
Definition: AbstractFloatItem.cpp:220
QDeclarativeItem
Marble::MarbleQuickItem::pinch
void pinch(QPointF center, qreal scale, Qt::GestureState state)
Definition: MarbleQuickItem.cpp:245
Marble::MarbleQuickItem::paint
void paint(QPainter *painter)
Definition: MarbleQuickItem.cpp:172
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QPainter::begin
bool begin(QPaintDevice *device)
Marble::MarbleQuickItem::componentComplete
void componentComplete()
Definition: MarbleQuickItem.cpp:191
QCursor
Marble::MarbleDefaultInputHandler::handlePinch
bool handlePinch(QPointF center, qreal scaleFactor, Qt::GestureState state)
Definition: MarbleInputHandler.cpp:293
QTouchEvent
Marble::GeoDataPlacemark
a class representing a point of interest on the map
Definition: GeoDataPlacemark.h:54
QRegion
Marble::MarbleQuickItem::getEventFilter
QObject * getEventFilter() const
Definition: MarbleQuickItem.cpp:240
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:13:40 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

marble

Skip menu "marble"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdeedu API Reference

Skip menu "kdeedu API Reference"
  • Analitza
  •     lib
  • kalgebra
  • kalzium
  •   libscience
  • kanagram
  • kig
  •   lib
  • klettres
  • marble
  • parley
  • rocs
  •   App
  •   RocsCore
  •   VisualEditor
  •   stepcore

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal