2018-01-03 20:24:41 +00:00
|
|
|
# PFD UI Element - Rotating UI Element. Displays value by rotating an element around a center-point
|
|
|
|
var RotatingElement =
|
|
|
|
{
|
|
|
|
new : func (pagename, svg, name, minVal, maxVal, rangeDeg, centerOffset, value=0, style=nil)
|
|
|
|
{
|
|
|
|
var obj = {
|
|
|
|
parents : [ RotatingElement, PFD.UIElement ],
|
|
|
|
_name : pagename ~ name,
|
|
|
|
_edit : 0,
|
|
|
|
_min : minVal,
|
|
|
|
_max : maxVal,
|
|
|
|
_rangeDeg : rangeDeg,
|
|
|
|
_style : style,
|
|
|
|
};
|
|
|
|
|
|
|
|
if (style == nil) obj._style = PFD.DefaultStyle;
|
|
|
|
|
|
|
|
obj._symbol = svg.getElementById(obj._name);
|
|
|
|
assert(obj._symbol != nil, "Unable to find element " ~ obj._name);
|
|
|
|
obj._baseTranslation = obj._symbol.getTranslation();
|
|
|
|
|
|
|
|
# Set the center for rotation purposes.
|
|
|
|
assert(size(centerOffset) == 2, "centerOffset must be an array of two elements [x,y]");
|
|
|
|
obj._symbol.set("center-offset-x", centerOffset[0]);
|
|
|
|
obj._symbol.set("center-offset-y", centerOffset[1]);
|
|
|
|
|
|
|
|
obj.setValue(value);
|
|
|
|
|
|
|
|
# State and timer for flashing highlighting of elements
|
2018-02-04 22:40:48 +00:00
|
|
|
# We need a separate Enabled flag as the timers are in a separate thread.
|
|
|
|
obj._highlightEnabled = 0;
|
2018-01-03 20:24:41 +00:00
|
|
|
obj._highlighted = 0;
|
|
|
|
obj._flashTimer = nil;
|
|
|
|
|
|
|
|
return obj;
|
|
|
|
},
|
|
|
|
|
|
|
|
getName : func() { return me._name; },
|
|
|
|
getValue : func() { return me._value; },
|
|
|
|
setValue : func(value) {
|
|
|
|
if (value == nil) value = 0.0;
|
|
|
|
|
|
|
|
# Bound value to the minimum and maximum values.
|
|
|
|
value = math.max(me._min, value);
|
|
|
|
value = math.min(me._max, value);
|
|
|
|
|
|
|
|
# Convert to normalized value
|
|
|
|
value = (value - me._min) / (me._max - me._min);
|
|
|
|
|
|
|
|
# Rotate, scales appropriately
|
|
|
|
me._symbol.setRotation(value * me._rangeDeg * D2R, [0.0, 0.0]);
|
|
|
|
},
|
|
|
|
|
|
|
|
setVisible : func(vis) { me._symbol.setVisible(vis); },
|
|
|
|
_flashElement : func() {
|
2018-02-04 22:40:48 +00:00
|
|
|
if (me._highlightEnabled == 0) {
|
2018-01-03 20:24:41 +00:00
|
|
|
me._symbol.setVisible(0);
|
|
|
|
me._highlighted = 0;
|
2018-02-04 22:40:48 +00:00
|
|
|
} else {
|
|
|
|
if (me._highlighted == 0) {
|
|
|
|
me._symbol.setVisible(1);
|
|
|
|
me._highlighted = 1;
|
|
|
|
} else {
|
|
|
|
me._symbol.setVisible(0);
|
|
|
|
me._highlighted = 0;
|
|
|
|
}
|
2018-01-03 20:24:41 +00:00
|
|
|
}
|
|
|
|
},
|
|
|
|
highlightElement : func() {
|
2018-02-04 22:40:48 +00:00
|
|
|
me._highlightEnabled = 1;
|
|
|
|
me._highlighted = 0;
|
2018-01-03 20:24:41 +00:00
|
|
|
me._flashElement();
|
|
|
|
me._flashTimer = maketimer(me._style.CURSOR_BLINK_PERIOD, me, me._flashElement);
|
|
|
|
me._flashTimer.start();
|
|
|
|
},
|
|
|
|
unhighlightElement : func() {
|
|
|
|
if (me._flashTimer != nil) me._flashTimer.stop();
|
|
|
|
me._flashTimer = nil;
|
2018-02-04 22:40:48 +00:00
|
|
|
me._highlightEnabled = 0;
|
|
|
|
me._highlighted = 0;
|
2018-01-03 20:24:41 +00:00
|
|
|
me._flashElement();
|
|
|
|
},
|
|
|
|
isEditable : func () { return 0; },
|
|
|
|
isInEdit : func() { return 0; },
|
|
|
|
enterElement : func() { return me.getValue(); },
|
|
|
|
clearElement : func() { },
|
|
|
|
editElement : func() { },
|
|
|
|
incrSmall : func(value) { },
|
|
|
|
incrLarge : func(value) { },
|
|
|
|
};
|