// Control // tflorez interface Control { void addUpdater(Updater theUpdater); String getName(); String getLabel(); Object getValue(); Updater getUpdater(); void notifyUpdater(); void setController(controlP5.Controller theController); void setValue(Object theValue); void syncController(); } class DefaultControl implements Control { String name; String label; Object value; Updater updater; controlP5.Controller controller; DefaultControl(String label, Object value) { this.name = label; this.label = label; this.value = value; } DefaultControl() { } void addUpdater(Updater updater) { this.updater = updater; } String getName() { return name; } String getLabel() { return label; } Object getValue() { return value; } Updater getUpdater() { return this.updater; } void notifyUpdater() { if (updater != null) { updater.update(this.value); } } void setLabel(String label) { this.label = label; } void setValue(Object value) { this.value = value; notifyUpdater(); syncController(); } void setController(controlP5.Controller theController) { this.controller = theController; } void syncController() { if (this.controller == null) { return; } else if (value instanceof Float) { Dbg.say("syncController: " + name + ", controller: " + controller); this.controller.setValue((Float)this.value); Dbg.say(" sync done."); } else { Dbg.say("syncController(): value: " + value); this.controller.setValue((Float)this.value); } } String toString() { return "Control: " + name + (name != label ? ", label: " + label : "") + ", value: "+ value; } } class BooleanControl extends DefaultControl { BooleanControl(String label, Boolean value) { this.name = label; this.label = label; this.value = Boolean.valueOf(value); } void setValue(Boolean theValue) { this.value = Boolean.valueOf(theValue); } } class ButtonControl extends DefaultControl { ButtonControl(String name) { this.name = name; this.label = name; } } class StateControl extends DefaultControl { String state; HashMap stateLabels; StateControl(String name, String defaultState, String defaultLabel) { stateLabels = new HashMap(); this.name = name; this.addState(defaultState, defaultLabel); this.setState(defaultState); } void addState(String state, String label) { stateLabels.put(state, label); //println("addState(" + state + ", " + label + ")"); //println(" stateLabels.get(" + state + "): " + stateLabels.get(state)); } void setState(String state) { this.state = state; this.label = (String) stateLabels.get(state); //println("setState(" + state + "): label: " + (String)label); } String getState() { return this.state; } String getValue() { return (String) this.getState(); } } abstract class NumberControl extends DefaultControl { String unitsLabel = ""; void setUnitsLabel(String l) { this.unitsLabel = l; } String getUnitsLabel() { return this.unitsLabel; } } class FloatControl extends NumberControl { float min; float max; FloatControl(String label, float value, float min, float max) { this.name = label; this.label = label; this.value = new Float(value); this.min = min; this.max = max; } FloatControl(String label, float value) { this(label, value, 0, 1); } FloatControl() { this("", 0); } Float getValue() { return (Float) this.value; } void setValue(float theValue) { this.value = Float.valueOf(theValue); } void updateBounds() { this.min = min((Float)value, this.min); this.max = max((Float)value, this.max); } } class IntegerControl extends DefaultControl { int min; int max; IntegerControl(String label, int value, int min, int max) { this.name = label; this.label = label; this.value = new Integer(value); this.min = min; this.max = max; } IntegerControl(String label, int value) { this(label, value, 0, 1); } void setValue(int theValue) { this.value = Integer.valueOf(theValue); } } class ControlPanel { ArrayList controls; String name; String label; ControlPanel(String name) { this.name = name; this.label = name; controls = new ArrayList(); } void setLabel(String label) { this.label = label; } Control addControl(Control c) { controls.add(c); return c; } Control putButton(String label) { ButtonControl c = new ButtonControl(label); return addControl(c); } Control putBoolean(String label, Boolean value) { Control c = new BooleanControl(label, value); return addControl(c); } Control putFloat(String label, float value) { Control c = new FloatControl(label, value); return addControl(c); } Control putFloat(String label, float value, float min, float max) { Control c = new FloatControl(label, value, min, max); return addControl(c); } Control putInteger(String label, int value) { Control c = new IntegerControl(label, value); return addControl(c); } Control putInteger(String label, int value, int min, int max) { //println("putInteger: " + " " + value + " " + min + " " + max); Control c = new IntegerControl(label, value, min, max); return addControl(c); } } class ControlMap extends HashMap { HashMap controls; List controlPanels; ControlMap(List controlPanels) { this.controls = this; this.controlPanels = controlPanels; //new ArrayList(Arrays.asList(controlPanels)); for (int i=0; i < controlPanels.size(); i++) { this.putControlPanel((ControlPanel)controlPanels.get(i)); } } ControlMap (ControlPanel[] controlPanels) { this(new ArrayList(Arrays.asList(controlPanels))); } void putControlPanel (ControlPanel panel) { if (!controlPanels.contains(panel)) { this.controlPanels.add(panel); } this.putControls(panel.controls); } void putControls (List controls) { for (int i=0; i" + sourceValue +")"); } } else { Dbg.warn(" not copying value for control: " + name); } } } } // UTILITIES FOR CONTROLP5 Boolean float2Boolean(Float theFloat) { return (theFloat == 0) ? Boolean.FALSE : Boolean.TRUE; } Boolean parseControlP5ToggleValue(Float controllerValue) { return float2Boolean(controllerValue); } Float boolean2Float(boolean b) { return (b == true) ? 1f : 0f; } Boolean parseControlP5Toggle(Toggle t) { return parseControlP5ToggleValue(t.value()); } Float parseForControlP5(Object o) { if (o instanceof Boolean) { Boolean b = (Boolean) o; return boolean2Float(b); } else if (o instanceof Float){ return (Float) o; } else if (o instanceof Integer) { return Float.valueOf( (Integer) o ); } else { Dbg.warn("parseForControlP5: no matching type for: " + o); return Float.valueOf(0); } }