BangleApps/modules/Slider.md

4.6 KiB

Slider Library

Take a look at README.md for hints on developing with this library.

Usage

var Slider = require("Slider");
var slider =  Slider(callbackFunction, configObject);

Bangle.on("drag", slider.f.dragSlider);

// If the slider should take precedent over other drag handlers use (fw2v18 and up):
// Bangle.prependListener("drag", slider.f.dragSlider);

callbackFunction (first argument) determines what slider is used for. slider will pass two arguments, mode and feedback, into callbackFunction (if slider is interactive or auto progressing). The different mode/feedback combinations to expect are:

  • "map", o.v.level | current level when interacting by mapping interface.
  • "incr", incr | where incr = +-1, when interacting by incrementing interface.
  • "remove", o.v.level | last level when the slider times out.
  • "auto" | on its own, when auto progressing.

configObject (second argument, optional) has the following defaults:

R = Bangle.appRect; // For use when determining defaults below.

{
currLevel:       undefined,    // The level to initate the slider with.
horizontal:      false,        // Slider should be horizontal?
xStart:          R.x2-R.w/4-4, // Leftmost x-coordinate. (Uppermost y-coordinate if horizontal)
width:           R.w/4,        // Width of the slider. (Height if horizontal)
yStart:          R.y+4,        // Uppermost y-coordinate. (Rightmost x-coordinate if horizontal)
height:          R.h-10,       // Height of the slider. (Width if horizontal)
steps:           30,           // Number of discrete steps of the slider.

dragableSlider:  true,         // Should supply the sliders standard interaction mechanisms?
dragRect:        R,            // Accept input within this rectangle.
useIncr:         true,         // Use the incrementing feature?
useMap:          false,        // Use the mapping feature?
oversizeR:       0,            // Determines if the mapping area should be extend outside the indicator (Right/Up).
oversizeL:       0,            // Determines if the mapping area should be extend outside the indicator (Left/Down).
propagateDrag:   false,        // Pass the drag event on down the handler chain?
timeout:         1,            // Seconds untill the slider times out.

drawableSlider:  true,         // Should supply the sliders standard drawing mechanism?
colorFG:         g.theme.fg2,  // Foreground color.
colorBG:         g.theme.bg2,  // Background color.
rounded:         true,         // Slider should have rounded corners?
outerBorderSize: 2,            // The size of the visual border.
innerBorderSize: 2,            // The distance between visual border and the slider.

autoProgress:    false,        // The slider should be able to progress automatically?
}

A slider initiated in the Web IDE terminal window reveals its internals to a degree:

>slider = require("Slider").create(()=>{}, {autoProgress:true})
={
  v: { level: 15, ebLast: 0, dy: 0 },
  f: {
    wasOnDragRect: function (exFirst,eyFirst) { ... },
    wasOnIndicator: function (exFirst) { ... },
    dragSlider: function (e) { ... },
    remove: function () { ... },
    updateBar: function (levelHeight) { ... },
    draw: function (level) { ... },
    autoUpdate: function () { ... },
    initAutoValues: function () { ... },
    startAutoUpdate: function () { ... },
    stopAutoUpdate: function () { ... }
   },
  c: { useMap: false, useIncr: true, horizontal: false, xStart: 127,
    width: 44, yStart: 28, height: 142, steps: 30, oversizeR: 0,
    oversizeL: 0, timeout: 1, colorFG: 65535, colorBG: 8, rounded: 20,
    propagateDrag: false, autoProgress: true, outerBorderSize: 2, innerBorderSize: 2,
    drawableSlider: true, dragableSlider: true, currLevel: undefined,
    dragRect: { x: 0, y: 24, w: 176, h: 152,
      x2: 175, y2: 175 },
    _xStart: 131, _width: 36, _yStart: 32, _height: 134, STEP_SIZE: 3.36666666666,
    r: { x: 127, y: 28, x2: 171, y2: 170,
      w: 44, h: 142 },
    borderRect: { x: 127, y: 28, w: 44, h: 142,
      r: 20 },
    hollowRect: { x: 129, y: 30, w: 40, h: 138,
      r: 20 }
   }
 }
>

There is a slider test app on thyttan's personal app loader (at time of writing). Looking at its code is a good way to see how the slider is used in app development.

The version of Remote for Spotify on thyttan's personal app loader (at time of writing) also utilizes the Slider module. Here is the code.