Merge pull request #6120 from tschaub/hint-changed

Set interacting hint during trackpad scroll
This commit is contained in:
Tim Schaub
2016-11-14 10:17:12 -07:00
committed by GitHub
3 changed files with 61 additions and 2 deletions

View File

@@ -1,6 +1,7 @@
goog.provide('ol.interaction.MouseWheelZoom');
goog.require('ol');
goog.require('ol.View');
goog.require('ol.easing');
goog.require('ol.events.EventType');
goog.require('ol.has');
@@ -73,6 +74,18 @@ ol.interaction.MouseWheelZoom = function(opt_options) {
*/
this.mode_ = undefined;
/**
* Trackpad events separated by this delay will be considered separate
* interactions.
* @type {number}
*/
this.trackpadEventGap_ = 400;
/**
* @type {number|undefined}
*/
this.trackpadTimeoutId_ = undefined;
/**
* The number of delta values per zoom level
* @private
@@ -143,7 +156,7 @@ ol.interaction.MouseWheelZoom.handleEvent = function(mapBrowserEvent) {
this.startTime_ = now;
}
if (!this.mode_ || now - this.startTime_ > 400) {
if (!this.mode_ || now - this.startTime_ > this.trackpadEventGap_) {
this.mode_ = Math.abs(delta) < 4 ?
ol.interaction.MouseWheelZoom.Mode.TRACKPAD :
ol.interaction.MouseWheelZoom.Mode.WHEEL;
@@ -151,6 +164,12 @@ ol.interaction.MouseWheelZoom.handleEvent = function(mapBrowserEvent) {
if (this.mode_ === ol.interaction.MouseWheelZoom.Mode.TRACKPAD) {
var view = map.getView();
if (this.trackpadTimeoutId_) {
clearTimeout(this.trackpadTimeoutId_);
} else {
view.setHint(ol.View.Hint.INTERACTING, 1);
}
this.trackpadTimeoutId_ = setTimeout(this.decrementInteractingHint_.bind(this), this.trackpadEventGap_);
var resolution = view.getResolution() * Math.pow(2, delta / this.trackpadDeltaPerZoom_);
var minResolution = view.getMinResolution();
var maxResolution = view.getMaxResolution();
@@ -197,6 +216,17 @@ ol.interaction.MouseWheelZoom.handleEvent = function(mapBrowserEvent) {
};
/**
* @private
*/
ol.interaction.MouseWheelZoom.prototype.decrementInteractingHint_ = function() {
this.trackpadTimeoutId_ = undefined;
var view = this.getMap().getView();
view.setHint(ol.View.Hint.INTERACTING, -1);
view.changed(); // notify listeners of the hint change
};
/**
* @private
* @param {ol.Map} map Map.

View File

@@ -216,6 +216,12 @@ ol.Map = function(options) {
*/
this.viewPropertyListenerKey_ = null;
/**
* @private
* @type {?ol.EventsKey}
*/
this.viewChangeListenerKey_ = null;
/**
* @private
* @type {Array.<ol.EventsKey>}
@@ -1102,11 +1108,18 @@ ol.Map.prototype.handleViewChanged_ = function() {
ol.events.unlistenByKey(this.viewPropertyListenerKey_);
this.viewPropertyListenerKey_ = null;
}
if (this.viewChangeListenerKey_) {
ol.events.unlistenByKey(this.viewChangeListenerKey_);
this.viewChangeListenerKey_ = null;
}
var view = this.getView();
if (view) {
this.viewPropertyListenerKey_ = ol.events.listen(
view, ol.ObjectEventType.PROPERTYCHANGE,
this.handleViewPropertyChanged_, this);
this.viewChangeListenerKey_ = ol.events.listen(
view, ol.events.EventType.CHANGE,
this.handleViewPropertyChanged_, this);
}
this.render();
};
@@ -1221,7 +1234,6 @@ ol.Map.prototype.removeOverlay = function(overlay) {
* @private
*/
ol.Map.prototype.renderFrame_ = function(time) {
var i, ii, viewState;
var size = this.getSize();

View File

@@ -160,6 +160,23 @@ describe('ol.Map', function() {
document.body.removeChild(target);
});
it('is called when the view.changed() is called', function() {
var view = map.getView();
var spy = sinon.spy(map, 'render');
view.changed();
expect(spy.callCount).to.be(1);
});
it('is not called on view changes after the view has been removed', function() {
var view = map.getView();
map.setView(null);
var spy = sinon.spy(map, 'render');
view.changed();
expect(spy.callCount).to.be(0);
});
it('calls renderFrame_ and results in an postrender event', function(done) {
var spy = sinon.spy(map, 'renderFrame_');