#include "coordinates/scenecoordinate.h"
#include "mapcommon.h"
#include "mapscroller.h"
+#include "ui/panelcommon.h"
#include "mapview.h"
m_scrollAndZoomAnimation->addAnimation(m_zoomAnimation);
connect(m_scrollAndZoomAnimation, SIGNAL(finished()),
this, SLOT(doubleTapZoomFinished()));
+
+ m_centerShiftAnimation = new QPropertyAnimation(this, "viewShift", this);
+ if (m_centerShiftAnimation) {
+ m_centerShiftAnimation->setStartValue(0.0);
+ m_centerShiftAnimation->setDuration(ZOOM_TIME_MS);
+ }
+}
+
+MapView::~MapView()
+{
+ qDebug() << __PRETTY_FUNCTION__;
+
+ m_scrollAndZoomAnimation->removeAnimation(m_scroller);
+ delete m_scrollAndZoomAnimation;
+}
+
+QPointF MapView::center() const
+{
+ return mapToScene(m_viewCenterPoint) - m_centerHorizontalShiftPoint;
}
void MapView::centerToSceneCoordinates(const SceneCoordinate &coordinate)
{
qDebug() << __PRETTY_FUNCTION__ << "coordinate" << coordinate;
- centerOn(coordinate.toPointF());
+ QPointF target = coordinate.toPointF();
+ m_lastSetScenePosition = coordinate;
+
+ target += m_centerHorizontalShiftPoint;
+
+ centerOn(target);
+}
+
+void MapView::disableCenterShift()
+{
+ qDebug() << __PRETTY_FUNCTION__;
+
+ if (m_centerShiftAnimation) {
+ m_centerShiftAnimation->setDirection(QAbstractAnimation::Backward);
+ m_centerShiftAnimation->start();
+ }
}
void MapView::doubleTapZoomFinished()
emit zoomIn();
}
+void MapView::enableCenterShift()
+{
+ qDebug() << __PRETTY_FUNCTION__;
+
+ if (m_centerShiftAnimation) {
+ m_centerShiftAnimation->setDirection(QAbstractAnimation::Forward);
+ m_centerShiftAnimation->start();
+ }
+}
+
void MapView::mouseDoubleClickEvent(QMouseEvent *event)
{
qDebug() << __PRETTY_FUNCTION__;
if (m_zoomLevel + 1 <= OSM_MAX_ZOOM_LEVEL) {
QPoint pressPosition = mapToScene(event->pos()).toPoint();
QPoint viewCenterPosition = mapToScene(width() / 2 - 1, height() / 2 - 1).toPoint();
- QPoint zoomPosition = viewCenterPosition - ((viewCenterPosition - pressPosition) / 2);
+ QPoint zoomPosition = viewCenterPosition - ((viewCenterPosition - pressPosition) / 2)
+ - m_centerHorizontalShiftPoint.toPoint() / 2;
m_scrollAndZoomAnimation->stop();
m_doubleTapZoomRunning = true;
m_scroller->setEasingCurve(QEasingCurve::Linear);
m_scroller->setDuration(ZOOM_TIME_MS);
- m_scroller->setStartValue(SceneCoordinate(m_scenePosition.x(), m_scenePosition.y()));
+ QPointF centerPoint = center();
+ m_scroller->setStartValue(SceneCoordinate(centerPoint.x(), centerPoint.y()));
m_scroller->setEndValue(SceneCoordinate(zoomPosition.x(), zoomPosition.y()));
m_zoomAnimation->setEasingCurve(QEasingCurve::InQuad);
m_zoomAnimation->setDuration(ZOOM_TIME_MS);
m_zoomAnimation->setStartValue(viewScale());
- m_zoomAnimation->setEndValue(pow(2, m_zoomLevel+1 - OSM_MAX_ZOOM_LEVEL));
+ m_zoomAnimation->setEndValue(pow(2, m_zoomLevel + 1 - OSM_MAX_ZOOM_LEVEL));
m_scrollAndZoomAnimation->start();
}
if (m_doubleTapZoomRunning)
return;
- m_scenePosition += m_mouseLastScenePosition - mapToScene(event->pos()).toPoint();
+ m_internalScenePosition += m_lastMouseEventScenePosition - mapToScene(event->pos()).toPoint();
if (m_index >= VALUES)
m_index = 0;
- m_dragMovement[m_index] = m_mouseLastViewPosition - event->pos();
+ m_dragMovement[m_index] = m_lastMouseEventViewPosition - event->pos();
m_dragTime[m_index] = m_time.elapsed();
m_time.start();
m_index++;
- emit viewScrolled(SceneCoordinate(m_scenePosition.x(), m_scenePosition.y()));
+ QPointF viewCenterPoint = m_internalScenePosition - m_centerHorizontalShiftPoint;
- m_mouseLastScenePosition = mapToScene(event->pos()).toPoint();
- m_mouseLastViewPosition = event->pos();
+ emit viewScrolled(SceneCoordinate(viewCenterPoint.x(), viewCenterPoint.y()));
+
+ m_lastMouseEventScenePosition = mapToScene(event->pos()).toPoint();
+ m_lastMouseEventViewPosition = event->pos();
}
void MapView::mousePressEvent(QMouseEvent *event)
QGraphicsView::mousePressEvent(event);
- m_mouseLastScenePosition = mapToScene(event->pos()).toPoint();
- m_mouseLastViewPosition = event->pos();
- m_scenePosition = mapToScene(width() / 2 - 1, height() / 2 - 1).toPoint();
+ m_lastMouseEventScenePosition = mapToScene(event->pos()).toPoint();
+ m_lastMouseEventViewPosition = event->pos();
+ m_internalScenePosition = mapToScene(width() / 2 - 1, height() / 2 - 1).toPoint();
for (int i = 0; i < VALUES; i++) {
m_dragMovement[i] = QPoint();
m_scroller->setEasingCurve(QEasingCurve::OutCirc);
m_scroller->setDuration(KINETIC_SCROLL_TIME_MS);
- m_scroller->setStartValue(SceneCoordinate(m_scenePosition.x(), m_scenePosition.y()));
- QPointF endValue = QPointF(m_scenePosition) + effectSceneDistance;
+ QPointF centerPoint = center();
+ m_scroller->setStartValue(SceneCoordinate(centerPoint.x(), centerPoint.y()));
+ QPointF endValue = centerPoint + effectSceneDistance;
m_scroller->setEndValue(SceneCoordinate(endValue.x(), endValue.y()));
m_scroller->start();
}
m_kineticMaxViewDistance = qMax(width(), height()) * KINETIC_MAX_VIEW_DISTANCE_FACTOR;
+ m_viewCenterPoint.setX(event->size().width() / 2);
+ m_viewCenterPoint.setY(event->size().height() / 2);
+
emit viewResized(event->size());
+
+ if (m_centerShiftAnimation) {
+ int mapVisibleWidth = event->size().width() - PANEL_WIDTH - PANEL_BAR_WIDTH;
+ int shiftFromMiddle = m_viewCenterPoint.x() - (mapVisibleWidth / 2);
+ m_centerShiftAnimation->setEndValue(shiftFromMiddle);
+ updateCenterShift();
+ }
}
void MapView::setViewScale(qreal viewScale)
QTransform transform;
transform.scale(viewScale, viewScale);
setTransform(transform);
+
+ updateCenterShift();
+}
+
+void MapView::setViewShift(qreal viewShift)
+{
+ qDebug() << __PRETTY_FUNCTION__;
+
+ m_centerHorizontalShiftViewPixels = viewShift;
+ emit horizontalShiftingChanged(m_centerHorizontalShiftViewPixels);
+
+ updateCenterShift();
}
void MapView::setZoomLevel(int zoomLevel)
}
}
-qreal MapView::viewScale()
+void MapView::updateCenterShift()
+{
+ qDebug() << __PRETTY_FUNCTION__;
+
+ m_centerHorizontalShiftPoint = QPointF(m_centerHorizontalShiftViewPixels * (1.0 / viewScale()),
+ 0);
+
+ centerToSceneCoordinates(m_lastSetScenePosition);
+}
+
+qreal MapView::viewScale() const
{
qDebug() << __PRETTY_FUNCTION__;
return transform().m11();
}
-MapView::~MapView()
+qreal MapView::viewShift() const
{
qDebug() << __PRETTY_FUNCTION__;
- m_scrollAndZoomAnimation->removeAnimation(m_scroller);
- delete m_scrollAndZoomAnimation;
+ return m_centerHorizontalShiftViewPixels;
}