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 99aa1e7 commit 1f8fbc9
Showing 1 changed file with 30 additions and 8 deletions.
38 changes: 30 additions & 8 deletions src/controllers/AbstractAppController.js
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ import gmfAuthenticationService from 'ngeo/auth/service';
import ngeoMapFeatureOverlayMgr from 'ngeo/map/FeatureOverlayMgr';
import storeMap from 'gmfapi/store/map';
import user, {UserState, loginMessageRequired} from 'gmfapi/store/user';
import {debounce} from 'gmf/misc/debounce2';

AbstractAppController.$inject = ['$scope', '$injector', 'mobile'];
/**
Expand Down Expand Up @@ -127,14 +128,15 @@ 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 @@ -700,6 +702,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 1f8fbc9

Please sign in to comment.