Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 801 | - | 1 | /* |
| 2 | * |
||
| 3 | * This file is part of QMapControl, |
||
| 4 | * an open-source cross-platform map widget |
||
| 5 | * |
||
| 6 | * Copyright (C) 2007 - 2008 Kai Winter |
||
| 7 | * |
||
| 8 | * This program is free software: you can redistribute it and/or modify |
||
| 9 | * it under the terms of the GNU Lesser General Public License as published by |
||
| 10 | * the Free Software Foundation, either version 3 of the License, or |
||
| 11 | * (at your option) any later version. |
||
| 12 | * |
||
| 13 | * This program is distributed in the hope that it will be useful, |
||
| 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
| 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||
| 16 | * GNU Lesser General Public License for more details. |
||
| 17 | * |
||
| 18 | * You should have received a copy of the GNU Lesser General Public License |
||
| 19 | * along with QMapControl. If not, see <http://www.gnu.org/licenses/>. |
||
| 20 | * |
||
| 21 | * Contact e-mail: kaiwinter@gmx.de |
||
| 22 | * Program URL : http://qmapcontrol.sourceforge.net/ |
||
| 23 | * |
||
| 24 | */ |
||
| 25 | |||
| 26 | #ifndef MAPCONTROL_H |
||
| 27 | #define MAPCONTROL_H |
||
| 28 | |||
| 29 | #include <QtGui> |
||
| 30 | |||
| 31 | #include "layermanager.h" |
||
| 32 | #include "layer.h" |
||
| 33 | #include "mapadapter.h" |
||
| 34 | #include "geometry.h" |
||
| 35 | #include "imagemanager.h" |
||
| 36 | |||
| 37 | //! QMapControl namespace |
||
| 38 | namespace qmapcontrol |
||
| 39 | { |
||
| 40 | class LayerManager; |
||
| 41 | class MapAdapter; |
||
| 42 | class Layer; |
||
| 43 | |||
| 44 | //! The control element of the widget and also the widget itself |
||
| 45 | /*! |
||
| 46 | * This is the main widget. |
||
| 47 | * To this control layers can be added. |
||
| 48 | * A MapControl have to be instantiated with a QSize which sets the size the widget takes in a layout. |
||
| 49 | * The given size is also the size, which is asured to be filled with map images. |
||
| 50 | * |
||
| 51 | * @author Kai Winter <kaiwinter@gmx.de> |
||
| 52 | */ |
||
| 53 | class MapControl : public QWidget |
||
| 54 | { |
||
| 55 | Q_OBJECT |
||
| 56 | |||
| 57 | public: |
||
| 58 | //! Declares what actions the mouse move has on the map |
||
| 59 | enum MouseMode |
||
| 60 | { |
||
| 61 | Panning, /*!< The map is moved */ |
||
| 62 | Dragging, /*!< A rectangular can be drawn */ |
||
| 63 | None, /*!< Mouse move events have no efect to the map */ |
||
| 64 | }; |
||
| 65 | |||
| 66 | //! The constructor of MapControl |
||
| 67 | /*! |
||
| 68 | * The MapControl is the widget which displays the maps. |
||
| 69 | * The size describes the area, which gets filled with map data |
||
| 70 | * When you give no MouseMode, the mouse is moving the map. |
||
| 71 | * You can change the MouseMode on runtime, to e.g. Dragging, which lets the user drag a rectangular box. |
||
| 72 | * After the dragging a signal with the size of the box is emitted. |
||
| 73 | * The mousemode ´None´ can be used, to completely define the control of the map yourself. |
||
| 74 | * @param size the size which the widget should fill with map data |
||
| 75 | * @param mousemode the way mouseevents are handled |
||
| 76 | */ |
||
| 77 | MapControl ( QSize size, MouseMode mousemode = Panning ); |
||
| 78 | |||
| 79 | ~MapControl(); |
||
| 80 | |||
| 81 | //! adds a layer |
||
| 82 | /*! |
||
| 83 | * If multiple layers are added, they are painted in the added order. |
||
| 84 | * @param layer the layer which should be added |
||
| 85 | */ |
||
| 86 | void addLayer ( Layer* layer ); |
||
| 87 | |||
| 88 | //! returns the layer with the given name |
||
| 89 | /*! |
||
| 90 | * @param layername name of the wanted layer |
||
| 91 | * @return the layer with the given name |
||
| 92 | */ |
||
| 93 | Layer* layer ( const QString& layername ) const; |
||
| 94 | |||
| 95 | //! returns the names of all layers |
||
| 96 | /*! |
||
| 97 | * @return returns a QList with the names of all layers |
||
| 98 | */ |
||
| 99 | QList<QString> layers() const; |
||
| 100 | |||
| 101 | //! returns the number of existing layers |
||
| 102 | /*! |
||
| 103 | * @return returns the number of existing layers |
||
| 104 | */ |
||
| 105 | int numberOfLayers() const; |
||
| 106 | |||
| 107 | //! returns the coordinate of the center of the map |
||
| 108 | /*! |
||
| 109 | * @return returns the coordinate of the middle of the screen |
||
| 110 | */ |
||
| 111 | QPointF currentCoordinate() const; |
||
| 112 | |||
| 113 | //! returns the current zoom level |
||
| 114 | /*! |
||
| 115 | * @return returns the current zoom level |
||
| 116 | */ |
||
| 117 | int currentZoom() const; |
||
| 118 | |||
| 119 | //! sets the middle of the map to the given coordinate |
||
| 120 | /*! |
||
| 121 | * @param coordinate the coordinate which the view´s middle should be set to |
||
| 122 | */ |
||
| 123 | void setView ( const QPointF& coordinate ) const; |
||
| 124 | |||
| 125 | //! sets the view, so all coordinates are visible |
||
| 126 | /*! |
||
| 127 | * @param coordinates the Coorinates which should be visible |
||
| 128 | */ |
||
| 129 | void setView ( const QList<QPointF> coordinates ) const; |
||
| 130 | |||
| 131 | //! sets the view and zooms in, so all coordinates are visible |
||
| 132 | /*! |
||
| 133 | * The code of setting the view to multiple coordinates is "brute force" and pretty slow. |
||
| 134 | * Have to be reworked. |
||
| 135 | * @param coordinates the Coorinates which should be visible |
||
| 136 | */ |
||
| 137 | void setViewAndZoomIn ( const QList<QPointF> coordinates ) const; |
||
| 138 | |||
| 139 | //! sets the view to the given Point |
||
| 140 | /*! |
||
| 141 | * |
||
| 142 | * @param point the geometric point the view should be set to |
||
| 143 | */ |
||
| 144 | void setView ( const Point* point ) const; |
||
| 145 | |||
| 146 | //! Keeps the center of the map on the Geometry, even when it moves |
||
| 147 | /*! |
||
| 148 | * To stop the following the method stopFollowing() have to be called |
||
| 149 | * @param geometry the Geometry which should stay centered. |
||
| 150 | */ |
||
| 151 | void followGeometry ( const Geometry* geometry ) const; |
||
| 152 | |||
| 153 | //TODO: |
||
| 154 | // void followGeometry(const QList<Geometry*>) const; |
||
| 155 | |||
| 156 | //! Stops the following of a Geometry |
||
| 157 | /*! |
||
| 158 | * if the view is set to follow a Geometry this method stops the trace. |
||
| 159 | * See followGeometry(). |
||
| 160 | * @param geometry the Geometry which should not followed anymore |
||
| 161 | */ |
||
| 162 | void stopFollowing ( Geometry* geometry ); |
||
| 163 | |||
| 164 | //! Smoothly moves the center of the view to the given Coordinate |
||
| 165 | /*! |
||
| 166 | * @param coordinate the Coordinate which the center of the view should moved to |
||
| 167 | */ |
||
| 168 | void moveTo ( QPointF coordinate ); |
||
| 169 | |||
| 170 | //! sets the Mouse Mode of the MapControl |
||
| 171 | /*! |
||
| 172 | * There are three MouseModes declard by an enum. |
||
| 173 | * The MouesMode Dragging draws an rectangular in the map while the MouseButton is pressed. |
||
| 174 | * When the Button is released a boxDragged() signal is emitted. |
||
| 175 | * |
||
| 176 | * The second MouseMode (the default) is Panning, which allows to drag the map around. |
||
| 177 | * @param mousemode the MouseMode |
||
| 178 | */ |
||
| 179 | void setMouseMode ( MouseMode mousemode ); |
||
| 180 | |||
| 181 | //! returns the current MouseMode |
||
| 182 | /*! |
||
| 183 | * For a explanation for the MouseModes see setMouseMode() |
||
| 184 | * @return the current MouseMode |
||
| 185 | */ |
||
| 186 | MapControl::MouseMode mouseMode(); |
||
| 187 | |||
| 188 | //int rotation; |
||
| 189 | |||
| 190 | //! Enable persistent caching of map tiles |
||
| 191 | /*! |
||
| 192 | * Call this method to allow the QMapControl widget to save map tiles |
||
| 193 | * persistent (also over application restarts). |
||
| 194 | * Tiles are stored in the subdirectory "QMapControl.cache" within the |
||
| 195 | * user's home directory. This can be changed by giving a path. |
||
| 196 | * @param path the path to the cache directory |
||
| 197 | */ |
||
| 198 | void enablePersistentCache ( const QDir& path=QDir::homePath() + "/QMapControl.cache" ); |
||
| 199 | |||
| 200 | |||
| 201 | //! Sets the proxy for HTTP connections |
||
| 202 | /*! |
||
| 203 | * This method sets the proxy for HTTP connections. |
||
| 204 | * This is not provided by the current Qtopia version! |
||
| 205 | * @param host the proxy´s hostname or ip |
||
| 206 | * @param port the proxy´s port |
||
| 207 | */ |
||
| 208 | void setProxy ( QString host, int port ); |
||
| 209 | |||
| 210 | //! Displays the scale within the widget |
||
| 211 | /*! |
||
| 212 | * |
||
| 213 | * @param show true if the scale should be displayed |
||
| 214 | */ |
||
| 215 | void showScale ( bool show ); |
||
| 216 | |||
| 217 | private: |
||
| 218 | LayerManager* layermanager; |
||
| 219 | QPoint screen_middle; // middle of the widget (half size) |
||
| 220 | |||
| 221 | QPoint pre_click_px; // used for scrolling (MouseMode Panning) |
||
| 222 | QPoint current_mouse_pos; // used for scrolling and dragging (MouseMode Panning/Dragging) |
||
| 223 | |||
| 224 | QSize size; // size of the widget |
||
| 225 | |||
| 226 | bool mousepressed; |
||
| 227 | MouseMode mymousemode; |
||
| 228 | bool scaleVisible; |
||
| 229 | |||
| 230 | bool m_loadingFlag; |
||
| 231 | |||
| 232 | QMutex moveMutex; // used for method moveTo() |
||
| 233 | QPointF target; // used for method moveTo() |
||
| 234 | int steps; // used for method moveTo() |
||
| 235 | |||
| 236 | QPointF clickToWorldCoordinate ( QPoint click ); |
||
| 237 | MapControl& operator= ( const MapControl& rhs ); |
||
| 238 | MapControl ( const MapControl& old ); |
||
| 239 | |||
| 240 | protected: |
||
| 241 | void paintEvent ( QPaintEvent* evnt ); |
||
| 242 | void mousePressEvent ( QMouseEvent* evnt ); |
||
| 243 | void mouseReleaseEvent ( QMouseEvent* evnt ); |
||
| 244 | void mouseMoveEvent ( QMouseEvent* evnt ); |
||
| 245 | |||
| 246 | signals: |
||
| 247 | // void mouseEvent(const QMouseEvent* evnt); |
||
| 248 | |||
| 249 | //! Emitted AFTER a MouseEvent occured |
||
| 250 | /*! |
||
| 251 | * This signals allows to receive click events within the MapWidget together with the world coordinate. |
||
| 252 | * It is emitted on MousePressEvents and MouseReleaseEvents. |
||
| 253 | * The kind of the event can be obtained by checking the events type. |
||
| 254 | * @param evnt the QMouseEvent that occured |
||
| 255 | * @param coordinate the corresponding world coordinate |
||
| 256 | */ |
||
| 257 | void mouseEventCoordinate ( const QMouseEvent* evnt, const QPointF coordinate ); |
||
| 258 | |||
| 259 | //! Emitted, after a Rectangular is dragged. |
||
| 260 | /*! |
||
| 261 | * It is possible to select a rectangular area in the map, if the MouseMode is set to Dragging. |
||
| 262 | * The coordinates are in world coordinates |
||
| 263 | * @param QRectF the dragged Rect |
||
| 264 | */ |
||
| 265 | void boxDragged ( const QRectF ); |
||
| 266 | |||
| 267 | //! This signal is emitted, when a Geometry is clicked |
||
| 268 | /*! |
||
| 269 | * @param geometry The clicked Geometry object |
||
| 270 | * @param coord_px The coordinate in pixel coordinates |
||
| 271 | */ |
||
| 272 | void geometryClicked ( Geometry* geometry, QPoint coord_px ); |
||
| 273 | |||
| 274 | //! This signal is emitted, after the view have changed |
||
| 275 | /*! |
||
| 276 | * @param coordinate The current coordinate |
||
| 277 | * @param zoom The current zoom |
||
| 278 | */ |
||
| 279 | void viewChanged ( const QPointF &coordinate, int zoom ); |
||
| 280 | |||
| 281 | public slots: |
||
| 282 | //! zooms in one step |
||
| 283 | void zoomIn(); |
||
| 284 | |||
| 285 | //! zooms out one step |
||
| 286 | void zoomOut(); |
||
| 287 | |||
| 288 | //! sets the given zoomlevel |
||
| 289 | /*! |
||
| 290 | * @param zoomlevel the zoomlevel |
||
| 291 | */ |
||
| 292 | void setZoom ( int zoomlevel ); |
||
| 293 | |||
| 294 | //! scrolls the view to the left |
||
| 295 | void scrollLeft ( int pixel=10 ); |
||
| 296 | |||
| 297 | //! scrolls the view to the right |
||
| 298 | void scrollRight ( int pixel=10 ); |
||
| 299 | |||
| 300 | //! scrolls the view up |
||
| 301 | void scrollUp ( int pixel=10 ); |
||
| 302 | |||
| 303 | //! scrolls the view down |
||
| 304 | void scrollDown ( int pixel=10 ); |
||
| 305 | |||
| 306 | //! scrolls the view by the given point |
||
| 307 | void scroll ( const QPoint scroll ); |
||
| 308 | |||
| 309 | //! updates the map for the given rect |
||
| 310 | /*! |
||
| 311 | * @param rect the area which should be repainted |
||
| 312 | */ |
||
| 313 | void updateRequest ( QRect rect ); |
||
| 314 | |||
| 315 | //! updates the hole map by creating a new offscreen image |
||
| 316 | /*! |
||
| 317 | * |
||
| 318 | */ |
||
| 319 | void updateRequestNew(); |
||
| 320 | |||
| 321 | //! Resizes the map to the given size |
||
| 322 | /*! |
||
| 323 | * @param newSize The new size |
||
| 324 | */ |
||
| 325 | void resize(const QSize newSize); |
||
| 326 | |||
| 327 | private slots: |
||
| 328 | void tick(); |
||
| 329 | void loadingFinished(); |
||
| 330 | void positionChanged ( Geometry* geom ); |
||
| 331 | }; |
||
| 332 | } |
||
| 333 | #endif |