!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 = withRightMargin(makeForm2(
      "I call this color:", dm_fieldLabel(mapLiveValue('myGuess, S, rcurry or2("no idea")),
      "How do you call this color?", centerAndEastWithMargin(
        onEnter(tfYourName = selectAllOnFocus(
          dm_fieldTextField('yourName)), rThread saveName),
        btnSave = jbutton("Save", rThread saveName))));

    ret withRightAlignedButtons(
      centerAndSouthWithMargin(
        northAndCenterWithMargins(
          westAndCenter(dm_fieldCheckBox('voiceMode),
            rightAlignedLine(
              jLiveValueLabel(mapLiveValue(func(O color) -> S { "Color Code: #" + color }, S, dm_fieldLiveValue('color))),
              jPopDownButton_noText("Choose color...", rThread chooseColor))),
          jSection("THE COLOR", colorPanel = singleColorPanel(toColor(color)))),
      jPreferredSizeToMinSizePlusY(5, theForm)),
      "New Color", rThread newColor);
  }
  
  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; }
}