public abstract class UIObject {
+ protected final static int DOUBLE_CLICK_THRESHOLD = 300;
+
protected final List<UIObject> children = new ArrayList<UIObject>();
protected boolean needsRedraw = true;
}
}
+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);
}
}
+ public boolean isActive() {
+ return active;
+ }
+
public UIButton setActive(boolean active) {
this.active = active;
onToggle(active);
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);
}
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) {
itemColor = pendingColor;
} else {
labelColor = #000000;
- itemColor = even ? #666666 : #777777;
+ itemColor = #707070;
}
+ float factor = even ? .92 : 1.08;
+ itemColor = lx.scaleBrightness(itemColor, factor);
+
pg.noStroke();
pg.fill(itemColor);
pg.rect(0, yp, w, itemHeight);
}
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);
if (scrollOffset + index < items.size()) {
pressedItem = items.get(scrollOffset + index);
pressedItem.onMousePressed();
- pressedItem.select();
redraw();
}
}
}
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();
}
public boolean isSelected();
public boolean isPending();
public String getLabel();
- public void select();
public void onMousePressed();
public void onMouseReleased();
}
}
protected void onDraw(PGraphics pg) {
- pg.stroke(#999999);
+ pg.stroke(#666666);
pg.fill(#222222);
pg.rect(0, 0, w, h);
pg.textAlign(CENTER, CENTER);