73227452c3
# Conflicts: # src/GlobeWidget.cpp # src/GlobeWidget.h # src/MainWindow.h # src/MapWidget.cpp # src/MapWidget.h # src/RinexNavigation.cpp
97 lines
3.0 KiB
C++
97 lines
3.0 KiB
C++
#pragma once
|
|
|
|
#include "TelemetryPoint.h"
|
|
|
|
#include <QHash>
|
|
#include <QPixmap>
|
|
#include <QPoint>
|
|
#include <QSet>
|
|
#include <QWidget>
|
|
|
|
#include <optional>
|
|
|
|
class QNetworkAccessManager;
|
|
class QLabel;
|
|
|
|
class MapWidget : public QWidget {
|
|
Q_OBJECT
|
|
|
|
public:
|
|
explicit MapWidget(QWidget *parent = nullptr);
|
|
|
|
void setPoints(const QVector<TelemetryPoint> &points);
|
|
void fitToPoints();
|
|
void clearPoints();
|
|
void setAverageMarker(double latitude, double longitude, double radiusMeters);
|
|
void clearAverageMarker();
|
|
void setCepMarker(double latitude, double longitude,
|
|
const std::optional<double> &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<TelemetryPoint> m_points;
|
|
QNetworkAccessManager *m_network = nullptr;
|
|
QLabel *m_attributionLabel = nullptr;
|
|
QHash<QString, QPixmap> m_tileCache;
|
|
QSet<QString> 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<double> m_cepRadiusMeters;
|
|
bool m_dragging = false;
|
|
QPoint m_lastMousePos;
|
|
double m_wheelZoomAccumulator = 0.0;
|
|
};
|