Skip to content

Commit

Permalink
Better recenter to fix center on the grid
Browse files Browse the repository at this point in the history
Cleaner code and allow a js way to remove/reset/update this
function if needed.

Keep the function to be sure the layers are not blurry. But also
add a debounce to not have a map "jumping around" on zoom-in/out.
  • Loading branch information
ger-benjamin committed Nov 27, 2024
1 parent 573b2a5 commit d70e2ee
Showing 1 changed file with 30 additions and 9 deletions.
39 changes: 30 additions & 9 deletions src/controllers/AbstractAppController.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// The MIT License (MIT)
//
// Copyright (c) 2015-2023 Camptocamp SA
// Copyright (c) 2015-2024 Camptocamp SA
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of
// this software and associated documentation files (the "Software"), to deal in
Expand Down Expand Up @@ -65,6 +65,7 @@ import ngeoMapFeatureOverlayMgr from 'ngeo/map/FeatureOverlayMgr';
import storeMap from 'gmfapi/store/map';
import user, {UserState, loginMessageRequired} from 'gmfapi/store/user';
import i18next from 'i18next';
import {debounce} from 'gmf/misc/debounce2';

/**
* Application abstract controller.
Expand Down Expand Up @@ -137,14 +138,14 @@ export function AbstractAppController($scope, $injector, mobile) {
return newCenter;
};

// Fix the center on the WMTS grid on animation end
const originalViewSetHint = view.setHint;
view.setHint = (hint, value) => {
originalViewSetHint.call(view, hint, value);
if (hint === ViewHint.ANIMATING && value === -1) {
view.setCenter(view.getCenter());
}
};
/**
* Base OL view.setHint function.
* Keep it to be able to reset its normal behavior if wanted.
* @private
*/
this.originalViewSetHint = view.setHint;
// Be sure the center is aligned with the grid (anti-blur effect).
this.fixCenterOnGrid(view);

const map = new olMap(
Object.assign(
Expand Down Expand Up @@ -726,6 +727,26 @@ function getLayerByLabels(layers, labels) {
return null;
}

/**
* Fix the center on the WMTS grid on animation end.
* This could help to have a not blurred map, but without
* timeout (and with map.view.constrainResolution to true), the map
* could "jump around" slightly on zooming in/out quickly.
* @param {import ('ol/View').View} view an ol view.
* @private
*/
AbstractAppController.prototype.fixCenterOnGrid = function (view) {
const debounceSetCenter = debounce((view, hint, value) => {
if (hint === ViewHint.ANIMATING && value === -1) {
view.setCenter(view.getCenter());
}
}, 50);
view.setHint = (hint, value) => {
this.originalViewSetHint.call(view, hint, value);
debounceSetCenter(view, hint, value);
};
};

/**
* @param {string} lang Language code.
*/
Expand Down

0 comments on commit d70e2ee

Please sign in to comment.