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