Merge branch 'master' of https://github.com/sugarcubes/SugarCubes
[SugarCubes.git] / _UIFramework.pde
index ba5a8c8e2b8ac1cd1a10b6887fb5b24fdd2befd6..ca744646078e8780cf50cc6a50f10b9f4b3ab4a2 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;
@@ -314,15 +316,39 @@ public class UILabel extends UIObject {
   }
 }
 
+public class UICheckbox extends UIButton {
+  
+  private boolean firstDraw = true;
+  
+  public UICheckbox(float x, float y, float w, float h) {
+    super(x, y, w, h);
+    setMomentary(false);
+  }
+  
+  public void onDraw(PGraphics pg) {
+    pg.stroke(borderColor);
+    pg.fill(active ? activeColor : inactiveColor);
+    pg.rect(0, 0, h, h);
+    if (firstDraw) {
+      pg.fill(labelColor);
+      pg.textFont(defaultItemFont);
+      pg.textAlign(LEFT, CENTER);
+      pg.text(label, h + 4, h/2);
+      firstDraw = false;
+    }
+  }
+      
+}
+
 public class UIButton extends UIObject {
 
-  private boolean active = false;
-  private boolean isMomentary = false;
-  private color borderColor = #666666;
-  private color inactiveColor = #222222;
-  private color activeColor = #669966;
-  private color labelColor = #999999;
-  private String label = "";
+  protected boolean active = false;
+  protected boolean isMomentary = false;
+  protected color borderColor = #666666;
+  protected color inactiveColor = #222222;
+  protected color activeColor = #669966;
+  protected color labelColor = #999999;
+  protected String label = "";
    
   public UIButton(float x, float y, float w, float h) {
     super(x, y, w, h);
@@ -359,6 +385,10 @@ public class UIButton extends UIObject {
     }
   }
   
+  public boolean isActive() {
+    return active;
+  }
+  
   public UIButton setActive(boolean active) {
     this.active = active;
     onToggle(active);
@@ -574,6 +604,18 @@ public class UIParameterKnob extends UIParameterControl {
     pg.text(knobLabel, knobSize/2, knobSize + knobLabelHeight - 2);
   }
   
+  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;
+    }
+  }
+  
   public void onMouseDragged(float mx, float my, float dx, float dy) {
     if (parameter != null) {
       float value = constrain(parameter.getValuef() - dy / 100., 0, 1);
@@ -602,11 +644,28 @@ public class UIParameterSlider extends UIParameterControl {
   }
   
   private boolean editing = false;
+  private long lastClick = 0;
+  private float doubleClickMode = 0;
+  private float doubleClickX = 0;
   protected void onMousePressed(float mx, float my) {
+    long now = millis();
     float handleLeft = 4 + parameter.getValuef() * (w-8-handleWidth);
     if (mx >= handleLeft && mx < handleLeft + handleWidth) {
       editing = true;
+    } else {
+      if ((now - lastClick) < DOUBLE_CLICK_THRESHOLD && abs(mx - doubleClickX) < 3) {
+        parameter.setValue(doubleClickMode);  
+      }
+      doubleClickX = mx;
+      if (mx < w*.25) {
+        doubleClickMode = 0;
+      } else if (mx > w*.75) {
+        doubleClickMode = 1;
+      } else {
+        doubleClickMode = 0.5;
+      }
     }
+    lastClick = now;
   }
   
   protected void onMouseReleased(float mx, float my) {
@@ -658,7 +717,7 @@ public class UIScrollList extends UIObject {
         itemColor = #707070;
       }
       float factor = even ? .92 : 1.08;
-      itemColor = color(hue(itemColor), saturation(itemColor), min(100, factor*brightness(itemColor)));
+      itemColor = lx.scaleBrightness(itemColor, factor);
       
       pg.noStroke();
       pg.fill(itemColor);
@@ -673,7 +732,7 @@ public class UIScrollList extends UIObject {
     }
     if (hasScroll) {
       pg.noStroke();
-      pg.fill(color(0, 0, 100, 15));
+      pg.fill(0x26ffffff);
       pg.rect(w-12, 0, 12, h);
       pg.fill(#333333);
       pg.rect(w-12, scrollYStart, 12, scrollYHeight);
@@ -733,9 +792,9 @@ public class UIScrollList extends UIObject {
   }
   
   public void setScrollOffset(int offset) {
-    scrollOffset = constrain(offset, 0, items.size() - numVisibleItems);
-    scrollYStart = (int) (scrollOffset * h / items.size());
-    scrollYHeight = (int) (numVisibleItems * h / (float) items.size());
+    scrollOffset = constrain(offset, 0, max(0, items.size() - numVisibleItems));
+    scrollYStart = round(scrollOffset * h / items.size());
+    scrollYHeight = round(numVisibleItems * h / items.size());
     redraw();
   }