@qooxdoo/framework
Version:
The JS Framework for Coders
128 lines (104 loc) • 3.15 kB
JavaScript
/* ************************************************************************
qooxdoo - the new era of web development
http://qooxdoo.org
Copyright:
2009 1&1 Internet AG, Germany, http://www.1und1.de
License:
MIT: https://opensource.org/licenses/MIT
See the LICENSE file in the project's top-level directory for details.
Authors:
* Fabian Jakobs (fjakobs)
************************************************************************ */
/**
* Timer, which accelerates after each interval. The initial delay and the
* interval time can be set using the properties {@link #firstInterval}
* and {@link #interval}. The {@link #interval} events will be fired with
* decreasing interval times while the timer is running, until the {@link #minimum}
* is reached. The {@link #decrease} property sets the amount of milliseconds
* which will decreased after every firing.
*
* This class is e.g. used in the {@link qx.ui.form.RepeatButton} and
* {@link qx.ui.form.HoverButton} widgets.
*
* NOTE: Instances of this class must be disposed of after use
*
*/
qx.Class.define("qx.event.AcceleratingTimer", {
extend: qx.core.Object,
implement: [qx.core.IDisposable],
construct() {
super();
this.__timer = new qx.event.Timer(this.getInterval());
this.__timer.addListener("interval", this._onInterval, this);
},
events: {
/** This event if fired each time the interval time has elapsed */
interval: "qx.event.type.Event"
},
properties: {
/**
* Interval used after the first run of the timer. Usually a smaller value
* than the "firstInterval" property value to get a faster reaction.
*/
interval: {
check: "Integer",
init: 100
},
/**
* Interval used for the first run of the timer. Usually a greater value
* than the "interval" property value to a little delayed reaction at the first
* time.
*/
firstInterval: {
check: "Integer",
init: 500
},
/** This configures the minimum value for the timer interval. */
minimum: {
check: "Integer",
init: 20
},
/** Decrease of the timer on each interval (for the next interval) until minTimer reached. */
decrease: {
check: "Integer",
init: 2
}
},
members: {
__timer: null,
__currentInterval: null,
/**
* Reset and start the timer.
*/
start() {
this.__timer.setInterval(this.getFirstInterval());
this.__timer.start();
},
/**
* Stop the timer
*/
stop() {
this.__timer.stop();
this.__currentInterval = null;
},
/**
* Interval event handler
*/
_onInterval() {
this.__timer.stop();
if (this.__currentInterval == null) {
this.__currentInterval = this.getInterval();
}
this.__currentInterval = Math.max(
this.getMinimum(),
this.__currentInterval - this.getDecrease()
);
this.__timer.setInterval(this.__currentInterval);
this.__timer.start();
this.fireEvent("interval");
}
},
destruct() {
this._disposeObjects("__timer");
}
});