// Layout Preload Data protected virtual void LayoutPreloadData() { // For updates bool updated = false; // Layout preload items GUILayout.Space(WitStyles.WindowPaddingBottom); GUILayout.BeginHorizontal(); WitEditorUI.LayoutSubheaderLabel("TTS Preload Data"); if (WitEditorUI.LayoutTextButton("Add Voice")) { AddVoice(); updated = true; } GUILayout.EndHorizontal(); EditorGUILayout.Space(); // Indent EditorGUI.indentLevel++; // Generate if (Settings.data == null) { Settings.data = new TTSPreloadData(); } if (Settings.data.voices == null) { Settings.data.voices = new TTSPreloadVoiceData[] { new TTSPreloadVoiceData() }; } // Begin scroll for (int v = 0; v < Settings.data.voices.Length; v++) { if (!LayoutVoiceData(Settings.data, v, ref updated)) { break; } } // Set dirty if (updated) { EditorUtility.SetDirty(Settings); } // Indent EditorGUI.indentLevel--; }
private static void OnServiceGUI(TTSService service) { // Wrong type if (service.GetType() != typeof(TTSWit) || Application.isPlaying) { return; } // Get data string text = "Update Voice List"; bool canUpdate = true; if (IsUpdating) { text = "Updating Voice List"; canUpdate = false; } else if (IsLoading) { text = "Loading Voice List"; canUpdate = false; } // Layout update GUI.enabled = canUpdate; if (WitEditorUI.LayoutTextButton(text) && canUpdate) { TTSWit wit = service as TTSWit; UpdateVoices(wit.RequestSettings.configuration, null); } GUI.enabled = true; // Force an update if (!_forcedUpdate && canUpdate && (_voices == null || _voices.Length == 0)) { _forcedUpdate = true; TTSWit wit = service as TTSWit; UpdateVoices(wit.RequestSettings.configuration, null); } }
protected override void LayoutContent() { // Server access token GUILayout.BeginHorizontal(); bool updated = false; WitEditorUI.LayoutPasswordField(WitTexts.SettingsServerTokenContent, ref serverToken, ref updated); if (updated) { RelinkServerToken(false); } if (WitEditorUI.LayoutTextButton(WitTexts.Texts.SettingsRelinkButtonLabel)) { RelinkServerToken(true); } if (WitEditorUI.LayoutTextButton(WitTexts.Texts.SettingsAddButtonLabel)) { int newIndex = WitConfigurationUtility.CreateConfiguration(serverToken); if (newIndex != -1) { SetConfiguration(newIndex); } } GUILayout.EndHorizontal(); GUILayout.Space(WitStyles.ButtonMargin); // Configuration select base.LayoutContent(); // Update inspector if needed if (witInspector == null || witConfiguration == null || witInspector.configuration != witConfiguration) { SetWitEditor(); } // Layout configuration inspector if (witConfiguration && witInspector) { witInspector.OnInspectorGUI(); } }
private void LayoutConduitContent() { string manifestPath = configuration.ManifestEditorPath; manifestAvailable = File.Exists(manifestPath); var useConduit = (GUILayout.Toggle(configuration.useConduit, "Use Conduit (Beta)")); if (configuration.useConduit != useConduit) { configuration.useConduit = useConduit; EditorUtility.SetDirty(configuration); } EditorGUI.BeginDisabledGroup(!configuration.useConduit); { EditorGUI.indentLevel++; GUILayout.Space(EditorGUI.indentLevel * WitStyles.ButtonMargin); { GUILayout.BeginHorizontal(); if (WitEditorUI.LayoutTextButton(manifestAvailable ? "Update Manifest" : "Generate Manifest")) { GenerateManifest(configuration, configuration.openManifestOnGeneration); } GUI.enabled = manifestAvailable; if (WitEditorUI.LayoutTextButton("Select Manifest") && manifestAvailable) { Selection.activeObject = AssetDatabase.LoadAssetAtPath <TextAsset>(configuration.ManifestEditorPath); } GUI.enabled = true; GUILayout.EndHorizontal(); GUILayout.Space(WitStyles.ButtonMargin); configuration.autoGenerateManifest = (GUILayout.Toggle(configuration.autoGenerateManifest, "Auto Generate")); } EditorGUI.indentLevel--; GUILayout.TextField($"Manifests generated: {Statistics.SuccessfulGenerations}"); } EditorGUI.EndDisabledGroup(); }
// Layout Preload Data protected virtual void LayoutPreloadActions() { // Layout preload actions EditorGUILayout.Space(); WitEditorUI.LayoutSubheaderLabel("TTS Preload Actions"); // Indent EditorGUI.indentLevel++; EditorGUILayout.Space(); // Hide when playing if (Application.isPlaying) { EditorUtility.ClearProgressBar(); WitEditorUI.LayoutErrorLabel("TTS preload actions cannot be performed at runtime."); EditorGUI.indentLevel--; return; } // Get TTS Service if needed TtsService = EditorGUILayout.ObjectField("TTS Service", TtsService, typeof(TTSService), true) as TTSService; if (TtsService == null) { EditorUtility.ClearProgressBar(); TtsService = GameObject.FindObjectOfType <TTSService>(); WitEditorUI.LayoutErrorLabel("You must add a TTS Service to the loaded scene in order perform TTS actions."); EditorGUI.indentLevel--; return; } if (TtsService != null && _ttsVoiceIDs == null) { _ttsVoiceIDs = GetVoiceIDs(TtsService); } // Begin buttons EditorGUILayout.Space(); EditorGUILayout.BeginHorizontal(); // Import JSON GUILayout.Space(ACTION_BTN_INDENT * EditorGUI.indentLevel); if (WitEditorUI.LayoutTextButton("Refresh Data")) { RefreshData(); } GUILayout.Space(ACTION_BTN_INDENT); if (WitEditorUI.LayoutTextButton("Import JSON")) { EditorUtility.ClearProgressBar(); if (TTSPreloadUtility.ImportData(Settings)) { RefreshData(); } } // Clear disk cache GUI.enabled = TtsService != null; EditorGUILayout.Space(); Color col = GUI.color; GUI.color = Color.red; if (WitEditorUI.LayoutTextButton("Delete Cache")) { EditorUtility.ClearProgressBar(); TTSPreloadUtility.DeleteData(TtsService); RefreshData(); } // Preload disk cache GUILayout.Space(ACTION_BTN_INDENT); GUI.color = Color.green; if (WitEditorUI.LayoutTextButton("Preload Cache")) { DownloadClips(); } GUI.color = col; GUI.enabled = true; // End buttons EditorGUILayout.EndHorizontal(); EditorGUILayout.Space(); // Indent EditorGUI.indentLevel--; }
// Layout phrase data private bool LayoutPhraseData(TTSPreloadVoiceData voiceData, int phraseIndex, ref bool updated) { // Begin Phrase EditorGUI.indentLevel++; // Get data TTSPreloadPhraseData phraseData = voiceData.phrases[phraseIndex]; string title = $"{(phraseIndex+1)} - {phraseData.textToSpeak}"; // Foldout GUILayout.BeginHorizontal(); bool show = WitEditorUI.LayoutFoldout(new GUIContent(title), phraseData); if (!show) { GUILayout.EndHorizontal(); EditorGUI.indentLevel--; return(true); } // Delete if (WitEditorUI.LayoutTextButton("Delete Phrase")) { voiceData.phrases = DeleteArrayItem <TTSPreloadPhraseData>(voiceData.phrases, phraseIndex); GUILayout.EndHorizontal(); EditorGUI.indentLevel--; updated = true; return(false); } // Begin phrase Data GUILayout.EndHorizontal(); EditorGUI.indentLevel++; // Phrase bool phraseChange = false; WitEditorUI.LayoutTextField(new GUIContent("Phrase"), ref phraseData.textToSpeak, ref phraseChange); if (phraseChange) { TTSPreloadUtility.RefreshPhraseData(TtsService, new TTSDiskCacheSettings() { DiskCacheLocation = TTSDiskCacheLocation.Preload }, TtsService?.GetPresetVoiceSettings(voiceData.presetVoiceID), phraseData); updated = true; } // Clip string clipID = phraseData.clipID; WitEditorUI.LayoutTextField(new GUIContent("Clip ID"), ref clipID, ref phraseChange); // State Color col = GUI.color; Color stateColor = Color.green; string stateValue = "Downloaded"; if (!phraseData.downloaded) { if (phraseData.downloadProgress <= 0f) { stateColor = Color.red; stateValue = "Missing"; } else { stateColor = Color.yellow; stateValue = $"Downloading {(phraseData.downloadProgress * 100f):00.0}%"; } } GUI.color = stateColor; WitEditorUI.LayoutKeyLabel("State", stateValue); GUI.color = col; // End Phrase EditorGUILayout.Space(); EditorGUI.indentLevel--; EditorGUI.indentLevel--; return(true); }
// Layout private bool LayoutVoiceData(TTSPreloadData preloadData, int voiceIndex, ref bool updated) { // Indent EditorGUI.indentLevel++; // Get data TTSPreloadVoiceData voiceData = preloadData.voices[voiceIndex]; string voiceID = voiceData.presetVoiceID; if (string.IsNullOrEmpty(voiceID)) { voiceID = "No Voice Selected"; } voiceID = $"{(voiceIndex+1)} - {voiceID}"; // Foldout GUILayout.BeginHorizontal(); bool show = WitEditorUI.LayoutFoldout(new GUIContent(voiceID), voiceData); if (!show) { GUILayout.EndHorizontal(); EditorGUI.indentLevel--; return(true); } // Delete if (WitEditorUI.LayoutTextButton("Delete Voice")) { DeleteVoice(voiceIndex); GUILayout.EndHorizontal(); EditorGUI.indentLevel--; updated = true; return(false); } // Begin Voice Data GUILayout.EndHorizontal(); EditorGUI.indentLevel++; // Voice Text Field if (TtsService == null || _ttsVoiceIDs == null || _ttsVoiceIDs.Count == 0) { WitEditorUI.LayoutTextField(new GUIContent("Voice ID"), ref voiceData.presetVoiceID, ref updated); } // Voice Preset Select else { int presetIndex = _ttsVoiceIDs.IndexOf(voiceData.presetVoiceID); bool presetUpdated = false; WitEditorUI.LayoutPopup("Voice ID", _ttsVoiceIDs.ToArray(), ref presetIndex, ref presetUpdated); if (presetUpdated) { voiceData.presetVoiceID = _ttsVoiceIDs[presetIndex]; string l = string.Empty; TTSPreloadUtility.RefreshVoiceData(TtsService, voiceData, null, ref l); updated = true; } } // Ensure phrases exist if (voiceData.phrases == null) { voiceData.phrases = new TTSPreloadPhraseData[] { }; } // Phrase Foldout EditorGUILayout.BeginHorizontal(); bool isLayout = WitEditorUI.LayoutFoldout(new GUIContent($"Phrases ({voiceData.phrases.Length})"), voiceData.phrases); if (WitEditorUI.LayoutTextButton("Add Phrase")) { TTSPreloadPhraseData lastPhrase = voiceData.phrases.Length == 0 ? null : voiceData.phrases[voiceData.phrases.Length - 1]; voiceData.phrases = AddArrayItem <TTSPreloadPhraseData>(voiceData.phrases, new TTSPreloadPhraseData() { textToSpeak = lastPhrase?.textToSpeak, clipID = lastPhrase?.clipID }); GUILayout.EndHorizontal(); EditorGUI.indentLevel--; updated = true; return(false); } EditorGUILayout.EndHorizontal(); if (isLayout) { for (int p = 0; p < voiceData.phrases.Length; p++) { if (!LayoutPhraseData(voiceData, p, ref updated)) { break; } } } // End Voice Data EditorGUILayout.Space(); EditorGUI.indentLevel--; EditorGUI.indentLevel--; return(true); }
protected override void LayoutContent() { // Get service VoiceService voiceService = null; // Runtime Mode if (Application.isPlaying) { // Refresh services if (_services == null) { RefreshVoiceServices(); } // Services missing if (_services == null || _serviceNames == null || _services.Length == 0) { WitEditorUI.LayoutErrorLabel(WitTexts.Texts.UnderstandingViewerMissingServicesLabel); return; } // Voice service select int newService = _currentService; bool serviceUpdate = false; GUILayout.BeginHorizontal(); // Clamp if (newService < 0 || newService >= _services.Length) { newService = 0; serviceUpdate = true; } // Layout WitEditorUI.LayoutPopup(WitTexts.Texts.UnderstandingViewerServicesLabel, _serviceNames, ref newService, ref serviceUpdate); // Update if (serviceUpdate) { SetVoiceService(newService); } // Refresh if (WitEditorUI.LayoutTextButton(WitTexts.Texts.ConfigurationRefreshButtonLabel)) { RefreshVoiceServices(); } GUILayout.EndHorizontal(); // Ensure service exists voiceService = service; } // Editor Only else { // Configuration select base.LayoutContent(); // Ensure configuration exists if (!witConfiguration) { WitEditorUI.LayoutErrorLabel(WitTexts.Texts.UnderstandingViewerMissingConfigLabel); return; } // Check client access token string clientAccessToken = witConfiguration.clientAccessToken; if (string.IsNullOrEmpty(clientAccessToken)) { WitEditorUI.LayoutErrorLabel(WitTexts.Texts.UnderstandingViewerMissingClientTokenLabel); GUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); if (WitEditorUI.LayoutTextButton(WitTexts.Texts.UnderstandingViewerSettingsButtonLabel)) { Selection.activeObject = witConfiguration; } GUILayout.EndHorizontal(); return; } } // Determine if input is allowed bool allowInput = !Application.isPlaying || (service != null && !service.Active); GUI.enabled = allowInput; // Utterance field bool updated = false; WitEditorUI.LayoutTextField(new GUIContent(WitTexts.Texts.UnderstandingViewerUtteranceLabel), ref _utterance, ref updated); // Begin Buttons GUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); // Submit utterance if (allowInput && WitEditorUI.LayoutTextButton(WitTexts.Texts.UnderstandingViewerSubmitButtonLabel)) { _responseText = ""; if (!string.IsNullOrEmpty(_utterance)) { SubmitUtterance(); } else { _response = null; } } // Service buttons GUI.enabled = true; if (EditorApplication.isPlaying && voiceService) { if (!voiceService.Active) { // Activate if (WitEditorUI.LayoutTextButton(WitTexts.Texts.UnderstandingViewerActivateButtonLabel)) { voiceService.Activate(); } } else { // Deactivate if (WitEditorUI.LayoutTextButton(WitTexts.Texts.UnderstandingViewerDeactivateButtonLabel)) { voiceService.Deactivate(); } // Abort if (WitEditorUI.LayoutTextButton(WitTexts.Texts.UnderstandingViewerAbortButtonLabel)) { voiceService.DeactivateAndAbortRequest(); } } } GUILayout.EndHorizontal(); // Results GUILayout.BeginVertical(EditorStyles.helpBox); if (_response != null) { DrawResponse(); } else if (voiceService && voiceService.MicActive) { WitEditorUI.LayoutWrapLabel(WitTexts.Texts.UnderstandingViewerListeningLabel); } else if (voiceService && voiceService.IsRequestActive) { WitEditorUI.LayoutWrapLabel(WitTexts.Texts.UnderstandingViewerLoadingLabel); } else if (string.IsNullOrEmpty(_responseText)) { WitEditorUI.LayoutWrapLabel(WitTexts.Texts.UnderstandingViewerPromptLabel); } else { WitEditorUI.LayoutWrapLabel(_responseText); } GUILayout.FlexibleSpace(); GUILayout.EndVertical(); }
protected virtual void LayoutContent() { // Begin vertical box GUILayout.BeginVertical(EditorStyles.helpBox); // Check for app name/id update ReloadAppData(); // Title Foldout GUILayout.BeginHorizontal(); string foldoutText = WitTexts.Texts.ConfigurationHeaderLabel; if (!string.IsNullOrEmpty(_appName)) { foldoutText = foldoutText + " - " + _appName; } _foldout = WitEditorUI.LayoutFoldout(new GUIContent(foldoutText), _foldout); // Refresh button if (CanConfigurationRefresh(configuration)) { if (string.IsNullOrEmpty(_appName)) { bool isValid = WitConfigurationUtility.IsServerTokenValid(_serverToken); GUI.enabled = isValid; if (WitEditorUI.LayoutTextButton(WitTexts.Texts.ConfigurationRefreshButtonLabel)) { ApplyServerToken(_serverToken); } } else { bool isRefreshing = configuration.IsRefreshingData(); GUI.enabled = !isRefreshing; if (WitEditorUI.LayoutTextButton(isRefreshing ? WitTexts.Texts.ConfigurationRefreshingButtonLabel : WitTexts.Texts.ConfigurationRefreshButtonLabel)) { SafeRefresh(); } } } GUI.enabled = true; GUILayout.EndHorizontal(); GUILayout.Space(WitStyles.ButtonMargin); // Show configuration app data if (_foldout) { // Indent EditorGUI.indentLevel++; // Server access token bool updated = false; WitEditorUI.LayoutPasswordField(WitTexts.ConfigurationServerTokenContent, ref _serverToken, ref updated); if (updated) { ApplyServerToken(_serverToken); } // Additional data if (configuration) { LayoutConfigurationData(); } // Undent EditorGUI.indentLevel--; } // End vertical box layout GUILayout.EndVertical(); GUILayout.BeginVertical(EditorStyles.helpBox); LayoutConduitContent(); GUILayout.EndVertical(); // Layout configuration request tabs LayoutConfigurationRequestTabs(); // Additional open wit button GUILayout.FlexibleSpace(); if (GUILayout.Button(OpenButtonLabel, WitStyles.TextButton)) { Application.OpenURL(HeaderUrl); } }