mirror of
https://github.com/tumic0/GPXSee.git
synced 2024-11-28 05:34:47 +01:00
Added digital zoom
This commit is contained in:
parent
33cb944e36
commit
03ef7a9147
22
src/gui.cpp
22
src/gui.cpp
@ -594,18 +594,24 @@ void GUI::keys()
|
||||
msgBox.setWindowTitle(tr("Keyboard controls"));
|
||||
msgBox.setText("<h3>" + tr("Keyboard controls") + "</h3>");
|
||||
msgBox.setInformativeText(
|
||||
"<div><table width=\"300\"><tr><td>" + tr("Next file")
|
||||
+ "</td><td><i>" + QKeySequence(NEXT_KEY).toString()
|
||||
"<style>td {padding-right: 1.5em;}</style><div><table><tr><td>"
|
||||
+ tr("Next file") + "</td><td><i>" + QKeySequence(NEXT_KEY).toString()
|
||||
+ "</i></td></tr><tr><td>" + tr("Previous file")
|
||||
+ "</td><td><i>" + QKeySequence(PREV_KEY).toString()
|
||||
+ "</i></td></tr><tr><td>" + tr("First file") + "</td><td><i>"
|
||||
+ QKeySequence(FIRST_KEY).toString() + "</i></td></tr><tr><td>"
|
||||
+ tr("Last file") + "</td><td><i>" + QKeySequence(LAST_KEY).toString()
|
||||
+ "</i></td></tr><tr><td>" + tr("Append modifier")
|
||||
+ "</td><td><i>SHIFT</i></td></tr><tr><td></td><td></td></tr><tr><td>"
|
||||
+ tr("Next map") + "</td><td><i>" + NEXT_MAP_SHORTCUT.toString()
|
||||
+ "</i></td></tr><tr><td>" + tr("Previous map") + "</td><td><i>"
|
||||
+ PREV_MAP_SHORTCUT.toString() + "</i></td></tr></table></div>");
|
||||
+ "</i></td></tr><tr><td>" + tr("Append file")
|
||||
+ "</td><td><i>" + QKeySequence(MODIFIER).toString() + tr("Next/Previous")
|
||||
+ "</i></td></tr><tr><td></td><td></td></tr><tr><td>" + tr("Next map")
|
||||
+ "</td><td><i>" + NEXT_MAP_SHORTCUT.toString() + "</i></td></tr><tr><td>"
|
||||
+ tr("Previous map") + "</td><td><i>" + PREV_MAP_SHORTCUT.toString()
|
||||
+ "</i></td></tr><tr><td></td><td></td></tr><tr><td>" + tr("Zoom in")
|
||||
+ "</td><td><i>" + QKeySequence(ZOOM_IN).toString()
|
||||
+ "</i></td></tr><tr><td>" + tr("Zoom out") + "</td><td><i>"
|
||||
+ QKeySequence(ZOOM_OUT).toString() + "</i></td></tr><tr><td>"
|
||||
+ tr("Digital zoom") + "</td><td><i>" + QKeySequence(MODIFIER).toString()
|
||||
+ tr("Zoom") + "</i></td></tr></table></div>");
|
||||
|
||||
msgBox.exec();
|
||||
}
|
||||
@ -1321,6 +1327,8 @@ void GUI::keyPressEvent(QKeyEvent *event)
|
||||
closeFiles();
|
||||
openFile(file);
|
||||
}
|
||||
|
||||
QMainWindow::keyPressEvent(event);
|
||||
}
|
||||
|
||||
void GUI::closeEvent(QCloseEvent *event)
|
||||
|
@ -10,6 +10,9 @@
|
||||
#define LAST_KEY Qt::Key_End
|
||||
#define MODIFIER Qt::ShiftModifier
|
||||
|
||||
#define ZOOM_IN QKeySequence::ZoomIn
|
||||
#define ZOOM_OUT QKeySequence::ZoomOut
|
||||
|
||||
#define QUIT_SHORTCUT QKeySequence(QKeySequence::Quit)
|
||||
#define OPEN_SHORTCUT QKeySequence(QKeySequence::Open)
|
||||
#define CLOSE_SHORTCUT QKeySequence(QKeySequence::Close)
|
||||
@ -22,6 +25,7 @@
|
||||
#define SHOW_GRAPHS_SHORTCUT QKeySequence(Qt::CTRL + Qt::Key_G)
|
||||
#define DISTANCE_GRAPH_SHORTCUT QKeySequence(Qt::CTRL + Qt::Key_D)
|
||||
#define TIME_GRAPH_SHORTCUT QKeySequence(Qt::CTRL + Qt::Key_T)
|
||||
|
||||
#ifdef Q_OS_MAC
|
||||
#define FULLSCREEN_SHORTCUT QKeySequence(Qt::META + Qt::CTRL + Qt::Key_F)
|
||||
#else // Q_OS_MAC
|
||||
|
@ -24,6 +24,7 @@ PathItem::PathItem(const Path &path, Map *map, QGraphicsItem *parent)
|
||||
|
||||
_marker = new MarkerItem(this);
|
||||
_marker->setPos(position(_path.at(0).distance()));
|
||||
_marker->setFlag(QGraphicsItem::ItemIgnoresTransformations);
|
||||
_md = _path.at(0).distance();
|
||||
|
||||
setCursor(Qt::ArrowCursor);
|
||||
@ -79,7 +80,7 @@ void PathItem::setColor(const QColor &color)
|
||||
update();
|
||||
}
|
||||
|
||||
void PathItem::setWidth(int width)
|
||||
void PathItem::setWidth(qreal width)
|
||||
{
|
||||
prepareGeometryChange();
|
||||
|
||||
|
@ -26,7 +26,7 @@ public:
|
||||
void setMap(Map *map);
|
||||
|
||||
void setColor(const QColor &color);
|
||||
void setWidth(int width);
|
||||
void setWidth(qreal width);
|
||||
void setStyle(Qt::PenStyle style);
|
||||
|
||||
void showMarker(bool show) {_marker->setVisible(show);}
|
||||
@ -52,7 +52,7 @@ private:
|
||||
Map *_map;
|
||||
qreal _md;
|
||||
|
||||
int _width;
|
||||
qreal _width;
|
||||
QPen _pen;
|
||||
QPainterPath _shape;
|
||||
QPainterPath _painterPath;
|
||||
|
117
src/pathview.cpp
117
src/pathview.cpp
@ -1,7 +1,7 @@
|
||||
#include <QGraphicsView>
|
||||
#include <QGraphicsScene>
|
||||
#include <QWheelEvent>
|
||||
#include <QSysInfo>
|
||||
#include <QApplication>
|
||||
#include "opengl.h"
|
||||
#include "misc.h"
|
||||
#include "poi.h"
|
||||
@ -12,9 +12,11 @@
|
||||
#include "routeitem.h"
|
||||
#include "waypointitem.h"
|
||||
#include "scaleitem.h"
|
||||
#include "keys.h"
|
||||
#include "pathview.h"
|
||||
|
||||
|
||||
#define MAX_ZOOM 1
|
||||
#define MIN_ZOOM -3
|
||||
#define MARGIN 10.0
|
||||
#define SCALE_OFFSET 7
|
||||
|
||||
@ -48,6 +50,7 @@ PathView::PathView(Map *map, POI *poi, QWidget *parent)
|
||||
|
||||
_mapScale = new ScaleItem();
|
||||
_mapScale->setZValue(2.0);
|
||||
_mapScale->setFlag(QGraphicsItem::ItemIgnoresTransformations);
|
||||
|
||||
_map = map;
|
||||
_poi = poi;
|
||||
@ -71,6 +74,7 @@ PathView::PathView(Map *map, POI *poi, QWidget *parent)
|
||||
_routeStyle = Qt::DashLine;
|
||||
|
||||
_plot = false;
|
||||
_digitalZoom = 0;
|
||||
|
||||
_scene->setSceneRect(_map->bounds());
|
||||
_res = _map->resolution(_scene->sceneRect().center());
|
||||
@ -93,7 +97,7 @@ PathItem *PathView::addTrack(const Track &track)
|
||||
_tracks.append(ti);
|
||||
_tr |= ti->path().boundingRect();
|
||||
ti->setColor(_palette.nextColor());
|
||||
ti->setWidth(_trackWidth);
|
||||
ti->setWidth(_trackWidth * pow(2, -_digitalZoom));
|
||||
ti->setStyle(_trackStyle);
|
||||
ti->setVisible(_showTracks);
|
||||
_scene->addItem(ti);
|
||||
@ -114,7 +118,7 @@ PathItem *PathView::addRoute(const Route &route)
|
||||
_routes.append(ri);
|
||||
_rr |= ri->path().boundingRect();
|
||||
ri->setColor(_palette.nextColor());
|
||||
ri->setWidth(_routeWidth);
|
||||
ri->setWidth(_routeWidth * pow(2, -_digitalZoom));
|
||||
ri->setStyle(_routeStyle);
|
||||
ri->setVisible(_showRoutes);
|
||||
ri->showWaypoints(_showRouteWaypoints);
|
||||
@ -138,6 +142,7 @@ void PathView::addWaypoints(const QList<Waypoint> &waypoints)
|
||||
wi->setZValue(1);
|
||||
wi->showLabel(_showWaypointLabels);
|
||||
wi->setVisible(_showWaypoints);
|
||||
wi->setFlag(QGraphicsItem::ItemIgnoresTransformations);
|
||||
_scene->addItem(wi);
|
||||
}
|
||||
|
||||
@ -268,6 +273,8 @@ void PathView::setMap(Map *map)
|
||||
_map->load();
|
||||
connect(_map, SIGNAL(loaded()), this, SLOT(redraw()));
|
||||
|
||||
resetDigitalZoom();
|
||||
|
||||
mapScale();
|
||||
_scene->setSceneRect(_map->bounds());
|
||||
|
||||
@ -278,6 +285,11 @@ void PathView::setMap(Map *map)
|
||||
for (int i = 0; i < _waypoints.size(); i++)
|
||||
_waypoints.at(i)->setMap(map);
|
||||
|
||||
QHash<Waypoint, WaypointItem*>::const_iterator it;
|
||||
for (it = _pois.constBegin(); it != _pois.constEnd(); it++)
|
||||
it.value()->setMap(_map);
|
||||
updatePOIVisibility();
|
||||
|
||||
QPointF center = contentCenter();
|
||||
centerOn(center);
|
||||
|
||||
@ -328,6 +340,7 @@ void PathView::addPOI(const QVector<Waypoint> &waypoints)
|
||||
pi->setZValue(1);
|
||||
pi->showLabel(_showPOILabels);
|
||||
pi->setVisible(_showPOI);
|
||||
pi->setFlag(QGraphicsItem::ItemIgnoresTransformations);
|
||||
_scene->addItem(pi);
|
||||
|
||||
_pois.insert(w, pi);
|
||||
@ -357,22 +370,62 @@ void PathView::redraw()
|
||||
resetCachedContent();
|
||||
}
|
||||
|
||||
void PathView::zoom(const QPoint &pos, const Coordinates &c)
|
||||
void PathView::resetDigitalZoom()
|
||||
{
|
||||
QPoint offset = pos - viewport()->rect().center();
|
||||
_digitalZoom = 0;
|
||||
|
||||
rescale();
|
||||
resetTransform();
|
||||
|
||||
QPointF center = _map->ll2xy(c) - offset;
|
||||
centerOn(center);
|
||||
setTrackWidth(_trackWidth);
|
||||
setRouteWidth(_routeWidth);
|
||||
}
|
||||
|
||||
_res = _map->resolution(center);
|
||||
_mapScale->setResolution(_res);
|
||||
void PathView::digitalZoom(int zoom)
|
||||
{
|
||||
_digitalZoom += zoom;
|
||||
scale(pow(2, zoom), pow(2, zoom));
|
||||
|
||||
setTrackWidth(_trackWidth);
|
||||
setRouteWidth(_routeWidth);
|
||||
|
||||
_mapScale->setResolution(_res * pow(2, -_digitalZoom));
|
||||
}
|
||||
|
||||
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
|
||||
>= MAX_ZOOM)) || ((_digitalZoom < 0 && zoom < 0) && (!shift
|
||||
|| _digitalZoom <= MIN_ZOOM)))
|
||||
return;
|
||||
|
||||
digitalZoom(zoom);
|
||||
} else {
|
||||
qreal os, ns;
|
||||
os = _map->zoom();
|
||||
ns = (zoom > 0) ? _map->zoomIn() : _map->zoomOut();
|
||||
|
||||
if (ns != os) {
|
||||
QPoint offset = pos - viewport()->rect().center();
|
||||
|
||||
rescale();
|
||||
|
||||
QPointF center = _map->ll2xy(c) - offset;
|
||||
centerOn(center);
|
||||
|
||||
_res = _map->resolution(center);
|
||||
_mapScale->setResolution(_res);
|
||||
} else {
|
||||
if (shift)
|
||||
digitalZoom(zoom);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void PathView::wheelEvent(QWheelEvent *event)
|
||||
{
|
||||
qreal os, ns;
|
||||
static int deg = 0;
|
||||
|
||||
deg += event->delta() / 8;
|
||||
@ -380,48 +433,39 @@ void PathView::wheelEvent(QWheelEvent *event)
|
||||
return;
|
||||
deg = 0;
|
||||
|
||||
os = _map->zoom();
|
||||
Coordinates c = _map->xy2ll(mapToScene(event->pos()));
|
||||
|
||||
ns = (event->delta() > 0) ? _map->zoomIn() : _map->zoomOut();
|
||||
if (ns != os)
|
||||
zoom(event->pos(), c);
|
||||
zoom((event->delta() > 0) ? 1 : -1, event->pos(), c);
|
||||
}
|
||||
|
||||
void PathView::mouseDoubleClickEvent(QMouseEvent *event)
|
||||
{
|
||||
qreal os, ns;
|
||||
|
||||
if (event->button() != Qt::LeftButton && event->button() != Qt::RightButton)
|
||||
return;
|
||||
|
||||
os = _map->zoom();
|
||||
Coordinates c = _map->xy2ll(mapToScene(event->pos()));
|
||||
|
||||
ns = (event->button() == Qt::LeftButton) ? _map->zoomIn() : _map->zoomOut();
|
||||
if (ns != os)
|
||||
zoom(event->pos(), c);
|
||||
zoom((event->button() == Qt::LeftButton) ? 1 : -1, event->pos(), c);
|
||||
}
|
||||
|
||||
void PathView::keyPressEvent(QKeyEvent *event)
|
||||
{
|
||||
qreal os, ns;
|
||||
int z;
|
||||
|
||||
os = _map->zoom();
|
||||
QPoint pos = QRect(QPoint(), viewport()->size()).center();
|
||||
Coordinates c = _map->xy2ll(mapToScene(pos));
|
||||
|
||||
if (event->matches(QKeySequence::ZoomIn))
|
||||
ns = _map->zoomIn();
|
||||
else if (event->matches(QKeySequence::ZoomOut))
|
||||
ns = _map->zoomOut();
|
||||
if (event->matches(ZOOM_IN))
|
||||
z = 1;
|
||||
else if (event->matches(ZOOM_OUT))
|
||||
z = -1;
|
||||
else {
|
||||
QWidget::keyPressEvent(event);
|
||||
if (_digitalZoom && event->key() == Qt::Key_Escape )
|
||||
resetDigitalZoom();
|
||||
|
||||
QGraphicsView::keyPressEvent(event);
|
||||
return;
|
||||
}
|
||||
|
||||
if (ns != os)
|
||||
zoom(pos, c);
|
||||
zoom(z, pos, c);
|
||||
}
|
||||
|
||||
void PathView::plot(QPainter *painter, const QRectF &target)
|
||||
@ -474,6 +518,9 @@ void PathView::clear()
|
||||
|
||||
_tr = QRectF(); _rr = QRectF(); _wr = QRectF();
|
||||
_wp = QPointF();
|
||||
|
||||
_digitalZoom = 0;
|
||||
resetTransform();
|
||||
}
|
||||
|
||||
void PathView::showTracks(bool show)
|
||||
@ -559,7 +606,7 @@ void PathView::setTrackWidth(int width)
|
||||
_trackWidth = width;
|
||||
|
||||
for (int i = 0; i < _tracks.count(); i++)
|
||||
_tracks.at(i)->setWidth(width);
|
||||
_tracks.at(i)->setWidth(width * pow(2, -_digitalZoom));
|
||||
}
|
||||
|
||||
void PathView::setRouteWidth(int width)
|
||||
@ -567,7 +614,7 @@ void PathView::setRouteWidth(int width)
|
||||
_routeWidth = width;
|
||||
|
||||
for (int i = 0; i < _routes.count(); i++)
|
||||
_routes.at(i)->setWidth(width);
|
||||
_routes.at(i)->setWidth(width * pow(2, -_digitalZoom));
|
||||
}
|
||||
|
||||
void PathView::setTrackStyle(Qt::PenStyle style)
|
||||
|
@ -76,7 +76,9 @@ private:
|
||||
qreal mapScale() const;
|
||||
QPointF contentCenter() const;
|
||||
void rescale();
|
||||
void zoom(const QPoint &pos, const Coordinates &c);
|
||||
void zoom(int zoom, const QPoint &pos, const Coordinates &c);
|
||||
void digitalZoom(int zoom);
|
||||
void resetDigitalZoom();
|
||||
void updatePOIVisibility();
|
||||
void updateWaypointsBoundingRect(const QPointF &wp);
|
||||
|
||||
@ -118,6 +120,7 @@ private:
|
||||
Qt::PenStyle _trackStyle;
|
||||
Qt::PenStyle _routeStyle;
|
||||
|
||||
int _digitalZoom;
|
||||
bool _plot;
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user