File indexing completed on 2024-05-05 03:50:37
0001 // SPDX-License-Identifier: LGPL-2.1-or-later 0002 // 0003 // SPDX-FileCopyrightText: 2009 Andrew Manson <g.real.ate@gmail.com> 0004 // SPDX-FileCopyrightText: 2013 Thibaut Gridel <tgridel@free.fr> 0005 // SPDX-FileCopyrightText: 2014 Calin Cruceru <crucerucalincristian@gmail.com> 0006 // 0007 0008 0009 #ifndef MARBLE_ANNOTATEPLUGIN_H 0010 #define MARBLE_ANNOTATEPLUGIN_H 0011 0012 #include "RenderPlugin.h" 0013 #include "SceneGraphicsItem.h" 0014 #include "GeoDataGroundOverlay.h" 0015 #include "GroundOverlayFrame.h" 0016 0017 #include <QMenu> 0018 #include <QSortFilterProxyModel> 0019 0020 0021 namespace Marble 0022 { 0023 0024 class MarbleWidget; 0025 class GeoDataDocument; 0026 class GeoDataLinearRing; 0027 class AreaAnnotation; 0028 class PolylineAnnotation; 0029 class PlacemarkTextAnnotation; 0030 class OsmPlacemarkData; 0031 0032 0033 /** 0034 * @brief This class specifies the Marble layer interface of a plugin which 0035 * annotates maps with polygons and placemarks. 0036 */ 0037 class AnnotatePlugin : public RenderPlugin 0038 { 0039 Q_OBJECT 0040 Q_PLUGIN_METADATA(IID "org.kde.marble.AnnotatePlugin") 0041 Q_INTERFACES( Marble::RenderPluginInterface ) 0042 MARBLE_PLUGIN( AnnotatePlugin ) 0043 0044 public: 0045 explicit AnnotatePlugin(const MarbleModel *model = nullptr); 0046 ~AnnotatePlugin() override; 0047 0048 QStringList backendTypes() const override; 0049 0050 QString renderPolicy() const override; 0051 0052 QStringList renderPosition() const override; 0053 0054 QString name() const override; 0055 0056 QString guiString() const override; 0057 0058 QString nameId() const override; 0059 0060 QString version() const override; 0061 0062 QString description() const override; 0063 0064 QIcon icon () const override; 0065 0066 QString copyrightYears() const override; 0067 0068 QVector<PluginAuthor> pluginAuthors() const override; 0069 0070 void initialize () override; 0071 0072 bool isInitialized () const override; 0073 0074 QString runtimeTrace() const override; 0075 0076 const QList<QActionGroup*> *actionGroups() const override; 0077 0078 bool render( GeoPainter *painter, ViewportParams *viewport, 0079 const QString &renderPos, GeoSceneLayer *layer = nullptr ) override; 0080 0081 Q_SIGNALS: 0082 void placemarkMoved(); 0083 void nodeAdded( const GeoDataCoordinates &coordinates ); 0084 void itemMoved( GeoDataPlacemark *placemark ); 0085 void mouseMoveGeoPosition( const QString& ); 0086 0087 private Q_SLOTS: 0088 void enableModel( bool enabled ); 0089 void askToRemoveFocusItem(); 0090 void removeFocusItem(); 0091 void clearAnnotations(); 0092 void saveAnnotationFile(); 0093 void loadAnnotationFile(); 0094 void openAnnotationFile(const QString&); 0095 void copyItem(); 0096 void cutItem(); 0097 void pasteItem(); 0098 0099 void addTextAnnotation(); 0100 void editTextAnnotation(); 0101 void stopEditingTextAnnotation( int result ); 0102 0103 void addOverlay(); 0104 void editOverlay(); 0105 void removeOverlay(); 0106 void updateOverlayFrame( GeoDataGroundOverlay *overlay ); 0107 0108 void addPolygon(); 0109 void stopEditingPolygon( int result ); 0110 void setAddingPolygonHole( bool enabled ); 0111 void setAddingNodes( bool enabled ); 0112 void editPolygon(); 0113 void selectNode(); 0114 void deleteNode(); 0115 void deselectNodes(); 0116 void deleteSelectedNodes(); 0117 void setAreaAvailable(); 0118 0119 void addPolyline(); 0120 void editPolyline(); 0121 void stopEditingPolyline( int result ); 0122 void setPolylineAvailable(); 0123 0124 void addRelation( const OsmPlacemarkData &relationOsmData ); 0125 void downloadOsm(); 0126 0127 protected: 0128 bool eventFilter( QObject *watched, QEvent *event ) override; 0129 0130 private: 0131 void addContextItems(); 0132 void setupActions( MarbleWidget *marbleWidget ); 0133 static void disableActions(QActionGroup *group); 0134 static void enableAllActions(QActionGroup *group); 0135 void enableActionsOnItemType( const QString &type ); 0136 void disableFocusActions(); 0137 0138 void setupTextAnnotationRmbMenu(); 0139 void showTextAnnotationRmbMenu( qreal x, qreal y ); 0140 0141 void setupGroundOverlayModel(); 0142 void setupOverlayRmbMenu(); 0143 void showOverlayRmbMenu( GeoDataGroundOverlay *overlay, qreal x, qreal y ); 0144 void displayOverlayFrame( GeoDataGroundOverlay *overlay ); 0145 void clearOverlayFrames(); 0146 0147 void setupPolygonRmbMenu(); 0148 void setupNodeRmbMenu(); 0149 void showPolygonRmbMenu( qreal x, qreal y ); 0150 void showNodeRmbMenu( qreal x, qreal y ); 0151 0152 void setupPolylineRmbMenu(); 0153 void showPolylineRmbMenu( qreal x, qreal y ); 0154 0155 void handleUncaughtEvents( QMouseEvent *mouseEvent ); 0156 void handleReleaseOverlay( QMouseEvent *mouseEvent ); 0157 bool handleDrawingPolyline( QMouseEvent *mouseEvent ); 0158 bool handleDrawingPolygon( QMouseEvent *mouseEvent ); 0159 bool handleMovingSelectedItem( QMouseEvent *mouseEvent ); 0160 0161 void handleRequests( QMouseEvent *mouseEvent, SceneGraphicsItem *item ); 0162 void handleSuccessfulPressEvent( QMouseEvent *mouseEvent, SceneGraphicsItem *item ); 0163 void handleSuccessfulHoverEvent( QMouseEvent *mouseEvent, SceneGraphicsItem *item ); 0164 void handleSuccessfulReleaseEvent( QMouseEvent *mouseEvent, SceneGraphicsItem *item ); 0165 0166 void announceStateChanged( SceneGraphicsItem::ActionState newState ); 0167 void setupCursor( SceneGraphicsItem *item ); 0168 0169 const GeoDataCoordinates mouseGeoDataCoordinates(QMouseEvent *mouseEvent) const; 0170 0171 bool m_isInitialized; 0172 bool m_widgetInitialized; 0173 MarbleWidget *m_marbleWidget; 0174 0175 QMenu *m_overlayRmbMenu; 0176 QMenu *m_polygonRmbMenu; 0177 QMenu *m_nodeRmbMenu; 0178 QMenu *m_textAnnotationRmbMenu; 0179 QMenu *m_polylineRmbMenu; 0180 0181 QList<QActionGroup*> m_actions; 0182 QSortFilterProxyModel m_groundOverlayModel; 0183 QMap<GeoDataGroundOverlay*, SceneGraphicsItem*> m_groundOverlayFrames; 0184 0185 // A list of all osm relations 0186 QHash<qint64, OsmPlacemarkData> m_osmRelations; 0187 0188 0189 GeoDataDocument* m_annotationDocument; 0190 QList<SceneGraphicsItem*> m_graphicsItems; 0191 0192 SceneGraphicsItem *m_movedItem; 0193 SceneGraphicsItem *m_focusItem; 0194 SceneGraphicsItem *m_editedItem; 0195 GeoDataGroundOverlay *m_rmbOverlay; 0196 0197 GeoDataPlacemark *m_polylinePlacemark; 0198 GeoDataPlacemark *m_polygonPlacemark; 0199 0200 GeoDataCoordinates m_fromWhereToCopy; 0201 SceneGraphicsItem *m_clipboardItem; 0202 QAction *m_pasteGraphicItem; 0203 0204 bool m_drawingPolygon; 0205 bool m_drawingPolyline; 0206 bool m_addingPlacemark; 0207 bool m_editingDialogIsShown; 0208 }; 0209 0210 } 0211 0212 #endif // MARBLE_ANNOTATEPLUGIN_H