Apat and added acos to spherycolor, not included in color yet but working
[SugarCubes.git] / _UIFramework.pde
index f4a0a40796fe4a3a42e5360985eb032ab76ca282..8ecb7e9a59c91e10b0dd683e04b59b1f02909425 100644 (file)
@@ -21,6 +21,8 @@ final PFont defaultTitleFont = createFont("Myriad Pro", 10);
 
 public abstract class UIObject {
   
+  protected final static int DOUBLE_CLICK_THRESHOLD = 300;
+  
   protected final List<UIObject> children = new ArrayList<UIObject>();  
 
   protected boolean needsRedraw = true;
@@ -525,7 +527,7 @@ public class UIToggleSet extends UIObject {
 }
 
 
-public abstract class UIParameterControl extends UIObject implements LXParameter.Listener {
+public abstract class UIParameterControl extends UIObject implements LXParameterListener {
   protected LXParameter parameter = null;
     
   protected UIParameterControl(float x, float y, float w, float h) {
@@ -536,6 +538,27 @@ public abstract class UIParameterControl extends UIObject implements LXParameter
     redraw();
   }
   
+  protected float getNormalized() {
+    if (parameter != null) {
+      if (parameter instanceof BasicParameter) {
+        return ((BasicParameter)parameter).getNormalizedf();
+      }
+      return parameter.getValuef();
+    }
+    return 0;
+  }
+  
+  protected UIParameterControl setNormalized(float value) {
+    if (parameter != null) {
+      if (parameter instanceof BasicParameter) {
+        ((BasicParameter)parameter).setNormalized(value);
+      } else {
+        parameter.setValue(value);
+      }
+    }
+    return this;
+  }
+  
   public UIParameterControl setParameter(LXParameter parameter) {
     if (this.parameter != null) {
       if (this.parameter instanceof LXListenableParameter) {
@@ -557,6 +580,7 @@ public class UIParameterKnob extends UIParameterControl {
   private int knobSize = 28;
   private final float knobIndent = .4;  
   private final int knobLabelHeight = 14;
+  private boolean showValue = false;
     
   public UIParameterKnob(float x, float y) {
     this(x, y, 0, 0);
@@ -568,7 +592,7 @@ public class UIParameterKnob extends UIParameterControl {
   }
 
   protected void onDraw(PGraphics pg) {    
-    float knobValue = (parameter != null) ? parameter.getValuef() : 0;
+    float knobValue = getNormalized();
     
     pg.ellipseMode(CENTER);
     pg.noStroke();
@@ -588,7 +612,12 @@ public class UIParameterKnob extends UIParameterControl {
     pg.fill(#333333);
     pg.ellipse(knobSize/2, knobSize/2, knobSize/2, knobSize/2);
 
-    String knobLabel = (parameter != null) ? parameter.getLabel() : null;
+    String knobLabel;
+    if (showValue) {
+      knobLabel = (parameter != null) ? ("" + parameter.getValue()) : null;
+    } else {
+      knobLabel = (parameter != null) ? parameter.getLabel() : null;
+    }
     if (knobLabel == null) {
       knobLabel = "-";
     } else if (knobLabel.length() > 4) {
@@ -602,11 +631,28 @@ public class UIParameterKnob extends UIParameterControl {
     pg.text(knobLabel, knobSize/2, knobSize + knobLabelHeight - 2);
   }
   
-  public void onMouseDragged(float mx, float my, float dx, float dy) {
-    if (parameter != null) {
-      float value = constrain(parameter.getValuef() - dy / 100., 0, 1);
-      parameter.setValue(value);
+  private long lastMousePress = 0;
+  public void onMousePressed(float mx, float my) {
+    super.onMousePressed(mx, my);
+    long now = millis();
+    if (now - lastMousePress < DOUBLE_CLICK_THRESHOLD) {
+      parameter.reset();
+      lastMousePress = 0;
+    } else {
+      lastMousePress = now;
     }
+    showValue = true;
+    redraw();    
+  }
+  
+  public void onMouseReleased(float mx, float my) {
+    showValue = false;
+    redraw();
+  }
+  
+  public void onMouseDragged(float mx, float my, float dx, float dy) {
+    float value = constrain(getNormalized() - dy / 100., 0, 1);
+    setNormalized(value);
   }
 }
 
@@ -635,12 +681,12 @@ public class UIParameterSlider extends UIParameterControl {
   private float doubleClickX = 0;
   protected void onMousePressed(float mx, float my) {
     long now = millis();
-    float handleLeft = 4 + parameter.getValuef() * (w-8-handleWidth);
+    float handleLeft = 4 + getNormalized() * (w-8-handleWidth);
     if (mx >= handleLeft && mx < handleLeft + handleWidth) {
       editing = true;
     } else {
-      if ((now - lastClick) < 300 && abs(mx - doubleClickX) < 3) {
-        parameter.setValue(doubleClickMode);  
+      if ((now - lastClick) < DOUBLE_CLICK_THRESHOLD && abs(mx - doubleClickX) < 3) {
+        setNormalized(doubleClickMode);  
       }
       doubleClickX = mx;
       if (mx < w*.25) {
@@ -660,7 +706,7 @@ public class UIParameterSlider extends UIParameterControl {
   
   protected void onMouseDragged(float mx, float my, float dx, float dy) {
     if (editing) {
-      parameter.setValue(constrain((mx - handleWidth/2. - 4) / (w-8-handleWidth), 0, 1));
+      setNormalized(constrain((mx - handleWidth/2. - 4) / (w-8-handleWidth), 0, 1));
     }
   }
 }