1
0
mirror of https://github.com/tumic0/GPXSee.git synced 2024-10-06 23:03:22 +02:00
GPXSee/src/pathview.cpp

804 lines
18 KiB
C++
Raw Normal View History

#include <QGraphicsView>
#include <QGraphicsScene>
#include <QWheelEvent>
2017-04-05 22:53:25 +02:00
#include <QApplication>
2017-05-22 14:54:22 +02:00
#include <QPixmapCache>
#include <QScrollBar>
2016-12-20 00:11:30 +01:00
#include "opengl.h"
#include "misc.h"
2016-02-12 10:23:14 +01:00
#include "poi.h"
2016-10-23 11:09:20 +02:00
#include "data.h"
2016-02-12 10:09:17 +01:00
#include "map.h"
#include "trackitem.h"
2016-08-09 01:16:19 +02:00
#include "routeitem.h"
2016-02-19 21:34:55 +01:00
#include "waypointitem.h"
#include "scaleitem.h"
2017-04-05 22:53:25 +02:00
#include "keys.h"
2016-09-26 21:01:58 +02:00
#include "pathview.h"
2017-06-26 00:20:42 +02:00
#define MAX_DIGITAL_ZOOM 2
2017-06-26 00:20:42 +02:00
#define MIN_DIGITAL_ZOOM -3
#define MARGIN 10.0
#define SCALE_OFFSET 7
PathView::PathView(Map *map, POI *poi, QWidget *parent)
2017-07-27 19:47:46 +02:00
: QGraphicsView(parent)
{
Q_ASSERT(map != 0);
Q_ASSERT(poi != 0);
_scene = new QGraphicsScene(this);
setScene(_scene);
setCacheMode(QGraphicsView::CacheBackground);
setDragMode(QGraphicsView::ScrollHandDrag);
setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
2016-12-06 01:48:26 +01:00
setRenderHint(QPainter::Antialiasing, true);
2016-10-04 10:16:46 +02:00
setAcceptDrops(false);
_mapScale = new ScaleItem();
_mapScale->setZValue(2.0);
_scene->addItem(_mapScale);
_map = map;
_poi = poi;
2017-10-04 23:15:39 +02:00
connect(_map, SIGNAL(loaded()), this, SLOT(reloadMap()));
connect(_poi, SIGNAL(pointsChanged()), this, SLOT(updatePOI()));
2016-07-25 19:32:36 +02:00
_units = Metric;
_opacity = 1.0;
2017-09-15 00:07:09 +02:00
_backgroundColor = Qt::white;
2016-08-09 01:16:19 +02:00
_showMap = true;
2016-08-09 01:16:19 +02:00
_showTracks = true;
_showRoutes = true;
_showWaypoints = true;
_showWaypointLabels = true;
2016-10-08 14:53:10 +02:00
_showPOI = true;
2016-08-09 01:16:19 +02:00
_showPOILabels = true;
_overlapPOIs = true;
2016-08-09 10:47:49 +02:00
_showRouteWaypoints = true;
2016-12-06 01:48:26 +01:00
_trackWidth = 3;
_routeWidth = 3;
_trackStyle = Qt::SolidLine;
_routeStyle = Qt::DashLine;
_waypointSize = 8;
_waypointColor = Qt::black;
_poiSize = 8;
_poiColor = Qt::black;
2016-08-09 01:16:19 +02:00
_plot = false;
2017-04-05 22:53:25 +02:00
_digitalZoom = 0;
2017-01-20 01:17:22 +01:00
2017-09-15 00:07:09 +02:00
_map->setBackgroundColor(_backgroundColor);
_scene->setSceneRect(_map->bounds());
centerOn(_scene->sceneRect().center());
}
void PathView::centerOn(const QPointF &pos)
{
QGraphicsView::centerOn(pos);
/* Fix the offset caused by QGraphicsView::centerOn() approximation */
QPointF center = mapToScene(viewport()->rect().center());
QPoint offset((int)(pos.x() - center.x()), (int)(pos.y() - center.y()));
if (qAbs(offset.x()) == 1)
horizontalScrollBar()->setValue(horizontalScrollBar()->value()
+ offset.x());
if (qAbs(offset.y()) == 1)
verticalScrollBar()->setValue(verticalScrollBar()->value()
+ offset.y());
_res = _map->resolution(pos);
_mapScale->setResolution(_res);
}
2016-09-26 21:01:58 +02:00
PathItem *PathView::addTrack(const Track &track)
{
if (track.isNull()) {
2016-12-06 01:48:26 +01:00
_palette.nextColor();
2016-09-19 00:56:10 +02:00
return 0;
2016-03-23 20:49:40 +01:00
}
TrackItem *ti = new TrackItem(track, _map);
2016-08-09 01:16:19 +02:00
_tracks.append(ti);
2016-11-11 17:58:18 +01:00
_tr |= ti->path().boundingRect();
2016-12-06 01:48:26 +01:00
ti->setColor(_palette.nextColor());
ti->setWidth(_trackWidth);
2016-12-06 01:48:26 +01:00
ti->setStyle(_trackStyle);
ti->setUnits(_units);
2016-08-09 01:16:19 +02:00
ti->setVisible(_showTracks);
ti->setDigitalZoom(_digitalZoom);
2016-08-09 01:16:19 +02:00
_scene->addItem(ti);
2016-09-19 00:56:10 +02:00
addPOI(_poi->points(ti->path()));
2016-10-08 14:53:10 +02:00
2016-09-19 00:56:10 +02:00
return ti;
2016-03-03 09:15:56 +01:00
}
2016-09-26 21:01:58 +02:00
PathItem *PathView::addRoute(const Route &route)
2016-08-09 01:16:19 +02:00
{
if (route.isNull()) {
2016-12-06 01:48:26 +01:00
_palette.nextColor();
2016-09-19 00:56:10 +02:00
return 0;
2016-08-09 01:16:19 +02:00
}
RouteItem *ri = new RouteItem(route, _map);
2016-08-09 01:16:19 +02:00
_routes.append(ri);
2016-11-11 17:58:18 +01:00
_rr |= ri->path().boundingRect();
2016-12-06 01:48:26 +01:00
ri->setColor(_palette.nextColor());
ri->setWidth(_routeWidth);
2016-12-06 01:48:26 +01:00
ri->setStyle(_routeStyle);
ri->setUnits(_units);
2016-08-09 01:16:19 +02:00
ri->setVisible(_showRoutes);
2016-08-09 10:47:49 +02:00
ri->showWaypoints(_showRouteWaypoints);
ri->showWaypointLabels(_showWaypointLabels);
ri->setDigitalZoom(_digitalZoom);
2016-08-09 01:16:19 +02:00
_scene->addItem(ri);
2016-09-19 00:56:10 +02:00
addPOI(_poi->points(ri->path()));
2016-10-08 14:53:10 +02:00
2016-09-19 00:56:10 +02:00
return ri;
2016-08-09 01:16:19 +02:00
}
2016-09-26 21:01:58 +02:00
void PathView::addWaypoints(const QList<Waypoint> &waypoints)
2016-03-15 01:20:24 +01:00
{
for (int i = 0; i < waypoints.count(); i++) {
2016-03-19 09:06:43 +01:00
const Waypoint &w = waypoints.at(i);
2016-03-15 01:20:24 +01:00
WaypointItem *wi = new WaypointItem(w, _map);
_waypoints.append(wi);
updateWaypointsBoundingRect(wi->waypoint().coordinates());
2016-03-15 01:20:24 +01:00
wi->setZValue(1);
wi->setSize(_waypointSize);
wi->setColor(_waypointColor);
2016-08-09 01:16:19 +02:00
wi->showLabel(_showWaypointLabels);
wi->setUnits(_units);
2016-08-09 01:16:19 +02:00
wi->setVisible(_showWaypoints);
wi->setDigitalZoom(_digitalZoom);
2016-03-15 01:20:24 +01:00
_scene->addItem(wi);
}
addPOI(_poi->points(waypoints));
2016-03-15 01:20:24 +01:00
}
2016-10-23 11:09:20 +02:00
QList<PathItem *> PathView::loadData(const Data &data)
2016-03-03 09:15:56 +01:00
{
2016-09-19 00:56:10 +02:00
QList<PathItem *> paths;
qreal zoom = _map->zoom();
2016-10-23 11:09:20 +02:00
for (int i = 0; i < data.tracks().count(); i++)
paths.append(addTrack(*(data.tracks().at(i))));
for (int i = 0; i < data.routes().count(); i++)
paths.append(addRoute(*(data.routes().at(i))));
addWaypoints(data.waypoints());
2016-03-15 01:20:24 +01:00
2016-08-09 01:16:19 +02:00
if (_tracks.empty() && _routes.empty() && _waypoints.empty())
2016-09-19 00:56:10 +02:00
return paths;
2016-03-15 01:20:24 +01:00
if (mapZoom() != zoom)
rescale();
2017-01-20 01:17:22 +01:00
else
2016-10-08 14:53:10 +02:00
updatePOIVisibility();
centerOn(contentCenter());
2016-09-19 00:56:10 +02:00
return paths;
}
void PathView::updateWaypointsBoundingRect(const Coordinates &wp)
{
2017-06-30 18:15:22 +02:00
if (_wr.isNull())
_wr = RectC(wp, wp);
else
_wr.unite(wp);
}
qreal PathView::mapZoom() const
{
RectC br = _tr | _rr | _wr;
2016-03-15 01:20:24 +01:00
return _map->zoomFit(viewport()->size() - QSize(2*MARGIN, 2*MARGIN), br);
2016-03-15 01:20:24 +01:00
}
QPointF PathView::contentCenter() const
{
RectC br = _tr | _rr | _wr;
2017-06-30 18:15:22 +02:00
return _map->ll2xy(br.center());
}
2016-10-08 14:53:10 +02:00
void PathView::updatePOIVisibility()
{
QHash<SearchPointer<Waypoint>, WaypointItem*>::const_iterator it, jt;
2016-10-08 14:53:10 +02:00
if (!_showPOI)
return;
for (it = _pois.constBegin(); it != _pois.constEnd(); it++)
it.value()->show();
if (!_overlapPOIs) {
for (it = _pois.constBegin(); it != _pois.constEnd(); it++) {
for (jt = _pois.constBegin(); jt != _pois.constEnd(); jt++) {
if (it.value()->isVisible() && jt.value()->isVisible()
&& it != jt && it.value()->collidesWithItem(jt.value()))
jt.value()->hide();
}
}
}
}
void PathView::rescale()
{
_scene->setSceneRect(_map->bounds());
resetCachedContent();
2017-01-16 09:54:12 +01:00
2016-08-09 01:16:19 +02:00
for (int i = 0; i < _tracks.size(); i++)
_tracks.at(i)->setMap(_map);
2016-08-09 01:16:19 +02:00
for (int i = 0; i < _routes.size(); i++)
_routes.at(i)->setMap(_map);
for (int i = 0; i < _waypoints.size(); i++)
_waypoints.at(i)->setMap(_map);
2016-03-15 01:20:24 +01:00
QHash<SearchPointer<Waypoint>, WaypointItem*>::const_iterator it;
2016-10-08 14:53:10 +02:00
for (it = _pois.constBegin(); it != _pois.constEnd(); it++)
it.value()->setMap(_map);
2016-10-08 14:53:10 +02:00
updatePOIVisibility();
}
2016-12-06 01:48:26 +01:00
void PathView::setPalette(const Palette &palette)
{
_palette = palette;
_palette.reset();
for (int i = 0; i < _tracks.count(); i++)
_tracks.at(i)->setColor(_palette.nextColor());
for (int i = 0; i < _routes.count(); i++)
_routes.at(i)->setColor(_palette.nextColor());
}
void PathView::setMap(Map *map)
{
2017-06-27 22:42:59 +02:00
QPointF pos = mapToScene(viewport()->rect().center());
2017-06-26 00:20:42 +02:00
Coordinates center = _map->xy2ll(pos);
qreal resolution = _map->resolution(pos);
_map->unload();
2017-10-04 23:15:39 +02:00
disconnect(_map, SIGNAL(loaded()), this, SLOT(reloadMap()));
_map = map;
_map->load();
2017-10-04 23:15:39 +02:00
connect(_map, SIGNAL(loaded()), this, SLOT(reloadMap()));
2017-04-05 22:53:25 +02:00
resetDigitalZoom();
2017-06-26 00:20:42 +02:00
_map->zoomFit(resolution, center);
_scene->setSceneRect(_map->bounds());
for (int i = 0; i < _tracks.size(); i++)
_tracks.at(i)->setMap(map);
for (int i = 0; i < _routes.size(); i++)
_routes.at(i)->setMap(map);
for (int i = 0; i < _waypoints.size(); i++)
_waypoints.at(i)->setMap(map);
QHash<SearchPointer<Waypoint>, WaypointItem*>::const_iterator it;
2017-04-05 22:53:25 +02:00
for (it = _pois.constBegin(); it != _pois.constEnd(); it++)
it.value()->setMap(_map);
updatePOIVisibility();
centerOn(_map->ll2xy(center));
resetCachedContent();
2017-05-22 14:54:22 +02:00
QPixmapCache::clear();
}
2016-10-08 14:53:10 +02:00
void PathView::setPOI(POI *poi)
{
disconnect(_poi, SIGNAL(pointsChanged()), this, SLOT(updatePOI()));
connect(poi, SIGNAL(pointsChanged()), this, SLOT(updatePOI()));
2016-10-09 23:46:30 +02:00
2016-10-08 14:53:10 +02:00
_poi = poi;
updatePOI();
2016-10-08 14:53:10 +02:00
}
2016-10-09 23:46:30 +02:00
void PathView::updatePOI()
2016-10-08 14:53:10 +02:00
{
QHash<SearchPointer<Waypoint>, WaypointItem*>::const_iterator it;
2016-10-09 23:46:30 +02:00
for (it = _pois.constBegin(); it != _pois.constEnd(); it++) {
_scene->removeItem(it.value());
delete it.value();
}
_pois.clear();
2016-10-08 14:53:10 +02:00
for (int i = 0; i < _tracks.size(); i++)
addPOI(_poi->points(_tracks.at(i)->path()));
2016-10-08 14:53:10 +02:00
for (int i = 0; i < _routes.size(); i++)
addPOI(_poi->points(_routes.at(i)->path()));
2016-10-08 14:53:10 +02:00
addPOI(_poi->points(_waypoints));
updatePOIVisibility();
}
2016-09-26 21:01:58 +02:00
void PathView::addPOI(const QVector<Waypoint> &waypoints)
{
for (int i = 0; i < waypoints.size(); i++) {
2016-03-19 09:06:43 +01:00
const Waypoint &w = waypoints.at(i);
if (_pois.contains(SearchPointer<Waypoint>(&w)))
continue;
WaypointItem *pi = new WaypointItem(w, _map);
pi->setZValue(1);
pi->setSize(_poiSize);
pi->setColor(_poiColor);
2016-08-09 01:16:19 +02:00
pi->showLabel(_showPOILabels);
2016-10-08 14:53:10 +02:00
pi->setVisible(_showPOI);
pi->setDigitalZoom(_digitalZoom);
_scene->addItem(pi);
_pois.insert(SearchPointer<Waypoint>(&(pi->waypoint())), pi);
}
}
2016-09-26 21:01:58 +02:00
void PathView::setUnits(enum Units units)
{
2016-07-25 19:32:36 +02:00
_units = units;
_mapScale->setUnits(units);
2016-07-25 19:32:36 +02:00
2016-08-09 01:16:19 +02:00
for (int i = 0; i < _tracks.count(); i++)
_tracks[i]->setUnits(units);
for (int i = 0; i < _routes.count(); i++)
_routes[i]->setUnits(units);
2016-08-02 00:28:56 +02:00
for (int i = 0; i < _waypoints.size(); i++)
_waypoints.at(i)->setUnits(units);
QHash<SearchPointer<Waypoint>, WaypointItem*>::const_iterator it;
2016-08-02 00:28:56 +02:00
for (it = _pois.constBegin(); it != _pois.constEnd(); it++)
it.value()->setUnits(units);
}
2017-10-04 23:15:39 +02:00
void PathView::clearMapCache()
{
2017-10-04 23:15:39 +02:00
_map->clearCache();
resetCachedContent();
}
2017-04-05 22:53:25 +02:00
void PathView::resetDigitalZoom()
{
QHash<SearchPointer<Waypoint>, WaypointItem*>::const_iterator it;
_digitalZoom = 0;
2017-04-05 22:53:25 +02:00
resetTransform();
for (int i = 0; i < _tracks.size(); i++)
_tracks.at(i)->setDigitalZoom(0);
for (int i = 0; i < _routes.size(); i++)
_routes.at(i)->setDigitalZoom(0);
for (int i = 0; i < _waypoints.size(); i++)
_waypoints.at(i)->setDigitalZoom(0);
for (it = _pois.constBegin(); it != _pois.constEnd(); it++)
it.value()->setDigitalZoom(0);
_mapScale->setDigitalZoom(0);
2017-04-05 22:53:25 +02:00
}
2017-04-05 22:53:25 +02:00
void PathView::digitalZoom(int zoom)
{
QHash<SearchPointer<Waypoint>, WaypointItem*>::const_iterator it;
2017-04-05 22:53:25 +02:00
_digitalZoom += zoom;
scale(pow(2, zoom), pow(2, zoom));
for (int i = 0; i < _tracks.size(); i++)
_tracks.at(i)->setDigitalZoom(_digitalZoom);
for (int i = 0; i < _routes.size(); i++)
_routes.at(i)->setDigitalZoom(_digitalZoom);
for (int i = 0; i < _waypoints.size(); i++)
_waypoints.at(i)->setDigitalZoom(_digitalZoom);
for (it = _pois.constBegin(); it != _pois.constEnd(); it++)
it.value()->setDigitalZoom(_digitalZoom);
2017-04-05 22:53:25 +02:00
_mapScale->setDigitalZoom(_digitalZoom);
2017-04-05 22:53:25 +02:00
}
void PathView::zoom(int zoom, const QPoint &pos, const Coordinates &c)
{
bool shift = QApplication::keyboardModifiers() & Qt::ShiftModifier;
if (_digitalZoom) {
if (((_digitalZoom > 0 && zoom > 0) && (!shift || _digitalZoom
2017-06-26 00:20:42 +02:00
>= MAX_DIGITAL_ZOOM)) || ((_digitalZoom < 0 && zoom < 0) && (!shift
|| _digitalZoom <= MIN_DIGITAL_ZOOM)))
2017-04-05 22:53:25 +02:00
return;
digitalZoom(zoom);
} else {
qreal os, ns;
os = _map->zoom();
ns = (zoom > 0) ? _map->zoomIn() : _map->zoomOut();
if (ns != os) {
rescale();
centerOn(_map->ll2xy(c) - (pos - viewport()->rect().center()));
2017-04-05 22:53:25 +02:00
} else {
if (shift)
digitalZoom(zoom);
}
}
}
2016-09-26 21:01:58 +02:00
void PathView::wheelEvent(QWheelEvent *event)
{
2017-04-01 06:56:50 +02:00
static int deg = 0;
deg += event->delta() / 8;
if (qAbs(deg) < 15)
return;
deg = 0;
Coordinates c = _map->xy2ll(mapToScene(event->pos()));
2017-04-05 22:53:25 +02:00
zoom((event->delta() > 0) ? 1 : -1, event->pos(), c);
}
void PathView::mouseDoubleClickEvent(QMouseEvent *event)
{
if (event->button() != Qt::LeftButton && event->button() != Qt::RightButton)
return;
Coordinates c = _map->xy2ll(mapToScene(event->pos()));
2017-04-05 22:53:25 +02:00
zoom((event->button() == Qt::LeftButton) ? 1 : -1, event->pos(), c);
}
2016-09-26 21:01:58 +02:00
void PathView::keyPressEvent(QKeyEvent *event)
{
2017-04-05 22:53:25 +02:00
int z;
2017-06-27 22:42:59 +02:00
QPoint pos = viewport()->rect().center();
Coordinates c = _map->xy2ll(mapToScene(pos));
2017-04-05 22:53:25 +02:00
if (event->matches(ZOOM_IN))
z = 1;
else if (event->matches(ZOOM_OUT))
z = -1;
else if (_digitalZoom && event->key() == Qt::Key_Escape) {
resetDigitalZoom();
return;
} else {
2017-04-05 22:53:25 +02:00
QGraphicsView::keyPressEvent(event);
return;
}
2017-04-05 22:53:25 +02:00
zoom(z, pos, c);
}
void PathView::plot(QPainter *painter, const QRectF &target, qreal scale,
bool hires)
{
QRect orig, adj;
qreal ratio, diff, origRes, q;
2017-08-31 16:28:37 +02:00
QPointF origScene, origPos;
Coordinates origLL;
2016-05-20 22:44:03 +02:00
// Enter plot mode
setUpdatesEnabled(false);
2017-08-31 16:28:37 +02:00
_plot = true;
_map->setBlockingMode(true);
// Compute sizes & ratios
2016-05-15 13:19:07 +02:00
orig = viewport()->rect();
2017-08-31 16:28:37 +02:00
origPos = _mapScale->pos();
2016-05-27 22:45:58 +02:00
if (orig.height() * (target.width() / target.height()) - orig.width() < 0) {
ratio = target.height() / target.width();
2016-05-27 22:45:58 +02:00
diff = (orig.width() * ratio) - orig.height();
adj = orig.adjusted(0, -diff/2, 0, diff/2);
2016-05-27 22:45:58 +02:00
} else {
ratio = target.width() / target.height();
diff = (orig.height() * ratio) - orig.width();
adj = orig.adjusted(-diff/2, 0, diff/2, 0);
}
q = (target.width() / scale) / adj.width();
2017-08-31 16:28:37 +02:00
// Adjust the view for printing
if (hires) {
origScene = mapToScene(orig.center());
origLL = _map->xy2ll(origScene);
origRes = _map->resolution(origScene);
2017-08-31 16:28:37 +02:00
QPointF s(painter->device()->logicalDpiX()
/ (qreal)metric(QPaintDevice::PdmDpiX),
painter->device()->logicalDpiY()
/ (qreal)metric(QPaintDevice::PdmDpiY));
2017-08-31 16:28:37 +02:00
adj = QRect(0, 0, adj.width() * s.x(), adj.height() * s.y());
_map->zoomFit(adj.size(), _tr | _rr | _wr);
rescale();
QPointF center = contentCenter();
centerOn(center);
adj.moveCenter(mapFromScene(center));
_mapScale->setDigitalZoom(-log2(s.x() / q));
2017-08-31 16:28:37 +02:00
_mapScale->setPos(mapToScene(QPoint(adj.bottomRight() + QPoint(
-(SCALE_OFFSET + _mapScale->boundingRect().width()) * (s.x() / q),
-(SCALE_OFFSET + _mapScale->boundingRect().height()) * (s.x() / q)))));
2017-08-31 16:28:37 +02:00
} else {
_mapScale->setDigitalZoom(-log2(1.0 / q));
2017-08-31 16:28:37 +02:00
_mapScale->setPos(mapToScene(QPoint(adj.bottomRight() + QPoint(
-(SCALE_OFFSET + _mapScale->boundingRect().width()) / q ,
-(SCALE_OFFSET + _mapScale->boundingRect().height()) / q))));
2017-08-31 16:28:37 +02:00
}
2016-05-20 22:44:03 +02:00
2017-08-31 16:28:37 +02:00
// Print the view
render(painter, target, adj);
2016-05-20 22:44:03 +02:00
2017-08-31 16:28:37 +02:00
// Revert view changes to display mode
if (hires) {
_map->zoomFit(origRes, origLL);
rescale();
centerOn(origScene);
}
_mapScale->setDigitalZoom(0);
2017-08-31 16:28:37 +02:00
_mapScale->setPos(origPos);
// Exit plot mode
2017-08-31 16:28:37 +02:00
_map->setBlockingMode(false);
_plot = false;
2016-05-20 22:44:03 +02:00
setUpdatesEnabled(true);
}
2016-09-26 21:01:58 +02:00
void PathView::clear()
{
_pois.clear();
2016-08-09 01:16:19 +02:00
_tracks.clear();
_routes.clear();
_waypoints.clear();
_scene->removeItem(_mapScale);
_scene->clear();
_scene->addItem(_mapScale);
2016-03-02 09:34:39 +01:00
_palette.reset();
2017-06-30 18:15:22 +02:00
_tr = RectC();
_rr = RectC();
_wr = RectC();
2017-04-05 22:53:25 +02:00
resetDigitalZoom();
resetCachedContent();
2017-05-22 14:54:22 +02:00
QPixmapCache::clear();
}
2016-09-26 21:01:58 +02:00
void PathView::showTracks(bool show)
2016-08-09 01:16:19 +02:00
{
_showTracks = show;
for (int i = 0; i < _tracks.count(); i++)
_tracks.at(i)->setVisible(show);
}
2016-09-26 21:01:58 +02:00
void PathView::showRoutes(bool show)
2016-08-09 01:16:19 +02:00
{
_showRoutes = show;
for (int i = 0; i < _routes.count(); i++)
_routes.at(i)->setVisible(show);
}
2016-09-26 21:01:58 +02:00
void PathView::showWaypoints(bool show)
2016-08-09 01:16:19 +02:00
{
_showWaypoints = show;
for (int i = 0; i < _waypoints.count(); i++)
_waypoints.at(i)->setVisible(show);
}
2016-09-26 21:01:58 +02:00
void PathView::showWaypointLabels(bool show)
2016-08-09 01:16:19 +02:00
{
_showWaypointLabels = show;
for (int i = 0; i < _waypoints.size(); i++)
_waypoints.at(i)->showLabel(show);
for (int i = 0; i < _routes.size(); i++)
_routes.at(i)->showWaypointLabels(show);
2016-08-09 01:16:19 +02:00
}
2016-09-26 21:01:58 +02:00
void PathView::showRouteWaypoints(bool show)
2016-08-09 10:47:49 +02:00
{
_showRouteWaypoints = show;
for (int i = 0; i < _routes.size(); i++)
_routes.at(i)->showWaypoints(show);
}
void PathView::showMap(bool show)
{
_showMap = show;
resetCachedContent();
}
2016-10-08 14:53:10 +02:00
void PathView::showPOI(bool show)
{
_showPOI = show;
QHash<SearchPointer<Waypoint>, WaypointItem*>::const_iterator it;
2016-10-08 14:53:10 +02:00
for (it = _pois.constBegin(); it != _pois.constEnd(); it++)
it.value()->setVisible(show);
updatePOIVisibility();
}
2016-09-26 21:01:58 +02:00
void PathView::showPOILabels(bool show)
2016-08-09 01:16:19 +02:00
{
_showPOILabels = show;
QHash<SearchPointer<Waypoint>, WaypointItem*>::const_iterator it;
2016-08-09 01:16:19 +02:00
for (it = _pois.constBegin(); it != _pois.constEnd(); it++)
it.value()->showLabel(show);
2016-10-08 14:53:10 +02:00
updatePOIVisibility();
2016-08-09 01:16:19 +02:00
}
2016-09-26 21:01:58 +02:00
void PathView::setPOIOverlap(bool overlap)
{
2016-08-09 01:16:19 +02:00
_overlapPOIs = overlap;
2016-10-08 14:53:10 +02:00
updatePOIVisibility();
}
2016-12-06 01:48:26 +01:00
void PathView::setTrackWidth(int width)
{
_trackWidth = width;
for (int i = 0; i < _tracks.count(); i++)
_tracks.at(i)->setWidth(width);
2016-12-06 01:48:26 +01:00
}
void PathView::setRouteWidth(int width)
{
_routeWidth = width;
for (int i = 0; i < _routes.count(); i++)
_routes.at(i)->setWidth(width);
2016-12-06 01:48:26 +01:00
}
void PathView::setTrackStyle(Qt::PenStyle style)
{
_trackStyle = style;
for (int i = 0; i < _tracks.count(); i++)
_tracks.at(i)->setStyle(style);
}
void PathView::setRouteStyle(Qt::PenStyle style)
{
_routeStyle = style;
for (int i = 0; i < _routes.count(); i++)
_routes.at(i)->setStyle(style);
}
void PathView::setWaypointSize(int size)
{
_waypointSize = size;
for (int i = 0; i < _waypoints.size(); i++)
_waypoints.at(i)->setSize(size);
}
void PathView::setWaypointColor(const QColor &color)
{
_waypointColor = color;
for (int i = 0; i < _waypoints.size(); i++)
_waypoints.at(i)->setColor(color);
}
void PathView::setPOISize(int size)
{
QHash<SearchPointer<Waypoint>, WaypointItem*>::const_iterator it;
_poiSize = size;
for (it = _pois.constBegin(); it != _pois.constEnd(); it++)
it.value()->setSize(size);
}
void PathView::setPOIColor(const QColor &color)
{
QHash<SearchPointer<Waypoint>, WaypointItem*>::const_iterator it;
_poiColor = color;
for (it = _pois.constBegin(); it != _pois.constEnd(); it++)
it.value()->setColor(color);
}
void PathView::setMapOpacity(int opacity)
{
_opacity = opacity / 100.0;
resetCachedContent();
}
2017-09-15 00:07:09 +02:00
void PathView::setBackgroundColor(const QColor &color)
{
2017-09-15 00:07:09 +02:00
_backgroundColor = color;
_map->setBackgroundColor(color);
resetCachedContent();
}
2016-09-26 21:01:58 +02:00
void PathView::drawBackground(QPainter *painter, const QRectF &rect)
{
if (_showMap) {
if (_opacity < 1.0) {
2017-09-15 00:07:09 +02:00
painter->fillRect(rect, _backgroundColor);
painter->setOpacity(_opacity);
}
_map->draw(painter, rect);
} else
2017-09-15 00:07:09 +02:00
painter->fillRect(rect, _backgroundColor);
}
void PathView::resizeEvent(QResizeEvent *event)
{
qreal zoom = _map->zoom();
if (mapZoom() != zoom)
rescale();
centerOn(contentCenter());
QGraphicsView::resizeEvent(event);
}
void PathView::paintEvent(QPaintEvent *event)
{
2016-05-20 22:44:03 +02:00
QPointF scenePos = mapToScene(rect().bottomRight() + QPoint(
-(SCALE_OFFSET + _mapScale->boundingRect().width()),
-(SCALE_OFFSET + _mapScale->boundingRect().height())));
if (_mapScale->pos() != scenePos && !_plot)
_mapScale->setPos(scenePos);
QGraphicsView::paintEvent(event);
}
2016-12-06 01:48:26 +01:00
2017-01-16 09:54:12 +01:00
void PathView::scrollContentsBy(int dx, int dy)
{
QGraphicsView::scrollContentsBy(dx, dy);
QPointF center = mapToScene(viewport()->rect().center());
qreal res = _map->resolution(center);
2017-01-16 09:54:12 +01:00
if (qMax(res, _res) / qMin(res, _res) > 1.1) {
_mapScale->setResolution(res);
_res = res;
}
}
2016-12-06 01:48:26 +01:00
void PathView::useOpenGL(bool use)
{
2017-02-12 17:38:20 +01:00
if (use)
2017-01-02 23:01:50 +01:00
setViewport(new OPENGL_WIDGET);
2017-02-12 17:38:20 +01:00
else
2016-12-06 01:48:26 +01:00
setViewport(new QWidget);
}
2017-09-15 00:07:09 +02:00
void PathView::useAntiAliasing(bool use)
{
setRenderHint(QPainter::Antialiasing, use);
}
2017-10-04 23:15:39 +02:00
void PathView::reloadMap()
{
resetCachedContent();
}