Skip to content

Instantly share code, notes, and snippets.

@positlabs
Created March 22, 2023 17:32
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save positlabs/1d3b26924c327a29f5360824d61e5d6d to your computer and use it in GitHub Desktop.
Save positlabs/1d3b26924c327a29f5360824d61e5d6d to your computer and use it in GitHub Desktop.
Debounce function for Lens Studio. Also provides setTimeout and clearTimeout functions.
/*
Debouncing functions is used for delaying a function call until a certain amount of time has passed.
In the example below, it's used to hide a slider after 3 seconds if the user isn't interacting with it.
*/
/**
* Polyfill for browser function setTimeout
* @param {function} callback - function to trigger after timeout is completed
* @param {number} delay - time in milliseconds to delay the callback
* @returns {DelayedCallbackEvent} - event can be cancelled with `clearTimeout(event)`
*/
function setTimeout(callback, delay) {
var e = script.createEvent('DelayedCallbackEvent')
e.reset(delay * .001)
e.bind(callback)
return e
}
/**
* Polyfill for browser function clearTimeout
* @param {DelayedCallbackEvent} event - The event returned from setTimeout
*/
function clearTimeout(event) {
event.enabled = false
}
/**
* Debounce function generator for delaying a function call
* @param {function} callback - function to debounce
* @param {number} delay - time to delay, in milliseconds
* @returns {function} - debounced function
*/
function debounce(callback, delay) {
if(!delay) throw Error('missing delay from debounce')
var timeoutEvent
return function () {
// Clear any existing timeout
if (timeoutEvent) {
clearTimeout(timeoutEvent)
}
// Set a new timeout to call the callback function after a delay
timeoutEvent = setTimeout(callback, delay)
}
}
/*
EXAMPLE
Slider controller
*/
//@input Component.AudioComponent audio
/** @type {AudioComponent} */
var audio = script.audio
//@input Component.ScriptComponent sliderScript
/** @type {ScriptComponent} */
var sliderScript = script.sliderScript
var slider = sliderScript.api
slider.addCallback('onSliderValueChanged', function (v) {
audio.volume = v
// prevent hiding while using the slider
debouncedHide()
})
var st = sliderScript.getSceneObject().getComponent('ScreenTransform')
function show() {
print('show slider')
// show your slider!
}
function hide() {
print('hide slider')
// hide your slider!
}
var debouncedHide = debounce(hide, 3000)
script.createEvent('TapEvent').bind(function () {
// tapping the screen will show the slider
show()
// slider will hide if user hasn't tapped the screen or used the slider within 3 seconds
debouncedHide()
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment