#pragma once #include "TelemetryPoint.h" #include #include #include #include #include #include class QNetworkAccessManager; class QLabel; class MapWidget : public QWidget { Q_OBJECT public: explicit MapWidget(QWidget *parent = nullptr); void setPoints(const QVector &points); void fitToPoints(); void clearPoints(); void setAverageMarker(double latitude, double longitude, double radiusMeters); void clearAverageMarker(); void setCepMarker(double latitude, double longitude, const std::optional &radiusMeters); void clearCepMarker(); [[nodiscard]] QPointF centerCoordinate() const; public slots: void setAutoFollow(bool enabled); void setTelemetryOverlayEnabled(bool enabled); void setAverageOverlayEnabled(bool enabled); void setRecentPointsEnabled(bool enabled); void zoomIn(); void zoomOut(); signals: void autoFollowChanged(bool enabled); void referenceLocationSelected(double latitude, double longitude); protected: bool event(QEvent *event) override; void paintEvent(QPaintEvent *event) override; void wheelEvent(QWheelEvent *event) override; void mousePressEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override; void resizeEvent(QResizeEvent *event) override; private: QPointF coordinateToWorld(double latitude, double longitude, int zoom) const; QPointF worldToCoordinate(const QPointF &world, int zoom) const; QPointF coordinateToScreen(double latitude, double longitude) const; QPointF screenToCoordinate(const QPointF &screen) const; QPointF topLeftWorld() const; void drawTiles(QPainter &painter); void drawTelemetry(QPainter &painter); void drawLegend(QPainter &painter); void drawAverageOverlay(QPainter &painter); void drawCepOverlay(QPainter &painter); void drawCepMarker(QPainter &painter); void drawEmptyState(QPainter &painter); void requestTile(int tileX, int tileY, int zoom); void setZoomKeepingPoint(int newZoom, const QPointF &screenAnchor); void disableAutoFollowFromUserAction(); int preferredFocusIndex() const; QVector m_points; QNetworkAccessManager *m_network = nullptr; QLabel *m_attributionLabel = nullptr; QHash m_tileCache; QSet m_pendingTiles; double m_centerLat = 39.0; double m_centerLon = 35.0; int m_zoom = 6; bool m_autoFollow = true; bool m_showTelemetryOverlay = true; bool m_showAverageOverlay = true; bool m_showRecentPoints = true; bool m_hasAverageMarker = false; double m_averageLat = 0.0; double m_averageLon = 0.0; double m_averageRadiusMeters = 0.0; bool m_hasCepMarker = false; double m_cepLatitude = 0.0; double m_cepLongitude = 0.0; std::optional m_cepRadiusMeters; bool m_dragging = false; QPoint m_lastMousePos; double m_wheelZoomAccumulator = 0.0; };