!7 module ShowRandomColor > DynModule { RGB color; S myGuess, yourName; bool voiceMode = true; // voice input & output transient JPanel colorPanel; transient JTextField tfYourName; transient JButton btnSave; visualize { if (color == null) setField(color := makeRandomColor()); dm_onTopInput(voidfunc(S s) { if (!dm_isActiveModule(module())) ret with print("not active"); JComponent popup = dm_generalMap_get('yesPopup); if "yes that's right" simulateClick(btnSave); else if "yes|okay|ok" { if (isShowing(popup) && getOpt(popup, 'forComponent) == btnSave) { removeFromParent(popup); simulateClick(btnSave); } } else if "no" removeFromParent(popup); else if "new color|next color" newColor(); else { print("Got input: " + s); setField(yourName := s); dm_showYesToAcceptPopupAbove(btnSave); } }); JComponent theForm = vstackWithSpacing( makeBold(fontSize(20, liveValueLabel(mapLiveValue(dm_fieldLiveValue('myGuess), S, func(S s) -> S { "I call this color: " + or2(s, "Uh... no idea.") })))), westCenterAndEastWithMargin(fontSize(20, jBoldLabel("How do you call this color?")), onEnter(tfYourName = selectAllOnFocus( fontSize(20, dm_fieldTextField('yourName))), rThread saveName), btnSave = jBoldButton("SAVE", rThread saveName)), withTopMargin(rightAlignedLine(jBoldButton("NEXT ONE", rThread newColor)))); ret centerAndSouthWithMargin( northAndCenterWithMargins( westAndCenter(dm_fieldCheckBox('voiceMode), rightAlignedLine( withLabel("Color Code:", jBoldLiveValueLabel(mapLiveValue(func(O color) -> S { "#" + color }, S, dm_fieldLiveValue('color)))), jPopDownButton_noText("Choose color...", rThread chooseColor))), jCenteredSectionWithFont(sansSerifBold(18), " HERE'S THE COLOR ", colorPanel = singleColorPanel(toColor(color)))), withSideMargin(15, theForm)); } void newColor enter { setColor(makeRandomColor()); } void setColor(RGB color) enter { setField(+color); setField(myGuess := or((S) dm_callModule(dm_colorNamesModule(), 'getClosestColorName, color.getColor()), "no idea")); setField(yourName := myGuess); changeSingleColorPanel(colorPanel, color.getColor()); selectAll(tfYourName); } void saveName enter { setField(yourName := trim(yourName)); if (empty(yourName)) ret; if (eqic(myGuess, yourName)) dm_infoBoxOrTalk(voiceMode, randomLL( "Got this one right!", "I'm good!", "I'm so smart.", "Yay!")); else dm_infoBoxOrTalk(voiceMode, quote(yourName) + (voiceMode ? "," : "...") + " I see."); dm_callModule(dm_colorNamesModule(), 'addColorName, color.getColor(), yourName, ""); newColor(); } RGB makeRandomColor() { ret randomHSBColor(); } void chooseColor enter { inputText("Choose a color (RRGGBB)", color.getHexString(), voidfunc(S s) enter { setColor(rgbFromHex(s)) }); } S switchableFields() { ret 'voiceMode; } }