!7 cmodule VoiceRecognitionStatus { transient S modeOff = "off", modeListenAllTheTime = "listen", modeListenOnNoise = "listen on noise"; transient LS userSelectedModes = ll( modeOff, modeListenAllTheTime, modeListenOnNoise); // left-click on tray icon cycles only through these states transient LS cycleList = ll(modeOff, modeListenOnNoise); S userSelectedMode; switchable bool showHostTrayIcon = true; transient TrayIcon hostTrayIcon; transient ButtonGroup buttons; transient long listeningUntil; // optional transient bool listening; start { dm_reloadOnFieldChange showHostTrayIcon(); if (showHostTrayIcon) hostTrayIcon = dm_systemTrayIcon(makeImage(), makeTooltip(), flattenArray_recursive( rThread nextMode, // left-click command "Show speech correlator", r { dm_activateOSAndModule speechCorrelator() }, map(userSelectedModes, mode -> ll(mode, rThread { setModeWithInfoBox(mode) })), // modes "---", "type", rThread { dm_focusAIBar() } // allow user to type in AI bar )); dm_watchFieldAndNow userSelectedMode(r { selectRadioButton(buttons, indexOfIC(userSelectedModes, userSelectedMode)); if (eqic(userSelectedMode, modeOff)) { // turn off Listen On Noise & actual recognizer dm_call(dm_listenOnNoiseModuleOpt(), 'setEnabled, false); dm_stopListening(); dm_findAndCall("#1020629/SpeechRecognitionControl", 'cancelAll); } else if (eqic(userSelectedMode, modeListenOnNoise)) { dm_call(dm_listenOnNoiseModule(), 'setEnabled, true); dm_startGoogleSpeechRecognition(); } else if (eqic(userSelectedMode, modeListenAllTheTime)) { dm_call(dm_listenOnNoiseModuleOpt(), 'setEnabled, false); dm_startGoogleSpeechRecognition(); } setToolTip(hostTrayIcon, makeTooltip()); setTrayIconImage(hostTrayIcon, makeImage()); }); } visualize { buttons = jRadioButtons(userSelectedModes); selectRadioButton(buttons, indexOfIC(userSelectedModes, userSelectedMode)); onRadioButtonChange(buttons, voidfunc(int i) { setField(userSelectedMode := _get(userSelectedModes, i)); }); ret jfullcenter(vstackWithSpacing(buttonsInGroup(buttons))); } void nextMode { setModeWithInfoBox(nextInCyclicList(userSelectedMode, cycleList)); } void setModeWithInfoBox(S mode) { infoBox("New mode: " + mode, 1.0); setField(userSelectedMode := mode); } S makeTooltip() { ret userSelectedMode + " - voice recognition 3-way switch"; } S makeImage() { ret eqic(userSelectedMode, modeOff) ? #1102870 : #1101635; } }