2 * DOUBLE BLACK DIAMOND DOUBLE BLACK DIAMOND
5 * ///\\\ ///\\\ ///\\\ ///\\\
6 * \\\/// \\\/// \\\/// \\\///
9 * EXPERTS ONLY!! EXPERTS ONLY!!
11 * Custom UI components using the framework.
14 class UIPatternDeck extends UIWindow {
18 public UIPatternDeck(Engine.Deck deck, String label, float x, float y, float w, float h) {
19 super(label, x, y, w, h);
23 List<ScrollItem> items = new ArrayList<ScrollItem>();
24 for (LXPattern p : deck.getPatterns()) {
25 items.add(new PatternScrollItem(p));
27 final UIScrollList patternList = new UIScrollList(1, yp, w-2, 160).setItems(items);
28 patternList.addToContainer(this);
29 yp += patternList.h + 10;
31 final UIParameterKnob[] parameterKnobs = new UIParameterKnob[12];
32 for (int ki = 0; ki < parameterKnobs.length; ++ki) {
33 parameterKnobs[ki] = new UIParameterKnob(5 + 34*(ki % 4), yp + (ki/4) * 48);
34 parameterKnobs[ki].addToContainer(this);
37 Engine.Listener lxListener = new Engine.Listener() {
38 public void patternWillChange(Engine.Deck deck, LXPattern pattern, LXPattern nextPattern) {
41 public void patternDidChange(Engine.Deck deck, LXPattern pattern) {
44 for (LXParameter parameter : pattern.getParameters()) {
45 if (pi >= parameterKnobs.length) {
48 parameterKnobs[pi++].setParameter(parameter);
50 while (pi < parameterKnobs.length) {
51 parameterKnobs[pi++].setParameter(null);
56 deck.addListener(lxListener);
57 lxListener.patternDidChange(deck, deck.getActivePattern());
61 class PatternScrollItem extends AbstractScrollItem {
63 private LXPattern pattern;
66 PatternScrollItem(LXPattern pattern) {
67 this.pattern = pattern;
68 label = className(pattern, "Pattern");
71 public String getLabel() {
75 public boolean isSelected() {
76 return deck.getActivePattern() == pattern;
79 public boolean isPending() {
80 return deck.getNextPattern() == pattern;
83 public void select() {
84 deck.goPattern(pattern);
89 class UICrossfader extends UIWindow {
91 public UICrossfader(float x, float y, float w, float h) {
92 super("CROSSFADER", x, y, w, h);
94 List<ScrollItem> items = new ArrayList<ScrollItem>();
95 for (LXTransition t : transitions) {
96 items.add(new TransitionScrollItem(t));
98 new UIScrollList(1, titleHeight, w-2, 60).setItems(items).addToContainer(this);
99 new UIParameterSlider(6, titleHeight + 66, w-12, 24).setParameter(lx.engine.getDeck(1).getCrossfader()).addToContainer(this);
100 new UIToggleSet(6, 122, w-12, 20) {
101 protected void onToggle(String value) {
104 }.setOptions(new String[] { "A", "COMP", "B" }).setValue(displayMode = "COMP").addToContainer(this);
108 class TransitionScrollItem extends AbstractScrollItem {
109 private final LXTransition transition;
110 private String label;
112 TransitionScrollItem(LXTransition transition) {
113 this.transition = transition;
114 label = className(transition, "Transition");
117 public String getLabel() {
121 public boolean isSelected() {
122 return transition == lx.engine.getDeck(1).getBlendTransition();
125 public boolean isPending() {
129 public void select() {
130 lx.engine.getDeck(1).setBlendTransition(transition);
134 class UIEffects extends UIWindow {
135 UIEffects(float x, float y, float w, float h) {
136 super("FX", x, y, w, h);
138 int yp = titleHeight;
139 List<ScrollItem> items = new ArrayList<ScrollItem>();
140 for (LXEffect fx : glucose.lx.getEffects()) {
141 items.add(new FXScrollItem(fx));
143 final UIScrollList effectsList = new UIScrollList(1, yp, w-2, 60).setItems(items);
144 effectsList.addToContainer(this);
145 yp += effectsList.h + 10;
147 final UIParameterKnob[] parameterKnobs = new UIParameterKnob[4];
148 for (int ki = 0; ki < parameterKnobs.length; ++ki) {
149 parameterKnobs[ki] = new UIParameterKnob(5 + 34*(ki % 4), yp + (ki/4) * 48);
150 parameterKnobs[ki].addToContainer(this);
153 GLucose.EffectListener fxListener = new GLucose.EffectListener() {
154 public void effectSelected(LXEffect effect) {
156 for (LXParameter p : effect.getParameters()) {
157 if (i >= parameterKnobs.length) {
160 parameterKnobs[i++].setParameter(p);
162 while (i < parameterKnobs.length) {
163 parameterKnobs[i++].setParameter(null);
168 glucose.addEffectListener(fxListener);
169 fxListener.effectSelected(glucose.getSelectedEffect());
173 class FXScrollItem extends AbstractScrollItem {
175 private LXEffect effect;
176 private String label;
178 FXScrollItem(LXEffect effect) {
179 this.effect = effect;
180 label = className(effect, "Effect");
183 public String getLabel() {
187 public boolean isSelected() {
188 return !effect.isEnabled() && (glucose.getSelectedEffect() == effect);
191 public boolean isPending() {
192 return effect.isEnabled();
195 public void select() {
196 glucose.setSelectedEffect(effect);
199 public void onMousePressed() {
200 if (glucose.getSelectedEffect() == effect) {
201 if (effect.isMomentary()) {
209 public void onMouseReleased() {
210 if (effect.isMomentary()) {
219 class UIOutput extends UIWindow {
220 public UIOutput(float x, float y, float w, float h) {
221 super("OUTPUT", x, y, w, h);
222 float yp = titleHeight;
223 for (final PandaDriver panda : pandaBoards) {
224 final UIButton button = new UIButton(4, yp, w-8, 20) {
225 protected void onToggle(boolean active) {
226 panda.setEnabled(active);
228 }.setLabel(panda.ip);
229 button.addToContainer(this);
230 panda.setListener(new PandaDriver.Listener() {
231 public void onToggle(boolean active) {
232 button.setActive(active);
240 class UITempo extends UIWindow {
242 private final UIButton tempoButton;
244 UITempo(float x, float y, float w, float h) {
245 super("TEMPO", x, y, w, h);
246 tempoButton = new UIButton(4, titleHeight, w-8, 20) {
247 protected void onToggle(boolean active) {
252 }.setMomentary(true);
253 tempoButton.addToContainer(this);
257 tempoButton.setLabel("" + ((int)(lx.tempo.bpm() * 10)) / 10.);
260 // Overlay tempo thing with openGL, redraw faster than button UI
261 fill(color(0, 0, 24 - 8*lx.tempo.rampf()));
263 rect(x + 8, y + titleHeight + 5, 12, 12);
267 class UIMapping extends UIWindow {
269 private static final String MAP_MODE_ALL = "ALL";
270 private static final String MAP_MODE_CHANNEL = "CHNL";
271 private static final String MAP_MODE_CUBE = "CUBE";
273 private static final String CUBE_MODE_ALL = "ALL";
274 private static final String CUBE_MODE_STRIP = "SNGL";
275 private static final String CUBE_MODE_PATTERN = "PTRN";
277 private final MappingTool mappingTool;
279 private final UIIntegerBox channelBox;
280 private final UIIntegerBox cubeBox;
281 private final UIIntegerBox stripBox;
283 UIMapping(MappingTool tool, float x, float y, float w, float h) {
284 super("MAPPING", x, y, w, h);
287 int yp = titleHeight;
288 new UIToggleSet(4, yp, w-8, 20) {
289 protected void onToggle(String value) {
290 if (value == MAP_MODE_ALL) mappingTool.mappingMode = mappingTool.MAPPING_MODE_ALL;
291 else if (value == MAP_MODE_CHANNEL) mappingTool.mappingMode = mappingTool.MAPPING_MODE_CHANNEL;
292 else if (value == MAP_MODE_CUBE) mappingTool.mappingMode = mappingTool.MAPPING_MODE_SINGLE_CUBE;
294 }.setOptions(new String[] { MAP_MODE_ALL, MAP_MODE_CHANNEL, MAP_MODE_CUBE }).addToContainer(this);
296 new UILabel(4, yp+8, w-8, 20).setLabel("CHANNEL ID").addToContainer(this);
298 (channelBox = new UIIntegerBox(4, yp, w-8, 20) {
299 protected void onValueChange(int value) {
300 mappingTool.setChannel(value-1);
302 }).setRange(1, mappingTool.numChannels()).addToContainer(this);
305 new UILabel(4, yp+8, w-8, 20).setLabel("CUBE ID").addToContainer(this);
307 (cubeBox = new UIIntegerBox(4, yp, w-8, 20) {
308 protected void onValueChange(int value) {
309 mappingTool.setCube(value-1);
311 }).setRange(1, glucose.model.cubes.size()).addToContainer(this);
314 new UILabel(4, yp+8, w-8, 20).setLabel("COLORS").addToContainer(this);
317 new UIScrollList(1, yp, w-2, 60).setItems(Arrays.asList(new ScrollItem[] {
318 new ColorScrollItem(ColorScrollItem.COLOR_RED),
319 new ColorScrollItem(ColorScrollItem.COLOR_GREEN),
320 new ColorScrollItem(ColorScrollItem.COLOR_BLUE),
321 })).addToContainer(this);
324 new UILabel(4, yp+8, w-8, 20).setLabel("STRIP MODE").addToContainer(this);
327 new UIToggleSet(4, yp, w-8, 20) {
328 protected void onToggle(String value) {
329 if (value == CUBE_MODE_ALL) mappingTool.cubeMode = mappingTool.CUBE_MODE_ALL;
330 else if (value == CUBE_MODE_STRIP) mappingTool.cubeMode = mappingTool.CUBE_MODE_SINGLE_STRIP;
331 else if (value == CUBE_MODE_PATTERN) mappingTool.cubeMode = mappingTool.CUBE_MODE_STRIP_PATTERN;
333 }.setOptions(new String[] { CUBE_MODE_ALL, CUBE_MODE_STRIP, CUBE_MODE_PATTERN }).addToContainer(this);
336 new UILabel(4, yp+8, w-8, 20).setLabel("STRIP ID").addToContainer(this);
339 (stripBox = new UIIntegerBox(4, yp, w-8, 20) {
340 protected void onValueChange(int value) {
341 mappingTool.setStrip(value-1);
343 }).setRange(1, Cube.STRIPS_PER_CUBE).addToContainer(this);
347 public void setChannelID(int value) {
348 channelBox.setValue(value);
351 public void setCubeID(int value) {
352 cubeBox.setValue(value);
355 public void setStripID(int value) {
356 stripBox.setValue(value);
359 class ColorScrollItem extends AbstractScrollItem {
361 public static final int COLOR_RED = 1;
362 public static final int COLOR_GREEN = 2;
363 public static final int COLOR_BLUE = 3;
365 private final int colorChannel;
367 ColorScrollItem(int colorChannel) {
368 this.colorChannel = colorChannel;
371 public String getLabel() {
372 switch (colorChannel) {
373 case COLOR_RED: return "Red";
374 case COLOR_GREEN: return "Green";
375 case COLOR_BLUE: return "Blue";
380 public boolean isSelected() {
381 switch (colorChannel) {
382 case COLOR_RED: return mappingTool.channelModeRed;
383 case COLOR_GREEN: return mappingTool.channelModeGreen;
384 case COLOR_BLUE: return mappingTool.channelModeBlue;
389 public void select() {
390 switch (colorChannel) {
391 case COLOR_RED: mappingTool.channelModeRed = !mappingTool.channelModeRed; break;
392 case COLOR_GREEN: mappingTool.channelModeGreen = !mappingTool.channelModeGreen; break;
393 case COLOR_BLUE: mappingTool.channelModeBlue = !mappingTool.channelModeBlue; break;
399 class UIDebugText extends UIContext {
401 private String line1 = "";
402 private String line2 = "";
404 UIDebugText(float x, float y, float w, float h) {
408 public UIDebugText setText(String line1) {
409 return setText(line1, "");
412 public UIDebugText setText(String line1, String line2) {
413 if (!line1.equals(this.line1) || !line2.equals(this.line2)) {
416 setVisible(line1.length() + line2.length() > 0);
422 protected void onDraw(PGraphics pg) {
424 if (line1.length() + line2.length() > 0) {
428 pg.textFont(defaultItemFont);
429 pg.textAlign(LEFT, TOP);
431 pg.text(line1, 4, 4);
432 pg.text(line2, 4, 24);
437 String className(Object p, String suffix) {
438 String s = p.getClass().getName();
440 if ((li = s.lastIndexOf(".")) > 0) {
441 s = s.substring(li + 1);
443 if (s.indexOf("SugarCubes$") == 0) {
444 s = s.substring("SugarCubes$".length());
446 if ((suffix != null) && ((li = s.indexOf(suffix)) != -1)) {
447 s = s.substring(0, li);