50 lines
1.3 KiB
JavaScript
50 lines
1.3 KiB
JavaScript
"use strict"
|
|
|
|
var coreRenderer = require("../render/render")
|
|
|
|
function throttle(callback) {
|
|
//60fps translates to 16.6ms, round it down since setTimeout requires int
|
|
var delay = 16
|
|
var last = 0, pending = null
|
|
var timeout = typeof requestAnimationFrame === "function" ? requestAnimationFrame : setTimeout
|
|
return function() {
|
|
var elapsed = Date.now() - last
|
|
if (pending === null) {
|
|
pending = timeout(function() {
|
|
pending = null
|
|
callback()
|
|
last = Date.now()
|
|
}, delay - elapsed)
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
module.exports = function($window, throttleMock) {
|
|
var renderService = coreRenderer($window)
|
|
renderService.setEventCallback(function(e) {
|
|
if (e.redraw !== false) redraw()
|
|
})
|
|
|
|
var callbacks = []
|
|
var rendering = false
|
|
|
|
function subscribe(key, callback) {
|
|
unsubscribe(key)
|
|
callbacks.push(key, callback)
|
|
}
|
|
function unsubscribe(key) {
|
|
var index = callbacks.indexOf(key)
|
|
if (index > -1) callbacks.splice(index, 2)
|
|
}
|
|
function sync() {
|
|
if (rendering) throw new Error("Nested m.redraw.sync() call")
|
|
rendering = true
|
|
for (var i = 1; i < callbacks.length; i+=2) try {callbacks[i]()} catch (e) {/*noop*/}
|
|
rendering = false
|
|
}
|
|
|
|
var redraw = (throttleMock || throttle)(sync)
|
|
redraw.sync = sync
|
|
return {subscribe: subscribe, unsubscribe: unsubscribe, redraw: redraw, render: renderService.render}
|
|
}
|