MapView scale less detailed levels on current level feature

This commit is contained in:
2023-01-20 23:28:08 +03:00
parent c166c040b0
commit 4b8a7a4779
5 changed files with 47 additions and 8 deletions

View File

@@ -66,6 +66,7 @@ QPointF MapView::center() const {
void MapView::setCenter(QPointF c) {
center_ = OSM::geo2xy(c);
checkCenter();
updateViewRect();
drawBackground();
}
@@ -100,6 +101,7 @@ void MapView::mouseMoveEvent(QMouseEvent * e) {
if (is_pan) {
double mins = qMin(width(), height());
center_ -= QPointF(e->pos() - press_point) / scale_ / mins;
checkCenter();
press_point = e->pos();
updateViewRect();
drawBackground();
@@ -133,7 +135,7 @@ void MapView::paintEvent(QPaintEvent *) {
void MapView::resizeEvent(QResizeEvent *) {
cache->setMinimumCacheSize((width() + tileSize) * (height() + tileSize) * 4);
cache->setMinimumCacheSize((width() + tileSize) * (height() + tileSize) * 4 * 3);
checkZoom();
updateZoomLevel();
updateViewRect();
@@ -158,9 +160,10 @@ void MapView::drawBackground() {
for (int iy = sy; iy < ey; ++iy) {
QRectF r((ix)*ts, (iy)*ts, ts, ts);
r.translate(-offset);
auto tile = cache->getTile((OSM::TileIndex){zoom_level, ix, iy});
QRectF px_rct(QPointF(), QSizeF(tileSize, tileSize));
auto tile = cache->getTile((OSM::TileIndex){zoom_level, ix, iy}, px_rct);
if (!tile.isEmpty()) {
p.drawPixmap(r, tile.pixmap, QRectF(tile.pixmap.rect()));
p.drawPixmap(r, tile.pixmap, px_rct);
} else {
p.fillRect(r, brush_tr);
}
@@ -212,6 +215,14 @@ void MapView::checkZoom() {
}
void MapView::checkCenter() {
if (center_.x() < 0.) center_.setX(0.);
if (center_.x() > 1.) center_.setX(1.);
if (center_.y() < 0.) center_.setY(0.);
if (center_.y() > 1.) center_.setY(1.);
}
void MapView::zoomLevelChanged(int new_level) {
zoom_level = qBound(0, new_level, max_level);
// qDebug() << "level changed" << new_level << zoom_level;
@@ -296,7 +307,8 @@ void MapView::zoom(double factor, QPoint anchor) {
checkZoom();
QPointF new_center = mapToNorm(anchor);
center_ += prev_center - new_center;
view_rect.translate(prev_center - new_center);
checkCenter();
view_rect.moveCenter(center_);
updateZoomLevel();
drawBackground();
}
@@ -312,6 +324,7 @@ void MapView::zoomTo(double level) {
void MapView::centerTo(QPointF coord) {
center_ = OSM::geo2xy(coord);
checkCenter();
updateViewRect();
drawBackground();
}