!7 cmodule VoiceRecognitionStatus { transient S modeOff = "off", modeListenAllTheTime = "listen", modeListenOnNoise = "listen on noise"; transient LS userSelectedModes = ll( modeOff, modeListenAllTheTime, 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(#1101635, makeTooltip(), rThread nextMode, flattenArray_recursive(map(userSelectedModes, mode -> ll(mode, rThread { setModeWithInfoBox(mode); })))); 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_findAndCall("#1020629/SpeechRecognitionControl", 'cancelAll); dm_stopListening(); } 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()); }); } 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, userSelectedModes)); } void setModeWithInfoBox(S mode) { infoBox("New mode: " + mode, 1.0); setField(userSelectedMode := mode); } S makeTooltip() { ret userSelectedMode + " - voice recognition 3-way switch"; } }