from os import path as os_path from typing import Union from types import SimpleNamespace from tkinter import font as tk_font import webbrowser import i18n from languages import selectable_languages from customtkinter import StringVar, IntVar, BooleanVar, END as CTK_END, get_appearance_mode from vrct_gui.ui_managers import ColorThemeManager, ImageFileManager, UiScalingManager from vrct_gui import vrct_gui from config import config class View(): def __init__(self): self.settings = SimpleNamespace() theme = get_appearance_mode() if config.APPEARANCE_THEME == "System" else config.APPEARANCE_THEME all_ctm = ColorThemeManager(theme) all_uism = UiScalingManager(config.UI_SCALING) image_file = ImageFileManager(theme) i18n.load_path.append(os_path.join(os_path.dirname(__file__), "locales")) i18n.set("fallback", "en") # The fallback language is English. i18n.set("skip_locale_root_data", True) i18n.set("filename_format", "{locale}.{format}") i18n.set("enable_memoization", True) i18n.set("locale", config.UI_LANGUAGE) common_args = { "image_file": image_file, "FONT_FAMILY": config.FONT_FAMILY, } self.settings.main = SimpleNamespace( ctm=all_ctm.main, uism=all_uism.main, COMPACT_MODE_ICON_SIZE=0, **common_args ) self.settings.config_window = SimpleNamespace( ctm=all_ctm.config_window, uism=all_uism.config_window, **common_args ) self.settings.selectable_language_window = SimpleNamespace( ctm=all_ctm.selectable_language_window, uism=all_uism.selectable_language_window, **common_args ) self.settings.modal_window = SimpleNamespace( ctm=all_ctm.modal_window, uism=all_uism.modal_window, **common_args ) self.view_variable = SimpleNamespace( # Common CALLBACK_RESTART_SOFTWARE=None, # Open Config Window CALLBACK_OPEN_CONFIG_WINDOW=None, CALLBACK_CLOSE_CONFIG_WINDOW=None, # Open Help and Information Page CALLBACK_CLICKED_HELP_AND_INFO=self.openWebPage_VrctDocuments, # Open Update Page CALLBACK_CLICKED_UPDATE_AVAILABLE=None, # Main Window # Sidebar # Sidebar Compact Mode IS_MAIN_WINDOW_SIDEBAR_COMPACT_MODE=config.IS_MAIN_WINDOW_SIDEBAR_COMPACT_MODE, CALLBACK_TOGGLE_MAIN_WINDOW_SIDEBAR_COMPACT_MODE=None, # Sidebar Features VAR_LABEL_TRANSLATION=StringVar(value=i18n.t("main_window.translation")), CALLBACK_TOGGLE_TRANSLATION=None, VAR_LABEL_TRANSCRIPTION_SEND=StringVar(value=i18n.t("main_window.transcription_send")), CALLBACK_TOGGLE_TRANSCRIPTION_SEND=None, VAR_LABEL_TRANSCRIPTION_RECEIVE=StringVar(value=i18n.t("main_window.transcription_receive")), CALLBACK_TOGGLE_TRANSCRIPTION_RECEIVE=None, VAR_LABEL_FOREGROUND=StringVar(value=i18n.t("main_window.foreground")), CALLBACK_TOGGLE_FOREGROUND=None, # Sidebar Language Settings VAR_LABEL_LANGUAGE_SETTINGS=StringVar(value=i18n.t("main_window.language_settings")), LIST_SELECTABLE_LANGUAGES=[], CALLBACK_SELECTED_LANGUAGE_PRESET_TAB=None, VAR_LABEL_YOUR_LANGUAGE=StringVar(value=i18n.t("main_window.your_language")), VAR_YOUR_LANGUAGE = StringVar(value="Japanese\n(Japan)"), CALLBACK_OPEN_SELECTABLE_YOUR_LANGUAGE_WINDOW=None, IS_OPENED_SELECTABLE_YOUR_LANGUAGE_WINDOW=False, CALLBACK_SELECTED_YOUR_LANGUAGE=None, VAR_LABEL_BOTH_DIRECTION_DESC=StringVar(value=i18n.t("main_window.both_direction_desc")), VAR_LABEL_TARGET_LANGUAGE=StringVar(value=i18n.t("main_window.target_language")), VAR_TARGET_LANGUAGE = StringVar(value="English\n(United States)"), CALLBACK_OPEN_SELECTABLE_TARGET_LANGUAGE_WINDOW=None, IS_OPENED_SELECTABLE_TARGET_LANGUAGE_WINDOW=False, CALLBACK_SELECTED_TARGET_LANGUAGE=None, VAR_LABEL_TEXTBOX_ALL=StringVar(value=i18n.t("main_window.textbox_tab_all")), VAR_LABEL_TEXTBOX_SENT=StringVar(value=i18n.t("main_window.textbox_tab_sent")), VAR_LABEL_TEXTBOX_RECEIVED=StringVar(value=i18n.t("main_window.textbox_tab_received")), VAR_LABEL_TEXTBOX_SYSTEM=StringVar(value=i18n.t("main_window.textbox_tab_system")), VAR_UPDATE_AVAILABLE=StringVar(value=i18n.t("main_window.update_available")), # Modal Window For Main Window VAR_LABEL_MODAL_MESSAGE_FOR__MAIN_WINDOW=StringVar(value=i18n.t("main_window.modal_message.opened_config_window")), # Selectable Language Window VAR_TITLE_LABEL_SELECTABLE_LANGUAGE=StringVar(value=""), VAR_GO_BACK_LABEL_SELECTABLE_LANGUAGE=StringVar(value=i18n.t("selectable_language_window.go_back_button")), # Config Window ACTIVE_SETTING_BOX_TAB_ATTR_NAME="side_menu_tab_appearance", CALLBACK_SELECTED_SETTING_BOX_TAB=None, VAR_ERROR_MESSAGE=StringVar(value=""), VAR_VERSION=StringVar(value=config.VERSION), VAR_CONFIG_WINDOW_TITLE=StringVar(value=i18n.t("config_window.config_title")), VAR_CONFIG_WINDOW_COMPACT_MODE_LABEL=StringVar(value=i18n.t("config_window.compact_mode")), # Side Menu Labels VAR_SIDE_MENU_LABEL_APPEARANCE=StringVar(value=i18n.t("config_window.side_menu_labels.appearance")), VAR_SIDE_MENU_LABEL_TRANSLATION=StringVar(value=i18n.t("config_window.side_menu_labels.translation")), VAR_SIDE_MENU_LABEL_TRANSCRIPTION=StringVar(value=i18n.t("config_window.side_menu_labels.transcription")), VAR_SECOND_TITLE_TRANSCRIPTION_MIC=StringVar(value=i18n.t("config_window.side_menu_labels.transcription_mic")), VAR_SECOND_TITLE_TRANSCRIPTION_SPEAKER=StringVar(value=i18n.t("config_window.side_menu_labels.transcription_speaker")), VAR_SIDE_MENU_LABEL_OTHERS=StringVar(value=i18n.t("config_window.side_menu_labels.others")), VAR_SIDE_MENU_LABEL_ADVANCED_SETTINGS=StringVar(value=i18n.t("config_window.side_menu_labels.advanced_settings")), VAR_CURRENT_ACTIVE_CONFIG_TITLE=StringVar(value=""), VAR_LABEL_TRANSPARENCY=StringVar(value=i18n.t("config_window.transparency.label")), VAR_DESC_TRANSPARENCY=StringVar(value=i18n.t("config_window.transparency.desc")), SLIDER_RANGE_TRANSPARENCY=(50, 100), CALLBACK_SET_TRANSPARENCY=None, VAR_TRANSPARENCY=IntVar(value=config.TRANSPARENCY), CALLBACK_BUTTON_PRESS_TRANSPARENCY=self._closeTheCoverOfMainWindow, CALLBACK_BUTTON_RELEASE_TRANSPARENCY=self._openTheCoverOfMainWindow, VAR_LABEL_APPEARANCE_THEME=StringVar(value=i18n.t("config_window.appearance_theme.label")), VAR_DESC_APPEARANCE_THEME=StringVar(value=i18n.t("config_window.appearance_theme.desc")), LIST_APPEARANCE_THEME=["Light", "Dark", "System"], CALLBACK_SET_APPEARANCE_THEME=None, VAR_APPEARANCE_THEME=StringVar(value=config.APPEARANCE_THEME), VAR_LABEL_UI_SCALING=StringVar(value=i18n.t("config_window.ui_size.label")), VAR_DESC_UI_SCALING=None, LIST_UI_SCALING=["40%", "60%", "80%", "90%", "100%", "110%", "120%", "150%", "200%"], CALLBACK_SET_UI_SCALING=None, VAR_UI_SCALING=StringVar(value=config.UI_SCALING), VAR_LABEL_FONT_FAMILY=StringVar(value=i18n.t("config_window.font_family.label")), VAR_DESC_FONT_FAMILY=None, LIST_FONT_FAMILY=self.getAvailableFonts(), CALLBACK_SET_FONT_FAMILY=None, VAR_FONT_FAMILY=StringVar(value=config.FONT_FAMILY), VAR_LABEL_UI_LANGUAGE=StringVar(value=i18n.t("config_window.ui_language.label")), VAR_DESC_UI_LANGUAGE=None, LIST_UI_LANGUAGE=list(selectable_languages.values()), CALLBACK_SET_UI_LANGUAGE=None, VAR_UI_LANGUAGE=StringVar(value=selectable_languages[config.UI_LANGUAGE]), VAR_LABEL_DEEPL_AUTH_KEY=StringVar(value=i18n.t("config_window.deepl_auth_key.label")), VAR_DESC_DEEPL_AUTH_KEY=None, CALLBACK_SET_DEEPL_AUTH_KEY=None, VAR_DEEPL_AUTH_KEY=StringVar(value=config.AUTH_KEYS["DeepL(auth)"]), # Transcription Tab (Mic) VAR_TAB_SECOND_LABEL_TRANSCRIPTION_MIC=StringVar(value=i18n.t("config_window.tab_transcription.label")), VAR_LABEL_MIC_HOST=StringVar(value=i18n.t("config_window.mic_host.label")), VAR_DESC_MIC_HOST=None, LIST_MIC_HOST=[], CALLBACK_SET_MIC_HOST=None, VAR_MIC_HOST=StringVar(value=config.CHOICE_MIC_HOST), VAR_LABEL_MIC_DEVICE=StringVar(value=i18n.t("config_window.mic_device.label")), VAR_DESC_MIC_DEVICE=None, LIST_MIC_DEVICE=[], CALLBACK_SET_MIC_DEVICE=None, VAR_MIC_DEVICE=StringVar(value=config.CHOICE_MIC_DEVICE), VAR_LABEL_MIC_DYNAMIC_ENERGY_THRESHOLD=StringVar(value=i18n.t("config_window.mic_dynamic_energy_threshold.label")), VAR_DESC_MIC_DYNAMIC_ENERGY_THRESHOLD=StringVar(value=i18n.t("config_window.mic_dynamic_energy_threshold.desc")), CALLBACK_SET_MIC_DYNAMIC_ENERGY_THRESHOLD=None, VAR_MIC_DYNAMIC_ENERGY_THRESHOLD=BooleanVar(value=config.INPUT_MIC_DYNAMIC_ENERGY_THRESHOLD), SLIDER_RANGE_MIC_ENERGY_THRESHOLD=(0, config.MAX_MIC_ENERGY_THRESHOLD), CALLBACK_CHECK_MIC_THRESHOLD=None, VAR_MIC_ENERGY_THRESHOLD__SLIDER=IntVar(value=config.INPUT_MIC_ENERGY_THRESHOLD), VAR_MIC_ENERGY_THRESHOLD__ENTRY=StringVar(value=config.INPUT_MIC_ENERGY_THRESHOLD), CALLBACK_FOCUS_OUT_MIC_ENERGY_THRESHOLD=self.setLatestConfigVariable_MicEnergyThreshold, VAR_LABEL_MIC_RECORD_TIMEOUT=StringVar(value=i18n.t("config_window.mic_record_timeout.label")), VAR_DESC_MIC_RECORD_TIMEOUT=None, CALLBACK_SET_MIC_RECORD_TIMEOUT=None, VAR_MIC_RECORD_TIMEOUT=StringVar(value=config.INPUT_MIC_RECORD_TIMEOUT), CALLBACK_FOCUS_OUT_MIC_RECORD_TIMEOUT=self.setLatestConfigVariable_MicRecordTimeout, VAR_LABEL_MIC_PHRASE_TIMEOUT=StringVar(value=i18n.t("config_window.mic_phrase_timeout.label")), VAR_DESC_MIC_PHRASE_TIMEOUT=None, CALLBACK_SET_MIC_PHRASE_TIMEOUT=None, VAR_MIC_PHRASE_TIMEOUT=StringVar(value=config.INPUT_MIC_PHRASE_TIMEOUT), CALLBACK_FOCUS_OUT_MIC_PHRASE_TIMEOUT=self.setLatestConfigVariable_MicPhraseTimeout, VAR_LABEL_MIC_MAX_PHRASES=StringVar(value=i18n.t("config_window.mic_max_phrase.label")), VAR_DESC_MIC_MAX_PHRASES=StringVar(value=i18n.t("config_window.mic_max_phrase.desc")), CALLBACK_SET_MIC_MAX_PHRASES=None, VAR_MIC_MAX_PHRASES=StringVar(value=config.INPUT_MIC_MAX_PHRASES), CALLBACK_FOCUS_OUT_MIC_MAX_PHRASES=self.setLatestConfigVariable_MicMaxPhrases, VAR_LABEL_MIC_WORD_FILTER=StringVar(value=i18n.t("config_window.mic_word_filter.label")), VAR_DESC_MIC_WORD_FILTER=StringVar(value=i18n.t("config_window.mic_word_filter.desc")), CALLBACK_SET_MIC_WORD_FILTER=None, VAR_MIC_WORD_FILTER=StringVar(value=",".join(config.INPUT_MIC_WORD_FILTER) if len(config.INPUT_MIC_WORD_FILTER) > 0 else ""), # Transcription Tab (Speaker) VAR_LABEL_SPEAKER_DEVICE=StringVar(value=i18n.t("config_window.speaker_device.label")), VAR_DESC_SPEAKER_DEVICE=None, LIST_SPEAKER_DEVICE=[], CALLBACK_SET_SPEAKER_DEVICE=None, VAR_SPEAKER_DEVICE=StringVar(value=config.CHOICE_SPEAKER_DEVICE), VAR_LABEL_SPEAKER_DYNAMIC_ENERGY_THRESHOLD=StringVar(value=i18n.t("config_window.speaker_dynamic_energy_threshold.label")), VAR_DESC_SPEAKER_DYNAMIC_ENERGY_THRESHOLD=StringVar(value=i18n.t("config_window.speaker_dynamic_energy_threshold.desc")), CALLBACK_SET_SPEAKER_DYNAMIC_ENERGY_THRESHOLD=None, VAR_SPEAKER_DYNAMIC_ENERGY_THRESHOLD=BooleanVar(value=config.INPUT_SPEAKER_DYNAMIC_ENERGY_THRESHOLD), SLIDER_RANGE_SPEAKER_ENERGY_THRESHOLD=(0, config.MAX_SPEAKER_ENERGY_THRESHOLD), CALLBACK_CHECK_SPEAKER_THRESHOLD=None, VAR_SPEAKER_ENERGY_THRESHOLD__SLIDER=IntVar(value=config.INPUT_SPEAKER_ENERGY_THRESHOLD), VAR_SPEAKER_ENERGY_THRESHOLD__ENTRY=StringVar(value=config.INPUT_SPEAKER_ENERGY_THRESHOLD), CALLBACK_FOCUS_OUT_SPEAKER_ENERGY_THRESHOLD=self.setLatestConfigVariable_SpeakerEnergyThreshold, VAR_LABEL_SPEAKER_RECORD_TIMEOUT=StringVar(value=i18n.t("config_window.speaker_record_timeout.label")), VAR_DESC_SPEAKER_RECORD_TIMEOUT=None, CALLBACK_SET_SPEAKER_RECORD_TIMEOUT=None, VAR_SPEAKER_RECORD_TIMEOUT=StringVar(value=config.INPUT_SPEAKER_RECORD_TIMEOUT), CALLBACK_FOCUS_OUT_SPEAKER_RECORD_TIMEOUT=self.setLatestConfigVariable_SpeakerRecordTimeout, VAR_LABEL_SPEAKER_PHRASE_TIMEOUT=StringVar(value=i18n.t("config_window.speaker_phrase_timeout.label")), VAR_DESC_SPEAKER_PHRASE_TIMEOUT=None, CALLBACK_SET_SPEAKER_PHRASE_TIMEOUT=None, VAR_SPEAKER_PHRASE_TIMEOUT=StringVar(value=config.INPUT_SPEAKER_PHRASE_TIMEOUT), CALLBACK_FOCUS_OUT_SPEAKER_PHRASE_TIMEOUT=self.setLatestConfigVariable_SpeakerPhraseTimeout, VAR_LABEL_SPEAKER_MAX_PHRASES=StringVar(value=i18n.t("config_window.speaker_max_phrase.label")), VAR_DESC_SPEAKER_MAX_PHRASES=StringVar(value=i18n.t("config_window.speaker_max_phrase.desc")), CALLBACK_SET_SPEAKER_MAX_PHRASES=None, VAR_SPEAKER_MAX_PHRASES=StringVar(value=config.INPUT_SPEAKER_MAX_PHRASES), CALLBACK_FOCUS_OUT_SPEAKER_MAX_PHRASES=self.setLatestConfigVariable_SpeakerMaxPhrases, # Others Tab VAR_LABEL_ENABLE_AUTO_CLEAR_MESSAGE_BOX=StringVar(value=i18n.t("config_window.auto_clear_the_message_box.label")), VAR_DESC_ENABLE_AUTO_CLEAR_MESSAGE_BOX=None, CALLBACK_SET_ENABLE_AUTO_CLEAR_MESSAGE_BOX=None, VAR_ENABLE_AUTO_CLEAR_MESSAGE_BOX=BooleanVar(value=config.ENABLE_AUTO_CLEAR_MESSAGE_BOX), VAR_LABEL_ENABLE_NOTICE_XSOVERLAY=StringVar(value=i18n.t("config_window.notice_xsoverlay.label")), VAR_DESC_ENABLE_NOTICE_XSOVERLAY=StringVar(value=i18n.t("config_window.notice_xsoverlay.desc")), CALLBACK_SET_ENABLE_NOTICE_XSOVERLAY=None, VAR_ENABLE_NOTICE_XSOVERLAY=BooleanVar(value=config.ENABLE_NOTICE_XSOVERLAY), VAR_LABEL_ENABLE_AUTO_EXPORT_MESSAGE_LOGS=StringVar(value=i18n.t("config_window.auto_export_message_logs.label")), VAR_DESC_ENABLE_AUTO_EXPORT_MESSAGE_LOGS=StringVar(value=i18n.t("config_window.auto_export_message_logs.desc")), CALLBACK_SET_ENABLE_AUTO_EXPORT_MESSAGE_LOGS=None, VAR_ENABLE_AUTO_EXPORT_MESSAGE_LOGS=BooleanVar(value=config.ENABLE_LOGGER), VAR_LABEL_MESSAGE_FORMAT=StringVar(value=i18n.t("config_window.message_format.label")), VAR_DESC_MESSAGE_FORMAT=StringVar(value=i18n.t("config_window.message_format.desc")), CALLBACK_SET_MESSAGE_FORMAT=None, VAR_MESSAGE_FORMAT=StringVar(value=config.MESSAGE_FORMAT), VAR_LABEL_ENABLE_SEND_MESSAGE_TO_VRC=StringVar(value=i18n.t("config_window.send_message_to_vrc.label")), VAR_DESC_ENABLE_SEND_MESSAGE_TO_VRC=StringVar(value=i18n.t("config_window.send_message_to_vrc.desc")), CALLBACK_SET_ENABLE_SEND_MESSAGE_TO_VRC=None, VAR_ENABLE_SEND_MESSAGE_TO_VRC=BooleanVar(value=config.ENABLE_SEND_MESSAGE_TO_VRC), # [deprecated] # VAR_LABEL_STARTUP_OSC_ENABLED_CHECK=StringVar(value=i18n.t("config_window.startup_osc_enabled_check.label")), # VAR_DESC_STARTUP_OSC_ENABLED_CHECK=StringVar(value=i18n.t("config_window.startup_osc_enabled_check.desc")), # CALLBACK_SET_STARTUP_OSC_ENABLED_CHECK=None, # VAR_STARTUP_OSC_ENABLED_CHECK=BooleanVar(value=config.STARTUP_OSC_ENABLED_CHECK), # Advanced Settings Tab VAR_LABEL_OSC_IP_ADDRESS=StringVar(value=i18n.t("config_window.osc_ip_address.label")), VAR_DESC_OSC_IP_ADDRESS=None, CALLBACK_SET_OSC_IP_ADDRESS=None, VAR_OSC_IP_ADDRESS=StringVar(value=config.OSC_IP_ADDRESS), VAR_LABEL_OSC_PORT=StringVar(value=i18n.t("config_window.osc_port.label")), VAR_DESC_OSC_PORT=None, CALLBACK_SET_OSC_PORT=None, VAR_OSC_PORT=StringVar(value=config.OSC_PORT), ) def register( self, common_registers=None, window_action_registers=None, main_window_registers=None, config_window_registers=None ): if common_registers is not None: self.view_variable.CALLBACK_CLICKED_UPDATE_AVAILABLE=common_registers.get("callback_update_software", None) self.view_variable.CALLBACK_RESTART_SOFTWARE=common_registers.get("callback_restart_software", None) if window_action_registers is not None: self.view_variable.CALLBACK_OPEN_CONFIG_WINDOW=window_action_registers.get("callback_open_config_window", None) self.view_variable.CALLBACK_CLOSE_CONFIG_WINDOW=window_action_registers.get("callback_close_config_window", None) if main_window_registers is not None: self.view_variable.CALLBACK_ENABLE_MAIN_WINDOW_SIDEBAR_COMPACT_MODE = main_window_registers.get("callback_enable_main_window_sidebar_compact_mode", None) self.view_variable.CALLBACK_DISABLE_MAIN_WINDOW_SIDEBAR_COMPACT_MODE = main_window_registers.get("callback_disable_main_window_sidebar_compact_mode", None) self.view_variable.CALLBACK_TOGGLE_TRANSLATION = main_window_registers.get("callback_toggle_translation", None) self.view_variable.CALLBACK_TOGGLE_TRANSCRIPTION_SEND = main_window_registers.get("callback_toggle_transcription_send", None) self.view_variable.CALLBACK_TOGGLE_TRANSCRIPTION_RECEIVE = main_window_registers.get("callback_toggle_transcription_receive", None) self.view_variable.CALLBACK_TOGGLE_FOREGROUND = main_window_registers.get("callback_toggle_foreground", None) self.view_variable.CALLBACK_SELECTED_YOUR_LANGUAGE = main_window_registers.get("callback_your_language", None) self.view_variable.CALLBACK_SELECTED_TARGET_LANGUAGE = main_window_registers.get("callback_target_language", None) main_window_registers.get("values", None) and self.updateList_selectableLanguages(main_window_registers["values"]) self.view_variable.CALLBACK_SELECTED_LANGUAGE_PRESET_TAB = main_window_registers.get("callback_selected_language_preset_tab", None) entry_message_box = getattr(vrct_gui, "entry_message_box") entry_message_box.bind("", main_window_registers.get("bind_Return")) entry_message_box.bind("", main_window_registers.get("bind_Any_KeyPress")) entry_message_box.bind("", self._foregroundOffForcefully) entry_message_box.bind("", self._foregroundOnForcefully) self.updateGuiVariableByPresetTabNo(config.SELECTED_TAB_NO) vrct_gui._setDefaultActiveLanguagePresetTab(tab_no=config.SELECTED_TAB_NO) self.view_variable.CALLBACK_OPEN_SELECTABLE_YOUR_LANGUAGE_WINDOW = self.openSelectableLanguagesWindow_YourLanguage self.view_variable.CALLBACK_OPEN_SELECTABLE_TARGET_LANGUAGE_WINDOW = self.openSelectableLanguagesWindow_TargetLanguage # Config Window self.view_variable.CALLBACK_SELECTED_SETTING_BOX_TAB=self._updateActiveSettingBoxTabNo if config_window_registers is not None: # Compact Mode Switch self.view_variable.CALLBACK_ENABLE_CONFIG_WINDOW_COMPACT_MODE = config_window_registers.get("callback_disable_config_window_compact_mode", None) self.view_variable.CALLBACK_DISABLE_CONFIG_WINDOW_COMPACT_MODE = config_window_registers.get("callback_enable_config_window_compact_mode", None) # Appearance Tab self.view_variable.CALLBACK_SET_TRANSPARENCY = config_window_registers.get("callback_set_transparency", None) self.view_variable.CALLBACK_SET_APPEARANCE = config_window_registers.get("callback_set_appearance", None) self.view_variable.CALLBACK_SET_UI_SCALING = config_window_registers.get("callback_set_ui_scaling", None) self.view_variable.CALLBACK_SET_FONT_FAMILY = config_window_registers.get("callback_set_font_family", None) self.view_variable.CALLBACK_SET_UI_LANGUAGE = config_window_registers.get("callback_set_ui_language", None) # Translation Tab self.view_variable.CALLBACK_SET_DEEPL_AUTHKEY = config_window_registers.get("callback_set_deepl_authkey", None) # Transcription Tab (Mic) self.view_variable.CALLBACK_SET_MIC_HOST = config_window_registers.get("callback_set_mic_host", None) config_window_registers.get("list_mic_host", None) and self.updateList_MicHost(config_window_registers["list_mic_host"]) self.view_variable.CALLBACK_SET_MIC_DEVICE = config_window_registers.get("callback_set_mic_device", None) config_window_registers.get("list_mic_device", None) and self.updateList_MicDevice(config_window_registers["list_mic_device"]) self.view_variable.CALLBACK_SET_MIC_ENERGY_THRESHOLD = config_window_registers.get("callback_set_mic_energy_threshold", None) self.view_variable.CALLBACK_SET_MIC_DYNAMIC_ENERGY_THRESHOLD = config_window_registers.get("callback_set_mic_dynamic_energy_threshold", None) self.view_variable.CALLBACK_CHECK_MIC_THRESHOLD = config_window_registers.get("callback_check_mic_threshold", None) self.view_variable.CALLBACK_SET_MIC_RECORD_TIMEOUT = config_window_registers.get("callback_set_mic_record_timeout", None) self.view_variable.CALLBACK_SET_MIC_PHRASE_TIMEOUT = config_window_registers.get("callback_set_mic_phrase_timeout", None) self.view_variable.CALLBACK_SET_MIC_MAX_PHRASES = config_window_registers.get("callback_set_mic_max_phrases", None) self.view_variable.CALLBACK_SET_MIC_WORD_FILTER = config_window_registers.get("callback_set_mic_word_filter", None) # Transcription Tab (Speaker) self.view_variable.CALLBACK_SET_SPEAKER_DEVICE = config_window_registers.get("callback_set_speaker_device", None) config_window_registers.get("list_speaker_device", None) and self.updateList_SpeakerDevice(config_window_registers["list_speaker_device"]) self.view_variable.CALLBACK_SET_SPEAKER_ENERGY_THRESHOLD = config_window_registers.get("callback_set_speaker_energy_threshold", None) self.view_variable.CALLBACK_SET_SPEAKER_DYNAMIC_ENERGY_THRESHOLD = config_window_registers.get("callback_set_speaker_dynamic_energy_threshold", None) self.view_variable.CALLBACK_CHECK_SPEAKER_THRESHOLD = config_window_registers.get("callback_check_speaker_threshold", None) self.view_variable.CALLBACK_SET_SPEAKER_RECORD_TIMEOUT = config_window_registers.get("callback_set_speaker_record_timeout", None) self.view_variable.CALLBACK_SET_SPEAKER_PHRASE_TIMEOUT = config_window_registers.get("callback_set_speaker_phrase_timeout", None) self.view_variable.CALLBACK_SET_SPEAKER_MAX_PHRASES = config_window_registers.get("callback_set_speaker_max_phrases", None) # Others Tab self.view_variable.CALLBACK_SET_ENABLE_AUTO_CLEAR_MESSAGE_BOX = config_window_registers.get("callback_set_enable_auto_clear_chatbox", None) self.view_variable.CALLBACK_SET_ENABLE_NOTICE_XSOVERLAY = config_window_registers.get("callback_set_enable_notice_xsoverlay", None) self.view_variable.CALLBACK_SET_ENABLE_AUTO_EXPORT_MESSAGE_LOGS = config_window_registers.get("callback_set_enable_auto_export_message_logs", None) self.view_variable.CALLBACK_SET_MESSAGE_FORMAT = config_window_registers.get("callback_set_message_format", None) self.view_variable.CALLBACK_SET_ENABLE_SEND_MESSAGE_TO_VRC = config_window_registers.get("callback_set_enable_send_message_to_vrc", None) # self.view_variable.CALLBACK_SET_STARTUP_OSC_ENABLED_CHECK = config_window_registers.get("callback_set_startup_osc_enabled_check", None) #[deprecated] # Advanced Settings Tab self.view_variable.CALLBACK_SET_OSC_IP_ADDRESS = config_window_registers.get("callback_set_osc_ip_address", None) self.view_variable.CALLBACK_SET_OSC_PORT = config_window_registers.get("callback_set_osc_port", None) # The initial processing after registration. if config.IS_CONFIG_WINDOW_COMPACT_MODE is True: self.enableConfigWindowCompactMode() vrct_gui.config_window.setting_box_compact_mode_switch_box.select() if config.CHOICE_MIC_HOST == "NoHost": self.view_variable.VAR_MIC_HOST.set("No Mic Host Detected") if config.CHOICE_MIC_DEVICE == "NoDevice": self.view_variable.VAR_MIC_DEVICE.set("No Mic Device Detected") if config.CHOICE_MIC_HOST == "NoHost" or config.CHOICE_MIC_DEVICE == "NoDevice": vrct_gui._changeConfigWindowWidgetsStatus( status="disabled", target_names=[ "sb__optionmenu_mic_host", "sb__optionmenu_mic_device", ] ) self.replaceMicThresholdCheckButton_Disabled() if config.CHOICE_SPEAKER_DEVICE == "NoDevice": self.view_variable.VAR_SPEAKER_DEVICE.set("No Speaker Device Detected") vrct_gui._changeConfigWindowWidgetsStatus( status="disabled", target_names=[ "sb__optionmenu_speaker_device", ] ) self.replaceSpeakerThresholdCheckButton_Disabled() if config.INPUT_MIC_DYNAMIC_ENERGY_THRESHOLD is True: self.closeMicEnergyThresholdWidget() if config.INPUT_SPEAKER_DYNAMIC_ENERGY_THRESHOLD is True: self.closeSpeakerEnergyThresholdWidget() # Insert sample conversation for testing. # self._insertSampleConversationToTextbox() @staticmethod def getAvailableFonts(): available_fonts = list(tk_font.families()) available_fonts.sort() filtered_available_fonts = list(filter(lambda x: x.startswith("@") is False, available_fonts)) return filtered_available_fonts @staticmethod def openWebPage(url:str): webbrowser.open_new_tab(url) def openWebPage_Booth(self): self.openWebPage(config.BOOTH_URL) self._printToTextbox_Info("Opened Booth page in your web browser.") def openWebPage_VrctDocuments(self): self.openWebPage(config.DOCUMENTS_URL) self._printToTextbox_Info("Opened the VRCT Documents page in your web browser.") @staticmethod def showUpdateAvailableButton(): vrct_gui.update_available_container.grid() @staticmethod def setMainWindowAllWidgetsStatusToNormal(): vrct_gui._changeMainWindowWidgetsStatus("normal", "All") @staticmethod def setMainWindowAllWidgetsStatusToDisabled(): vrct_gui._changeMainWindowWidgetsStatus("disabled", "All") def _foregroundOnForcefully(self, _e): if config.ENABLE_FOREGROUND: self.foregroundOn() def _foregroundOffForcefully(self, _e): if config.ENABLE_FOREGROUND: self.foregroundOff() @staticmethod def foregroundOn(): vrct_gui.attributes("-topmost", True) @staticmethod def foregroundOff(): vrct_gui.attributes("-topmost", False) @staticmethod def _openTheCoverOfMainWindow(): vrct_gui.modal_window.show() vrct_gui.config_window.lift() @staticmethod def _closeTheCoverOfMainWindow(): vrct_gui.modal_window.withdraw() def enableMainWindowSidebarCompactMode(self): self.view_variable.IS_MAIN_WINDOW_SIDEBAR_COMPACT_MODE = True vrct_gui._enableMainWindowSidebarCompactMode() def disableMainWindowSidebarCompactMode(self): self.view_variable.IS_MAIN_WINDOW_SIDEBAR_COMPACT_MODE = False vrct_gui._disableMainWindowSidebarCompactMode() def openSelectableLanguagesWindow_YourLanguage(self, _e): self.view_variable.VAR_TITLE_LABEL_SELECTABLE_LANGUAGE.set(i18n.t("selectable_language_window.title_your_language")) vrct_gui._openSelectableLanguagesWindow("your_language") def openSelectableLanguagesWindow_TargetLanguage(self, _e): self.view_variable.VAR_TITLE_LABEL_SELECTABLE_LANGUAGE.set(i18n.t("selectable_language_window.title_target_language")) vrct_gui._openSelectableLanguagesWindow("target_language") def updateGuiVariableByPresetTabNo(self, tab_no:str): self.view_variable.VAR_YOUR_LANGUAGE.set(config.SELECTED_TAB_YOUR_LANGUAGES[tab_no]) self.view_variable.VAR_TARGET_LANGUAGE.set(config.SELECTED_TAB_TARGET_LANGUAGES[tab_no]) def updateList_selectableLanguages(self, new_selectable_language_list:list): self.view_variable.LIST_SELECTABLE_LANGUAGES = new_selectable_language_list def printToTextbox_enableTranslation(self): self._printToTextbox_Info("翻訳機能をONにしました") def printToTextbox_disableTranslation(self): self._printToTextbox_Info("翻訳機能をOFFにしました") def printToTextbox_enableTranscriptionSend(self): self._printToTextbox_Info("Voice2chatbox機能をONにしました") def printToTextbox_disableTranscriptionSend(self): self._printToTextbox_Info("Voice2chatbox機能をOFFにしました") def printToTextbox_enableTranscriptionReceive(self): self._printToTextbox_Info("Speaker2chatbox機能をONにしました") def printToTextbox_disableTranscriptionReceive(self): self._printToTextbox_Info("Speaker2chatbox機能をOFFにしました") def printToTextbox_enableForeground(self): self._printToTextbox_Info("Start foreground") def printToTextbox_disableForeground(self): self._printToTextbox_Info("Stop foreground") def printToTextbox_AuthenticationSuccess(self): self._printToTextbox_Info("Auth key update completed") def printToTextbox_AuthenticationError(self): self._printToTextbox_Info("Auth Key is incorrect or Usage limit reached") def printToTextbox_OSCError(self): self._printToTextbox_Info("OSC is not enabled, please enable OSC and rejoin. or turn off the \"Send Message To VRChat\" setting") def printToTextbox_DetectedByWordFilter(self, detected_message): self._printToTextbox_Info(f"Detect WordFilter :{detected_message}") def printToTextbox_selectedYourLanguages(self, selected_your_language): your_language = selected_your_language.replace("\n", " ") self._printToTextbox_Info(f"Your Language has changed : {your_language}") def printToTextbox_selectedTargetLanguages(self, selected_target_language): target_language = selected_target_language.replace("\n", " ") self._printToTextbox_Info(f"Target Language has changed : {target_language}") def printToTextbox_latestSelectedLanguages(self): your_language = self.view_variable.VAR_YOUR_LANGUAGE.get().replace("\n", " ") target_language = self.view_variable.VAR_TARGET_LANGUAGE.get().replace("\n", " ") self._printToTextbox_Info(f"Your Language : {your_language} -- Target Language : {target_language}") def printToTextbox_changedLanguagePresetTab(self, tab_no:str): your_language = config.SELECTED_TAB_YOUR_LANGUAGES[tab_no].replace("\n", " ") target_language = config.SELECTED_TAB_TARGET_LANGUAGES[tab_no].replace("\n", " ") self._printToTextbox_Info(f"Switched Language Preset. No.{tab_no}\nYour Language : {your_language} -- Target Language : {target_language}") @staticmethod def _printToTextbox_Info(info_message): vrct_gui._printToTextbox( target_type="SYSTEM", original_message=info_message, # translated_message="", ) def printToTextbox_SentMessage(self, original_message, translated_message): self._printToTextbox_Sent(original_message, translated_message) @staticmethod def _printToTextbox_Sent(original_message, translated_message): vrct_gui._printToTextbox( target_type="SENT", original_message=original_message, translated_message=translated_message, ) def printToTextbox_ReceivedMessage(self, original_message, translated_message): self._printToTextbox_Received(original_message, translated_message) @staticmethod def _printToTextbox_Received(original_message, translated_message): vrct_gui._printToTextbox( target_type="RECEIVED", original_message=original_message, translated_message=translated_message, ) @staticmethod def getTextFromMessageBox(): return vrct_gui.entry_message_box.get() @staticmethod def clearMessageBox(): vrct_gui.entry_message_box.delete(0, CTK_END) @staticmethod def setMainWindowTransparency(transparency:float): vrct_gui.wm_attributes("-alpha", transparency) def enableConfigWindowCompactMode(self): for additional_widget in vrct_gui.config_window.additional_widgets: additional_widget.grid_remove() def disableConfigWindowCompactMode(self): for additional_widget in vrct_gui.config_window.additional_widgets: additional_widget.grid() def createGUI(self): vrct_gui._createGUI(settings=self.settings, view_variable=self.view_variable) @staticmethod def showGUI(): vrct_gui._showGUI() @staticmethod def startMainLoop(): vrct_gui._showGUI() vrct_gui._startMainLoop() # Config Window def _updateActiveSettingBoxTabNo(self, active_setting_box_tab_attr_name:str): self.view_variable.ACTIVE_SETTING_BOX_TAB_ATTR_NAME = active_setting_box_tab_attr_name @staticmethod def setWidgetsStatus_ConfigWindowCompactModeSwitch_Disabled(): vrct_gui.config_window.setting_box_compact_mode_switch_box.configure(state="disabled") @staticmethod def setWidgetsStatus_ConfigWindowCompactModeSwitch_Normal(): vrct_gui.config_window.setting_box_compact_mode_switch_box.configure(state="normal") @staticmethod def openMicEnergyThresholdWidget(): vrct_gui.config_window.sb__mic_dynamic_energy_threshold.grid(pady=0) vrct_gui.config_window.sb__mic_energy_threshold.grid() @staticmethod def closeMicEnergyThresholdWidget(): vrct_gui.config_window.sb__mic_dynamic_energy_threshold.grid(pady=(0,1)) vrct_gui.config_window.sb__mic_energy_threshold.grid_remove() @staticmethod def openSpeakerEnergyThresholdWidget(): vrct_gui.config_window.sb__speaker_dynamic_energy_threshold.grid(pady=0) vrct_gui.config_window.sb__speaker_energy_threshold.grid() @staticmethod def closeSpeakerEnergyThresholdWidget(): vrct_gui.config_window.sb__speaker_dynamic_energy_threshold.grid(pady=(0,1)) vrct_gui.config_window.sb__speaker_energy_threshold.grid_remove() def initMicThresholdCheckButton(self): if config.CHOICE_MIC_HOST == "NoHost" or config.CHOICE_MIC_DEVICE == "NoDevice": self.replaceMicThresholdCheckButton_Disabled() else: self.replaceMicThresholdCheckButton_Passive() @staticmethod def replaceMicThresholdCheckButton_Active(): vrct_gui.config_window.sb__progressbar_x_slider__passive_button_mic_energy_threshold.grid_remove() vrct_gui.config_window.sb__progressbar_x_slider__disabled_button_mic_energy_threshold.grid_remove() vrct_gui.config_window.sb__progressbar_x_slider__active_button_mic_energy_threshold.grid() @staticmethod def replaceMicThresholdCheckButton_Disabled(): vrct_gui.config_window.sb__progressbar_x_slider__passive_button_mic_energy_threshold.grid_remove() vrct_gui.config_window.sb__progressbar_x_slider__active_button_mic_energy_threshold.grid_remove() vrct_gui.config_window.sb__progressbar_x_slider__disabled_button_mic_energy_threshold.grid() @staticmethod def replaceMicThresholdCheckButton_Passive(): vrct_gui.config_window.sb__progressbar_x_slider__active_button_mic_energy_threshold.grid_remove() vrct_gui.config_window.sb__progressbar_x_slider__disabled_button_mic_energy_threshold.grid_remove() vrct_gui.config_window.sb__progressbar_x_slider__passive_button_mic_energy_threshold.grid() def initSpeakerThresholdCheckButton(self): if config.CHOICE_SPEAKER_DEVICE == "NoDevice": self.replaceSpeakerThresholdCheckButton_Disabled() else: self.replaceSpeakerThresholdCheckButton_Passive() @staticmethod def replaceSpeakerThresholdCheckButton_Active(): vrct_gui.config_window.sb__progressbar_x_slider__passive_button_speaker_energy_threshold.grid_remove() vrct_gui.config_window.sb__progressbar_x_slider__disabled_button_speaker_energy_threshold.grid_remove() vrct_gui.config_window.sb__progressbar_x_slider__active_button_speaker_energy_threshold.grid() @staticmethod def replaceSpeakerThresholdCheckButton_Disabled(): vrct_gui.config_window.sb__progressbar_x_slider__passive_button_speaker_energy_threshold.grid_remove() vrct_gui.config_window.sb__progressbar_x_slider__active_button_speaker_energy_threshold.grid_remove() vrct_gui.config_window.sb__progressbar_x_slider__disabled_button_speaker_energy_threshold.grid() @staticmethod def replaceSpeakerThresholdCheckButton_Passive(): vrct_gui.config_window.sb__progressbar_x_slider__active_button_speaker_energy_threshold.grid_remove() vrct_gui.config_window.sb__progressbar_x_slider__disabled_button_speaker_energy_threshold.grid_remove() vrct_gui.config_window.sb__progressbar_x_slider__passive_button_speaker_energy_threshold.grid() def updateList_MicHost(self, new_mic_host_list:list): self.view_variable.LIST_MIC_HOST = new_mic_host_list vrct_gui.dropdown_menu_window.updateDropdownMenuValues( dropdown_menu_widget_id="sb__optionmenu_mic_host", dropdown_menu_values=new_mic_host_list, ) def updateSelected_MicHost(self, selected_mic_host_name:str): self.view_variable.VAR_MIC_HOST.set(selected_mic_host_name) def updateList_MicDevice(self, new_mic_device_list:list): self.view_variable.LIST_MIC_DEVICE = new_mic_device_list vrct_gui.dropdown_menu_window.updateDropdownMenuValues( dropdown_menu_widget_id="sb__optionmenu_mic_device", dropdown_menu_values=new_mic_device_list, ) def updateSelected_MicDevice(self, default_selected_mic_device_name:str): self.view_variable.VAR_MIC_DEVICE.set(default_selected_mic_device_name) @staticmethod def updateSetProgressBar_MicEnergy(new_mic_energy): vrct_gui.config_window.sb__progressbar_x_slider__progressbar_mic_energy_threshold.set(new_mic_energy/config.MAX_MIC_ENERGY_THRESHOLD) @staticmethod def initProgressBar_MicEnergy(): vrct_gui.config_window.sb__progressbar_x_slider__progressbar_mic_energy_threshold.set(0) def updateList_SpeakerDevice(self, new_speaker_device_list:list): self.view_variable.LIST_SPEAKER_DEVICE = new_speaker_device_list vrct_gui.dropdown_menu_window.updateDropdownMenuValues( dropdown_menu_widget_id="sb__optionmenu_speaker_device", dropdown_menu_values=new_speaker_device_list, ) @staticmethod def updateSetProgressBar_SpeakerEnergy(new_speaker_energy): vrct_gui.config_window.sb__progressbar_x_slider__progressbar_speaker_energy_threshold.set(new_speaker_energy/config.MAX_SPEAKER_ENERGY_THRESHOLD) @staticmethod def initProgressBar_SpeakerEnergy(): vrct_gui.config_window.sb__progressbar_x_slider__progressbar_speaker_energy_threshold.set(0) def setGuiVariable_MicEnergyThreshold(self, value): self.view_variable.VAR_MIC_ENERGY_THRESHOLD__SLIDER.set(int(value)) self.view_variable.VAR_MIC_ENERGY_THRESHOLD__ENTRY.set(str(value)) def setLatestConfigVariable_MicEnergyThreshold(self, _e=None): self.setGuiVariable_MicEnergyThreshold(config.INPUT_MIC_ENERGY_THRESHOLD) self.clearErrorMessage() def setGuiVariable_SpeakerEnergyThreshold(self, value): self.view_variable.VAR_SPEAKER_ENERGY_THRESHOLD__SLIDER.set(int(value)) self.view_variable.VAR_SPEAKER_ENERGY_THRESHOLD__ENTRY.set(str(value)) def setLatestConfigVariable_SpeakerEnergyThreshold(self, _e=None): self.setGuiVariable_SpeakerEnergyThreshold(config.INPUT_SPEAKER_ENERGY_THRESHOLD) self.clearErrorMessage() def setGuiVariable_MicRecordTimeout(self, value, delete=False): if delete is True: self._clearEntryBox(vrct_gui.config_window.sb__entry_mic_record_timeout) self.view_variable.VAR_MIC_RECORD_TIMEOUT.set(str(value)) def setLatestConfigVariable_MicRecordTimeout(self, _e=None): self.setGuiVariable_MicRecordTimeout(config.INPUT_MIC_RECORD_TIMEOUT) self.clearErrorMessage() def setGuiVariable_MicPhraseTimeout(self, value, delete=False): if delete is True: self._clearEntryBox(vrct_gui.config_window.sb__entry_mic_phrase_timeout) self.view_variable.VAR_MIC_PHRASE_TIMEOUT.set(str(value)) def setLatestConfigVariable_MicPhraseTimeout(self, _e=None): self.setGuiVariable_MicPhraseTimeout(config.INPUT_MIC_PHRASE_TIMEOUT) self.clearErrorMessage() def setGuiVariable_MicMaxPhrases(self, value, delete=False): if delete is True: self._clearEntryBox(vrct_gui.config_window.sb__entry_mic_max_phrases) self.view_variable.VAR_MIC_MAX_PHRASES.set(str(value)) def setLatestConfigVariable_MicMaxPhrases(self, _e=None): self.setGuiVariable_MicMaxPhrases(config.INPUT_MIC_MAX_PHRASES) self.clearErrorMessage() def setGuiVariable_SpeakerRecordTimeout(self, value, delete=False): if delete is True: self._clearEntryBox(vrct_gui.config_window.sb__entry_speaker_record_timeout) self.view_variable.VAR_SPEAKER_RECORD_TIMEOUT.set(str(value)) def setLatestConfigVariable_SpeakerRecordTimeout(self, _e=None): self.setGuiVariable_SpeakerRecordTimeout(config.INPUT_SPEAKER_RECORD_TIMEOUT) self.clearErrorMessage() def setGuiVariable_SpeakerPhraseTimeout(self, value, delete=False): if delete is True: self._clearEntryBox(vrct_gui.config_window.sb__entry_speaker_phrase_timeout) self.view_variable.VAR_SPEAKER_PHRASE_TIMEOUT.set(str(value)) def setLatestConfigVariable_SpeakerPhraseTimeout(self, _e=None): self.setGuiVariable_SpeakerPhraseTimeout(config.INPUT_SPEAKER_PHRASE_TIMEOUT) self.clearErrorMessage() def setGuiVariable_SpeakerMaxPhrases(self, value, delete=False): if delete is True: self._clearEntryBox(vrct_gui.config_window.sb__entry_speaker_max_phrases) self.view_variable.VAR_SPEAKER_MAX_PHRASES.set(str(value)) def setLatestConfigVariable_SpeakerMaxPhrases(self, _e=None): self.setGuiVariable_SpeakerMaxPhrases(config.INPUT_SPEAKER_MAX_PHRASES) self.clearErrorMessage() @staticmethod def _clearEntryBox(entry_widget): entry_widget.delete(0, CTK_END) def showErrorMessage_MicEnergyThreshold(self): self._showErrorMessage(vrct_gui.config_window.sb__progressbar_x_slider__entry_mic_energy_threshold, "Mic Energy Threshold Error Message") def showErrorMessage_MicRecordTimeout(self): self._showErrorMessage(vrct_gui.config_window.sb__entry_mic_record_timeout, "Mic Record Timeout Error Message") def showErrorMessage_MicPhraseTimeout(self): self._showErrorMessage(vrct_gui.config_window.sb__entry_mic_phrase_timeout, "Mic Phrase Timeout Error Message") def showErrorMessage_MicMaxPhrases(self): self._showErrorMessage(vrct_gui.config_window.sb__entry_mic_max_phrases, "Mic Max Phrases Error Message") def showErrorMessage_SpeakerEnergyThreshold(self): self._showErrorMessage(vrct_gui.config_window.sb__progressbar_x_slider__entry_speaker_energy_threshold, "Speaker Energy Threshold Error Message") def showErrorMessage_SpeakerRecordTimeout(self): self._showErrorMessage(vrct_gui.config_window.sb__entry_speaker_record_timeout, "Speaker Record Timeout Error Message") def showErrorMessage_SpeakerPhraseTimeout(self): self._showErrorMessage(vrct_gui.config_window.sb__entry_speaker_phrase_timeout, "Speaker Phrase Timeout Error Message") def showErrorMessage_SpeakerMaxPhrases(self): self._showErrorMessage(vrct_gui.config_window.sb__entry_speaker_max_phrases, "Speaker Max Phrases Error Message") def _showErrorMessage(self, target_widget, message): self.view_variable.VAR_ERROR_MESSAGE.set(message) vrct_gui._showErrorMessage(target_widget=target_widget) def clearErrorMessage(self): vrct_gui._clearErrorMessage() @staticmethod def showSplash(): vrct_gui.showSplash() @staticmethod def destroySplash(): vrct_gui.destroySplash() # These conversations are generated by ChatGPT def _insertSampleConversationToTextbox(self): self.printToTextbox_enableTranscriptionSend() self.printToTextbox_enableTranscriptionReceive() conversation_data_without_translation = [ { "me": "おはよう。", }, { "me": "おはよう。", "target": "やぁ。", }, { "me": "今日の天気はどうかな?", "target": "天気予報を見てないけど、晴れるといいね。", }, { "me": "そうだね。昨日は雨だったから。", "target": "それで、今日の予定は?", }, ] for data in conversation_data_without_translation: if data.get("me", None) is not None: self.printToTextbox_SentMessage(data.get("me", None), data.get("me_t", None)) if data.get("target", None) is not None: self.printToTextbox_ReceivedMessage(data.get("target", None), data.get("target_t", None)) self.printToTextbox_enableTranslation() conversation_data = [ { "me": "I have work in the morning, but I'm meeting friends for dinner in the evening.", "me_t": "아침에 일이 있지만 저녁에 친구들과 만나 저녁 식사할 예정이에요.", "target": "재미있어 보여요! 무엇을 먹을 예정이에요?", "target_t": "Sounds fun! What are you planning to eat?" }, { "me": "We're going to an Italian restaurant, and I'm going to have pizza.", "me_t": "우리는 이탈리안 레스토랑에 가서 피자를 먹을 거에요.", "target": "그걸 듣자마자 배가 고파져요. 언젠가 함께하고 싶어요.", "target_t": "Just hearing that makes me hungry. I'd love to join you sometime." }, { "me": "Let's plan it for next time!", "me_t": "다음 번에 계획해 봐요!", "target": "그래요!", "target_t": "Sure!" }, { "me": "When would be a good time for you?", "me_t": "너에게 언제가 좋을까?", "target": "나는 주말이 가장 좋을 것 같아요. 토요일은 어때요?", "target_t": "I think the weekend works best for me. How about Saturday?" }, { "me": "Saturday sounds perfect. What time would be convenient?", "me_t": "토요일이 완벽해 보여. 편한 시간은 언제인가요?", "target": "저는 저녁이 괜찮아요. 7시쯤 괜찮을까요?", "target_t": "Evening works for me. Is around 7 PM okay?" }, { "me": "7 PM works great. Do you have any preferences for food other than Italian?", "me_t": "7시가 아주 적당해. 이탈리안 음식 이외에 어떤 음식을 좋아하세요?", "target": "특별한 선호도는 없어요. 무엇이든 괜찮아요. 추천 디저트가 있다면 알려주세요.", "target_t": "I don't have any particular preferences, so anything is fine. If there's a recommended dessert, let me know." }, { "me": "朝は仕事があるけど、夜は友達と食事に行く予定だよ。", "me_t": "I have work in the morning, but I'm meeting friends for dinner in the evening.", "target": "Sounds fun! What are you planning to eat?", "target_t": "楽しそう!何を食べる予定?", }, { "me": "イタリアンレストランに行って、ピザを食べるつもりだよ。", "me_t": "We're going to an Italian restaurant, and I'm going to have pizza.", "target": "Just hearing that makes me hungry. I'd love to join you sometime.", "target_t": "それ聞いただけでおなかすいたよ。私も一緒に行きたいな。", }, { "me": "次回にぜひ一緒に行こう!", "me_t": "Let's plan it for next time!", "target": "Sure!", "target_t": "そうだね!", }, { "me": "次回はいつがいいかな?", "me_t": "When would be a good time for you?", "target": "I think the weekend works best for me. How about Saturday?", "target_t": "私は週末が一番いいかな。土曜日はどう?" }, { "me": "土曜日はちょうどいいね。何時ごろが良いかな?", "me_t": "Saturday sounds perfect. What time would be convenient?", "target": "Evening works for me. Is around 7 PM okay?", "target_t": "夜がいいかな。7時くらいからがちょうど良いかな。" }, { "me": "7時からはちょうどいいよ。イタリアン以外の食べ物について何か好みがある?", "me_t": "7 PM works great. Do you have any preferences for food other than Italian?", "target": "I don't have any particular preferences, so anything is fine. If there's a recommended dessert, let me know.", "target_t": "特に好みはないから、何でも大丈夫。おすすめのデザートがあれば教えてね。" }, ] for data in conversation_data: if data.get("me", None) is not None: self.printToTextbox_SentMessage(data.get("me", None), data.get("me_t", None)) if data.get("target", None) is not None: self.printToTextbox_ReceivedMessage(data.get("target", None), data.get("target_t", None)) view = View()