diff --git a/batch/restart.bat b/batch/restart.bat deleted file mode 100644 index b3327d40..00000000 --- a/batch/restart.bat +++ /dev/null @@ -1,9 +0,0 @@ -@if not "%~0"=="%~dp0.\%~nx0" start /min cmd /c,"%~dp0.\%~nx0" %* & goto :eof - -set name=%1 -set local_path=%~dp0 - -taskkill /im %name% /F -ping -n 2 127.0.0.1 > nul -START "" "%local_path%%name%" -del /f "%~dp0%~nx0" \ No newline at end of file diff --git a/batch/update.bat b/batch/update.bat deleted file mode 100644 index 36087ca3..00000000 --- a/batch/update.bat +++ /dev/null @@ -1,20 +0,0 @@ -@if not "%~0"=="%~dp0.\%~nx0" start /min cmd /c,"%~dp0.\%~nx0" %* & goto :eof - -set exe_name=%1 -set folder_name=%2 -set folder_tmp=%3 -set restart=%4 -set local_path=%~dp0 - -taskkill /im %exe_name% /F -ping -n 2 127.0.0.1 > nul -del /f "%local_path%%exe_name%" -rmdir /s /q "%local_path%%folder_name%" -xcopy "%local_path%%folder_tmp%" "%local_path%" /E /I -rmdir /s /q "%local_path%%folder_tmp%" - -if %restart% == True ( - START "" "%local_path%%exe_name%" -) - -del /f "%~dp0%~nx0" \ No newline at end of file diff --git a/build.bat b/build.bat deleted file mode 100644 index b1e119f4..00000000 --- a/build.bat +++ /dev/null @@ -1,2 +0,0 @@ -pyinstaller --windowed --clean --noconfirm --icon="./img/vrct_logo_mark_black.ico" --add-data "./img;img/" --add-data "./fonts;fonts/" --add-data "./locales;locales/" --add-data "./batch;batch/" --name VRCT --add-data ".venv\Lib\site-packages\customtkinter;customtkinter/" --add-data ".venv\Lib\site-packages\zeroconf;zeroconf/" --add-data ".venv\Lib\site-packages\openvr;openvr/" --exclude-module pandas --exclude-module matplotlib --exclude-module PyQt5 main.py -"C:\Program Files (x86)\NSIS\makensis.exe" installer/installer.nsi \ No newline at end of file diff --git a/config.py b/config.py deleted file mode 100644 index f5f89b49..00000000 --- a/config.py +++ /dev/null @@ -1,1157 +0,0 @@ -import sys -import inspect -from os import path as os_path, makedirs as os_makedirs -from json import load as json_load -from json import dump as json_dump -import tkinter as tk -from tkinter import font -from models.translation.translation_languages import translation_lang -from models.transcription.transcription_utils import getInputDevices, getDefaultInputDevice, getOutputDevices, getDefaultOutputDevice -from models.transcription.transcription_languages import transcription_lang -from utils import generatePercentageStringsList, isUniqueStrings - -json_serializable_vars = {} -def json_serializable(var_name): - def decorator(func): - json_serializable_vars[var_name] = func - return func - return decorator - -def saveJson(path, key, value): - with open(path, "r", encoding="utf-8") as fp: - json_data = json_load(fp) - json_data[key] = value - with open(path, "w", encoding="utf-8") as fp: - json_dump(json_data, fp, indent=4, ensure_ascii=False) - -class Config: - _instance = None - - def __new__(cls): - if cls._instance is None: - cls._instance = super(Config, cls).__new__(cls) - cls._instance.init_config() - cls._instance.load_config() - return cls._instance - - # Read Only - @property - def VERSION(self): - return self._VERSION - - @property - def ENABLE_SPEAKER2CHATBOX_PASS_CONFIRMATION(self): - return self._ENABLE_SPEAKER2CHATBOX_PASS_CONFIRMATION - - @property - def PATH_LOCAL(self): - return self._PATH_LOCAL - - @property - def PATH_CONFIG(self): - return self._PATH_CONFIG - - @property - def PATH_LOGS(self): - return self._PATH_LOGS - - @property - def GITHUB_URL(self): - return self._GITHUB_URL - - @property - def UPDATER_URL(self): - return self._UPDATER_URL - - @property - def BOOTH_URL(self): - return self._BOOTH_URL - - @property - def DOCUMENTS_URL(self): - return self._DOCUMENTS_URL - - @property - def DEEPL_AUTH_KEY_PAGE_URL(self): - return self._DEEPL_AUTH_KEY_PAGE_URL - - @property - def TRANSPARENCY_RANGE(self): - return self._TRANSPARENCY_RANGE - - @property - def APPEARANCE_THEME_LIST(self): - return self._APPEARANCE_THEME_LIST - - @property - def UI_SCALING_LIST(self): - return self._UI_SCALING_LIST - - @property - def TEXTBOX_UI_SCALING_RANGE(self): - return self._TEXTBOX_UI_SCALING_RANGE - - @property - def MESSAGE_BOX_RATIO_RANGE(self): - return self._MESSAGE_BOX_RATIO_RANGE - - @property - def SELECTABLE_UI_LANGUAGES_DICT(self): - return self._SELECTABLE_UI_LANGUAGES_DICT - - @property - def SELECTABLE_CTRANSLATE2_WEIGHT_TYPE_DICT(self): - return self._SELECTABLE_CTRANSLATE2_WEIGHT_TYPE_DICT - - @property - def SELECTABLE_WHISPER_WEIGHT_TYPE_DICT(self): - return self._SELECTABLE_WHISPER_WEIGHT_TYPE_DICT - - @property - def MAX_MIC_ENERGY_THRESHOLD(self): - return self._MAX_MIC_ENERGY_THRESHOLD - - @property - def MAX_SPEAKER_ENERGY_THRESHOLD(self): - return self._MAX_SPEAKER_ENERGY_THRESHOLD - - # Read Write - @property - def ENABLE_SPEAKER2CHATBOX(self): - return self._ENABLE_SPEAKER2CHATBOX - - @ENABLE_SPEAKER2CHATBOX.setter - def ENABLE_SPEAKER2CHATBOX(self, value): - if isinstance(value, bool): - self._ENABLE_SPEAKER2CHATBOX = value - - @property - def ENABLE_TRANSLATION(self): - return self._ENABLE_TRANSLATION - - @ENABLE_TRANSLATION.setter - def ENABLE_TRANSLATION(self, value): - if isinstance(value, bool): - self._ENABLE_TRANSLATION = value - - @property - def ENABLE_TRANSCRIPTION_SEND(self): - return self._ENABLE_TRANSCRIPTION_SEND - - @ENABLE_TRANSCRIPTION_SEND.setter - def ENABLE_TRANSCRIPTION_SEND(self, value): - if isinstance(value, bool): - self._ENABLE_TRANSCRIPTION_SEND = value - - @property - def ENABLE_TRANSCRIPTION_RECEIVE(self): - return self._ENABLE_TRANSCRIPTION_RECEIVE - - @ENABLE_TRANSCRIPTION_RECEIVE.setter - def ENABLE_TRANSCRIPTION_RECEIVE(self, value): - if isinstance(value, bool): - self._ENABLE_TRANSCRIPTION_RECEIVE = value - - @property - def ENABLE_FOREGROUND(self): - return self._ENABLE_FOREGROUND - - @ENABLE_FOREGROUND.setter - def ENABLE_FOREGROUND(self, value): - if isinstance(value, bool): - self._ENABLE_FOREGROUND = value - - @property - def SOURCE_COUNTRY(self): - return self._SOURCE_COUNTRY - - @SOURCE_COUNTRY.setter - def SOURCE_COUNTRY(self, value): - if isinstance(value, str): - self._SOURCE_COUNTRY = value - - @property - def SOURCE_LANGUAGE(self): - return self._SOURCE_LANGUAGE - - @SOURCE_LANGUAGE.setter - def SOURCE_LANGUAGE(self, value): - if isinstance(value, str): - self._SOURCE_LANGUAGE = value - - @property - def TARGET_COUNTRY(self): - return self._TARGET_COUNTRY - - @TARGET_COUNTRY.setter - def TARGET_COUNTRY(self, value): - if isinstance(value, str): - self._TARGET_COUNTRY = value - - @property - def TARGET_LANGUAGE(self): - return self._TARGET_LANGUAGE - - @TARGET_LANGUAGE.setter - def TARGET_LANGUAGE(self, value): - if isinstance(value, str): - self._TARGET_LANGUAGE = value - - @property - def CHOICE_INPUT_TRANSLATOR(self): - return self._CHOICE_INPUT_TRANSLATOR - - @CHOICE_INPUT_TRANSLATOR.setter - def CHOICE_INPUT_TRANSLATOR(self, value): - if value in list(translation_lang.keys()): - self._CHOICE_INPUT_TRANSLATOR= value - - @property - def CHOICE_OUTPUT_TRANSLATOR(self): - return self._CHOICE_OUTPUT_TRANSLATOR - - @CHOICE_OUTPUT_TRANSLATOR.setter - def CHOICE_OUTPUT_TRANSLATOR(self, value): - if value in list(translation_lang.keys()): - self._CHOICE_OUTPUT_TRANSLATOR = value - - @property - def SENT_MESSAGES_LOG(self): - return self._SENT_MESSAGES_LOG - - @SENT_MESSAGES_LOG.setter - def SENT_MESSAGES_LOG(self, value): - if isinstance(value, list): - self._SENT_MESSAGES_LOG = value - - @property - def CURRENT_SENT_MESSAGES_LOG_INDEX(self): - return self._CURRENT_SENT_MESSAGES_LOG_INDEX - - @CURRENT_SENT_MESSAGES_LOG_INDEX.setter - def CURRENT_SENT_MESSAGES_LOG_INDEX(self, value): - if isinstance(value, int): - self._CURRENT_SENT_MESSAGES_LOG_INDEX = value - - @property - def IS_RESET_BUTTON_DISPLAYED_FOR_TRANSLATION(self): - return self._IS_RESET_BUTTON_DISPLAYED_FOR_TRANSLATION - - @IS_RESET_BUTTON_DISPLAYED_FOR_TRANSLATION.setter - def IS_RESET_BUTTON_DISPLAYED_FOR_TRANSLATION(self, value): - if isinstance(value, bool): - self._IS_RESET_BUTTON_DISPLAYED_FOR_TRANSLATION = value - - @property - def IS_RESET_BUTTON_DISPLAYED_FOR_WHISPER(self): - return self._IS_RESET_BUTTON_DISPLAYED_FOR_WHISPER - - @IS_RESET_BUTTON_DISPLAYED_FOR_WHISPER.setter - def IS_RESET_BUTTON_DISPLAYED_FOR_WHISPER(self, value): - if isinstance(value, bool): - self._IS_RESET_BUTTON_DISPLAYED_FOR_WHISPER = value - - @property - def IS_EASTER_EGG_ENABLED(self): - return self._IS_EASTER_EGG_ENABLED - - @IS_EASTER_EGG_ENABLED.setter - def IS_EASTER_EGG_ENABLED(self, value): - if isinstance(value, bool): - self._IS_EASTER_EGG_ENABLED = value - - # Save Json Data - ## Main Window - @property - @json_serializable('SELECTED_TAB_NO') - def SELECTED_TAB_NO(self): - return self._SELECTED_TAB_NO - - @SELECTED_TAB_NO.setter - def SELECTED_TAB_NO(self, value): - if isinstance(value, str): - self._SELECTED_TAB_NO = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('SELECTED_TAB_YOUR_TRANSLATOR_ENGINES') - def SELECTED_TAB_YOUR_TRANSLATOR_ENGINES(self): - return self._SELECTED_TAB_YOUR_TRANSLATOR_ENGINES - - @SELECTED_TAB_YOUR_TRANSLATOR_ENGINES.setter - def SELECTED_TAB_YOUR_TRANSLATOR_ENGINES(self, value): - if isinstance(value, dict): - self._SELECTED_TAB_YOUR_TRANSLATOR_ENGINES = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('SELECTED_TAB_TARGET_TRANSLATOR_ENGINES') - def SELECTED_TAB_TARGET_TRANSLATOR_ENGINES(self): - return self._SELECTED_TAB_TARGET_TRANSLATOR_ENGINES - - @SELECTED_TAB_TARGET_TRANSLATOR_ENGINES.setter - def SELECTED_TAB_TARGET_TRANSLATOR_ENGINES(self, value): - if isinstance(value, dict): - self._SELECTED_TAB_TARGET_TRANSLATOR_ENGINES = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('SELECTED_TAB_YOUR_LANGUAGES') - def SELECTED_TAB_YOUR_LANGUAGES(self): - return self._SELECTED_TAB_YOUR_LANGUAGES - - @SELECTED_TAB_YOUR_LANGUAGES.setter - def SELECTED_TAB_YOUR_LANGUAGES(self, value): - try: - if isinstance(value, dict): - value_old = self.SELECTED_TAB_YOUR_LANGUAGES - for k, v in value.items(): - language = v["language"] - country = v["country"] - if language not in list(transcription_lang.keys()) or country not in list(transcription_lang[language].keys()): - value[k] = value_old[k] - self._SELECTED_TAB_YOUR_LANGUAGES = value - except Exception: - pass - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('SELECTED_TAB_TARGET_LANGUAGES') - def SELECTED_TAB_TARGET_LANGUAGES(self): - return self._SELECTED_TAB_TARGET_LANGUAGES - - @SELECTED_TAB_TARGET_LANGUAGES.setter - def SELECTED_TAB_TARGET_LANGUAGES(self, value): - try: - if isinstance(value, dict): - value_old = self.SELECTED_TAB_TARGET_LANGUAGES - for k, v in value.items(): - language = v["language"] - country = v["country"] - if language not in list(transcription_lang.keys()) or country not in list(transcription_lang[language].keys()): - value[k] = value_old[k] - self._SELECTED_TAB_TARGET_LANGUAGES = value - except Exception: - pass - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('SELECTED_TRANSCRIPTION_ENGINE') - def SELECTED_TRANSCRIPTION_ENGINE(self): - return self._SELECTED_TRANSCRIPTION_ENGINE - - @SELECTED_TRANSCRIPTION_ENGINE.setter - def SELECTED_TRANSCRIPTION_ENGINE(self, value): - if isinstance(value, str): - self._SELECTED_TRANSCRIPTION_ENGINE = value - # saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('IS_MAIN_WINDOW_SIDEBAR_COMPACT_MODE') - def IS_MAIN_WINDOW_SIDEBAR_COMPACT_MODE(self): - return self._IS_MAIN_WINDOW_SIDEBAR_COMPACT_MODE - - @IS_MAIN_WINDOW_SIDEBAR_COMPACT_MODE.setter - def IS_MAIN_WINDOW_SIDEBAR_COMPACT_MODE(self, value): - if isinstance(value, bool): - self._IS_MAIN_WINDOW_SIDEBAR_COMPACT_MODE = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - ## Config Window - @property - @json_serializable('TRANSPARENCY') - def TRANSPARENCY(self): - return self._TRANSPARENCY - - @TRANSPARENCY.setter - def TRANSPARENCY(self, value): - if isinstance(value, int) and self.TRANSPARENCY_RANGE[0] <= value <= self.TRANSPARENCY_RANGE[1]: - self._TRANSPARENCY = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('APPEARANCE_THEME') - def APPEARANCE_THEME(self): - return self._APPEARANCE_THEME - - @APPEARANCE_THEME.setter - def APPEARANCE_THEME(self, value): - if value in self.APPEARANCE_THEME_LIST: - self._APPEARANCE_THEME = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('UI_SCALING') - def UI_SCALING(self): - return self._UI_SCALING - - @UI_SCALING.setter - def UI_SCALING(self, value): - if value in self.UI_SCALING_LIST: - self._UI_SCALING = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('TEXTBOX_UI_SCALING') - def TEXTBOX_UI_SCALING(self): - return self._TEXTBOX_UI_SCALING - - @TEXTBOX_UI_SCALING.setter - def TEXTBOX_UI_SCALING(self, value): - if isinstance(value, int) and self.TEXTBOX_UI_SCALING_RANGE[0] <= value <= self.TEXTBOX_UI_SCALING_RANGE[1]: - self._TEXTBOX_UI_SCALING = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('MESSAGE_BOX_RATIO') - def MESSAGE_BOX_RATIO(self): - return self._MESSAGE_BOX_RATIO - - @MESSAGE_BOX_RATIO.setter - def MESSAGE_BOX_RATIO(self, value): - if isinstance(value, int) and self.MESSAGE_BOX_RATIO_RANGE[0] <= value <= self.MESSAGE_BOX_RATIO_RANGE[1]: - self._MESSAGE_BOX_RATIO = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('FONT_FAMILY') - def FONT_FAMILY(self): - return self._FONT_FAMILY - - @FONT_FAMILY.setter - def FONT_FAMILY(self, value): - root = tk.Tk() - root.withdraw() - if value in list(font.families()): - self._FONT_FAMILY = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - root.destroy() - - @property - @json_serializable('UI_LANGUAGE') - def UI_LANGUAGE(self): - return self._UI_LANGUAGE - - @UI_LANGUAGE.setter - def UI_LANGUAGE(self, value): - if value in list(self.SELECTABLE_UI_LANGUAGES_DICT.keys()): - self._UI_LANGUAGE = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('ENABLE_RESTORE_MAIN_WINDOW_GEOMETRY') - def ENABLE_RESTORE_MAIN_WINDOW_GEOMETRY(self): - return self._ENABLE_RESTORE_MAIN_WINDOW_GEOMETRY - - @ENABLE_RESTORE_MAIN_WINDOW_GEOMETRY.setter - def ENABLE_RESTORE_MAIN_WINDOW_GEOMETRY(self, value): - if isinstance(value, bool): - self._ENABLE_RESTORE_MAIN_WINDOW_GEOMETRY = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('MAIN_WINDOW_GEOMETRY') - def MAIN_WINDOW_GEOMETRY(self): - return self._MAIN_WINDOW_GEOMETRY - - @MAIN_WINDOW_GEOMETRY.setter - def MAIN_WINDOW_GEOMETRY(self, value): - if isinstance(value, dict) and set(value.keys()) == set(self.MAIN_WINDOW_GEOMETRY.keys()): - for key, value in value.items(): - if isinstance(value, str): - self._MAIN_WINDOW_GEOMETRY[key] = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, self.MAIN_WINDOW_GEOMETRY) - - @property - @json_serializable('CHOICE_MIC_HOST') - def CHOICE_MIC_HOST(self): - return self._CHOICE_MIC_HOST - - @CHOICE_MIC_HOST.setter - def CHOICE_MIC_HOST(self, value): - if value in [host for host in getInputDevices().keys()]: - self._CHOICE_MIC_HOST = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('CHOICE_MIC_DEVICE') - def CHOICE_MIC_DEVICE(self): - return self._CHOICE_MIC_DEVICE - - @CHOICE_MIC_DEVICE.setter - def CHOICE_MIC_DEVICE(self, value): - if value in [device["name"] for device in getInputDevices()[self.CHOICE_MIC_HOST]]: - self._CHOICE_MIC_DEVICE = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('INPUT_MIC_ENERGY_THRESHOLD') - def INPUT_MIC_ENERGY_THRESHOLD(self): - return self._INPUT_MIC_ENERGY_THRESHOLD - - @INPUT_MIC_ENERGY_THRESHOLD.setter - def INPUT_MIC_ENERGY_THRESHOLD(self, value): - if isinstance(value, int): - self._INPUT_MIC_ENERGY_THRESHOLD = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('INPUT_MIC_DYNAMIC_ENERGY_THRESHOLD') - def INPUT_MIC_DYNAMIC_ENERGY_THRESHOLD(self): - return self._INPUT_MIC_DYNAMIC_ENERGY_THRESHOLD - - @INPUT_MIC_DYNAMIC_ENERGY_THRESHOLD.setter - def INPUT_MIC_DYNAMIC_ENERGY_THRESHOLD(self, value): - if isinstance(value, bool): - self._INPUT_MIC_DYNAMIC_ENERGY_THRESHOLD = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('INPUT_MIC_RECORD_TIMEOUT') - def INPUT_MIC_RECORD_TIMEOUT(self): - return self._INPUT_MIC_RECORD_TIMEOUT - - @INPUT_MIC_RECORD_TIMEOUT.setter - def INPUT_MIC_RECORD_TIMEOUT(self, value): - if isinstance(value, int): - self._INPUT_MIC_RECORD_TIMEOUT = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('INPUT_MIC_PHRASE_TIMEOUT') - def INPUT_MIC_PHRASE_TIMEOUT(self): - return self._INPUT_MIC_PHRASE_TIMEOUT - - @INPUT_MIC_PHRASE_TIMEOUT.setter - def INPUT_MIC_PHRASE_TIMEOUT(self, value): - if isinstance(value, int): - self._INPUT_MIC_PHRASE_TIMEOUT = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('INPUT_MIC_MAX_PHRASES') - def INPUT_MIC_MAX_PHRASES(self): - return self._INPUT_MIC_MAX_PHRASES - - @INPUT_MIC_MAX_PHRASES.setter - def INPUT_MIC_MAX_PHRASES(self, value): - if isinstance(value, int): - self._INPUT_MIC_MAX_PHRASES = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('INPUT_MIC_WORD_FILTER') - def INPUT_MIC_WORD_FILTER(self): - return self._INPUT_MIC_WORD_FILTER - - @INPUT_MIC_WORD_FILTER.setter - def INPUT_MIC_WORD_FILTER(self, value): - if isinstance(value, list): - self._INPUT_MIC_WORD_FILTER = sorted(set(value), key=value.index) - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('INPUT_MIC_AVG_LOGPROB') - def INPUT_MIC_AVG_LOGPROB(self): - return self._INPUT_MIC_AVG_LOGPROB - - @INPUT_MIC_AVG_LOGPROB.setter - def INPUT_MIC_AVG_LOGPROB(self, value): - if isinstance(value, float) or isinstance(value, int): - self._INPUT_MIC_AVG_LOGPROB = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('INPUT_MIC_NO_SPEECH_PROB') - def INPUT_MIC_NO_SPEECH_PROB(self): - return self._INPUT_MIC_NO_SPEECH_PROB - - @INPUT_MIC_NO_SPEECH_PROB.setter - def INPUT_MIC_NO_SPEECH_PROB(self, value): - if isinstance(value, float) or isinstance(value, int): - self._INPUT_MIC_NO_SPEECH_PROB = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('CHOICE_SPEAKER_DEVICE') - def CHOICE_SPEAKER_DEVICE(self): - return self._CHOICE_SPEAKER_DEVICE - - @CHOICE_SPEAKER_DEVICE.setter - def CHOICE_SPEAKER_DEVICE(self, value): - if value in [device["name"] for device in getOutputDevices()]: - self._CHOICE_SPEAKER_DEVICE = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('INPUT_SPEAKER_ENERGY_THRESHOLD') - def INPUT_SPEAKER_ENERGY_THRESHOLD(self): - return self._INPUT_SPEAKER_ENERGY_THRESHOLD - - @INPUT_SPEAKER_ENERGY_THRESHOLD.setter - def INPUT_SPEAKER_ENERGY_THRESHOLD(self, value): - if isinstance(value, int): - self._INPUT_SPEAKER_ENERGY_THRESHOLD = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('INPUT_SPEAKER_DYNAMIC_ENERGY_THRESHOLD') - def INPUT_SPEAKER_DYNAMIC_ENERGY_THRESHOLD(self): - return self._INPUT_SPEAKER_DYNAMIC_ENERGY_THRESHOLD - - @INPUT_SPEAKER_DYNAMIC_ENERGY_THRESHOLD.setter - def INPUT_SPEAKER_DYNAMIC_ENERGY_THRESHOLD(self, value): - if isinstance(value, bool): - self._INPUT_SPEAKER_DYNAMIC_ENERGY_THRESHOLD = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('INPUT_SPEAKER_RECORD_TIMEOUT') - def INPUT_SPEAKER_RECORD_TIMEOUT(self): - return self._INPUT_SPEAKER_RECORD_TIMEOUT - - @INPUT_SPEAKER_RECORD_TIMEOUT.setter - def INPUT_SPEAKER_RECORD_TIMEOUT(self, value): - if isinstance(value, int): - self._INPUT_SPEAKER_RECORD_TIMEOUT = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('INPUT_SPEAKER_PHRASE_TIMEOUT') - def INPUT_SPEAKER_PHRASE_TIMEOUT(self): - return self._INPUT_SPEAKER_PHRASE_TIMEOUT - - @INPUT_SPEAKER_PHRASE_TIMEOUT.setter - def INPUT_SPEAKER_PHRASE_TIMEOUT(self, value): - if isinstance(value, int): - self._INPUT_SPEAKER_PHRASE_TIMEOUT = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('INPUT_SPEAKER_MAX_PHRASES') - def INPUT_SPEAKER_MAX_PHRASES(self): - return self._INPUT_SPEAKER_MAX_PHRASES - - @INPUT_SPEAKER_MAX_PHRASES.setter - def INPUT_SPEAKER_MAX_PHRASES(self, value): - if isinstance(value, int): - self._INPUT_SPEAKER_MAX_PHRASES = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('INPUT_SPEAKER_AVG_LOGPROB') - def INPUT_SPEAKER_AVG_LOGPROB(self): - return self._INPUT_SPEAKER_AVG_LOGPROB - - @INPUT_SPEAKER_AVG_LOGPROB.setter - def INPUT_SPEAKER_AVG_LOGPROB(self, value): - if isinstance(value, float) or isinstance(value, int): - self._INPUT_SPEAKER_AVG_LOGPROB = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('INPUT_SPEAKER_NO_SPEECH_PROB') - def INPUT_SPEAKER_NO_SPEECH_PROB(self): - return self._INPUT_SPEAKER_NO_SPEECH_PROB - - @INPUT_SPEAKER_NO_SPEECH_PROB.setter - def INPUT_SPEAKER_NO_SPEECH_PROB(self, value): - if isinstance(value, float) or isinstance(value, int): - self._INPUT_SPEAKER_NO_SPEECH_PROB = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('OSC_IP_ADDRESS') - def OSC_IP_ADDRESS(self): - return self._OSC_IP_ADDRESS - - @OSC_IP_ADDRESS.setter - def OSC_IP_ADDRESS(self, value): - if isinstance(value, str): - self._OSC_IP_ADDRESS = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('OSC_PORT') - def OSC_PORT(self): - return self._OSC_PORT - - @OSC_PORT.setter - def OSC_PORT(self, value): - if isinstance(value, int): - self._OSC_PORT = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('AUTH_KEYS') - def AUTH_KEYS(self): - return self._AUTH_KEYS - - @AUTH_KEYS.setter - def AUTH_KEYS(self, value): - if isinstance(value, dict) and set(value.keys()) == set(self.AUTH_KEYS.keys()): - for key, value in value.items(): - if isinstance(value, str): - self._AUTH_KEYS[key] = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, self.AUTH_KEYS) - - @property - @json_serializable('USE_TRANSLATION_FEATURE') - def USE_TRANSLATION_FEATURE(self): - return self._USE_TRANSLATION_FEATURE - - @USE_TRANSLATION_FEATURE.setter - def USE_TRANSLATION_FEATURE(self, value): - if isinstance(value, bool): - self._USE_TRANSLATION_FEATURE = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('USE_WHISPER_FEATURE') - def USE_WHISPER_FEATURE(self): - return self._USE_WHISPER_FEATURE - - @USE_WHISPER_FEATURE.setter - def USE_WHISPER_FEATURE(self, value): - if isinstance(value, bool): - self._USE_WHISPER_FEATURE = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('CTRANSLATE2_WEIGHT_TYPE') - def CTRANSLATE2_WEIGHT_TYPE(self): - return self._CTRANSLATE2_WEIGHT_TYPE - - @CTRANSLATE2_WEIGHT_TYPE.setter - def CTRANSLATE2_WEIGHT_TYPE(self, value): - # if isinstance(value, str) and value in self.SELECTABLE_CTRANSLATE2_WEIGHT_TYPE_DICT: - if isinstance(value, str): - self._CTRANSLATE2_WEIGHT_TYPE = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('WHISPER_WEIGHT_TYPE') - def WHISPER_WEIGHT_TYPE(self): - return self._WHISPER_WEIGHT_TYPE - - @WHISPER_WEIGHT_TYPE.setter - def WHISPER_WEIGHT_TYPE(self, value): - if isinstance(value, str): - self._WHISPER_WEIGHT_TYPE = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('ENABLE_AUTO_CLEAR_MESSAGE_BOX') - def ENABLE_AUTO_CLEAR_MESSAGE_BOX(self): - return self._ENABLE_AUTO_CLEAR_MESSAGE_BOX - - @ENABLE_AUTO_CLEAR_MESSAGE_BOX.setter - def ENABLE_AUTO_CLEAR_MESSAGE_BOX(self, value): - if isinstance(value, bool): - self._ENABLE_AUTO_CLEAR_MESSAGE_BOX = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('ENABLE_SEND_ONLY_TRANSLATED_MESSAGES') - def ENABLE_SEND_ONLY_TRANSLATED_MESSAGES(self): - return self._ENABLE_SEND_ONLY_TRANSLATED_MESSAGES - - @ENABLE_SEND_ONLY_TRANSLATED_MESSAGES.setter - def ENABLE_SEND_ONLY_TRANSLATED_MESSAGES(self, value): - if isinstance(value, bool): - self._ENABLE_SEND_ONLY_TRANSLATED_MESSAGES = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('SEND_MESSAGE_BUTTON_TYPE') - def SEND_MESSAGE_BUTTON_TYPE(self): - return self._SEND_MESSAGE_BUTTON_TYPE - - @SEND_MESSAGE_BUTTON_TYPE.setter - def SEND_MESSAGE_BUTTON_TYPE(self, value): - if isinstance(value, str): - self._SEND_MESSAGE_BUTTON_TYPE = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('OVERLAY_SETTINGS') - def OVERLAY_SETTINGS(self): - return self._OVERLAY_SETTINGS - - @OVERLAY_SETTINGS.setter - def OVERLAY_SETTINGS(self, value): - if isinstance(value, dict) and set(value.keys()) == set(self.OVERLAY_SETTINGS.keys()): - for key, value in value.items(): - if isinstance(value, float): - self._OVERLAY_SETTINGS[key] = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, self.OVERLAY_SETTINGS) - - @property - @json_serializable('ENABLE_OVERLAY_SMALL_LOG') - def ENABLE_OVERLAY_SMALL_LOG(self): - return self._ENABLE_OVERLAY_SMALL_LOG - - @ENABLE_OVERLAY_SMALL_LOG.setter - def ENABLE_OVERLAY_SMALL_LOG(self, value): - if isinstance(value, bool): - self._ENABLE_OVERLAY_SMALL_LOG = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('OVERLAY_SMALL_LOG_SETTINGS') - def OVERLAY_SMALL_LOG_SETTINGS(self): - return self._OVERLAY_SMALL_LOG_SETTINGS - - @OVERLAY_SMALL_LOG_SETTINGS.setter - def OVERLAY_SMALL_LOG_SETTINGS(self, value): - if isinstance(value, dict) and set(value.keys()) == set(self.OVERLAY_SMALL_LOG_SETTINGS.keys()): - for key, value in value.items(): - match (key): - case "x_pos" | "y_pos" | "z_pos" | "x_rotation" | "y_rotation" | "z_rotation": - if isinstance(value, float): - self._OVERLAY_SMALL_LOG_SETTINGS[key] = value - case "display_duration" | "fadeout_duration": - if isinstance(value, int): - self._OVERLAY_SMALL_LOG_SETTINGS[key] = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, self.OVERLAY_SMALL_LOG_SETTINGS) - - @property - @json_serializable('OVERLAY_UI_TYPE') - def OVERLAY_UI_TYPE(self): - return self._OVERLAY_UI_TYPE - - @OVERLAY_UI_TYPE.setter - def OVERLAY_UI_TYPE(self, value): - if isinstance(value, str): - self._OVERLAY_UI_TYPE = value - # saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('ENABLE_SEND_MESSAGE_TO_VRC') - def ENABLE_SEND_MESSAGE_TO_VRC(self): - return self._ENABLE_SEND_MESSAGE_TO_VRC - - @ENABLE_SEND_MESSAGE_TO_VRC.setter - def ENABLE_SEND_MESSAGE_TO_VRC(self, value): - if isinstance(value, bool): - self._ENABLE_SEND_MESSAGE_TO_VRC = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('SEND_MESSAGE_FORMAT') - def SEND_MESSAGE_FORMAT(self): - return self._SEND_MESSAGE_FORMAT - - @SEND_MESSAGE_FORMAT.setter - def SEND_MESSAGE_FORMAT(self, value): - if isinstance(value, str): - if isUniqueStrings(["[message]"], value) is False: - value = "[message]" - self._SEND_MESSAGE_FORMAT = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('SEND_MESSAGE_FORMAT_WITH_T') - def SEND_MESSAGE_FORMAT_WITH_T(self): - return self._SEND_MESSAGE_FORMAT_WITH_T - - @SEND_MESSAGE_FORMAT_WITH_T.setter - def SEND_MESSAGE_FORMAT_WITH_T(self, value): - if isinstance(value, str): - if isUniqueStrings(["[message]", "[translation]"], value) is False: - value = "[message]([translation])" - self._SEND_MESSAGE_FORMAT_WITH_T = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('RECEIVED_MESSAGE_FORMAT') - def RECEIVED_MESSAGE_FORMAT(self): - return self._RECEIVED_MESSAGE_FORMAT - - @RECEIVED_MESSAGE_FORMAT.setter - def RECEIVED_MESSAGE_FORMAT(self, value): - if isinstance(value, str): - if isUniqueStrings(["[message]"], value) is False: - value = "[message]" - self._RECEIVED_MESSAGE_FORMAT = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('RECEIVED_MESSAGE_FORMAT_WITH_T') - def RECEIVED_MESSAGE_FORMAT_WITH_T(self): - return self._RECEIVED_MESSAGE_FORMAT_WITH_T - - @RECEIVED_MESSAGE_FORMAT_WITH_T.setter - def RECEIVED_MESSAGE_FORMAT_WITH_T(self, value): - if isinstance(value, str): - if isUniqueStrings(["[message]", "[translation]"], value) is False: - value = "[message]([translation])" - self._RECEIVED_MESSAGE_FORMAT_WITH_T = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - # Speaker2Chatbox------------------ - @property - @json_serializable('ENABLE_SPEAKER2CHATBOX_PASS') - def ENABLE_SPEAKER2CHATBOX_PASS(self): - return self._ENABLE_SPEAKER2CHATBOX_PASS - - @ENABLE_SPEAKER2CHATBOX_PASS.setter - def ENABLE_SPEAKER2CHATBOX_PASS(self, value): - if isinstance(value, str): - self._ENABLE_SPEAKER2CHATBOX_PASS = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('ENABLE_SEND_RECEIVED_MESSAGE_TO_VRC') - def ENABLE_SEND_RECEIVED_MESSAGE_TO_VRC(self): - return self._ENABLE_SEND_RECEIVED_MESSAGE_TO_VRC - - @ENABLE_SEND_RECEIVED_MESSAGE_TO_VRC.setter - def ENABLE_SEND_RECEIVED_MESSAGE_TO_VRC(self, value): - if isinstance(value, bool): - if self._ENABLE_SPEAKER2CHATBOX is True: - self._ENABLE_SEND_RECEIVED_MESSAGE_TO_VRC = value - else: - self._ENABLE_SEND_RECEIVED_MESSAGE_TO_VRC = False - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - # Speaker2Chatbox------------------ - - - - @property - @json_serializable('ENABLE_LOGGER') - def ENABLE_LOGGER(self): - return self._ENABLE_LOGGER - - @ENABLE_LOGGER.setter - def ENABLE_LOGGER(self, value): - if isinstance(value, bool): - self._ENABLE_LOGGER = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('ENABLE_VRC_MIC_MUTE_SYNC') - def ENABLE_VRC_MIC_MUTE_SYNC(self): - return self._ENABLE_VRC_MIC_MUTE_SYNC - - @ENABLE_VRC_MIC_MUTE_SYNC.setter - def ENABLE_VRC_MIC_MUTE_SYNC(self, value): - if isinstance(value, bool): - self._ENABLE_VRC_MIC_MUTE_SYNC = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - @json_serializable('IS_CONFIG_WINDOW_COMPACT_MODE') - def IS_CONFIG_WINDOW_COMPACT_MODE(self): - return self._IS_CONFIG_WINDOW_COMPACT_MODE - - @IS_CONFIG_WINDOW_COMPACT_MODE.setter - def IS_CONFIG_WINDOW_COMPACT_MODE(self, value): - if isinstance(value, bool): - self._IS_CONFIG_WINDOW_COMPACT_MODE = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - def init_config(self): - # Read Only - self._VERSION = "2.2.9" - self._ENABLE_SPEAKER2CHATBOX = False # Speaker2Chatbox - self._ENABLE_SPEAKER2CHATBOX_PASS_CONFIRMATION = "VRCT=0YEN" - self._PATH_LOCAL = os_path.dirname(sys.argv[0]) - self._PATH_CONFIG = os_path.join(self._PATH_LOCAL, "config.json") - self._PATH_LOGS = os_path.join(self._PATH_LOCAL, "logs") - os_makedirs(self._PATH_LOGS, exist_ok=True) - self._GITHUB_URL = "https://api.github.com/repos/misyaguziya/VRCT/releases/latest" - self._UPDATER_URL = "https://api.github.com/repos/misyaguziya/VRCT_updater/releases/latest" - self._BOOTH_URL = "https://misyaguziya.booth.pm/" - self._DOCUMENTS_URL = "https://mzsoftware.notion.site/VRCT-Documents-be79b7a165f64442ad8f326d86c22246" - self._DEEPL_AUTH_KEY_PAGE_URL = "https://www.deepl.com/ja/account/summary" - self._TRANSPARENCY_RANGE = (50, 100) - self._APPEARANCE_THEME_LIST = ["Light", "Dark", "System"] - self._UI_SCALING_LIST = generatePercentageStringsList(start=40, end=200, step=10) - self._TEXTBOX_UI_SCALING_RANGE = (50, 200) - self._MESSAGE_BOX_RATIO_RANGE = (1, 99) - self._SELECTABLE_UI_LANGUAGES_DICT = { - "en": "English", - "ja": "日本語", - "ko": "한국어", - "zh-Hant": "繁體中文", - "zh-Hans": "简体中文" - # If you want to add a new language and key, please append it here. - } - self._SELECTABLE_CTRANSLATE2_WEIGHT_TYPE_DICT = { - # {Save json str}: {i18n_placeholder} pairs - "Small": "Small", - "Large": "Large", - } - - self._SELECTABLE_WHISPER_WEIGHT_TYPE_DICT = { - # {Save json str}: {i18n_placeholder} pairs - "tiny": "tiny", - "base": "base", - "small": "small", - "medium": "medium", - "large-v1": "large-v1", - "large-v2": "large-v2", - "large-v3": "large-v3", - } - - self._MAX_MIC_ENERGY_THRESHOLD = 2000 - self._MAX_SPEAKER_ENERGY_THRESHOLD = 4000 - - # Read Write - self._ENABLE_TRANSLATION = False - self._ENABLE_TRANSCRIPTION_SEND = False - self._ENABLE_TRANSCRIPTION_RECEIVE = False - self._ENABLE_FOREGROUND = False - self._CHOICE_INPUT_TRANSLATOR = "CTranslate2" - self._CHOICE_OUTPUT_TRANSLATOR = "CTranslate2" - self._SOURCE_LANGUAGE = "Japanese" - self._SOURCE_COUNTRY = "Japan" - self._TARGET_LANGUAGE = "English" - self._TARGET_COUNTRY = "United States" - self._SENT_MESSAGES_LOG = [] - self._CURRENT_SENT_MESSAGES_LOG_INDEX = 0 - self._IS_RESET_BUTTON_DISPLAYED_FOR_TRANSLATION = False - self._IS_RESET_BUTTON_DISPLAYED_FOR_WHISPER = False - self._IS_EASTER_EGG_ENABLED = False - - # Save Json Data - ## Main Window - self._SELECTED_TAB_NO = "1" - self._SELECTED_TAB_YOUR_TRANSLATOR_ENGINES = { - "1":"CTranslate2", - "2":"CTranslate2", - "3":"CTranslate2", - } - self._SELECTED_TAB_TARGET_TRANSLATOR_ENGINES = { - "1":"CTranslate2", - "2":"CTranslate2", - "3":"CTranslate2", - } - self._SELECTED_TAB_YOUR_LANGUAGES = { - "1":{ - "language":"Japanese", - "country":"Japan" - }, - "2":{ - "language":"Japanese", - "country":"Japan" - }, - "3":{ - "language":"Japanese", - "country":"Japan" - }, - } - self._SELECTED_TAB_TARGET_LANGUAGES = { - "1":{ - "language":"English", - "country":"United States" - }, - "2":{ - "language":"English", - "country":"United States" - }, - "3":{ - "language":"English", - "country":"United States" - }, - } - self._SELECTED_TRANSCRIPTION_ENGINE = "Google" - self._IS_MAIN_WINDOW_SIDEBAR_COMPACT_MODE = False - - ## Config Window - self._TRANSPARENCY = 100 - self._APPEARANCE_THEME = "Dark" - self._UI_SCALING = "100%" - self._TEXTBOX_UI_SCALING = 100 - self._MESSAGE_BOX_RATIO = 10 - self._FONT_FAMILY = "Yu Gothic UI" - self._UI_LANGUAGE = "en" - self._ENABLE_RESTORE_MAIN_WINDOW_GEOMETRY = True - self._MAIN_WINDOW_GEOMETRY = { - "x_pos": "0", - "y_pos": "0", - "width": "870", - "height": "654", - } - self._CHOICE_MIC_HOST = getDefaultInputDevice()["host"]["name"] - self._CHOICE_MIC_DEVICE = getDefaultInputDevice()["device"]["name"] - self._INPUT_MIC_ENERGY_THRESHOLD = 300 - self._INPUT_MIC_DYNAMIC_ENERGY_THRESHOLD = False - self._INPUT_MIC_RECORD_TIMEOUT = 3 - self._INPUT_MIC_PHRASE_TIMEOUT = 3 - self._INPUT_MIC_MAX_PHRASES = 10 - self._INPUT_MIC_WORD_FILTER = [] - self._INPUT_MIC_AVG_LOGPROB=-0.8 - self._INPUT_MIC_NO_SPEECH_PROB=0.6 - self._CHOICE_SPEAKER_DEVICE = getDefaultOutputDevice()["device"]["name"] - self._INPUT_SPEAKER_ENERGY_THRESHOLD = 300 - self._INPUT_SPEAKER_DYNAMIC_ENERGY_THRESHOLD = False - self._INPUT_SPEAKER_RECORD_TIMEOUT = 3 - self._INPUT_SPEAKER_PHRASE_TIMEOUT = 3 - self._INPUT_SPEAKER_MAX_PHRASES = 10 - self._INPUT_SPEAKER_AVG_LOGPROB=-0.8 - self._INPUT_SPEAKER_NO_SPEECH_PROB=0.6 - self._OSC_IP_ADDRESS = "127.0.0.1" - self._OSC_PORT = 9000 - self._AUTH_KEYS = { - "DeepL_API": None, - } - self._USE_TRANSLATION_FEATURE = True - self._CTRANSLATE2_WEIGHT_TYPE = "Small" - self._USE_WHISPER_FEATURE = False - self._WHISPER_WEIGHT_TYPE = "base" - self._SEND_MESSAGE_FORMAT = "[message]" - self._SEND_MESSAGE_FORMAT_WITH_T = "[message]([translation])" - self._RECEIVED_MESSAGE_FORMAT = "[message]" - self._RECEIVED_MESSAGE_FORMAT_WITH_T = "[message]([translation])" - self._ENABLE_AUTO_CLEAR_MESSAGE_BOX = True - self._ENABLE_SEND_ONLY_TRANSLATED_MESSAGES = False - self._SEND_MESSAGE_BUTTON_TYPE = "show" - self._OVERLAY_SETTINGS = { - "opacity": 1.0, - "ui_scaling": 1.0, - } - self._ENABLE_OVERLAY_SMALL_LOG = False - self._OVERLAY_SMALL_LOG_SETTINGS = { - "x_pos": 0.0, - "y_pos": 0.0, - "z_pos": 0.0, - "x_rotation": 0.0, - "y_rotation": 0.0, - "z_rotation": 0.0, - "display_duration": 5, - "fadeout_duration": 2, - } - self._OVERLAY_UI_TYPE = "default" - self._ENABLE_SEND_MESSAGE_TO_VRC = True - self._ENABLE_SEND_RECEIVED_MESSAGE_TO_VRC = False # Speaker2Chatbox - self._ENABLE_SPEAKER2CHATBOX_PASS = "000000000" - self._ENABLE_LOGGER = False - self._ENABLE_VRC_MIC_MUTE_SYNC = False - self._IS_CONFIG_WINDOW_COMPACT_MODE = False - - def load_config(self): - if os_path.isfile(self.PATH_CONFIG) is not False: - with open(self.PATH_CONFIG, 'r', encoding="utf-8") as fp: - config = json_load(fp) - - old_message_format = None - for key in config.keys(): - if key == "MESSAGE_FORMAT": - old_message_format = config[key] - setattr(self, key, config[key]) - - # Force to Enable Speaker2Chatbox - self.ENABLE_SPEAKER2CHATBOX = True - - if old_message_format is not None: - setattr(self, "SEND_MESSAGE_FORMAT_WITH_T", old_message_format) - - with open(self.PATH_CONFIG, 'w', encoding="utf-8") as fp: - config = {} - for var_name, var_func in json_serializable_vars.items(): - config[var_name] = var_func(self) - json_dump(config, fp, indent=4, ensure_ascii=False) - -config = Config() \ No newline at end of file diff --git a/controller.py b/controller.py deleted file mode 100644 index 57ee6779..00000000 --- a/controller.py +++ /dev/null @@ -1,1183 +0,0 @@ -from time import sleep -from subprocess import Popen -from threading import Thread -from config import config -from model import model -from view import view -from utils import getKeyByValue, isUniqueStrings, strPctToInt -import argparse - -# Common -def callbackUpdateSoftware(func=None): - setMainWindowGeometry() - model.updateSoftware(restart=True, func=func) - -def callbackRestartSoftware(): - setMainWindowGeometry() - model.reStartSoftware() - -def callbackFilepathLogs(): - print("callbackFilepathLogs", config.PATH_LOGS.replace('/', '\\')) - Popen(['explorer', config.PATH_LOGS.replace('/', '\\')], shell=True) - -def callbackFilepathConfigFile(): - print("callbackFilepathConfigFile", config.PATH_LOCAL.replace('/', '\\')) - Popen(['explorer', config.PATH_LOCAL.replace('/', '\\')], shell=True) - -def callbackQuitVrct(): - setMainWindowGeometry() - -def callbackEnableEasterEgg(): - config.IS_EASTER_EGG_ENABLED = True - config.OVERLAY_UI_TYPE = "sakura" - view.printToTextbox_enableEasterEgg() - -def setMainWindowGeometry(): - PRE_SCALING_INT = strPctToInt(view.getPreUiScaling()) - NEW_SCALING_INT = strPctToInt(config.UI_SCALING) - MULTIPLY_FLOAT = (NEW_SCALING_INT / PRE_SCALING_INT) - main_window_geometry = view.getMainWindowGeometry(return_int=True) - main_window_geometry["width"] = str(int(main_window_geometry["width"] * MULTIPLY_FLOAT)) - main_window_geometry["height"] = str(int(main_window_geometry["height"] * MULTIPLY_FLOAT)) - main_window_geometry["x_pos"] = str(main_window_geometry["x_pos"]) - main_window_geometry["y_pos"] = str(main_window_geometry["y_pos"]) - config.MAIN_WINDOW_GEOMETRY = main_window_geometry - -def messageFormatter(format_type:str, translation, message): - if format_type == "RECEIVED": - FORMAT_WITH_T = config.RECEIVED_MESSAGE_FORMAT_WITH_T - FORMAT = config.RECEIVED_MESSAGE_FORMAT - elif format_type == "SEND": - FORMAT_WITH_T = config.SEND_MESSAGE_FORMAT_WITH_T - FORMAT = config.SEND_MESSAGE_FORMAT - else: - raise ValueError("format_type is not found", format_type) - - if len(translation) > 0: - osc_message = FORMAT_WITH_T.replace("[message]", message) - osc_message = osc_message.replace("[translation]", translation) - else: - osc_message = FORMAT.replace("[message]", message) - return osc_message - -def changeToCTranslate2Process(): - if config.CHOICE_INPUT_TRANSLATOR != "CTranslate2" or config.CHOICE_OUTPUT_TRANSLATOR != "CTranslate2": - config.CHOICE_INPUT_TRANSLATOR = "CTranslate2" - config.CHOICE_OUTPUT_TRANSLATOR = "CTranslate2" - updateTranslationEngineAndEngineList() - view.printToTextbox_TranslationEngineLimitError() - -# func transcription send message -def sendMicMessage(message): - if len(message) > 0: - addSentMessageLog(message) - translation = "" - if model.checkKeywords(message): - view.printToTextbox_DetectedByWordFilter(detected_message=message) - return - elif model.detectRepeatSendMessage(message): - return - elif config.ENABLE_TRANSLATION is False: - pass - else: - translation, success = model.getInputTranslate(message) - if success is False: - changeToCTranslate2Process() - - if config.ENABLE_TRANSCRIPTION_SEND is True: - if config.ENABLE_SEND_MESSAGE_TO_VRC is True: - if config.ENABLE_SEND_ONLY_TRANSLATED_MESSAGES is True: - if config.ENABLE_TRANSLATION is False: - osc_message = messageFormatter("SEND", "", message) - else: - osc_message = messageFormatter("SEND", "", translation) - else: - osc_message = messageFormatter("SEND", translation, message) - model.oscSendMessage(osc_message) - - - view.printToTextbox_SentMessage(message, translation) - if config.ENABLE_LOGGER is True: - if len(translation) > 0: - translation = f" ({translation})" - model.logger.info(f"[SENT] {message}{translation}") - - # if config.ENABLE_OVERLAY_SMALL_LOG is True: - # overlay_image = model.createOverlayImageShort(message, translation) - # model.updateOverlay(overlay_image) - # overlay_image = model.createOverlayImageLong("send", message, translation) - # model.updateOverlay(overlay_image) - -def startTranscriptionSendMessage(): - model.startMicTranscript(sendMicMessage, view.printToTextbox_TranscriptionSendNoDeviceError) - view.setMainWindowAllWidgetsStatusToNormal() - -def stopTranscriptionSendMessage(): - model.stopMicTranscript() - view.setMainWindowAllWidgetsStatusToNormal() - -def startThreadingTranscriptionSendMessage(): - view.printToTextbox_enableTranscriptionSend() - th_startTranscriptionSendMessage = Thread(target=startTranscriptionSendMessage) - th_startTranscriptionSendMessage.daemon = True - th_startTranscriptionSendMessage.start() - -def stopThreadingTranscriptionSendMessage(): - view.printToTextbox_disableTranscriptionSend() - th_stopTranscriptionSendMessage = Thread(target=stopTranscriptionSendMessage) - th_stopTranscriptionSendMessage.daemon = True - th_stopTranscriptionSendMessage.start() - -def startTranscriptionSendMessageOnCloseConfigWindow(): - model.startMicTranscript(sendMicMessage, view.printToTextbox_TranscriptionSendNoDeviceError) - -def stopTranscriptionSendMessageOnOpenConfigWindow(): - model.stopMicTranscript() - -def startThreadingTranscriptionSendMessageOnCloseConfigWindow(): - th_startTranscriptionSendMessage = Thread(target=startTranscriptionSendMessageOnCloseConfigWindow) - th_startTranscriptionSendMessage.daemon = True - th_startTranscriptionSendMessage.start() - -def stopThreadingTranscriptionSendMessageOnOpenConfigWindow(): - th_stopTranscriptionSendMessage = Thread(target=stopTranscriptionSendMessageOnOpenConfigWindow) - th_stopTranscriptionSendMessage.daemon = True - th_stopTranscriptionSendMessage.start() - -# func transcription receive message -def receiveSpeakerMessage(message): - if len(message) > 0: - translation = "" - if model.detectRepeatReceiveMessage(message): - return - elif config.ENABLE_TRANSLATION is False: - pass - else: - translation, success = model.getOutputTranslate(message) - if success is False: - changeToCTranslate2Process() - - if config.ENABLE_TRANSCRIPTION_RECEIVE is True: - if config.ENABLE_OVERLAY_SMALL_LOG is True: - if model.overlay.initialized is True: - overlay_image = model.createOverlayImageShort(message, translation) - model.updateOverlay(overlay_image) - # overlay_image = model.createOverlayImageLong("receive", message, translation) - # model.updateOverlay(overlay_image) - - # ------------Speaker2Chatbox------------ - if config.ENABLE_SPEAKER2CHATBOX is True: - # send OSC message - if config.ENABLE_SEND_RECEIVED_MESSAGE_TO_VRC is True: - osc_message = messageFormatter("RECEIVED", translation, message) - model.oscSendMessage(osc_message) - # ------------Speaker2Chatbox------------ - - # update textbox message log (Received) - view.printToTextbox_ReceivedMessage(message, translation) - if config.ENABLE_LOGGER is True: - if len(translation) > 0: - translation = f" ({translation})" - model.logger.info(f"[RECEIVED] {message}{translation}") - -def startTranscriptionReceiveMessage(): - model.startSpeakerTranscript(receiveSpeakerMessage, view.printToTextbox_TranscriptionReceiveNoDeviceError) - view.setMainWindowAllWidgetsStatusToNormal() - -def stopTranscriptionReceiveMessage(): - model.stopSpeakerTranscript() - view.setMainWindowAllWidgetsStatusToNormal() - -def startThreadingTranscriptionReceiveMessage(): - view.printToTextbox_enableTranscriptionReceive() - th_startTranscriptionReceiveMessage = Thread(target=startTranscriptionReceiveMessage) - th_startTranscriptionReceiveMessage.daemon = True - th_startTranscriptionReceiveMessage.start() - -def stopThreadingTranscriptionReceiveMessage(): - view.printToTextbox_disableTranscriptionReceive() - th_stopTranscriptionReceiveMessage = Thread(target=stopTranscriptionReceiveMessage) - th_stopTranscriptionReceiveMessage.daemon = True - th_stopTranscriptionReceiveMessage.start() - -def startTranscriptionReceiveMessageOnCloseConfigWindow(): - model.startSpeakerTranscript(receiveSpeakerMessage, view.printToTextbox_TranscriptionReceiveNoDeviceError) - - -def stopTranscriptionReceiveMessageOnOpenConfigWindow(): - model.stopSpeakerTranscript() - -def startThreadingTranscriptionReceiveMessageOnCloseConfigWindow(): - th_startTranscriptionReceiveMessage = Thread(target=startTranscriptionReceiveMessageOnCloseConfigWindow) - th_startTranscriptionReceiveMessage.daemon = True - th_startTranscriptionReceiveMessage.start() - -def stopThreadingTranscriptionReceiveMessageOnOpenConfigWindow(): - th_stopTranscriptionReceiveMessage = Thread(target=stopTranscriptionReceiveMessageOnOpenConfigWindow) - th_stopTranscriptionReceiveMessage.daemon = True - th_stopTranscriptionReceiveMessage.start() - -# func message box -def sendChatMessage(message): - if len(message) > 0: - addSentMessageLog(message) - translation = "" - if config.ENABLE_TRANSLATION is False: - pass - else: - translation, success = model.getInputTranslate(message) - if success is False: - changeToCTranslate2Process() - - # send OSC message - if config.ENABLE_SEND_MESSAGE_TO_VRC is True: - if config.ENABLE_SEND_ONLY_TRANSLATED_MESSAGES is True: - if config.ENABLE_TRANSLATION is False: - osc_message = messageFormatter("SEND", "", message) - else: - osc_message = messageFormatter("SEND", "", translation) - else: - osc_message = messageFormatter("SEND", translation, message) - model.oscSendMessage(osc_message) - - # if config.ENABLE_OVERLAY_SMALL_LOG is True: - # overlay_image = model.createOverlayImageShort(message, translation) - # model.updateOverlay(overlay_image) - # overlay_image = model.createOverlayImageLong("send", message, translation) - # model.updateOverlay(overlay_image) - - # update textbox message log (Sent) - view.printToTextbox_SentMessage(message, translation) - if config.ENABLE_LOGGER is True: - if len(translation) > 0: - translation = f" ({translation})" - model.logger.info(f"[SENT] {message}{translation}") - - # delete message in entry message box - if config.ENABLE_AUTO_CLEAR_MESSAGE_BOX is True: - view.clearMessageBox() - -def messageBoxPressKeyEnter(): - model.oscStopSendTyping() - message = view.getTextFromMessageBox() - sendChatMessage(message) - -def messageBoxPressKeyAny(e): - if config.ENABLE_SEND_MESSAGE_TO_VRC is True: - model.oscStartSendTyping() - else: - model.oscStopSendTyping() - -def messageBoxFocusIn(e): - view.foregroundOffIfForegroundEnabled() - -def messageBoxFocusOut(e): - view.foregroundOnIfForegroundEnabled() - if config.ENABLE_SEND_MESSAGE_TO_VRC is True: - model.oscStopSendTyping() - -def addSentMessageLog(sent_message): - config.SENT_MESSAGES_LOG.append(sent_message) - config.CURRENT_SENT_MESSAGES_LOG_INDEX = len(config.SENT_MESSAGES_LOG) - -def updateMessageBox(index_offset): - if len(config.SENT_MESSAGES_LOG) == 0: - return - try: - new_index = config.CURRENT_SENT_MESSAGES_LOG_INDEX + index_offset - target_message_text = config.SENT_MESSAGES_LOG[new_index] - view.replaceMessageBox(target_message_text) - config.CURRENT_SENT_MESSAGES_LOG_INDEX = new_index - except IndexError: - pass - -def messageBoxUpKeyPress(): - if config.CURRENT_SENT_MESSAGES_LOG_INDEX > 0: - updateMessageBox(-1) - -def messageBoxDownKeyPress(): - if config.CURRENT_SENT_MESSAGES_LOG_INDEX < len(config.SENT_MESSAGES_LOG) - 1: - updateMessageBox(1) - -def updateTranslationEngineAndEngineList(): - engine = config.CHOICE_INPUT_TRANSLATOR - engines = model.findTranslationEngines(config.SOURCE_LANGUAGE, config.TARGET_LANGUAGE) - if engine not in engines: - engine = engines[0] - config.CHOICE_INPUT_TRANSLATOR = engine - config.CHOICE_OUTPUT_TRANSLATOR = engine - view.updateSelectableTranslationEngineList(engines) - view.setGuiVariable_SelectedTranslationEngine(engine) - -def initSetTranslateEngine(): - engine = config.SELECTED_TAB_YOUR_TRANSLATOR_ENGINES[config.SELECTED_TAB_NO] - config.CHOICE_INPUT_TRANSLATOR = engine - engine = config.SELECTED_TAB_TARGET_TRANSLATOR_ENGINES[config.SELECTED_TAB_NO] - config.CHOICE_OUTPUT_TRANSLATOR = engine - -def initSetLanguageAndCountry(): - select = config.SELECTED_TAB_YOUR_LANGUAGES[config.SELECTED_TAB_NO] - config.SOURCE_LANGUAGE = select["language"] - config.SOURCE_COUNTRY = select["country"] - select = config.SELECTED_TAB_TARGET_LANGUAGES[config.SELECTED_TAB_NO] - config.TARGET_LANGUAGE = select["language"] - config.TARGET_COUNTRY = select["country"] - -def setYourTranslateEngine(select): - engines = config.SELECTED_TAB_YOUR_TRANSLATOR_ENGINES - engines[config.SELECTED_TAB_NO] = select - config.SELECTED_TAB_YOUR_TRANSLATOR_ENGINES = engines - config.CHOICE_INPUT_TRANSLATOR = select - -def setTargetTranslateEngine(select): - engines = config.SELECTED_TAB_TARGET_TRANSLATOR_ENGINES - engines[config.SELECTED_TAB_NO] = select - config.SELECTED_TAB_TARGET_TRANSLATOR_ENGINES = engines - config.CHOICE_OUTPUT_TRANSLATOR = select - -def setYourLanguageAndCountry(select): - languages = config.SELECTED_TAB_YOUR_LANGUAGES - languages[config.SELECTED_TAB_NO] = select - config.SELECTED_TAB_YOUR_LANGUAGES = languages - config.SOURCE_LANGUAGE = select["language"] - config.SOURCE_COUNTRY = select["country"] - updateTranslationEngineAndEngineList() - view.printToTextbox_selectedYourLanguages(select) - -def setTargetLanguageAndCountry(select): - languages = config.SELECTED_TAB_TARGET_LANGUAGES - languages[config.SELECTED_TAB_NO] = select - config.SELECTED_TAB_TARGET_LANGUAGES = languages - config.TARGET_LANGUAGE = select["language"] - config.TARGET_COUNTRY = select["country"] - updateTranslationEngineAndEngineList() - view.printToTextbox_selectedTargetLanguages(select) - -def swapYourLanguageAndTargetLanguage(): - your_language = config.SELECTED_TAB_YOUR_LANGUAGES[config.SELECTED_TAB_NO] - target_language = config.SELECTED_TAB_TARGET_LANGUAGES[config.SELECTED_TAB_NO] - setYourLanguageAndCountry(target_language) - setTargetLanguageAndCountry(your_language) - # Update Selected Languages for UI - view.updateGuiVariableByPresetTabNo(config.SELECTED_TAB_NO) - - -def callbackSelectedLanguagePresetTab(selected_tab_no): - config.SELECTED_TAB_NO = selected_tab_no - view.updateGuiVariableByPresetTabNo(config.SELECTED_TAB_NO) - - engines = config.SELECTED_TAB_YOUR_TRANSLATOR_ENGINES - engine = engines[config.SELECTED_TAB_NO] - config.CHOICE_INPUT_TRANSLATOR = engine - - engines = config.SELECTED_TAB_TARGET_TRANSLATOR_ENGINES - engine = engines[config.SELECTED_TAB_NO] - config.CHOICE_OUTPUT_TRANSLATOR = engine - - languages = config.SELECTED_TAB_YOUR_LANGUAGES - select = languages[config.SELECTED_TAB_NO] - config.SOURCE_LANGUAGE = select["language"] - config.SOURCE_COUNTRY = select["country"] - - languages = config.SELECTED_TAB_TARGET_LANGUAGES - select = languages[config.SELECTED_TAB_NO] - config.TARGET_LANGUAGE = select["language"] - config.TARGET_COUNTRY = select["country"] - view.printToTextbox_changedLanguagePresetTab(config.SELECTED_TAB_NO) - updateTranslationEngineAndEngineList() - -def callbackSelectedTranslationEngine(selected_translation_engine): - print("callbackSelectedTranslationEngine", selected_translation_engine) - setYourTranslateEngine(selected_translation_engine) - setTargetTranslateEngine(selected_translation_engine) - view.setGuiVariable_SelectedTranslationEngine(config.CHOICE_OUTPUT_TRANSLATOR) - -# command func -def callbackToggleTranslation(is_turned_on): - config.ENABLE_TRANSLATION = is_turned_on - if config.ENABLE_TRANSLATION is True: - if model.isLoadedCTranslate2Model() is False: - model.changeTranslatorCTranslate2Model() - view.printToTextbox_enableTranslation() - else: - view.printToTextbox_disableTranslation() - -def callbackToggleTranscriptionSend(is_turned_on): - view.setMainWindowAllWidgetsStatusToDisabled() - config.ENABLE_TRANSCRIPTION_SEND = is_turned_on - if config.ENABLE_TRANSCRIPTION_SEND is True: - startThreadingTranscriptionSendMessage() - view.changeTranscriptionDisplayStatus("MIC_ON") - else: - stopThreadingTranscriptionSendMessage() - view.changeTranscriptionDisplayStatus("MIC_OFF") - -def callbackToggleTranscriptionReceive(is_turned_on): - view.setMainWindowAllWidgetsStatusToDisabled() - config.ENABLE_TRANSCRIPTION_RECEIVE = is_turned_on - if config.ENABLE_TRANSCRIPTION_RECEIVE is True: - startThreadingTranscriptionReceiveMessage() - view.changeTranscriptionDisplayStatus("SPEAKER_ON") - else: - stopThreadingTranscriptionReceiveMessage() - view.changeTranscriptionDisplayStatus("SPEAKER_OFF") - - if config.ENABLE_TRANSCRIPTION_RECEIVE is True and config.ENABLE_OVERLAY_SMALL_LOG is True: - if model.overlay.initialized is False and model.overlay.checkSteamvrRunning() is True: - model.startOverlay() - elif config.ENABLE_TRANSCRIPTION_RECEIVE is False: - pass - -def callbackToggleForeground(is_turned_on): - config.ENABLE_FOREGROUND = is_turned_on - if config.ENABLE_FOREGROUND is True: - view.printToTextbox_enableForeground() - view.foregroundOn() - else: - view.printToTextbox_disableForeground() - view.foregroundOff() - -def callbackEnableMainWindowSidebarCompactMode(): - config.IS_MAIN_WINDOW_SIDEBAR_COMPACT_MODE = True - view.enableMainWindowSidebarCompactMode() - -def callbackDisableMainWindowSidebarCompactMode(): - config.IS_MAIN_WINDOW_SIDEBAR_COMPACT_MODE = False - view.disableMainWindowSidebarCompactMode() - -# Config Window -def callbackOpenConfigWindow(): - view.setMainWindowAllWidgetsStatusToDisabled() - if config.ENABLE_TRANSCRIPTION_SEND is True: - stopThreadingTranscriptionSendMessageOnOpenConfigWindow() - if config.ENABLE_TRANSCRIPTION_RECEIVE is True: - stopThreadingTranscriptionReceiveMessageOnOpenConfigWindow() - if config.ENABLE_FOREGROUND is True: - view.foregroundOff() - -def callbackCloseConfigWindow(): - model.stopCheckMicEnergy() - model.stopCheckSpeakerEnergy() - view.initMicThresholdCheckButton() - view.initSpeakerThresholdCheckButton() - - if config.ENABLE_TRANSCRIPTION_SEND is True: - startThreadingTranscriptionSendMessageOnCloseConfigWindow() - if config.ENABLE_TRANSCRIPTION_RECEIVE is True: - sleep(2) - if config.ENABLE_TRANSCRIPTION_RECEIVE is True: - startThreadingTranscriptionReceiveMessageOnCloseConfigWindow() - if config.ENABLE_FOREGROUND is True: - view.foregroundOn() - view.setMainWindowAllWidgetsStatusToNormal() - -# Compact Mode Switch -def callbackEnableConfigWindowCompactMode(): - config.IS_CONFIG_WINDOW_COMPACT_MODE = True - model.stopCheckMicEnergy() - view.initMicThresholdCheckButton() - model.stopCheckSpeakerEnergy() - view.initSpeakerThresholdCheckButton() - - view.enableConfigWindowCompactMode() - -def callbackDisableConfigWindowCompactMode(): - config.IS_CONFIG_WINDOW_COMPACT_MODE = False - model.stopCheckMicEnergy() - view.initMicThresholdCheckButton() - model.stopCheckSpeakerEnergy() - view.initSpeakerThresholdCheckButton() - - view.disableConfigWindowCompactMode() - -# Appearance Tab -def callbackSetTransparency(value): - print("callbackSetTransparency", int(value)) - config.TRANSPARENCY = int(value) - view.setMainWindowTransparency(config.TRANSPARENCY/100) - -def callbackSetAppearance(value): - print("callbackSetAppearance", value) - config.APPEARANCE_THEME = value - view.showRestartButtonIfRequired() - -def callbackSetUiScaling(value): - print("callbackSetUiScaling", value) - config.UI_SCALING = value - new_scaling_float = strPctToInt(value) / 100 - print("callbackSetUiScaling_new_scaling_float", new_scaling_float) - view.showRestartButtonIfRequired() - -def callbackSetTextboxUiScaling(value): - print("callbackSetTextboxUiScaling", int(value)) - config.TEXTBOX_UI_SCALING = int(value) - view.setMainWindowTextboxUiSize(config.TEXTBOX_UI_SCALING/100) - -def callbackSetMessageBoxRatio(value): - print("callbackSetMessageBoxRatio", int(value)) - config.MESSAGE_BOX_RATIO = int(value) - view.setMainWindowMessageBoxRatio(config.MESSAGE_BOX_RATIO) - -def callbackSetFontFamily(value): - print("callbackSetFontFamily", value) - config.FONT_FAMILY = value - view.showRestartButtonIfRequired() - -def callbackSetUiLanguage(value): - print("callbackSetUiLanguage", value) - value = getKeyByValue(config.SELECTABLE_UI_LANGUAGES_DICT, value) - print("callbackSetUiLanguage__after_getKeyByValue", value) - config.UI_LANGUAGE = value - view.showRestartButtonIfRequired(locale=config.UI_LANGUAGE) - -def callbackSetEnableRestoreMainWindowGeometry(value): - print("callbackSetEnableRestoreMainWindowGeometry", value) - config.ENABLE_RESTORE_MAIN_WINDOW_GEOMETRY = value - -# Translation Tab -def callbackSetUseTranslationFeature(value): - print("callbackSetUseTranslationFeature", value) - config.USE_TRANSLATION_FEATURE = value - if config.USE_TRANSLATION_FEATURE is True: - view.useTranslationFeatureProcess("Normal") - if model.checkCTranslatorCTranslate2ModelWeight(): - config.IS_RESET_BUTTON_DISPLAYED_FOR_TRANSLATION = False - def callback(): - model.changeTranslatorCTranslate2Model() - th_callback = Thread(target=callback) - th_callback.daemon = True - th_callback.start() - else: - config.IS_RESET_BUTTON_DISPLAYED_FOR_TRANSLATION = True - view.useTranslationFeatureProcess("Restart") - else: - config.IS_RESET_BUTTON_DISPLAYED_FOR_TRANSLATION = False - view.useTranslationFeatureProcess("Disable") - view.showRestartButtonIfRequired() - -def callbackSetCtranslate2WeightType(value): - print("callbackSetCtranslate2WeightType", value) - config.CTRANSLATE2_WEIGHT_TYPE = str(value) - view.updateSelectedCtranslate2WeightType(config.CTRANSLATE2_WEIGHT_TYPE) - view.setWidgetsStatus_changeWeightType_Pending() - if model.checkCTranslatorCTranslate2ModelWeight(): - config.IS_RESET_BUTTON_DISPLAYED_FOR_TRANSLATION = False - def callback(): - model.changeTranslatorCTranslate2Model() - view.useTranslationFeatureProcess("Normal") - view.setWidgetsStatus_changeWeightType_Done() - th_callback = Thread(target=callback) - th_callback.daemon = True - th_callback.start() - else: - config.IS_RESET_BUTTON_DISPLAYED_FOR_TRANSLATION = True - view.useTranslationFeatureProcess("Restart") - view.setWidgetsStatus_changeWeightType_Done() - view.showRestartButtonIfRequired() - -def callbackSetDeeplAuthKey(value): - print("callbackSetDeeplAuthKey", str(value)) - view.clearNotificationMessage() - if len(value) == 36 or len(value) == 39: - result = model.authenticationTranslatorDeepLAuthKey(auth_key=value) - if result is True: - key = value - view.printToTextbox_AuthenticationSuccess() - view.showSuccessMessage_DeeplAuthKey() - else: - key = None - view.printToTextbox_AuthenticationError() - view.showErrorMessage_DeeplAuthKey() - auth_keys = config.AUTH_KEYS - auth_keys["DeepL_API"] = key - config.AUTH_KEYS = auth_keys - elif len(value) == 0: - auth_keys = config.AUTH_KEYS - auth_keys["DeepL_API"] = None - config.AUTH_KEYS = auth_keys - updateTranslationEngineAndEngineList() - -# Transcription Tab -# Transcription (Mic) -def callbackSetMicHost(value): - print("callbackSetMicHost", value) - config.CHOICE_MIC_HOST = value - config.CHOICE_MIC_DEVICE = model.getInputDefaultDevice() - - view.updateSelected_MicDevice(config.CHOICE_MIC_DEVICE) - view.updateList_MicDevice(model.getListInputDevice()) - - model.stopCheckMicEnergy() - view.replaceMicThresholdCheckButton_Passive() - -def callbackSetMicDevice(value): - print("callbackSetMicDevice", value) - config.CHOICE_MIC_DEVICE = value - - model.stopCheckMicEnergy() - view.replaceMicThresholdCheckButton_Passive() - -def callbackSetMicEnergyThreshold(value): - print("callbackSetMicEnergyThreshold", value) - if value == "": - return - try: - value = int(value) - if 0 <= value and value <= config.MAX_MIC_ENERGY_THRESHOLD: - view.clearNotificationMessage() - config.INPUT_MIC_ENERGY_THRESHOLD = value - view.setGuiVariable_MicEnergyThreshold(config.INPUT_MIC_ENERGY_THRESHOLD) - else: - raise ValueError() - except Exception: - view.showErrorMessage_MicEnergyThreshold() - -def callbackSetMicDynamicEnergyThreshold(value): - print("callbackSetMicDynamicEnergyThreshold", value) - config.INPUT_MIC_DYNAMIC_ENERGY_THRESHOLD = value - if config.INPUT_MIC_DYNAMIC_ENERGY_THRESHOLD is True: - view.closeMicEnergyThresholdWidget() - else: - view.openMicEnergyThresholdWidget() - -def setProgressBarMicEnergy(energy): - view.updateSetProgressBar_MicEnergy(energy) - -def callbackCheckMicThreshold(is_turned_on): - print("callbackCheckMicThreshold", is_turned_on) - if is_turned_on is True: - view.replaceMicThresholdCheckButton_Disabled() - model.startCheckMicEnergy(setProgressBarMicEnergy, view.initProgressBar_MicEnergy) - view.replaceMicThresholdCheckButton_Active() - else: - view.replaceMicThresholdCheckButton_Disabled() - model.stopCheckMicEnergy() - view.replaceMicThresholdCheckButton_Passive() - -def callbackSetMicRecordTimeout(value): - print("callbackSetMicRecordTimeout", value) - if value == "": - return - try: - value = int(value) - if 0 <= value and value <= config.INPUT_MIC_PHRASE_TIMEOUT: - view.clearNotificationMessage() - config.INPUT_MIC_RECORD_TIMEOUT = value - view.setGuiVariable_MicRecordTimeout(config.INPUT_MIC_RECORD_TIMEOUT) - else: - raise ValueError() - except Exception: - view.showErrorMessage_MicRecordTimeout() - -def callbackSetMicPhraseTimeout(value): - print("callbackSetMicPhraseTimeout", value) - if value == "": - return - try: - value = int(value) - if 0 <= value and value >= config.INPUT_MIC_RECORD_TIMEOUT: - view.clearNotificationMessage() - config.INPUT_MIC_PHRASE_TIMEOUT = value - view.setGuiVariable_MicPhraseTimeout(config.INPUT_MIC_PHRASE_TIMEOUT) - else: - raise ValueError() - except Exception: - view.showErrorMessage_MicPhraseTimeout() - -def callbackSetMicMaxPhrases(value): - print("callbackSetMicMaxPhrases", value) - if value == "": - return - try: - value = int(value) - if 0 <= value: - view.clearNotificationMessage() - config.INPUT_MIC_MAX_PHRASES = value - view.setGuiVariable_MicMaxPhrases(config.INPUT_MIC_MAX_PHRASES) - else: - raise ValueError() - except Exception: - view.showErrorMessage_MicMaxPhrases() - -def callbackSetMicWordFilter(values): - print("callbackSetMicWordFilter", values) - values = str(values) - values = [w.strip() for w in values.split(",") if len(w.strip()) > 0] - # Copy the list - new_input_mic_word_filter_list = config.INPUT_MIC_WORD_FILTER - new_added_value = [] - for value in values: - if value in new_input_mic_word_filter_list: - # If the value is already in the list, do nothing. - pass - else: - new_input_mic_word_filter_list.append(value) - new_added_value.append(value) - config.INPUT_MIC_WORD_FILTER = new_input_mic_word_filter_list - - view.addValueToList_WordFilter(new_added_value) - view.clearEntryBox_WordFilter() - view.setLatestConfigVariable("MicMicWordFilter") - - model.resetKeywordProcessor() - model.addKeywords() - -def callbackDeleteMicWordFilter(value): - print("callbackDeleteMicWordFilter", value) - try: - new_input_mic_word_filter_list = config.INPUT_MIC_WORD_FILTER - new_input_mic_word_filter_list.remove(str(value)) - config.INPUT_MIC_WORD_FILTER = new_input_mic_word_filter_list - view.setLatestConfigVariable("MicMicWordFilter") - model.resetKeywordProcessor() - model.addKeywords() - except Exception: - print("There was no the target word in config.INPUT_MIC_WORD_FILTER") - -# Transcription (Speaker) -def callbackSetSpeakerDevice(value): - print("callbackSetSpeakerDevice", value) - config.CHOICE_SPEAKER_DEVICE = value - - model.stopCheckSpeakerEnergy() - view.replaceSpeakerThresholdCheckButton_Passive() - -def callbackSetSpeakerEnergyThreshold(value): - print("callbackSetSpeakerEnergyThreshold", value) - if value == "": - return - try: - value = int(value) - if 0 <= value and value <= config.MAX_SPEAKER_ENERGY_THRESHOLD: - view.clearNotificationMessage() - config.INPUT_SPEAKER_ENERGY_THRESHOLD = value - view.setGuiVariable_SpeakerEnergyThreshold(config.INPUT_SPEAKER_ENERGY_THRESHOLD) - else: - raise ValueError() - except Exception: - view.showErrorMessage_SpeakerEnergyThreshold() - -def callbackSetSpeakerDynamicEnergyThreshold(value): - print("callbackSetSpeakerDynamicEnergyThreshold", value) - config.INPUT_SPEAKER_DYNAMIC_ENERGY_THRESHOLD = value - if config.INPUT_SPEAKER_DYNAMIC_ENERGY_THRESHOLD is True: - view.closeSpeakerEnergyThresholdWidget() - else: - view.openSpeakerEnergyThresholdWidget() - -def setProgressBarSpeakerEnergy(energy): - view.updateSetProgressBar_SpeakerEnergy(energy) - -def callbackCheckSpeakerThreshold(is_turned_on): - print("callbackCheckSpeakerThreshold", is_turned_on) - if is_turned_on is True: - view.replaceSpeakerThresholdCheckButton_Disabled() - model.startCheckSpeakerEnergy( - setProgressBarSpeakerEnergy, - view.initProgressBar_SpeakerEnergy, - view.showErrorMessage_CheckSpeakerThreshold_NoDevice - ) - - view.replaceSpeakerThresholdCheckButton_Active() - else: - view.replaceSpeakerThresholdCheckButton_Disabled() - model.stopCheckSpeakerEnergy() - view.replaceSpeakerThresholdCheckButton_Passive() - -def callbackSetSpeakerRecordTimeout(value): - print("callbackSetSpeakerRecordTimeout", value) - if value == "": - return - try: - value = int(value) - if 0 <= value and value <= config.INPUT_SPEAKER_PHRASE_TIMEOUT: - view.clearNotificationMessage() - config.INPUT_SPEAKER_RECORD_TIMEOUT = value - view.setGuiVariable_SpeakerRecordTimeout(config.INPUT_SPEAKER_RECORD_TIMEOUT) - else: - raise ValueError() - except Exception: - view.showErrorMessage_SpeakerRecordTimeout() - -def callbackSetSpeakerPhraseTimeout(value): - print("callbackSetSpeakerPhraseTimeout", value) - if value == "": - return - try: - value = int(value) - if 0 <= value and value >= config.INPUT_SPEAKER_RECORD_TIMEOUT: - view.clearNotificationMessage() - config.INPUT_SPEAKER_PHRASE_TIMEOUT = value - view.setGuiVariable_SpeakerPhraseTimeout(config.INPUT_SPEAKER_PHRASE_TIMEOUT) - else: - raise ValueError() - except Exception: - view.showErrorMessage_SpeakerPhraseTimeout() - -def callbackSetSpeakerMaxPhrases(value): - print("callbackSetSpeakerMaxPhrases", value) - if value == "": - return - try: - value = int(value) - if 0 <= value: - view.clearNotificationMessage() - config.INPUT_SPEAKER_MAX_PHRASES = value - view.setGuiVariable_SpeakerMaxPhrases(config.INPUT_SPEAKER_MAX_PHRASES) - else: - raise ValueError() - except Exception: - view.showErrorMessage_SpeakerMaxPhrases() - -# Transcription (Internal AI Model) -def callbackSetUserWhisperFeature(value): - print("callbackSetUserWhisperFeature", value) - config.USE_WHISPER_FEATURE = value - if config.USE_WHISPER_FEATURE is True: - view.openWhisperWeightTypeWidget() - if model.checkTranscriptionWhisperModelWeight() is True: - config.IS_RESET_BUTTON_DISPLAYED_FOR_WHISPER = False - config.SELECTED_TRANSCRIPTION_ENGINE = "Whisper" - else: - config.IS_RESET_BUTTON_DISPLAYED_FOR_WHISPER = True - config.SELECTED_TRANSCRIPTION_ENGINE = "Google" - else: - view.closeWhisperWeightTypeWidget() - config.IS_RESET_BUTTON_DISPLAYED_FOR_WHISPER = False - config.SELECTED_TRANSCRIPTION_ENGINE = "Google" - view.showRestartButtonIfRequired() - -def callbackSetWhisperWeightType(value): - print("callbackSetWhisperWeightType", value) - config.WHISPER_WEIGHT_TYPE = str(value) - view.updateSelectedWhisperWeightType(config.WHISPER_WEIGHT_TYPE) - if model.checkTranscriptionWhisperModelWeight() is True: - config.IS_RESET_BUTTON_DISPLAYED_FOR_WHISPER = False - config.SELECTED_TRANSCRIPTION_ENGINE = "Whisper" - else: - config.IS_RESET_BUTTON_DISPLAYED_FOR_WHISPER = True - config.SELECTED_TRANSCRIPTION_ENGINE = "Google" - view.showRestartButtonIfRequired() - -# VR Tab -def callbackSetOverlaySettings(value, set_type:str): - print("callbackSetOverlaySettings", value, set_type) - pre_settings = config.OVERLAY_SETTINGS - pre_settings[set_type] = value - config.OVERLAY_SETTINGS = pre_settings - match (set_type): - case "opacity": - model.updateOverlayImageOpacity() - case "ui_scaling": - model.updateOverlayImageUiScaling() - -def callbackSetEnableOverlaySmallLog(value): - print("callbackSetEnableOverlaySmallLog", value) - config.ENABLE_OVERLAY_SMALL_LOG = value - - if config.ENABLE_OVERLAY_SMALL_LOG is True and config.ENABLE_TRANSCRIPTION_RECEIVE is True: - if model.overlay.initialized is False and model.overlay.checkSteamvrRunning() is True: - model.startOverlay() - elif config.ENABLE_OVERLAY_SMALL_LOG is False: - model.clearOverlayImage() - model.shutdownOverlay() - - if config.ENABLE_OVERLAY_SMALL_LOG is True: - view.setStateOverlaySmallLog("enabled") - elif config.ENABLE_OVERLAY_SMALL_LOG is False: - view.setStateOverlaySmallLog("disabled") - -def callbackSetOverlaySmallLogSettings(value, set_type:str): - print("callbackSetOverlaySmallLogSettings", value, set_type) - pre_settings = config.OVERLAY_SMALL_LOG_SETTINGS - pre_settings[set_type] = value - config.OVERLAY_SMALL_LOG_SETTINGS = pre_settings - match (set_type): - case "x_pos" | "y_pos" | "z_pos" | "x_rotation" | "y_rotation" | "z_rotation": - model.updateOverlayPosition() - case "display_duration" | "fadeout_duration": - model.updateOverlayTimes() - -# Others Tab -def callbackSetEnableAutoClearMessageBox(value): - print("callbackSetEnableAutoClearMessageBox", value) - config.ENABLE_AUTO_CLEAR_MESSAGE_BOX = value - -def callbackSetEnableSendOnlyTranslatedMessages(value): - print("callbackSetEnableSendOnlyTranslatedMessages", value) - config.ENABLE_SEND_ONLY_TRANSLATED_MESSAGES = value - -def callbackSetSendMessageButtonType(value): - print("callbackSetSendMessageButtonType", value) - config.SEND_MESSAGE_BUTTON_TYPE = value - view.changeMainWindowSendMessageButton(config.SEND_MESSAGE_BUTTON_TYPE) - -def callbackSetEnableAutoExportMessageLogs(value): - print("callbackSetEnableAutoExportMessageLogs", value) - config.ENABLE_LOGGER = value - - if config.ENABLE_LOGGER is True: - model.startLogger() - else: - model.stopLogger() - -def callbackSetEnableVrcMicMuteSync(value): - print("callbackSetEnableVrcMicMuteSync", value) - config.ENABLE_VRC_MIC_MUTE_SYNC = value - if config.ENABLE_VRC_MIC_MUTE_SYNC is True: - model.startCheckMuteSelfStatus() - view.setStateVrcMicMuteSync("enabled") - else: - model.stopCheckMuteSelfStatus() - view.setStateVrcMicMuteSync("disabled") - model.changeMicTranscriptStatus() - - -def callbackSetEnableSendMessageToVrc(value): - print("callbackSetEnableSendMessageToVrc", value) - config.ENABLE_SEND_MESSAGE_TO_VRC = value - -# Others (Message Formats(Send) -def callbackSetSendMessageFormat(value): - print("callbackSetSendMessageFormat", value) - if isUniqueStrings(["[message]"], value) is True: - config.SEND_MESSAGE_FORMAT = value - view.clearNotificationMessage() - view.setSendMessageFormat_EntryWidgets(config.SEND_MESSAGE_FORMAT) - else: - view.showErrorMessage_SendMessageFormat() - view.setSendMessageFormat_EntryWidgets(config.SEND_MESSAGE_FORMAT) - -def callbackSetSendMessageFormatWithT(value): - print("callbackSetSendMessageFormatWithT", value) - if len(value) > 0: - if isUniqueStrings(["[message]", "[translation]"], value) is True: - config.SEND_MESSAGE_FORMAT_WITH_T = value - view.clearNotificationMessage() - view.setSendMessageFormatWithT_EntryWidgets(config.SEND_MESSAGE_FORMAT_WITH_T) - else: - view.showErrorMessage_SendMessageFormatWithT() - view.setSendMessageFormatWithT_EntryWidgets(config.SEND_MESSAGE_FORMAT_WITH_T) - -# Others (Message Formats(Received) -def callbackSetReceivedMessageFormat(value): - print("callbackSetReceivedMessageFormat", value) - if isUniqueStrings(["[message]"], value) is True: - config.RECEIVED_MESSAGE_FORMAT = value - view.clearNotificationMessage() - view.setReceivedMessageFormat_EntryWidgets(config.RECEIVED_MESSAGE_FORMAT) - else: - view.showErrorMessage_ReceivedMessageFormat() - view.setReceivedMessageFormat_EntryWidgets(config.RECEIVED_MESSAGE_FORMAT) - -def callbackSetReceivedMessageFormatWithT(value): - print("callbackSetReceivedMessageFormatWithT", value) - if len(value) > 0: - if isUniqueStrings(["[message]", "[translation]"], value) is True: - config.RECEIVED_MESSAGE_FORMAT_WITH_T = value - view.clearNotificationMessage() - view.setReceivedMessageFormatWithT_EntryWidgets(config.RECEIVED_MESSAGE_FORMAT_WITH_T) - else: - view.showErrorMessage_ReceivedMessageFormatWithT() - view.setReceivedMessageFormatWithT_EntryWidgets(config.RECEIVED_MESSAGE_FORMAT_WITH_T) - -# ---------------------Speaker2Chatbox--------------------- -def callbackSetEnableSendReceivedMessageToVrc(value): - print("callbackSetEnableSendReceivedMessageToVrc", value) - config.ENABLE_SEND_RECEIVED_MESSAGE_TO_VRC = value -# ---------------------Speaker2Chatbox--------------------- - -# Advanced Settings Tab -def callbackSetOscIpAddress(value): - if value == "": - return - print("callbackSetOscIpAddress", str(value)) - config.OSC_IP_ADDRESS = str(value) - -def callbackSetOscPort(value): - if value == "": - return - print("callbackSetOscPort", int(value)) - config.OSC_PORT = int(value) - - -def initSetConfigByExeArguments(): - parser = argparse.ArgumentParser() - parser.add_argument("--ip") - parser.add_argument("--port") - args = parser.parse_args() - if args.ip is not None: - config.OSC_IP_ADDRESS = str(args.ip) - view.setGuiVariable_OscIpAddress(config.OSC_IP_ADDRESS) - if args.port is not None: - config.OSC_PORT = int(args.port) - view.setGuiVariable_OscPort(config.OSC_PORT) - -def createMainWindow(splash): - splash.toProgress(1) - # create GUI - view.createGUI() - splash.toProgress(2) - - # init config - initSetConfigByExeArguments() - initSetTranslateEngine() - initSetLanguageAndCountry() - - if config.AUTH_KEYS["DeepL_API"] is not None: - if model.authenticationTranslatorDeepLAuthKey(auth_key=config.AUTH_KEYS["DeepL_API"]) is False: - # error update Auth key - auth_keys = config.AUTH_KEYS - auth_keys["DeepL_API"] = None - config.AUTH_KEYS = auth_keys - view.printToTextbox_AuthenticationError() - - # set Translation Engine - updateTranslationEngineAndEngineList() - - # set Transcription Engine - if config.USE_WHISPER_FEATURE is True: - config.SELECTED_TRANSCRIPTION_ENGINE = "Whisper" - else: - config.SELECTED_TRANSCRIPTION_ENGINE = "Google" - - # set word filter - model.addKeywords() - - # check Software Updated - if model.checkSoftwareUpdated() is True: - view.showUpdateAvailableButton() - - # init logger - if config.ENABLE_LOGGER is True: - model.startLogger() - - # init OSC receive - model.startReceiveOSC() - if config.ENABLE_VRC_MIC_MUTE_SYNC is True: - model.startCheckMuteSelfStatus() - - splash.toProgress(3) # Last one. - - # set UI and callback - view.register( - common_registers={ - "callback_enable_easter_egg": callbackEnableEasterEgg, - - "callback_update_software": callbackUpdateSoftware, - "callback_restart_software": callbackRestartSoftware, - "callback_filepath_logs": callbackFilepathLogs, - "callback_filepath_config_file": callbackFilepathConfigFile, - "callback_quit_vrct": callbackQuitVrct, - }, - - window_action_registers={ - "callback_open_config_window": callbackOpenConfigWindow, - "callback_close_config_window": callbackCloseConfigWindow, - }, - - main_window_registers={ - "callback_enable_main_window_sidebar_compact_mode": callbackEnableMainWindowSidebarCompactMode, - "callback_disable_main_window_sidebar_compact_mode": callbackDisableMainWindowSidebarCompactMode, - - "callback_toggle_translation": callbackToggleTranslation, - "callback_toggle_transcription_send": callbackToggleTranscriptionSend, - "callback_toggle_transcription_receive": callbackToggleTranscriptionReceive, - "callback_toggle_foreground": callbackToggleForeground, - - "callback_your_language": setYourLanguageAndCountry, - "callback_target_language": setTargetLanguageAndCountry, - "values": model.getListLanguageAndCountry(), - "callback_swap_languages": swapYourLanguageAndTargetLanguage, - - "callback_selected_language_preset_tab": callbackSelectedLanguagePresetTab, - - "callback_selected_translation_engine": callbackSelectedTranslationEngine, - - "message_box_bind_Return": messageBoxPressKeyEnter, - "message_box_bind_Any_KeyPress": messageBoxPressKeyAny, - "message_box_bind_FocusIn": messageBoxFocusIn, - "message_box_bind_FocusOut": messageBoxFocusOut, - "message_box_bind_Up_KeyPress": messageBoxUpKeyPress, - "message_box_bind_Down_KeyPress": messageBoxDownKeyPress, - }, - - config_window_registers={ - # Compact Mode Switch - "callback_disable_config_window_compact_mode": callbackEnableConfigWindowCompactMode, - "callback_enable_config_window_compact_mode": callbackDisableConfigWindowCompactMode, - - # Appearance Tab - "callback_set_transparency": callbackSetTransparency, - "callback_set_appearance": callbackSetAppearance, - "callback_set_ui_scaling": callbackSetUiScaling, - "callback_set_textbox_ui_scaling": callbackSetTextboxUiScaling, - "callback_set_message_box_ratio": callbackSetMessageBoxRatio, - "callback_set_font_family": callbackSetFontFamily, - "callback_set_ui_language": callbackSetUiLanguage, - "callback_set_enable_restore_main_window_geometry": callbackSetEnableRestoreMainWindowGeometry, - - # Translation Tab - "callback_set_use_translation_feature": callbackSetUseTranslationFeature, - "callback_set_ctranslate2_weight_type": callbackSetCtranslate2WeightType, - "callback_set_deepl_auth_key": callbackSetDeeplAuthKey, - - # Transcription Tab (Mic) - "callback_set_mic_host": callbackSetMicHost, - "list_mic_host": model.getListInputHost(), - "callback_set_mic_device": callbackSetMicDevice, - "list_mic_device": model.getListInputDevice(), - "callback_set_mic_energy_threshold": callbackSetMicEnergyThreshold, - "callback_set_mic_dynamic_energy_threshold": callbackSetMicDynamicEnergyThreshold, - "callback_check_mic_threshold": callbackCheckMicThreshold, - "callback_set_mic_record_timeout": callbackSetMicRecordTimeout, - "callback_set_mic_phrase_timeout": callbackSetMicPhraseTimeout, - "callback_set_mic_max_phrases": callbackSetMicMaxPhrases, - "callback_set_mic_word_filter": callbackSetMicWordFilter, - "callback_delete_mic_word_filter": callbackDeleteMicWordFilter, - - # Transcription Tab (Speaker) - "callback_set_speaker_device": callbackSetSpeakerDevice, - "list_speaker_device": model.getListOutputDevice(), - "callback_set_speaker_energy_threshold": callbackSetSpeakerEnergyThreshold, - "callback_set_speaker_dynamic_energy_threshold": callbackSetSpeakerDynamicEnergyThreshold, - "callback_check_speaker_threshold": callbackCheckSpeakerThreshold, - "callback_set_speaker_record_timeout": callbackSetSpeakerRecordTimeout, - "callback_set_speaker_phrase_timeout": callbackSetSpeakerPhraseTimeout, - "callback_set_speaker_max_phrases": callbackSetSpeakerMaxPhrases, - - # Transcription Tab (Internal AI Model) - "callback_set_use_whisper_feature": callbackSetUserWhisperFeature, - "callback_set_whisper_weight_type": callbackSetWhisperWeightType, - - # VR Tab - "callback_set_overlay_settings": callbackSetOverlaySettings, - "callback_set_enable_overlay_small_log": callbackSetEnableOverlaySmallLog, - "callback_set_overlay_small_log_settings": callbackSetOverlaySmallLogSettings, - - # Others Tab - "callback_set_enable_auto_clear_chatbox": callbackSetEnableAutoClearMessageBox, - "callback_set_send_only_translated_messages": callbackSetEnableSendOnlyTranslatedMessages, - "callback_set_send_message_button_type": callbackSetSendMessageButtonType, - "callback_set_enable_auto_export_message_logs": callbackSetEnableAutoExportMessageLogs, - "callback_set_enable_vrc_mic_mute_sync": callbackSetEnableVrcMicMuteSync, - "callback_set_enable_send_message_to_vrc": callbackSetEnableSendMessageToVrc, - # Others(Message Formats(Send) - "callback_set_send_message_format": callbackSetSendMessageFormat, - "callback_set_send_message_format_with_t": callbackSetSendMessageFormatWithT, - # Others(Message Formats(Received) - "callback_set_received_message_format": callbackSetReceivedMessageFormat, - "callback_set_received_message_format_with_t": callbackSetReceivedMessageFormatWithT, - - # Speaker2Chatbox---------------- - "callback_set_enable_send_received_message_to_vrc": callbackSetEnableSendReceivedMessageToVrc, - # Speaker2Chatbox---------------- - - # Advanced Settings Tab - "callback_set_osc_ip_address": callbackSetOscIpAddress, - "callback_set_osc_port": callbackSetOscPort, - }, - ) - -def showMainWindow(): - view.startMainLoop() \ No newline at end of file diff --git a/img/VRCT_now_downloading.png b/img/VRCT_now_downloading.png deleted file mode 100644 index 8e372d87..00000000 Binary files a/img/VRCT_now_downloading.png and /dev/null differ diff --git a/img/VRCT_starting_up.png b/img/VRCT_starting_up.png deleted file mode 100644 index 9feac583..00000000 Binary files a/img/VRCT_starting_up.png and /dev/null differ diff --git a/img/about_vrct/arrow_left.png b/img/about_vrct/arrow_left.png deleted file mode 100644 index a1c4b35e..00000000 Binary files a/img/about_vrct/arrow_left.png and /dev/null differ diff --git a/img/about_vrct/arrow_right.png b/img/about_vrct/arrow_right.png deleted file mode 100644 index 69e005ba..00000000 Binary files a/img/about_vrct/arrow_right.png and /dev/null differ diff --git a/img/about_vrct/contributors_github_icon.png b/img/about_vrct/contributors_github_icon.png deleted file mode 100644 index 1c6e0727..00000000 Binary files a/img/about_vrct/contributors_github_icon.png and /dev/null differ diff --git a/img/about_vrct/contributors_members.png b/img/about_vrct/contributors_members.png deleted file mode 100644 index 4b0cf192..00000000 Binary files a/img/about_vrct/contributors_members.png and /dev/null differ diff --git a/img/about_vrct/contributors_section_title.png b/img/about_vrct/contributors_section_title.png deleted file mode 100644 index 641a535a..00000000 Binary files a/img/about_vrct/contributors_section_title.png and /dev/null differ diff --git a/img/about_vrct/contributors_x_icon.png b/img/about_vrct/contributors_x_icon.png deleted file mode 100644 index c17fb57d..00000000 Binary files a/img/about_vrct/contributors_x_icon.png and /dev/null differ diff --git a/img/about_vrct/dev_github_icon.png b/img/about_vrct/dev_github_icon.png deleted file mode 100644 index 8cbaaff7..00000000 Binary files a/img/about_vrct/dev_github_icon.png and /dev/null differ diff --git a/img/about_vrct/dev_misya.png b/img/about_vrct/dev_misya.png deleted file mode 100644 index 6df2b467..00000000 Binary files a/img/about_vrct/dev_misya.png and /dev/null differ diff --git a/img/about_vrct/dev_section_title.png b/img/about_vrct/dev_section_title.png deleted file mode 100644 index 4f1da8a2..00000000 Binary files a/img/about_vrct/dev_section_title.png and /dev/null differ diff --git a/img/about_vrct/dev_shiina.png b/img/about_vrct/dev_shiina.png deleted file mode 100644 index cfef057a..00000000 Binary files a/img/about_vrct/dev_shiina.png and /dev/null differ diff --git a/img/about_vrct/dev_x_icon.png b/img/about_vrct/dev_x_icon.png deleted file mode 100644 index dfd6d109..00000000 Binary files a/img/about_vrct/dev_x_icon.png and /dev/null differ diff --git a/img/about_vrct/localization_members.png b/img/about_vrct/localization_members.png deleted file mode 100644 index b12cd838..00000000 Binary files a/img/about_vrct/localization_members.png and /dev/null differ diff --git a/img/about_vrct/localization_title.png b/img/about_vrct/localization_title.png deleted file mode 100644 index a1eaebf5..00000000 Binary files a/img/about_vrct/localization_title.png and /dev/null differ diff --git a/img/about_vrct/poster_images_authors_en.png b/img/about_vrct/poster_images_authors_en.png deleted file mode 100644 index c3488c62..00000000 Binary files a/img/about_vrct/poster_images_authors_en.png and /dev/null differ diff --git a/img/about_vrct/poster_images_authors_ja.png b/img/about_vrct/poster_images_authors_ja.png deleted file mode 100644 index 3f2b1b00..00000000 Binary files a/img/about_vrct/poster_images_authors_ja.png and /dev/null differ diff --git a/img/about_vrct/poster_images_authors_m_en.png b/img/about_vrct/poster_images_authors_m_en.png deleted file mode 100644 index 95241ae1..00000000 Binary files a/img/about_vrct/poster_images_authors_m_en.png and /dev/null differ diff --git a/img/about_vrct/poster_images_authors_m_ja.png b/img/about_vrct/poster_images_authors_m_ja.png deleted file mode 100644 index 28df62d0..00000000 Binary files a/img/about_vrct/poster_images_authors_m_ja.png and /dev/null differ diff --git a/img/about_vrct/poster_showcase_pagination_button.png b/img/about_vrct/poster_showcase_pagination_button.png deleted file mode 100644 index bbfee311..00000000 Binary files a/img/about_vrct/poster_showcase_pagination_button.png and /dev/null differ diff --git a/img/about_vrct/poster_showcase_pagination_button_chato.png b/img/about_vrct/poster_showcase_pagination_button_chato.png deleted file mode 100644 index a4df1d52..00000000 Binary files a/img/about_vrct/poster_showcase_pagination_button_chato.png and /dev/null differ diff --git a/img/about_vrct/poster_showcase_section_title.png b/img/about_vrct/poster_showcase_section_title.png deleted file mode 100644 index 83b1f21f..00000000 Binary files a/img/about_vrct/poster_showcase_section_title.png and /dev/null differ diff --git a/img/about_vrct/project_link_booth.png b/img/about_vrct/project_link_booth.png deleted file mode 100644 index 14af933a..00000000 Binary files a/img/about_vrct/project_link_booth.png and /dev/null differ diff --git a/img/about_vrct/project_link_contact_us.png b/img/about_vrct/project_link_contact_us.png deleted file mode 100644 index c21bc7ef..00000000 Binary files a/img/about_vrct/project_link_contact_us.png and /dev/null differ diff --git a/img/about_vrct/project_link_documents.png b/img/about_vrct/project_link_documents.png deleted file mode 100644 index cd9723e4..00000000 Binary files a/img/about_vrct/project_link_documents.png and /dev/null differ diff --git a/img/about_vrct/project_link_vrct_github.png b/img/about_vrct/project_link_vrct_github.png deleted file mode 100644 index eb05f15f..00000000 Binary files a/img/about_vrct/project_link_vrct_github.png and /dev/null differ diff --git a/img/about_vrct/showcased_worlds/bar_asagao.png b/img/about_vrct/showcased_worlds/bar_asagao.png deleted file mode 100644 index 9965198c..00000000 Binary files a/img/about_vrct/showcased_worlds/bar_asagao.png and /dev/null differ diff --git a/img/about_vrct/showcased_worlds/cafe_cian.png b/img/about_vrct/showcased_worlds/cafe_cian.png deleted file mode 100644 index 9b38a299..00000000 Binary files a/img/about_vrct/showcased_worlds/cafe_cian.png and /dev/null differ diff --git a/img/about_vrct/showcased_worlds/cam.png b/img/about_vrct/showcased_worlds/cam.png deleted file mode 100644 index 41339042..00000000 Binary files a/img/about_vrct/showcased_worlds/cam.png and /dev/null differ diff --git a/img/about_vrct/showcased_worlds/celestial_blooms.png b/img/about_vrct/showcased_worlds/celestial_blooms.png deleted file mode 100644 index 19f23031..00000000 Binary files a/img/about_vrct/showcased_worlds/celestial_blooms.png and /dev/null differ diff --git a/img/about_vrct/showcased_worlds/chakachaka_multipurpose_room.png b/img/about_vrct/showcased_worlds/chakachaka_multipurpose_room.png deleted file mode 100644 index 0360e4e4..00000000 Binary files a/img/about_vrct/showcased_worlds/chakachaka_multipurpose_room.png and /dev/null differ diff --git a/img/about_vrct/showcased_worlds/ehon_no_heikousekai.png b/img/about_vrct/showcased_worlds/ehon_no_heikousekai.png deleted file mode 100644 index 3cb91ec4..00000000 Binary files a/img/about_vrct/showcased_worlds/ehon_no_heikousekai.png and /dev/null differ diff --git a/img/about_vrct/showcased_worlds/ehon_no_heikousekai_jimusho.png b/img/about_vrct/showcased_worlds/ehon_no_heikousekai_jimusho.png deleted file mode 100644 index 2e2b64cf..00000000 Binary files a/img/about_vrct/showcased_worlds/ehon_no_heikousekai_jimusho.png and /dev/null differ diff --git a/img/about_vrct/showcased_worlds/ikoiba.png b/img/about_vrct/showcased_worlds/ikoiba.png deleted file mode 100644 index 04a85165..00000000 Binary files a/img/about_vrct/showcased_worlds/ikoiba.png and /dev/null differ diff --git a/img/about_vrct/showcased_worlds/ippaidou.png b/img/about_vrct/showcased_worlds/ippaidou.png deleted file mode 100644 index ea2f4534..00000000 Binary files a/img/about_vrct/showcased_worlds/ippaidou.png and /dev/null differ diff --git a/img/about_vrct/showcased_worlds/japan_street.png b/img/about_vrct/showcased_worlds/japan_street.png deleted file mode 100644 index 941a4f05..00000000 Binary files a/img/about_vrct/showcased_worlds/japan_street.png and /dev/null differ diff --git a/img/about_vrct/showcased_worlds/japanese_culture_osenbeito.png b/img/about_vrct/showcased_worlds/japanese_culture_osenbeito.png deleted file mode 100644 index 9630bda2..00000000 Binary files a/img/about_vrct/showcased_worlds/japanese_culture_osenbeito.png and /dev/null differ diff --git a/img/about_vrct/showcased_worlds/kimodameshi.png b/img/about_vrct/showcased_worlds/kimodameshi.png deleted file mode 100644 index 7bee627b..00000000 Binary files a/img/about_vrct/showcased_worlds/kimodameshi.png and /dev/null differ diff --git a/img/about_vrct/showcased_worlds/kokekkopiyopiyo.png b/img/about_vrct/showcased_worlds/kokekkopiyopiyo.png deleted file mode 100644 index dc59ee56..00000000 Binary files a/img/about_vrct/showcased_worlds/kokekkopiyopiyo.png and /dev/null differ diff --git a/img/about_vrct/showcased_worlds/kr_jp_exchange.png b/img/about_vrct/showcased_worlds/kr_jp_exchange.png deleted file mode 100644 index 44b25835..00000000 Binary files a/img/about_vrct/showcased_worlds/kr_jp_exchange.png and /dev/null differ diff --git a/img/about_vrct/showcased_worlds/kuroinu_work_room.png b/img/about_vrct/showcased_worlds/kuroinu_work_room.png deleted file mode 100644 index c7cb7209..00000000 Binary files a/img/about_vrct/showcased_worlds/kuroinu_work_room.png and /dev/null differ diff --git a/img/about_vrct/showcased_worlds/language_exchange_tervern.png b/img/about_vrct/showcased_worlds/language_exchange_tervern.png deleted file mode 100644 index 17470129..00000000 Binary files a/img/about_vrct/showcased_worlds/language_exchange_tervern.png and /dev/null differ diff --git a/img/about_vrct/showcased_worlds/mamehinata_dogrun.png b/img/about_vrct/showcased_worlds/mamehinata_dogrun.png deleted file mode 100644 index da443ffe..00000000 Binary files a/img/about_vrct/showcased_worlds/mamehinata_dogrun.png and /dev/null differ diff --git a/img/about_vrct/showcased_worlds/monogatari_meetup.png b/img/about_vrct/showcased_worlds/monogatari_meetup.png deleted file mode 100644 index 3f10ed22..00000000 Binary files a/img/about_vrct/showcased_worlds/monogatari_meetup.png and /dev/null differ diff --git a/img/about_vrct/showcased_worlds/nihongokurabu.png b/img/about_vrct/showcased_worlds/nihongokurabu.png deleted file mode 100644 index 9425e0b5..00000000 Binary files a/img/about_vrct/showcased_worlds/nihongokurabu.png and /dev/null differ diff --git a/img/about_vrct/showcased_worlds/omoshiro_kotoba_asobi_game.png b/img/about_vrct/showcased_worlds/omoshiro_kotoba_asobi_game.png deleted file mode 100644 index 9a6cfbba..00000000 Binary files a/img/about_vrct/showcased_worlds/omoshiro_kotoba_asobi_game.png and /dev/null differ diff --git a/img/about_vrct/showcased_worlds/parallel_collar.png b/img/about_vrct/showcased_worlds/parallel_collar.png deleted file mode 100644 index b2ab89d6..00000000 Binary files a/img/about_vrct/showcased_worlds/parallel_collar.png and /dev/null differ diff --git a/img/about_vrct/showcased_worlds/poker_room_elysion.png b/img/about_vrct/showcased_worlds/poker_room_elysion.png deleted file mode 100644 index ae1fd928..00000000 Binary files a/img/about_vrct/showcased_worlds/poker_room_elysion.png and /dev/null differ diff --git a/img/about_vrct/showcased_worlds/re_yatuha_room.png b/img/about_vrct/showcased_worlds/re_yatuha_room.png deleted file mode 100644 index 505c63a1..00000000 Binary files a/img/about_vrct/showcased_worlds/re_yatuha_room.png and /dev/null differ diff --git a/img/about_vrct/showcased_worlds/silakan_datang_ke_rumahku.png b/img/about_vrct/showcased_worlds/silakan_datang_ke_rumahku.png deleted file mode 100644 index 2f9448fc..00000000 Binary files a/img/about_vrct/showcased_worlds/silakan_datang_ke_rumahku.png and /dev/null differ diff --git a/img/about_vrct/showcased_worlds/smokerz_guild_v2.png b/img/about_vrct/showcased_worlds/smokerz_guild_v2.png deleted file mode 100644 index a02edf1c..00000000 Binary files a/img/about_vrct/showcased_worlds/smokerz_guild_v2.png and /dev/null differ diff --git a/img/about_vrct/showcased_worlds/stretch_club_starting_from_minus.png b/img/about_vrct/showcased_worlds/stretch_club_starting_from_minus.png deleted file mode 100644 index 05d7db3b..00000000 Binary files a/img/about_vrct/showcased_worlds/stretch_club_starting_from_minus.png and /dev/null differ diff --git a/img/about_vrct/showcased_worlds/study_japanese_world_japanichijou.png b/img/about_vrct/showcased_worlds/study_japanese_world_japanichijou.png deleted file mode 100644 index 95a4cf67..00000000 Binary files a/img/about_vrct/showcased_worlds/study_japanese_world_japanichijou.png and /dev/null differ diff --git a/img/about_vrct/showcased_worlds/sushi_guru_annex.png b/img/about_vrct/showcased_worlds/sushi_guru_annex.png deleted file mode 100644 index e8576420..00000000 Binary files a/img/about_vrct/showcased_worlds/sushi_guru_annex.png and /dev/null differ diff --git a/img/about_vrct/showcased_worlds/sushi_stand_guruguru.png b/img/about_vrct/showcased_worlds/sushi_stand_guruguru.png deleted file mode 100644 index bffef7ef..00000000 Binary files a/img/about_vrct/showcased_worlds/sushi_stand_guruguru.png and /dev/null differ diff --git a/img/about_vrct/showcased_worlds/tyuuniti_kouryuukai.png b/img/about_vrct/showcased_worlds/tyuuniti_kouryuukai.png deleted file mode 100644 index 0d4656d2..00000000 Binary files a/img/about_vrct/showcased_worlds/tyuuniti_kouryuukai.png and /dev/null differ diff --git a/img/about_vrct/showcased_worlds/uj_club.png b/img/about_vrct/showcased_worlds/uj_club.png deleted file mode 100644 index 9118f48f..00000000 Binary files a/img/about_vrct/showcased_worlds/uj_club.png and /dev/null differ diff --git a/img/about_vrct/showcased_worlds/una_yosh.png b/img/about_vrct/showcased_worlds/una_yosh.png deleted file mode 100644 index da1a6789..00000000 Binary files a/img/about_vrct/showcased_worlds/una_yosh.png and /dev/null differ diff --git a/img/about_vrct/showcased_worlds/usanezumi_shrine2.png b/img/about_vrct/showcased_worlds/usanezumi_shrine2.png deleted file mode 100644 index f10cce6c..00000000 Binary files a/img/about_vrct/showcased_worlds/usanezumi_shrine2.png and /dev/null differ diff --git a/img/about_vrct/showcased_worlds/yuttari_eikaiwa.png b/img/about_vrct/showcased_worlds/yuttari_eikaiwa.png deleted file mode 100644 index c9616217..00000000 Binary files a/img/about_vrct/showcased_worlds/yuttari_eikaiwa.png and /dev/null differ diff --git a/img/about_vrct/special_thanks_members.png b/img/about_vrct/special_thanks_members.png deleted file mode 100644 index 80be4a66..00000000 Binary files a/img/about_vrct/special_thanks_members.png and /dev/null differ diff --git a/img/about_vrct/special_thanks_message_and_you.png b/img/about_vrct/special_thanks_message_and_you.png deleted file mode 100644 index f006ff15..00000000 Binary files a/img/about_vrct/special_thanks_message_and_you.png and /dev/null differ diff --git a/img/about_vrct/special_thanks_message_en.png b/img/about_vrct/special_thanks_message_en.png deleted file mode 100644 index 58db5a87..00000000 Binary files a/img/about_vrct/special_thanks_message_en.png and /dev/null differ diff --git a/img/about_vrct/special_thanks_message_ja.png b/img/about_vrct/special_thanks_message_ja.png deleted file mode 100644 index 493a6bf0..00000000 Binary files a/img/about_vrct/special_thanks_message_ja.png and /dev/null differ diff --git a/img/about_vrct/special_thanks_section_title.png b/img/about_vrct/special_thanks_section_title.png deleted file mode 100644 index ea64a970..00000000 Binary files a/img/about_vrct/special_thanks_section_title.png and /dev/null differ diff --git a/img/about_vrct/vrchat_disclaimer.png b/img/about_vrct/vrchat_disclaimer.png deleted file mode 100644 index c6e3dbb0..00000000 Binary files a/img/about_vrct/vrchat_disclaimer.png and /dev/null differ diff --git a/img/about_vrct/vrct_logo_for_about_vrct.png b/img/about_vrct/vrct_logo_for_about_vrct.png deleted file mode 100644 index 4f461409..00000000 Binary files a/img/about_vrct/vrct_logo_for_about_vrct.png and /dev/null differ diff --git a/img/about_vrct/vrct_posters/iya_vrct_manga_en.png b/img/about_vrct/vrct_posters/iya_vrct_manga_en.png deleted file mode 100644 index f73e762a..00000000 Binary files a/img/about_vrct/vrct_posters/iya_vrct_manga_en.png and /dev/null differ diff --git a/img/about_vrct/vrct_posters/iya_vrct_manga_ja.png b/img/about_vrct/vrct_posters/iya_vrct_manga_ja.png deleted file mode 100644 index 3fc0ff40..00000000 Binary files a/img/about_vrct/vrct_posters/iya_vrct_manga_ja.png and /dev/null differ diff --git a/img/about_vrct/vrct_posters/iya_vrct_manga_ko.png b/img/about_vrct/vrct_posters/iya_vrct_manga_ko.png deleted file mode 100644 index e40f769c..00000000 Binary files a/img/about_vrct/vrct_posters/iya_vrct_manga_ko.png and /dev/null differ diff --git a/img/about_vrct/vrct_posters/iya_vrct_poster_cn.png b/img/about_vrct/vrct_posters/iya_vrct_poster_cn.png deleted file mode 100644 index 6e3a5be4..00000000 Binary files a/img/about_vrct/vrct_posters/iya_vrct_poster_cn.png and /dev/null differ diff --git a/img/about_vrct/vrct_posters/iya_vrct_poster_en.png b/img/about_vrct/vrct_posters/iya_vrct_poster_en.png deleted file mode 100644 index 22352320..00000000 Binary files a/img/about_vrct/vrct_posters/iya_vrct_poster_en.png and /dev/null differ diff --git a/img/about_vrct/vrct_posters/iya_vrct_poster_ja.png b/img/about_vrct/vrct_posters/iya_vrct_poster_ja.png deleted file mode 100644 index 041d346e..00000000 Binary files a/img/about_vrct/vrct_posters/iya_vrct_poster_ja.png and /dev/null differ diff --git a/img/about_vrct/vrct_posters/iya_vrct_poster_ko.png b/img/about_vrct/vrct_posters/iya_vrct_poster_ko.png deleted file mode 100644 index 268a6e24..00000000 Binary files a/img/about_vrct/vrct_posters/iya_vrct_poster_ko.png and /dev/null differ diff --git a/img/arrow_left_black.png b/img/arrow_left_black.png deleted file mode 100644 index 5e3f8dfb..00000000 Binary files a/img/arrow_left_black.png and /dev/null differ diff --git a/img/arrow_left_disabled.png b/img/arrow_left_disabled.png deleted file mode 100644 index 5b5f3afa..00000000 Binary files a/img/arrow_left_disabled.png and /dev/null differ diff --git a/img/arrow_left_white.png b/img/arrow_left_white.png deleted file mode 100644 index 463d8a74..00000000 Binary files a/img/arrow_left_white.png and /dev/null differ diff --git a/img/cancel_icon.png b/img/cancel_icon.png deleted file mode 100644 index aa6c386e..00000000 Binary files a/img/cancel_icon.png and /dev/null differ diff --git a/img/chato_delivering.png b/img/chato_delivering.png deleted file mode 100644 index d38f1447..00000000 Binary files a/img/chato_delivering.png and /dev/null differ diff --git a/img/chato_unpackaging.png b/img/chato_unpackaging.png deleted file mode 100644 index 52eb66dc..00000000 Binary files a/img/chato_unpackaging.png and /dev/null differ diff --git a/img/configuration_icon_black.png b/img/configuration_icon_black.png deleted file mode 100644 index c97dfefe..00000000 Binary files a/img/configuration_icon_black.png and /dev/null differ diff --git a/img/configuration_icon_disabled.png b/img/configuration_icon_disabled.png deleted file mode 100644 index 03a4a217..00000000 Binary files a/img/configuration_icon_disabled.png and /dev/null differ diff --git a/img/configuration_icon_white.png b/img/configuration_icon_white.png deleted file mode 100644 index ee6e050e..00000000 Binary files a/img/configuration_icon_white.png and /dev/null differ diff --git a/img/downloading_unpackaging_d.png b/img/downloading_unpackaging_d.png deleted file mode 100644 index 5c3c7031..00000000 Binary files a/img/downloading_unpackaging_d.png and /dev/null differ diff --git a/img/downloading_unpackaging_u.png b/img/downloading_unpackaging_u.png deleted file mode 100644 index 684433d5..00000000 Binary files a/img/downloading_unpackaging_u.png and /dev/null differ diff --git a/img/folder_open_icon_black.png b/img/folder_open_icon_black.png deleted file mode 100644 index 988184b3..00000000 Binary files a/img/folder_open_icon_black.png and /dev/null differ diff --git a/img/folder_open_icon_white.png b/img/folder_open_icon_white.png deleted file mode 100644 index 3de75dfe..00000000 Binary files a/img/folder_open_icon_white.png and /dev/null differ diff --git a/img/foreground_icon_black.png b/img/foreground_icon_black.png deleted file mode 100644 index ff3594c2..00000000 Binary files a/img/foreground_icon_black.png and /dev/null differ diff --git a/img/foreground_icon_disabled.png b/img/foreground_icon_disabled.png deleted file mode 100644 index 91778b7b..00000000 Binary files a/img/foreground_icon_disabled.png and /dev/null differ diff --git a/img/foreground_icon_white.png b/img/foreground_icon_white.png deleted file mode 100644 index 50370ad1..00000000 Binary files a/img/foreground_icon_white.png and /dev/null differ diff --git a/img/headphones_icon_black.png b/img/headphones_icon_black.png deleted file mode 100644 index 2cb97ec2..00000000 Binary files a/img/headphones_icon_black.png and /dev/null differ diff --git a/img/headphones_icon_disabled.png b/img/headphones_icon_disabled.png deleted file mode 100644 index f81f812e..00000000 Binary files a/img/headphones_icon_disabled.png and /dev/null differ diff --git a/img/headphones_icon_white.png b/img/headphones_icon_white.png deleted file mode 100644 index 54f7359d..00000000 Binary files a/img/headphones_icon_white.png and /dev/null differ diff --git a/img/help_icon_black.png b/img/help_icon_black.png deleted file mode 100644 index 156ca026..00000000 Binary files a/img/help_icon_black.png and /dev/null differ diff --git a/img/help_icon_white.png b/img/help_icon_white.png deleted file mode 100644 index ee5cb936..00000000 Binary files a/img/help_icon_white.png and /dev/null differ diff --git a/img/link_icon_black.png b/img/link_icon_black.png deleted file mode 100644 index e4790914..00000000 Binary files a/img/link_icon_black.png and /dev/null differ diff --git a/img/link_icon_white.png b/img/link_icon_white.png deleted file mode 100644 index 58a56d45..00000000 Binary files a/img/link_icon_white.png and /dev/null differ diff --git a/img/mic_icon_black.png b/img/mic_icon_black.png deleted file mode 100644 index 1210b069..00000000 Binary files a/img/mic_icon_black.png and /dev/null differ diff --git a/img/mic_icon_disabled.png b/img/mic_icon_disabled.png deleted file mode 100644 index 542d2824..00000000 Binary files a/img/mic_icon_disabled.png and /dev/null differ diff --git a/img/mic_icon_white.png b/img/mic_icon_white.png deleted file mode 100644 index e1837463..00000000 Binary files a/img/mic_icon_white.png and /dev/null differ diff --git a/img/narrow_arrow_down_black.png b/img/narrow_arrow_down_black.png deleted file mode 100644 index e53829e5..00000000 Binary files a/img/narrow_arrow_down_black.png and /dev/null differ diff --git a/img/narrow_arrow_down_white.png b/img/narrow_arrow_down_white.png deleted file mode 100644 index 309560c8..00000000 Binary files a/img/narrow_arrow_down_white.png and /dev/null differ diff --git a/img/overlay_br_sakura.png b/img/overlay_br_sakura.png deleted file mode 100644 index 61e8ccd7..00000000 Binary files a/img/overlay_br_sakura.png and /dev/null differ diff --git a/img/overlay_tl_sakura.png b/img/overlay_tl_sakura.png deleted file mode 100644 index d6211f41..00000000 Binary files a/img/overlay_tl_sakura.png and /dev/null differ diff --git a/img/redo_icon_black.png b/img/redo_icon_black.png deleted file mode 100644 index 989581a3..00000000 Binary files a/img/redo_icon_black.png and /dev/null differ diff --git a/img/redo_icon_white.png b/img/redo_icon_white.png deleted file mode 100644 index 2a27e302..00000000 Binary files a/img/redo_icon_white.png and /dev/null differ diff --git a/img/refresh_icon.png b/img/refresh_icon.png deleted file mode 100644 index 408bc2a6..00000000 Binary files a/img/refresh_icon.png and /dev/null differ diff --git a/img/refresh_update_icon.png b/img/refresh_update_icon.png deleted file mode 100644 index c5acad15..00000000 Binary files a/img/refresh_update_icon.png and /dev/null differ diff --git a/img/send_message_icon_black.png b/img/send_message_icon_black.png deleted file mode 100644 index e4240e56..00000000 Binary files a/img/send_message_icon_black.png and /dev/null differ diff --git a/img/send_message_icon_white.png b/img/send_message_icon_white.png deleted file mode 100644 index cdead72b..00000000 Binary files a/img/send_message_icon_white.png and /dev/null differ diff --git a/img/swap_icon_black.png b/img/swap_icon_black.png deleted file mode 100644 index eec6f830..00000000 Binary files a/img/swap_icon_black.png and /dev/null differ diff --git a/img/swap_icon_white.png b/img/swap_icon_white.png deleted file mode 100644 index 8fa1cf53..00000000 Binary files a/img/swap_icon_white.png and /dev/null differ diff --git a/img/translation_icon_black.png b/img/translation_icon_black.png deleted file mode 100644 index 3e184a72..00000000 Binary files a/img/translation_icon_black.png and /dev/null differ diff --git a/img/translation_icon_disabled.png b/img/translation_icon_disabled.png deleted file mode 100644 index 533feb81..00000000 Binary files a/img/translation_icon_disabled.png and /dev/null differ diff --git a/img/translation_icon_white.png b/img/translation_icon_white.png deleted file mode 100644 index 706b0bbc..00000000 Binary files a/img/translation_icon_white.png and /dev/null differ diff --git a/img/unpackage_icon.png b/img/unpackage_icon.png deleted file mode 100644 index 8fd8e7d2..00000000 Binary files a/img/unpackage_icon.png and /dev/null differ diff --git a/img/vrchat_chatbox_trasnlator_transcription.png b/img/vrchat_chatbox_trasnlator_transcription.png deleted file mode 100644 index 9f2e401e..00000000 Binary files a/img/vrchat_chatbox_trasnlator_transcription.png and /dev/null differ diff --git a/img/vrct_logo_for_dark_mode.png b/img/vrct_logo_for_dark_mode.png deleted file mode 100644 index 53add076..00000000 Binary files a/img/vrct_logo_for_dark_mode.png and /dev/null differ diff --git a/img/vrct_logo_for_light_mode.png b/img/vrct_logo_for_light_mode.png deleted file mode 100644 index ad2b0b95..00000000 Binary files a/img/vrct_logo_for_light_mode.png and /dev/null differ diff --git a/img/vrct_logo_mark_black.ico b/img/vrct_logo_mark_black.ico deleted file mode 100644 index 7b711af3..00000000 Binary files a/img/vrct_logo_mark_black.ico and /dev/null differ diff --git a/img/vrct_logo_mark_black.png b/img/vrct_logo_mark_black.png deleted file mode 100644 index 4e4fce17..00000000 Binary files a/img/vrct_logo_mark_black.png and /dev/null differ diff --git a/img/vrct_logo_mark_black_icon.png b/img/vrct_logo_mark_black_icon.png deleted file mode 100644 index 1d73b8a8..00000000 Binary files a/img/vrct_logo_mark_black_icon.png and /dev/null differ diff --git a/img/vrct_logo_mark_white.png b/img/vrct_logo_mark_white.png deleted file mode 100644 index f99621f7..00000000 Binary files a/img/vrct_logo_mark_white.png and /dev/null differ diff --git a/img/vrct_logo_mark_white_square.png b/img/vrct_logo_mark_white_square.png deleted file mode 100644 index bfb6f60d..00000000 Binary files a/img/vrct_logo_mark_white_square.png and /dev/null differ diff --git a/img/vrct_update_process.png b/img/vrct_update_process.png deleted file mode 100644 index 27a77150..00000000 Binary files a/img/vrct_update_process.png and /dev/null differ diff --git a/img/xsoverlay2.png b/img/xsoverlay2.png deleted file mode 100644 index 20b4021a..00000000 Binary files a/img/xsoverlay2.png and /dev/null differ diff --git a/install.bat b/install.bat deleted file mode 100644 index 8d2a5d51..00000000 --- a/install.bat +++ /dev/null @@ -1,2 +0,0 @@ -python.exe -m pip install --upgrade pip -pip install -r requirements.txt \ No newline at end of file diff --git a/installer/installer.nsi b/installer/installer.nsi deleted file mode 100644 index 48187fd4..00000000 --- a/installer/installer.nsi +++ /dev/null @@ -1,245 +0,0 @@ -!define PRODUCT_VERSION "1.0.0.0" -!define VERSION "1.0.0.0" -VIProductVersion "${PRODUCT_VERSION}" -VIFileVersion "${VERSION}" -VIAddVersionKey "FileVersion" "${VERSION}" -VIAddVersionKey "ProductName" "VRCT" -VIAddVersionKey "ProductVersion" "${PRODUCT_VERSION}" -VIAddVersionKey "LegalCopyright" "Copyright m's software" -VIAddVersionKey "FileDescription" "Communication tool with translation & transcription for VRChat" - -; Modern UI -!include MUI2.nsh -; nsDialogs -!include nsDialogs.nsh -; LogicLib -!include LogicLib.nsh -; FileFunc -!include FileFunc.nsh - -!define MUI_ICON "..\img\vrct_logo_mark_black.ico" -!define MUI_UNICON "..\img\vrct_logo_mark_black.ico" - -Unicode true -; アプリケーション名 -Name "VRCT" -; 作成されるインストーラ -OutFile "VRCT_Setup.exe" - -RequestExecutionLevel admin -ShowInstDetails show - -; 圧縮メソッド -SetCompressor lzma -; インストールされるディレクトリ -InstallDir "$LOCALAPPDATA\VRCT" -; XPマニフェスト -XPStyle on -; ページ -!insertmacro MUI_PAGE_WELCOME -!insertmacro MUI_PAGE_LICENSE "..\LICENSE" -Page custom OptionPage1 OptionPageLeave1 -Page custom OptionPage2 OptionPageLeave2 -!insertmacro MUI_PAGE_INSTFILES -!insertmacro MUI_PAGE_FINISH -; アンインストーラ ページ -!insertmacro MUI_UNPAGE_WELCOME -!insertmacro MUI_UNPAGE_CONFIRM -!insertmacro MUI_UNPAGE_INSTFILES -!insertmacro MUI_UNPAGE_FINISH -; 日本語UI -!insertmacro MUI_LANGUAGE "Japanese" -; 引数取得マクロ -!insertmacro GetParameters -!insertmacro GetOptions -; インターフェース 設定 -!define MUI_ABORTWARNING -; 変数 -Var Checkbox_InstallShortcut -Var Dialog_Options -Var InstallShortcut -Var DropList_Language -Var Set_Langage -Var DownloadWeight -Var RadioButton_Download -Var RadioButton_NotDownload -Var Label_Translation_subtitle_1 -Var Label_Translation_subtitle_2 -Var subFont - -; 初期化時コールバック -Function .onInit - ; オプション値を初期化します。 - StrCpy $InstallShortcut ${BST_CHECKED} - StrCpy $DropList_Language "English" - StrCpy $DownloadWeight ${BST_CHECKED} -FunctionEnd - -; オプション ページ 1 -Function OptionPage1 - !insertmacro MUI_HEADER_TEXT "オプション (Options)" "オプションを設定してください。 (Please set the options.)" - ; nsDialogsを作成します。 - nsDialogs::Create 1018 - ; 作成されたnsDialogsを変数に代入します。 - Pop $Dialog_Options - - ${If} $Dialog_Options == error - ; ダイアログの作成に失敗した場合には終了します。 - Abort - ${EndIf} - - ${NSD_CreateCheckbox} 0 0u 100% 12u "デスクトップにショートカットを作成 (Install shortcut on desktop)" - Pop $Checkbox_InstallShortcut - - ${If} $InstallShortcut == ${BST_CHECKED} - ; チェックが入力済の場合、チェックボックスにチェックを入れます。 - ${NSD_Check} $Checkbox_InstallShortcut - ${EndIf} - nsDialogs::Show -FunctionEnd - -; オプション ページ 1 退出コールバック -Function OptionPageLeave1 - ${NSD_GetState} $Checkbox_InstallShortcut $InstallShortcut -FunctionEnd - -; オプション ページ 2 -Function OptionPage2 - CreateFont $subFont "MS UI Gothic" "8" "400" - - !insertmacro MUI_HEADER_TEXT "初期設定 (Initial Settings)" "後から変更可能です。 (Changeable later.)" - ; nsDialogsを作成します。 - nsDialogs::Create 1018 - ; 作成されたnsDialogsを変数に代入します。 - Pop $Dialog_Options - - ${If} $Dialog_Options == error - ; ダイアログの作成に失敗した場合には終了します。 - Abort - ${EndIf} - - ; ComboBoxを作成します。 - ${NSD_CreateLabel} 0 20u 30% 12u "UIの言語 (Language)" - - ${NSD_CreateDropList} 33% 20u 33% 12u "" - Pop $DropList_Language - - # ラジオボタンを追加しWEIGHTをDownloadするか選択する - ${NSD_CreateLabel} 0 70u 30% 12u "翻訳機能 (Translation)" - ${NSD_CreateLabel} 0 83u 30% 8u "言語モデルをダウンロード" - Pop $Label_Translation_subtitle_1 - SendMessage $Label_Translation_subtitle_1 ${WM_SETFONT} $subFont 0 - SetCtlColors $Label_Translation_subtitle_1 0x696969 0xF0F0F0 - ${NSD_CreateLabel} 0 92u 30% 8u "(Download language model)" - Pop $Label_Translation_subtitle_2 - SendMessage $Label_Translation_subtitle_2 ${WM_SETFONT} $subFont 0 - SetCtlColors $Label_Translation_subtitle_2 0x696969 0xF0F0F0 - - ${NSD_CreateRadioButton} 33% 70u 33% 12u "使用する (Use)" - Pop $RadioButton_Download - ${NSD_CreateRadioButton} 66% 70u 33% 12u "使用しない (Don't use)" - Pop $RadioButton_NotDownload - - ${NSD_CB_AddString} $DropList_Language "English" - ${NSD_CB_AddString} $DropList_Language "日本語" - ${NSD_CB_AddString} $DropList_Language "한국어" - - ${NSD_CB_SelectString} $DropList_Language "English" - - ${If} $DownloadWeight == ${BST_CHECKED} - ; チェックが入力済の場合、チェックボックスにチェックを入れます。 - ${NSD_Check} $RadioButton_Download - ${EndIf} - nsDialogs::Show -FunctionEnd - -; オプション ページ 2 退出コールバック -Function OptionPageLeave2 - ${NSD_GetText} $DropList_Language $DropList_Language - ${NSD_GetState} $RadioButton_Download $DownloadWeight -FunctionEnd - -; デフォルト セクション -Section - ; If VRCT is already running, display a warning message and exit - StrCpy $1 "VRCT.exe" - nsProcess::_FindProcess "$1" - Pop $R1 - ${If} $R1 = 0 - nsExec::ExecToStack "taskkill /IM VRCT.exe" - ${EndIf} - - ; ディレクトリを削除 - RMDir /r "$INSTDIR" - ; スタート メニューから削除 - Delete "$SMPROGRAMS\VRCT\VRCT.lnk" - RMDir "$SMPROGRAMS\VRCT" - ; デスクトップ ショートカットを削除 - Delete "$DESKTOP\VRCT.lnk" - ; レジストリ キーを削除 - DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\VRCT" - - ; 出力先を指定します。 - SetOutPath "$INSTDIR" - ; インストールされるファイル - File /r "..\dist\VRCT\" - - ; アンインストーラを出力 - WriteUninstaller "$INSTDIR\Uninstall.exe" - - ${If} $InstallShortcut == ${BST_CHECKED} - ; デスクトップにショートカットを作成 - CreateShortCut "$DESKTOP\VRCT.lnk" "$INSTDIR\VRCT.exe" - ${EndIf} - - ; ComboBoxの選択値から言語を判定しconfig.jsonを$INSTDIRに作成 - ${If} $DropList_Language == "English" - StrCpy $Set_Langage "en" - ${ElseIf} $DropList_Language == "日本語" - StrCpy $Set_Langage "ja" - ${ElseIf} $DropList_Language == "한국어" - StrCpy $Set_Langage "ko" - ${EndIf} - - ${If} $DownloadWeight == 1 - StrCpy $DownloadWeight "true" - ${Else} - StrCpy $DownloadWeight "false" - ${EndIf} - - StrCpy $1 '{"UI_LANGUAGE": "$Set_Langage", "USE_TRANSLATION_FEATURE": $DownloadWeight}' - FileOpen $0 "$INSTDIR\config.json" w - FileWrite $0 $1 - FileClose $0 - - ; スタート メニューにショートカットを登録 - CreateDirectory "$SMPROGRAMS\VRCT" - SetOutPath "$INSTDIR" - CreateShortcut "$SMPROGRAMS\VRCT\VRCT.lnk" "$INSTDIR\VRCT.exe" "" - ; レジストリに登録 - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\VRCT" "DisplayName" "VRCT" - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\VRCT" "UninstallString" '"$INSTDIR\Uninstall.exe"' - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\VRCT" "DisplayIcon" '"$INSTDIR\_internal\img\vrct_logo_mark_black.ico"' -SectionEnd - -; アンインストーラ -Section Uninstall - ; If VRCT is already running, display a warning message and exit - StrCpy $1 "VRCT.exe" - nsProcess::_FindProcess "$1" - Pop $R1 - ${If} $R1 = 0 - MessageBox MB_OK|MB_ICONEXCLAMATION "VRCT is still running. Cannot uninstall this software.$\nPlease close VRCT and try again." /SD IDOK - Abort - ${EndIf} - ; ディレクトリを削除 - RMDir /r "$INSTDIR" - RMDir /r "$LOCALAPPDATA\VRCT" - ; スタート メニューから削除 - Delete "$SMPROGRAMS\VRCT\VRCT.lnk" - RMDir "$SMPROGRAMS\VRCT" - ; デスクトップ ショートカットを削除 - Delete "$DESKTOP\VRCT.lnk" - ; レジストリ キーを削除 - DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\VRCT" -SectionEnd \ No newline at end of file diff --git a/locales/en.yml b/locales/en.yml deleted file mode 100644 index 2f5cdd0a..00000000 --- a/locales/en.yml +++ /dev/null @@ -1,300 +0,0 @@ -main_window: - translation: "Translation" - transcription_send: "Voice2Chatbox" - transcription_receive: "Speaker2Log" - foreground: "Foreground" - - language_settings: "Language Settings" - your_language: "Your Language" - translate_each_other_label: "Translate Each Other" - swap_button_label: "Swap Languages" - target_language: "Target Language" - translator: "Translator" - translator_ctranslate2: "Internal (Default)" - - textbox_tab_all: "All" - textbox_tab_sent: "Sent" - textbox_tab_received: "Received" - textbox_tab_system: "System" - - textbox_system_message: - enabled_easter_egg: "Whoa! You caught us! There is something...like...easter-egg-ish function has enabled! It'll affect to Overlay (VR) for now;)." - enabled_translation: "Translation feature is turned on." - disabled_translation: "Translation feature is turned off." - enabled_voice2chatbox: "Transcription from the microphone has started." - disabled_voice2chatbox: "Transcription from the microphone has been stopped." - enabled_speaker2log: "Transcription from the speaker has started." - disabled_speaker2log: "Transcription from the speaker has been stopped." - enabled_foreground: "The screen is fixed in the foreground." - disabled_foreground: "The foreground fixation has been released." - - auth_key_success: "Auth key update completed." - auth_key_error: "Auth Key is incorrect or Usage limit reached." - - no_mic_device_detected_error: "No mic device detected." - no_speaker_device_detected_error: "No speaker device detected." - translation_engine_limit_error: "It has automatically changed the translation engine. Access has been temporarily restricted due to an excessive number of requests to the translation engine. If you want to use the same translation engine, please wait for a while, restart VRCT, and try again." - - detected_by_word_filter: "The word %{detected_message} has not been sent due to detection by the word filter." - - selected_your_language: "'Your Language' has set to %{your_language}." - selected_target_language: "'Target Language' has set to %{target_language}." - switched_language_preset_tab: "Switched to Language Preset Tab No.%{tab_no}." - latest_language_setting: "Currently, 'Your Language' is set to %{your_language}, and 'Target Language' is set to %{target_language}." - - opened_web_page_booth: "Opened Booth page in your web browser." - opened_web_page_vrct_documents: "Opened VRCT Documents page in your web browser.\nFor any issues, requests, or inquiries, please feel free to contact us through the links at the bottom of the documents page, the 'Contact Form' or via X (formerly Twitter)!" - - update_available: "New version is here!" - state_text_enabled: "Enabled" - state_text_disabled: "Disabled" - - cover_message: "The functionality is temporarily disabled until the settings window is closed." - - confirmation_message: - update_software: "Download the new version and automatically restart the app.\nIt'll take a while. Do it now?" - deny_update_software: "Do it later" - accept_update_software: "Update and Restart" - updating: "Now updating..." - - detected_over_ui_size: "Current UI Size: %{current_ui_size}\nVRCT's window size may be larger than your display size.\n* Depending on your display size, you may need to adjust it multiple times." - deny_adjust_ui_size: "Keep it at this size" - accept_adjust_ui_size: "Set it smaller and restart" - - -selectable_language_window: - title_your_language: "Select Your Language" - title_target_language: "Select Target Language" - go_back_button: "Go Back" - - -overlay_settings: - restore_default_settings: "Restore Default Settings" - opacity: "Opacity" - ui_scaling: "UI Scaling" - x_position: "X-axis (left-right)" - y_position: "Y-axis (up-down)" - z_position: "Z-axis (front-back)" - x_rotation: "X-axis rotation" - y_rotation: "Y-axis rotation" - z_rotation: "Z-axis rotation" - display_duration: "Display duration" - fadeout_duration: "Fadeout duration" - - -config_window: - config_title: "Settings" - compact_mode: "Compact Mode" - version: "version %{version}" - restart_message: "Apply changes with a restart." - common_error_message: - invalid_value: "Invalid value." - - side_menu_labels: - appearance: "Appearance" - translation: "Translation" - transcription: "Transcription" - transcription_mic: "Mic" - transcription_speaker: "Speaker" - transcription_internal_model: "Transcription Model" - vr: "VR" - others: "Others" - others_send_message_formats: "Message Formats (Send)" - others_received_message_formats: "Message Formats (XSOverlay & Speaker2Chatbox)" - others_speaker2chatbox: "Speaker2Chatbox" - advanced_settings: "Advanced Settings" - - - transparency: - label: "Transparency" - desc: "Change the main window's transparency." - - appearance_theme: - label: "Theme" - desc: "Change the color theme." - - ui_size: - label: "UI Size" - - textbox_ui_size: - label: "Text Box Font Size" - desc: "You can adjust the font size used in the logs relative to the UI size." - - message_box_ratio: - label: "Message Box Size" - desc: "You can change the size of the input message box. It is in ratio to the text box.\n*No exact calculations." - - font_family: - label: "Font Family" - - ui_language: - label: "UI Language" - - to_restore_main_window_geometry: - label: "Remember The Main Window Position" - desc: "Restore the position and size of the previous window upon startup." - - use_translation_feature: - label: "Use Translation Feature" - desc: "You can't use the translation feature while this is turned off. Instead, the VRCT startup becomes a little faster. This is for users who don't need the translation feature and only use VRCT as a chatbox and transcription tool." - - ctranslate2_weight_type: - label: "Select Internal Translation Model" - desc: "You can choose the translation model to use for the internal translation engine." - small: "Basic model (%{capacity})" - large: "High accuracy model (%{capacity})" - - deepl_auth_key: - label: "DeepL Auth Key" - desc: "Please select %{translator} on the main screen with DeepL_API when using. ※Some languages may not be supported." - open_auth_key_webpage: "Open DeepL Account Webpage" - auth_key_success: "Auth key update completed." - auth_key_error: "Auth Key is incorrect or Usage limit reached." - - mic_host: - label: "Mic Host/Driver" - - mic_device: - label: "Mic Device" - - mic_dynamic_energy_threshold: - label_for_automatic: "Mic Energy Threshold (Current Setting: Automatic)" - desc_for_automatic: "Automatically determine microphone input sensitivity." - label_for_manual: "Mic Energy Threshold (Current Setting: Manual)" - desc_for_manual: "Manually determine the microphone input sensitivity using the slider. Press the microphone icon to input your voice and adjust the sensitivity while monitoring the volume." - error_message: "You can set it with a value between 0 to %{max}." - - mic_record_timeout: - label: "Mic Record Timeout" - desc: "Detects silence and, when the specified number of seconds has passed, considers the mic input to have ended. (Second(s))" - error_message: "It cannot be greater than '%{mic_phrase_timeout_label}' with a value of 0 or more." - - mic_phrase_timeout: - label: "Mic Phrase Timeout" - desc: "Transcription processing is performed at intervals of the specified number of seconds." - error_message: "It cannot be set lower than '%{mic_record_timeout_label}' with a value of 0 or more." - - mic_max_phrase: - label: "Mic Max Words" - desc: "It is the lower limit for the number of transcribed words, and only when this number is exceeded will the transcription results be displayed logs and send to VRChat." - error_message: "You can set a number equal to or greater than 0." - - mic_word_filter: - label: "Mic Word Filter" - desc: "If a registered word is detected, the text will not be sent. To add multiple words at once, separate them with a ',' (comma). \n*Duplicate words will not be registered." - add_button_label: "Add" - count_desc: "Current registered word count: %{count}" - - - speaker_device: - label: "Speaker Device" - - speaker_dynamic_energy_threshold: - label_for_automatic: "Speaker Energy Threshold (Current Setting: Automatic)" - desc_for_automatic: "Automatically determine speaker input sensitivity." - label_for_manual: "Speaker Energy Threshold (Current Setting: Manual)" - desc_for_manual: "Manually determine the speaker input sensitivity using the slider. Press the headphones icon to listen to the audio and adjust the sensitivity while monitoring the volume." - error_message: "You can set it with a value between 0 to %{max}." - no_device_error_message: "No speaker device detected." - - speaker_record_timeout: - label: "Speaker Record Timeout" - desc: "Detects silence and, when the specified number of seconds has passed, considers the speaker input to have ended. (Second(s))" - error_message: "It cannot be greater than '%{speaker_phrase_timeout_label}' with a value of 0 or more." - - speaker_phrase_timeout: - label: "Speaker Phrase Timeout" - desc: "Transcription processing is performed at intervals of the specified number of seconds." - error_message: "It cannot be set lower than '%{speaker_record_timeout_label}' with a value of 0 or more." - - speaker_max_phrase: - label: "Speaker Max Words" - desc: "It is the lower limit for the number of transcribed words, and only when this number is exceeded will the transcription results be displayed logs." - error_message: "You can set a number equal to or greater than 0." - - use_whisper_feature: - label: "Use Whisper Model As Transcription" - desc: "In some languages, the accuracy of speech recognition may improve. During speech recognition usage, CPU usage increases, so please consider your PC specs before using this feature." - - whisper_weight_type: - label: "Select Whisper Model" - desc: "Generally, models with larger capacity tend to have higher accuracy, but this also results in longer transcription times and increased CPU usage. Please refer to the documentation for explanations of each model.\n※Larger models, especially those exceeding medium size, can be challenging to run even depending on the CPU's performance." - model_template: "%{model_name} model (%{capacity})" - recommended_model_template: "%{model_name} model (%{capacity}) (Recommended)" - - - enable_overlay_small_log: - label: "Enable Overlay" - # desc: - open_overlay_settings: "Open Overlay Customized Settings" - - auto_clear_the_message_box: - label: "Auto Clear The Message Box" - - send_only_translated_messages: - label: "Send Only Translated Messages" - - send_message_button_type: - label: "Send Message Button" - hide: "Hide (Use enter key to send)" - show: "Show" - show_and_disable_enter_key: "Show and disable to send when pressed enter key" - - notice_xsoverlay: - label: "Notification XSOverlay" - desc: "Notify received messages by using XSOverlay's notification feature." - - auto_export_message_logs: - label: "Auto Export Message Logs" - desc: "Automatically export the conversation messages as a text file." - - vrc_mic_mute_sync: - label: "VRC Mic Mute Sync" - desc: "VRCT will not send the message to VRChat while VRChat's mic is muted.\n*There is a bit latency and Push-To-Talk is not supported." - - send_message_to_vrc: - label: "Send Message To VRChat" - desc: "There is a way to use it without sending messages to VRChat, but it is not supported. Enable this feature when you intend to send a message to VRChat." - - - send_message_format: - label: "Message Format" - desc: "You can change the decoration of the message you want to send.\n[message] will be replaced with the message." - example_text: "This is an example sentence. Fonts, line breaks, etc. may differ from the actual display." - error_message: "Cannot use the term '[message]'." - - send_message_format_with_t: - label: "Message Format (with Translation)" - desc: "You can change the decoration of the message you want to send.\n[message] will be replaced with the message, and [translation] will be replaced with the translated message." - example_text: "This is an example sentence. Fonts, line breaks, etc. may differ from the actual display." - error_message: "Cannot use the terms '[message]' and '[translation]'." - - received_message_format: - label: "Format of Received Messages" - desc: "Used for XSOverlay notification receiving feature.\n[message] will be replaced with the message. \n※It will be used in Speaker2Chatbox too." - example_text: "This is an example sentence. Actual display may vary, including font and line breaks." - error_message: "Cannot use the term '[message]'." - - received_message_format_with_t: - label: "Format of Received Messages (with Translation)" - desc: "Used for XSOverlay notification receiving feature.\n[message] will be replaced with the message, and [translation] will be replaced with the translated message.\n※It will be used in Speaker2Chatbox too." - example_text: "This is an example sentence. Actual display may vary, including font and line breaks." - error_message: "Cannot use the terms '[message]' and '[translation]'." - - - # Note: Speaker2Chatbox localization is fine only in English. Do not translate it into other languages. - # Speaker2Chatbox - send_received_message_to_vrc: - label: "Send Received Message To VRChat" - desc: "Send the message you received from the speaker's sound to VRChat's chatbox." - # Speaker2Chatbox - - - osc_ip_address: - label: "OSC IP Address" - - osc_port: - label: "OSC Port" - - open_config_filepath: - label: "Open Config File" \ No newline at end of file diff --git a/locales/ja.yml b/locales/ja.yml deleted file mode 100644 index 1a194973..00000000 --- a/locales/ja.yml +++ /dev/null @@ -1,292 +0,0 @@ -main_window: - translation: "翻訳" - transcription_send: "音声認識(マイク)" - transcription_receive: "音声認識(スピーカー)" - foreground: "最前面表示" - - language_settings: "言語設定" - your_language: "あなたの言語" - translate_each_other_label: "双方向に翻訳" - swap_button_label: "言語を入れ替え" - target_language: "相手の言語" - translator: "翻訳エンジン" - translator_ctranslate2: "オフライン翻訳 (Default)" - - textbox_tab_all: "全て" - textbox_tab_sent: "送信" - textbox_tab_received: "受信" - textbox_tab_system: "システム" - - textbox_system_message: - enabled_translation: "翻訳機能をONにしました。" - disabled_translation: "翻訳機能をOFFしました。" - enabled_voice2chatbox: "マイクからの音声入力、文字起こしを開始します。" - disabled_voice2chatbox: "マイクからの音声入力、文字起こしを終了しました。" - enabled_speaker2log: "スピーカーからの音声聞き取り、文字起こしを開始します。" - disabled_speaker2log: "スピーカーからの音声聞き取り、文字起こしを終了しました。" - enabled_foreground: "画面を常に最前面へ固定します。" - disabled_foreground: "最前面への固定を解除しました。" - - auth_key_success: "認証キーの更新が完了しました。" - auth_key_error: "認証キーが間違っているか、API使用制限が上限に達しています。" - - no_mic_device_detected_error: "マイクデバイスが検出されませんでした。" - no_speaker_device_detected_error: "スピーカーデバイスが検出されませんでした。" - translation_engine_limit_error: "翻訳エンジンを自動的に変更しました。対象翻訳エンジンへのリクエストが多すぎるため、一時的にアクセスが制限されています。同じ翻訳エンジンを使用したい場合はしばらく待ってから、VRCTの再起動をしてもう一度試してみてください。" - - detected_by_word_filter: "ワードフィルターに登録されている単語 %{detected_message} が検出されたため送信しませんでした。" - - selected_your_language: "「あなたの言語」 を %{your_language} に設定しました。" - selected_target_language: "「相手の言語」 を %{target_language} に設定しました。" - switched_language_preset_tab: "言語プリセット番号 %{tab_no} に切り替わりました。" - latest_language_setting: "現在「あなたの言語」は %{your_language}、「相手の言語」は %{target_language} に設定されています。" - - opened_web_page_booth: "お使いのブラウザで、Boothのページを開きました。" - opened_web_page_vrct_documents: "お使いのブラウザで、VRCTのドキュメントを開きました。使用方法などはそちらに記載されています。\n不具合、ご要望、その他お問い合わせはドキュメント最下部にあるLinks、「お問合せフォーム」もしくはX (元Twitter) にて気軽にご連絡ください!" - - update_available: "新しいバージョンが出ました!" - state_text_enabled: "有効" - state_text_disabled: "無効" - - cover_message: "設定画面が閉じられるまで、一時的に機能を停止しています。" - - confirmation_message: - update_software: "新しいバージョンをダウンロードしてアプリを再起動します。\n少し時間がかかります。今すぐ行いますか?" - deny_update_software: "後でする" - accept_update_software: "アップデートして再起動" - updating: "アップデート中..." - - detected_over_ui_size: "現在のUI サイズ: %{current_ui_size}\nVRCTのウィンドウサイズが、お使いのディスプレイサイズより大きい可能性があります。\n※ディスプレイサイズによっては、何度か再設定が必要な場合があります。" - deny_adjust_ui_size: "このサイズのままで良い" - accept_adjust_ui_size: "小さく設定して再起動" - - -selectable_language_window: - title_your_language: "あなたの言語" - title_target_language: "相手の言語" - go_back_button: "戻る" - - -overlay_settings: - restore_default_settings: "初期値に戻す" - opacity: "透明度" - ui_scaling: "サイズ" - x_position: "X軸(左右)" - y_position: "Y軸(上下)" - z_position: "Z軸(前後)" - x_rotation: "X軸の回転" - y_rotation: "Y軸の回転" - z_rotation: "Z軸の回転" - display_duration: "表示時間" - fadeout_duration: "フェードアウト時間" - - -config_window: - config_title: "設定" - compact_mode: "コンパクトモード" - version: "バージョン %{version}" - restart_message: "再起動して変更を適用する。" - common_error_message: - invalid_value: "無効な値です。" - - side_menu_labels: - appearance: "デザイン" - translation: "翻訳" - transcription: "音声認識" - transcription_mic: "マイク" - transcription_speaker: "スピーカー" - transcription_internal_model: "音声認識モデル" - others: "その他" - others_send_message_formats: "メッセージフォーマット (送信)" - others_received_message_formats: "メッセージフォーマット (XSOverlay & Speaker2Chatbox)" - advanced_settings: "高度な設定" - - - transparency: - label: "透明度" - desc: "メイン画面の透明度を変更できます。" - - appearance_theme: - label: "外観テーマ" - desc: "カラーテーマを変更できます。" - - ui_size: - label: "UIサイズ" - - textbox_ui_size: - label: "テキストボックス フォントサイズ" - desc: "ログに表示されるフォントのサイズを、UIサイズを基準にして倍率を変えられます。" - - message_box_ratio: - label: "メッセージ入力欄のサイズ" - desc: "メッセージ入力欄のサイズを変更できます。テキストボックスとの比率となっています。\n※厳密な計算はしていません。" - - font_family: - label: "使用フォント" - - ui_language: - label: "UIの言語 / UI Language" - - to_restore_main_window_geometry: - label: "メイン画面の位置を記憶する" - desc: "起動時、前回の画面の位置とサイズを復元します。" - - use_translation_feature: - label: "翻訳機能を使用する" - desc: "オフにしている間は、翻訳機能を使わない代わり、VRCTの起動が少し速くなります。\n翻訳機能を必要とせず、VRCTをチャット送信と文字起こしツールとしてのみ使用するユーザー用です。" - - ctranslate2_weight_type: - label: "オフライン翻訳のタイプ" - desc: "翻訳エンジン(オフライン翻訳)で翻訳する際に、使用する翻訳モデルを選択できます。" - small: "通常モデル (%{capacity})" - large: "高精度モデル (%{capacity})" - - deepl_auth_key: - label: "DeepL 認証キー" - desc: "使用の際は、メイン画面にある %{translator} をDeepL_APIに変更してください。\n※対応していない言語もあります。" - open_auth_key_webpage: "DeepLアカウントページを開く" - auth_key_success: "認証キーの更新が完了しました。" - auth_key_error: "認証キーが間違っているか、API使用制限が上限に達しています。" - - mic_host: - label: "マイク(ホスト/ドライバー)" - - mic_device: - label: "マイク (デバイス)" - - mic_dynamic_energy_threshold: - label_for_automatic: "マイク入力感度の調整 (現在の設定: 自動)" - desc_for_automatic: "マイクの入力感度を自動的に調節する。" - label_for_manual: "マイク入力感度の調整 (現在の設定: 手動)" - desc_for_manual: "スライダーを調整して入力感度を手動で決められます。マイクのアイコンを押すと、実際に声を入力し、音量を確認しながら調節できます。" - error_message: "0 から %{max} までの数値で設定できます。" - - mic_record_timeout: - label: "入力が終了したとみなす無音時間" - desc: "無音を検出し、設定された秒数経過すると、音声入力が終了したとみなします。" - error_message: "0 以上で 「%{mic_phrase_timeout_label}」より大きくすることはできません。" - - mic_phrase_timeout: - label: "一度に文字起こしする時間の長さ" - desc: "設定された秒数ごとに文字起こし処理が行われます。" - error_message: "0 以上で 「%{mic_record_timeout_label}」より小さくすることはできません。" - - mic_max_phrase: - label: "送信するまでに保持する単語数" - desc: "文字起こしされた単語数の下限値で、この数値を超えた場合のみ結果をVRChatへ送信し、ログに表示します。" - error_message: "0以上の数値を設定できます。" - - mic_word_filter: - label: "ワードフィルター" - desc: "登録された単語を検出すると、その文章は送信されません。\n「,」カンマで区切ると、まとめて複数の単語を追加できます。\n※重複した単語は登録されません。" - add_button_label: "追加" - count_desc: "現在登録されている単語数: %{count}" - - - speaker_device: - label: "スピーカー (デバイス)" - - speaker_dynamic_energy_threshold: - label_for_automatic: "スピーカー入力感度の調整 (現在の設定: 自動)" - desc_for_automatic: "スピーカーの入力感度を自動的に調節する。" - label_for_manual: "スピーカー入力感度の調整 (現在の設定: 手動)" - desc_for_manual: "スライダーを調整して入力感度を手動で決められます。ヘッドフォンのアイコンを押すと、実際に音声を聞き取り、音量を確認しながら調節できます。" - error_message: "0 から %{max} までの数値で設定できます。" - no_device_error_message: "スピーカーデバイスが検出されませんでした。" - - speaker_record_timeout: - label: "入力が終了したとみなす無音時間" - desc: "無音を検出し、設定された秒数経過すると、音声入力が終了したとみなします。" - error_message: "0 以上で 「%{speaker_phrase_timeout_label}」より大きくすることはできません。" - - speaker_phrase_timeout: - label: "一度に文字起こしする時間の長さ" - desc: "設定された秒数ごとに文字起こし処理が行われます。" - error_message: "0 以上で 「%{speaker_record_timeout_label}」より小さくすることはできません。" - - speaker_max_phrase: - label: "ログとして表示するまでに保持する単語数" - desc: "文字起こしされた単語数の下限値で、この数値を超えた場合のみ結果をログに表示します。" - error_message: "0以上の数値を設定できます。" - - use_whisper_feature: - label: "音声認識にWhisperモデルを使用する" - desc: "一部の言語では、音声認識の精度が向上するかもしれません。音声認識使用中、CPUの使用率が上がるので、お使いのPCスペックと相談してこの機能を使用してください。" - - whisper_weight_type: - label: "Whisperモデルのタイプ" - desc: "基本的に、容量が多いモデルほど精度は高いですが、文字起こしまでの時間が伸び、CPU使用率も増加します。各モデルの説明はドキュメントをご覧ください。\n※特にmediumより容量の大きいモデルは、CPUの性能によっては使用すらも困難です。" - model_template: "%{model_name} モデル (%{capacity})" - recommended_model_template: "%{model_name} モデル (%{capacity}) (推奨)" - - - enable_overlay_small_log: - label: "Overlay機能を有効" - # desc: - open_overlay_settings: "Overlay詳細設定を開く" - - - - auto_clear_the_message_box: - label: "送信後はチャットボックスを空にする" - - send_only_translated_messages: - label: "翻訳後のメッセージのみ送信する" - - send_message_button_type: - label: "メッセージ送信ボタン" - hide: "非表示 (エンターキーを使って送信)" - show: "表示" - show_and_disable_enter_key: "表示し、エンターキーでの送信を無効" - - notice_xsoverlay: - label: "XSOverlayでの通知受け取り機能を有効" - desc: "文字起こし (受信) されたメッセージをXSOverlayの機能を使って通知として受け取れます。" - - auto_export_message_logs: - label: "会話ログを自動的に保存する" - desc: "テキストファイルとしてログがlogsフォルダ内に保存されます。" - - vrc_mic_mute_sync: - label: "VRCマイクミュート同期" - desc: "VRChatのマイクがミュートされている間は、メッセージをVRChatに送信しません。\n※若干の遅延はあります。また、Push-To-Talkは非対応です。" - - - send_message_to_vrc: - label: "VRChatにメッセージを送信する" - desc: "サポート対象外ですが、VRChatにメッセージを送信せずに使う方法があります。送信したい場合、この機能を有効にする事を忘れないでください。" - - - send_message_format: - label: "送信するメッセージのフォーマット" - desc: "VRChatで相手に実際に見えるフォーマットを変更できます。\n[message]がメッセージに置換されます。" - example_text: "これは例文です。フォントや改行箇所など、実際の表示とは異なる場合があります。" - error_message: "[message]という文字は使えません。" - - send_message_format_with_t: - label: "送信するメッセージのフォーマット(翻訳付き)" - desc: "VRChatで相手に実際に見えるフォーマットを変更できます。\n[message]がメッセージに置換され、[translation]が翻訳されたメッセージに置換されます。" - example_text: "これは例文です。フォントや改行箇所など、実際の表示とは異なる場合があります。" - error_message: "[message]と[translation]という文字は使えません。" - - received_message_format: - label: "受信するメッセージのフォーマット" - desc: "XSOverlay通知受け取り機能で使用されます。\n[message]がメッセージに置換されます。\n※Speaker2Chatboxでの送信機能にも使われます。" - example_text: "これは例文です。フォントや改行箇所など、実際の表示とは異なる場合があります。" - error_message: "[message]という文字は使えません。" - - received_message_format_with_t: - label: "受信するメッセージのフォーマット(翻訳付き)" - desc: "XSOverlay通知受け取り機能で使用されます。\n[message]がメッセージに置換され、[translation]が翻訳されたメッセージに置換されます。\n※Speaker2Chatboxでの送信機能にも使われます。" - example_text: "これは例文です。フォントや改行箇所など、実際の表示とは異なる場合があります。" - error_message: "[message]と[translation]という文字は使えません。" - - - osc_ip_address: - label: "OSC IP Address" - - osc_port: - label: "OSC Port" - - open_config_filepath: - label: "設定ファイルを開く" \ No newline at end of file diff --git a/locales/ko.yml b/locales/ko.yml deleted file mode 100644 index 02e70c0b..00000000 --- a/locales/ko.yml +++ /dev/null @@ -1,291 +0,0 @@ -main_window: - translation: "번역" - transcription_send: "음성인식 (마이크)" - transcription_receive: "음성인식 (스피커)" - foreground: "항상 위로" - - language_settings: "언어 설정" - your_language: "당신의 언어" - translate_each_other_label: "양방향으로 번역" - swap_button_label: "언어 교체" - target_language: "상대방의 언어" - translator: "번역 엔진" - translator_ctranslate2: "오프라인 번역 (기본값)" - - textbox_tab_all: "전체" - textbox_tab_sent: "전송" - textbox_tab_received: "수신" - textbox_tab_system: "시스템" - - textbox_system_message: - enabled_easter_egg: "우와! 이스터에그를 발견하셨군요! 이제 Overlay (VR)에 영향을 주는 숨겨진 기능이 활성화되었습니다!" - enabled_translation: "번역 기능을 시작합니다." - disabled_translation: "번역 기능이 중지되었습니다." - enabled_voice2chatbox: "마이크에서의 음성인식을 시작합니다." - disabled_voice2chatbox: "마이크에서의 음성인식이 중지되었습니다." - enabled_speaker2log: "스피커에서의 음성인식을 시작합니다." - disabled_speaker2log: "스피커에서의 음성인식이 중지되었습니다." - enabled_foreground: "화면을 항상 위로 고정합니다." - disabled_foreground: "화면 고정이 해제되었습니다." - - auth_key_success: "인증 키 갱신이 완료되었습니다." - auth_key_error: "인증 키가 잘못되었거나 API 사용 제한이 상한선에 도달했습니다." - - no_mic_device_detected_error: "마이크 장치를 찾지 못했습니다." - no_speaker_device_detected_error: "스피커 장치를 찾지 못했습니다." - translation_engine_limit_error: "번역 엔진을 자동으로 변경했습니다. 대상 번역 엔진에 대한 요청이 너무 많아 일시적으로 접근이 제한되었습니다. 해당 번역 엔진을 사용하려면 잠시 기다린 후 VRCT를 재시작하여 다시 시도해 보시기 바랍니다." - - detected_by_word_filter: "단어 필터에 등록된 단어 '%{detected_message}'(이)가 감지되어 전송하지 않았습니다." - - selected_your_language: "'당신의 언어'가 %{your_language}(으)로 설정되었습니다." - selected_target_language: "'상대방의 언어'가 %{target_language}(으)로 설정되었습니다." - switched_language_preset_tab: "언어 프리셋 번호 %{tab_no}로 전환되었습니다." - latest_language_setting: "현재 '당신의 언어'는 %{your_language}, '상대방의 언어'는 %{target_language}(으)로 설정되어 있습니다." - - opened_web_page_booth: "브라우저에서 Booth 페이지를 열었습니다." - opened_web_page_vrct_documents: "웹 브라우저에서 VRCT 문서 페이지가 열렸습니다.\n문제, 요청 또는 문의 사항이 있는 경우 문서 페이지 하단의 링크, '문의 양식' 또는 X(구 트위터)를 통해 언제든지 문의해 주세요!" - - update_available: "새로운 버전이 나왔습니다!" - state_text_enabled: "활성화됨" - state_text_disabled: "비활성화됨" - - cover_message: "설정 화면이 닫힐 때까지 일시적으로 기능을 정지하고 있습니다." - - confirmation_message: - update_software: "새 버전을 다운로드하고 재시작합니다. \n 조금 시간이 걸립니다. 지금 시작할까요?" - deny_update_software: "나중에 하기" - accept_update_software: "업데이트 및 재시작" - updating: "업데이트 중..." - - detected_over_ui_size: "현재 UI 크기: %{current_ui_size}\nVRCT의 창 크기가 사용자의 디스플레이 크기보다 클 수 있습니다. \n* 디스플레이 크기에 따라 여러 번 재설정해야 할 수도 있습니다." - deny_adjust_ui_size: "지금 상태를 유지" - accept_adjust_ui_size: "작게 줄이고 재시작" - - -selectable_language_window: - title_your_language: "당신의 언어" - title_target_language: "상대방의 언어" - go_back_button: "돌아가기" - - -overlay_settings: - restore_default_settings: "기본값으로 복원" - opacity: "불투명도" - ui_scaling: "UI 크기 조절" - x_position: "X축 위치 (좌우)" - y_position: "Y축 위치 (상하)" - z_position: "Z축 위치 (전후)" - x_rotation: "X축 회전" - y_rotation: "Y축 회전" - z_rotation: "Z축 회전" - display_duration: "표시 시간" - fadeout_duration: "서서히 사라지는 시간" - - -config_window: - config_title: "설정" - compact_mode: "컴팩트 모드" - version: "버전 %{version}" - restart_message: "재시작하여 변경 사항을 적용합니다." - common_error_message: - invalid_value: "유효하지 않은 값입니다." - - side_menu_labels: - appearance: "모양" - translation: "번역" - transcription: "음성인식" - transcription_mic: "마이크" - transcription_speaker: "스피커" - transcription_internal_model: "내부 엔진" - others: "기타" - others_send_message_formats: "메시지 형식 (전송)" - others_received_message_formats: "메시지 형식 (수신)" - others_speaker2chatbox: "스피커->챗박스" - advanced_settings: "고급 설정" - - - transparency: - label: "투명도" - desc: "메인 화면의 투명도를 변경합니다." - - appearance_theme: - label: "테마" - desc: "색상 테마를 변경합니다." - - ui_size: - label: "UI 크기" - - textbox_ui_size: - label: "텍스트 박스 글자 크기" - desc: "로그에 표시되는 글자 크기의 배율을 UI 크기에 따라 변경합니다." - - message_box_ratio: - label: "메시지 입력창 크기" - desc: "메시지 입력창의 크기를 변경합니다. 텍스트 박스와의 비율로 설정되어 있습니다. \n* 정확한 계산은 하지 않았습니다." - - font_family: - label: "글꼴" - - ui_language: - label: "UI 언어 / UI Language" - - to_restore_main_window_geometry: - label: "메인 화면 위치 기억" - desc: "시작 시 이전 화면의 위치와 크기를 복원합니다." - - use_translation_feature: - label: "번역 기능 사용" - desc: "번역 기능이 꺼져 있는 동안에는 번역을 하지 않는 대신 VRCT가 조금 더 빠르게 실행됩니다. \n 번역 기능이 필요하지 않고 VRCT를 채팅 전송 및 음성 인식 도구로만 사용하는 사용자를 위한 기능입니다." - - ctranslate2_weight_type: - label: "번역 모델" - desc: "오프라인 번역 시 사용할 번역 모델을 변경합니다." - small: "일반 모델 (%{capacity})" - large: "정밀 모델 (%{capacity})" - - deepl_auth_key: - label: "DeepL 인증 키" - desc: "사용 시 메인 화면에 있는 %{translator}를 DeepL_API로 변경해 주세요.\n지원하지 않는 언어도 있습니다." - open_auth_key_webpage: "DeepL 계정 페이지 열기" - auth_key_success: "인증 키 갱신이 완료되었습니다." - auth_key_error: "인증 키가 잘못되었거나 API 사용 제한이 상한에 도달했습니다." - - mic_host: - label: "마이크 호스트/드라이버" - - mic_device: - label: "마이크 장치" - - mic_dynamic_energy_threshold: - label_for_automatic: "음성 입력 최소 볼륨 (현재 설정: 자동)" - desc_for_automatic: "마이크의 입력 감도를 자동으로 조절합니다." - label_for_manual: "음성 입력 최소 볼륨 (현재 설정: 수동)" - desc_for_manual: "슬라이더를 움직여 입력 감도를 수동으로 조절합니다. 마이크 아이콘을 누르면 실제 음성의 볼륨을 확인하며 감도를 조절할 수 있습니다." - error_message: "0에서 %{max}까지의 숫자로만 설정할 수 있습니다." - - mic_record_timeout: - label: "최대 무음 시간" - desc: "무음을 감지하고 설정된 시간(초)만큼의 시간이 지나면 음성 입력이 종료된 것으로 판단합니다." - error_message: "0 이상에서 '%{mic_phrase_timeout_label}'보다 클 수 없습니다." - - mic_phrase_timeout: - label: "최대 인식 시간" - desc: "설정된 초 단위로 음성인식 처리가 이루어집니다." - error_message: "0 이상에서 '%{mic_record_timeout_label}'보다 작을 수 없습니다." - - mic_max_phrase: - label: "최대 입력 절(phrases) 수" - desc: "인식된 단어 수의 하한값으로, 이 수치를 초과하는 경우에만 결과를 VRChat으로 전송하고 로그에 표시합니다." - error_message: "0 이상의 숫자만 설정할 수 있습니다." - - mic_word_filter: - label: "단어 필터" - desc: "등록된 단어가 감지되면 해당 문장은 전송되지 않습니다. \n ',' 쉼표로 구분하면 여러 단어를 추가할 수 있습니다. \n* 중복된 단어는 등록되지 않습니다." - add_button_label: "추가" - count_desc: "현재 등록되어 있는 단어 수: %{count}" - - - speaker_device: - label: "스피커 장치" - - speaker_dynamic_energy_threshold: - label_for_automatic: "음성 입력 최소 볼륨 (현재 설정: 자동)" - desc_for_automatic: "스피커의 입력 감도를 자동으로 조절합니다." - label_for_manual: "음성 입력 최소 볼륨 (현재 설정: 수동)" - desc_for_manual: "슬라이더를 움직여 입력 감도를 수동으로 조절합니다. 헤드폰 아이콘을 누르면 실제 음성의 볼륨을 확인하며 감도를 조절할 수 있습니다." - error_message: "0에서 %{max}까지의 숫자로만 설정할 수 있습니다." - no_device_error_message: "스피커 디바이스를 찾지 못했습니다." - - speaker_record_timeout: - label: "최대 무음 시간" - desc: "무음을 감지하고 설정된 시간(초)만큼의 시간이 지나면 음성 입력이 종료된 것으로 판단합니다." - error_message: "0 이상에서 '%{speaker_phrase_timeout_label}'보다 클 수 없습니다." - - speaker_phrase_timeout: - label: "최대 인식 시간" - desc: "설정된 초 단위로 음성인식 처리가 이루어집니다." - error_message: "0 이상에서 '%{speaker_record_timeout_label}'보다 작을 수 없습니다." - - speaker_max_phrase: - label: "최대 입력 절(phrases) 수" - desc: "인식된 단어 수의 하한값으로, 이 수치를 초과하는 경우에만 결과를 로그에 표시합니다." - error_message: "0 이상의 숫자만 설정할 수 있습니다." - - use_whisper_feature: - label: "음성 인식에 Whisper 모델 사용" - desc: "일부 언어에서는 음성 인식의 정확도가 향상될 수 있습니다. 음성 인식 중 CPU 사용률이 올라가기 때문에 사용하시는 PC의 사양을 고려하여 이 기능을 사용해 주세요." - - whisper_weight_type: - label: "Whisper 모델 타입" - desc: "기본적으로 모델의 용량이 클수록 정확도는 높지만, 음성 인식 시간이 늘어나며 CPU 사용률도 증가합니다. 각 모델의 설명은 문서를 참조해 주세요.\n* 특히 medium보다 용량이 큰 모델은 CPU 성능에 따라 사용이 어려울 수 있습니다." - model_template: "%{model_name} 모델 (%{capacity})" - recommended_model_template: "%{model_name} 모델 (%{capacity}) (권장)" - - - enable_overlay_small_log: - label: "Overlay 활성화" - # desc: - open_overlay_settings: "Overlay 설정 창 열기" - - auto_clear_the_message_box: - label: "챗박스 자동 삭제" - - send_only_translated_messages: - label: "번역된 메시지만 전송" - - send_message_button_type: - label: "메시지 전송 버튼" - hide: "숨김 (Enter 키를 사용하여 전송)" - show: "표시" - show_and_disable_enter_key: "표시 (Enter 키 전송 비활성화)" - - notice_xsoverlay: - label: "XSOverlay에서 알림 수신 기능 활성화" - desc: "수신된 메시지를 XSOverlay의 기능을 통해 알림으로 받아볼 수 있습니다." - - auto_export_message_logs: - label: "대화 로그 자동 저장" - desc: "logs 폴더에 텍스트 파일로 로그가 저장됩니다." - - vrc_mic_mute_sync: - label: "VRChat 마이크 음소거 동기화" - desc: "VRChat의 마이크가 음소거되어 있는 동안에는 VRCT가 VRChat으로 메시지를 보내지 않습니다.\n* 약간의 지연이 있을 수 있으며, '눌러서 말하기' 기능은 지원되지 않습니다." - - send_message_to_vrc: - label: "VRChat에 메시지 전송" - desc: "VRChat에 메시지를 보내지 않고 사용할 수 있는 방법이 있지만 지원되지 않습니다. VRChat에 메시지를 보내려면 이 기능을 활성화하세요." - - - send_message_format: - label: "메시지 형식" - desc: "메시지가 실제로 보이는 형식을 변경합니다. \n[message]가 메시지로 대체됩니다." - example_text: "이것은 예문입니다. 폰트, 줄바꿈 등 실제 표시와 다를 수 있습니다." - error_message: "[message]라는 문자는 사용할 수 없습니다." - - send_message_format_with_t: - label: "메시지 형식 (번역 포함)" - desc: "메시지가 실제로 보이는 형식을 변경합니다. \n[message]는 메시지로, [translation]은 번역된 메시지로 대체됩니다.\nXSOverlay의 알림에서도 사용됩니다." - example_text: "예문입니다. 글꼴, 줄 바꿈 등이 실제 표시와 다를 수 있습니다." - error_message: "[message]와 [translation]이라는 문자는 사용할 수 없습니다." - - received_message_format: - label: "메시지 형식" - desc: "메시지가 실제로 보이는 형식을 변경합니다. \n[message]가 메시지로 대체됩니다." - example_text: "이것은 예문입니다. 폰트, 줄바꿈 등 실제 표시와 다를 수 있습니다." - error_message: "[message]라는 문자는 사용할 수 없습니다." - - received_message_format_with_t: - label: "메시지 형식 (번역 포함)" - desc: "메시지가 실제로 보이는 형식을 변경합니다. \n[message]는 메시지로, [translation]은 번역된 메시지로 대체됩니다.\nXSOverlay의 알림에서도 사용됩니다." - example_text: "이것은 예문입니다. 폰트, 줄바꿈 등 실제 표시와 다를 수 있습니다." - error_message: "[message]와 [translation]이라는 문자는 사용할 수 없습니다." - - - osc_ip_address: - label: "OSC IP 주소" - - osc_port: - label: "OSC 포트" - - open_config_filepath: - label: "설정 파일 열기" \ No newline at end of file diff --git a/locales/readme_first.txt b/locales/readme_first.txt deleted file mode 100644 index 9d3bc1e8..00000000 --- a/locales/readme_first.txt +++ /dev/null @@ -1,3 +0,0 @@ -Thank you for considering translating VRCT's UI. -For your information, we are planning to transition VRCT's UI from Python's tkinter to a web-based platform using HTML, CSS, and JavaScript. -This means there might be structural changes to the UI. We apologize if any of the sentences you translated are removed due to these changes. \ No newline at end of file diff --git a/locales/zh-Hans.yml b/locales/zh-Hans.yml deleted file mode 100644 index 204ee9ee..00000000 --- a/locales/zh-Hans.yml +++ /dev/null @@ -1,293 +0,0 @@ -main_window: - translation: "翻译" - transcription_send: "你的语音转文字" - transcription_receive: "他人语音转文字" - foreground: "顶层显示" - - language_settings: "语言设定" - your_language: "你的语言" - translate_each_other_label: "双向翻译" - swap_button_label: "互换" - target_language: "目标语言" - translator: "翻译器" - translator_ctranslate2: "离线翻译(默认)" - - textbox_tab_all: "全部" - textbox_tab_sent: "发送" - textbox_tab_received: "接受" - textbox_tab_system: "系统" - - textbox_system_message: - enabled_translation: "翻译已启动." - disabled_translation: "翻译已关闭." - enabled_voice2chatbox: "正在翻译你的语音并转成文字." - disabled_voice2chatbox: "你的语音翻译结束了." - enabled_speaker2log: "正在翻译他人语音并转成文字." - disabled_speaker2log: "第三者的语音翻译结束了." - enabled_foreground: "顶层显示开启." - disabled_foreground: "顶层显示关闭." - - auth_key_success: "授权密匙更新完毕" - auth_key_error: "授权密匙错误或已达到翻译API(翻译器决定)使用次数上限." - - no_mic_device_detected_error: "未检测到你的麦克风." - no_speaker_device_detected_error: "未检测到他人语音输入." - translation_engine_limit_error: "自动更换了翻译器.原因是对该翻译器请求太频繁,它暂时拒绝了接收翻译请求.如仍想使用原本翻译器,请稍等片刻后在重启VRCT." - - detected_by_word_filter: "该单词 %{detected_message} 被单词过滤器检测出所以没有发送." - - selected_your_language: "[你的语言]设定为 %{your_language} " - selected_target_language: "[目标语言]设定为 %{target_language} " - switched_language_preset_tab: "已切换为第 %{tab_no} 号语言设定" - latest_language_setting: "现在,你的语言是 %{your_language},目标语言是 %{target_language} ." - - opened_web_page_booth: "在你的默认浏览器上打开了Booth页面" - opened_web_page_vrct_documents: "在你的默认浏览器上打开了VRCT文档,有着关于VRCT的使用方法\n其他问题、请求、查询等请通过文档底部的链接或X (Twitter) 联系我们!" - - update_available: "有新版本可供使用!" - state_text_enabled: "启用" - state_text_disabled: "停用" - - cover_message: "在设置窗口关闭前,VRCT的功能暂时停用" - - confirmation_message: - update_software: "下载新版本并自动启动\n会花少许时间,现在更新吗?" - deny_update_software: "稍后再说" - accept_update_software: "更新后自动启动" - updating: "更新中..." - - detected_over_ui_size: "现在的界面大小: %{current_ui_size}\nVRCT的窗口大小有可能会大于显示器\n请根据你的屏幕大小设置合适的VRCT的大小" - deny_adjust_ui_size: "现在界面大小是合适的" - accept_adjust_ui_size: "缩小界面大小并重新启动" - - -selectable_language_window: - title_your_language: "你的语言" - title_target_language: "目标语言" - go_back_button: "返回" - - -overlay_settings: - restore_default_settings: "恢复默认设置" - opacity: "透明度" - ui_scaling: "大小" - x_position: "X轴(左右)" - y_position: "Y轴(上下)" - z_position: "Z轴(前后)" - x_rotation: "X轴旋转" - y_rotation: "Y轴旋转" - z_rotation: "Z轴旋转" - display_duration: "显示持续时间" - fadeout_duration: "渐隐持续时间" - - -config_window: - config_title: "设定" - compact_mode: "精简模式" - version: "版本 %{version}" - restart_message: "重启并应用设定" - common_error_message: - invalid_value: "无效的值" - - side_menu_labels: - appearance: "外观" - translation: "翻译" - transcription: "转录" - transcription_mic: "你的麦克风" - transcription_speaker: "他人声音" - transcription_internal_model: "转录模型" - others: "其他" - # others_send_message_formats: "メッセージフォーマット (送信)" - # others_received_message_formats: "メッセージフォーマット (XSOverlay & Speaker2Chatbox)" - advanced_settings: "高级设置" - - - transparency: - label: "透明度" - desc: "更改主视窗透明度" - - appearance_theme: - label: "主题" - desc: "更改主题配色" - - ui_size: - label: "界面大小" - - textbox_ui_size: - label: "文本框字体大小" - desc: "你可以根据用户界面大小调整文本框中使用的字体大小。" - - message_box_ratio: - label: "文本框大小" - desc: "你可以根据界面比例调整文本框大小\n※可能不准确" - - font_family: - label: "字体" - - ui_language: - label: "界面语言" - - to_restore_main_window_geometry: - label: "记录主界面位置" - desc: "启动时,按照上次的大小和位置启动" - - use_translation_feature: - label: "启用翻译功能" - desc: "关闭此功能时,无法使用翻译功能.VRCT的启动速度会变得更快一些.这适用于不需要翻译功能,只将VRCT用作聊天框和转录工具的用户." - - ctranslate2_weight_type: - label: "选择离线翻译模型" - desc: "可以选择用于离线翻译的翻译模型" - small: "普通模型 (%{capacity})" - large: "高精度模型 (%{capacity})" - - deepl_auth_key: - label: "DeepL 授权密匙" - desc: "在使用的时候,使用时请在主屏幕上通过 DeepL_API 选择 %{translator} \n※某些语言可能不支持" - open_auth_key_webpage: "打开DeepL账号页面" - auth_key_success: "授权密匙认证完成。" - auth_key_error: "授权密匙错误或已达API使用上限" - - mic_host: - label: "麦克风(host/driver)" - - mic_device: - label: "麦克风 (设备)" - - mic_dynamic_energy_threshold: - label_for_automatic: "麦克风输入阈值(当前设置:自动)" - desc_for_automatic: "自动调整麦克风输入阈值" - label_for_manual: "麦克风输入阈值(当前设置:手动)" - desc_for_manual: "使用滑杆手动确定麦克风输入灵敏度。按下麦克风图标输入语音,并在监控音量的同时调节灵敏度。" - error_message: "数值应为 0 至 %{max} 之间。" - - mic_record_timeout: - label: "语音输入结束后的静音时间" - desc: "当检测到静音并经过设定的秒数后,语音输入即被视为完成。" - error_message: "数值应为 0 至 [%{mic_phrase_timeout_label}]" - - mic_phrase_timeout: - label: "转录间隔" - desc: "在经过设定的时间后执行转录" - error_message: "转录间隔时间大于0秒且不能小于「%{mic_record_timeout_label}」" - - mic_max_phrase: - label: "麦克风发送时的最小单词数" - desc: "转录字数的下限,只有超过这个数字,才会记录翻译结果并发送到VRC" - error_message: "数值应为 0 以上" - - mic_word_filter: - label: "单词过滤器" - desc: "检测出被记录的单词时,不会发送这段话\n如要添加多个单词,可以用逗号来分割\n※不会记录重复的单词" - add_button_label: "添加" - count_desc: "现在被记录的单词数: %{count}" - - - speaker_device: - label: "他人语音 (设备)" - - speaker_dynamic_energy_threshold: - label_for_automatic: "他人语音接收阈值(当前设置:自动)" - desc_for_automatic: "自动调节他人语音接收阈值" - label_for_manual: "他人语音接收阈值(当前设置:手动)" - desc_for_manual: "使用滑杆手动调整他人语音接收阈值.在按下耳机按钮时,请根据实际听到的声音调整该大小" - error_message: "设定的数值从 0 到 %{max} " - no_device_error_message: "未检测到他人语音" - - speaker_record_timeout: - label: "语音接收结束后的静音时间" - desc: "当检测到静音并经过设定的秒数后,语音接收即被视为完成。" - error_message: "数值应为 0 至 「%{speaker_phrase_timeout_label}」" - - speaker_phrase_timeout: - label: "转录间隔" - desc: "在经过设定的时间后执行转录" - error_message: "转录间隔时间大于0秒且不能小于「%{speaker_record_timeout_label}」" - - - speaker_max_phrase: - label: "语音接收时的最小单词数" - desc: "转录字数的下限,只有超过这个数字,才会记录转录结果" - error_message: "数值应为 0 以上" - - use_whisper_feature: - label: "使用Whisper模型翻译" - desc: "在某些语言中,语音识别的准确性可能会提高.语音识别的过程中,CPU占有率可能会提高,请根据你的pc性能来决定是否使用它." - - whisper_weight_type: - label: "选择某个Whisper模型" - desc: "通常来说,容量越大的模型精度也会越高,但也会增加文字显示所需要的时间和CPU的使用率。请浏览各个模型的文档\n※特别是大于medium容量的模型、因CPU性能原因甚至无法使用。" - model_template: "%{model_name} 模型 (%{capacity})" - recommended_model_template: "%{model_name} 模型 (%{capacity}) (推荐)" - - - enable_overlay_small_log: - label: "可使用Overlay" - # desc: - open_overlay_settings: "打开Overlay进阶设置" - - - - auto_clear_the_message_box: - label: "发言后自动清空chatbox" - - send_only_translated_messages: - label: "只发送翻译后的信息" - - send_message_button_type: - label: "发送信息按钮" - hide: "隐藏 (可使用回车发送信息)" - show: "显示" - show_and_disable_enter_key: "显示,并且停用‘回车发送信息’" - - # notice_xsoverlay: - # label: "XSOverlayでの通知受け取り機能を有効" - # desc: "文字起こし (受信) されたメッセージをXSOverlayの機能を使って通知として受け取れます。" - - auto_export_message_logs: - label: "自动导出聊天记录" - desc: "以文本文件的形式在logs文件夹中保存。" - - vrc_mic_mute_sync: - label: "与VRC中的麦克风静音同步" - desc: "当VRChat的麦克风处于静音时,不在VRChat中发送信息\n※存在少许延迟且不支持按键发言." - - - send_message_to_vrc: - label: "发送信息至VRChat" - desc: "不发送信息至VRChat的情况下也能使用它,但该功能现在并未完成.在想要发送信息时,请不要忘记打开这个功能." - - - # send_message_format: - # label: "送信するメッセージのフォーマット" - # desc: "VRChatで相手に実際に見えるフォーマットを変更できます。\n[message]がメッセージに置換されます。" - # example_text: "これは例文です。フォントや改行箇所など、実際の表示とは異なる場合があります。" - # error_message: "[message]という文字は使えません。" - - # send_message_format_with_t: - # label: "送信するメッセージのフォーマット(翻訳付き)" - # desc: "VRChatで相手に実際に見えるフォーマットを変更できます。\n[message]がメッセージに置換され、[translation]が翻訳されたメッセージに置換されます。" - # example_text: "これは例文です。フォントや改行箇所など、実際の表示とは異なる場合があります。" - # error_message: "[message]と[translation]という文字は使えません。" - - # received_message_format: - # label: "受信するメッセージのフォーマット" - # desc: "XSOverlay通知受け取り機能で使用されます。\n[message]がメッセージに置換されます。\n※Speaker2Chatboxでの送信機能にも使われます。" - # example_text: "これは例文です。フォントや改行箇所など、実際の表示とは異なる場合があります。" - # error_message: "[message]という文字は使えません。" - - # received_message_format_with_t: - # label: "受信するメッセージのフォーマット(翻訳付き)" - # desc: "XSOverlay通知受け取り機能で使用されます。\n[message]がメッセージに置換され、[translation]が翻訳されたメッセージに置換されます。\n※Speaker2Chatboxでの送信機能にも使われます。" - # example_text: "これは例文です。フォントや改行箇所など、実際の表示とは異なる場合があります。" - # error_message: "[message]と[translation]という文字は使えません。" - - - osc_ip_address: - label: "OSC IP 地址" - - osc_port: - label: "OSC 端口" - - open_config_filepath: - label: "打开设置文件" \ No newline at end of file diff --git a/locales/zh-Hant.yml b/locales/zh-Hant.yml deleted file mode 100644 index 26e79a07..00000000 --- a/locales/zh-Hant.yml +++ /dev/null @@ -1,283 +0,0 @@ -main_window: - translation: "翻譯" - transcription_send: "麥克風轉文字" - transcription_receive: "喇叭轉文字" - foreground: "最上層顯示" - - language_settings: "語言設定" - your_language: "你的語言" - translate_each_other_label: "互相翻譯" - swap_button_label: "交換語言" - target_language: "目標語言" - translator: "翻譯器" - translator_ctranslate2: "離線翻譯(預設)" - - textbox_tab_all: "全部" - textbox_tab_sent: "已發送" - textbox_tab_received: "已接收" - textbox_tab_system: "系統" - - textbox_system_message: - enabled_easter_egg: "你找到了彩蛋!看看你的 VR Overlay 有沒有什麼變化?" - enabled_translation: "翻譯功能已啟用。" - disabled_translation: "翻譯功能已停用。" - enabled_voice2chatbox: "麥克風轉文字已啟用。" - disabled_voice2chatbox: "麥克風轉文字已停用。" - enabled_speaker2log: "喇叭轉文字已啟用。" - disabled_speaker2log: "喇叭轉文字已停用。" - enabled_foreground: "最上層顯示已啟用。" - disabled_foreground: "最上層顯示已停用。" - - auth_key_success: "授權金鑰更新完成。" - auth_key_error: "授權金鑰錯誤或已達使用上限。" - - no_mic_device_detected_error: "未偵測到麥克風。" - no_speaker_device_detected_error: "未偵測到喇叭。" - translation_engine_limit_error: "翻譯引擎已自動變更。由於請求太頻繁,已被這個翻譯引擎暫時受限。如果你想使用相同的翻譯引擎,請稍等片刻,重新啟動 VRCT 並重試。" - - detected_by_word_filter: "由於詞語過濾器的偵測,「%{detected_message}」未被發送。" - - selected_your_language: "「你的語言」已設為 %{your_language}。" - selected_target_language: "「目標語言」已設為 %{target_language}。" - switched_language_preset_tab: "已切換到第 %{tab_no} 個語言設定。" - latest_language_setting: "目前「你的語言」設為 %{your_language},「目標語言」設為 %{target_language}。" - - opened_web_page_booth: "已在瀏覽器中打開 Booth 頁面。" - opened_web_page_vrct_documents: "已在瀏覽器中打開VRCT文件頁面。\n如有任何問題、請求或查詢,請通過文件頁面底部的連結、「聯絡表單」或 X (Twitter) 聯絡我們!" - - update_available: "有新版本可供使用!" - state_text_enabled: "啟用" - state_text_disabled: "停用" - - cover_message: "VRCT 功能在設定視窗關閉前暫時停用。" - - confirmation_message: - update_software: "下載新版本並自動更新 VRCT。\n會花一些時間,現在更新嗎?" - deny_update_software: "稍後再說" - accept_update_software: "更新" - updating: "正在更新..." - - detected_over_ui_size: "介面大小:%{current_ui_size}\nVRCT 的視窗大小可能超過你的螢幕大小。" - deny_adjust_ui_size: "保持目前大小" - accept_adjust_ui_size: "縮小介面並重新啟動" - -selectable_language_window: - title_your_language: "選擇你的語言" - title_target_language: "選擇目標語言" - go_back_button: "返回" - -overlay_settings: - restore_default_settings: "恢復預設設定" - opacity: "透明度" - ui_scaling: "介面縮放" - x_position: "X軸(左右)" - y_position: "Y軸(上下)" - z_position: "Z軸(前後)" - x_rotation: "X軸旋轉" - y_rotation: "Y軸旋轉" - z_rotation: "Z軸旋轉" - display_duration: "顯示持續時間" - fadeout_duration: "淡出持續時間" - -config_window: - config_title: "設定" - compact_mode: "精簡模式" - version: "版本 %{version}" - restart_message: "重新啟動以應用變更。" - common_error_message: - invalid_value: "無效值。" - - side_menu_labels: - appearance: "外觀" - translation: "翻譯" - transcription: "轉錄" - transcription_mic: "麥克風" - transcription_speaker: "喇叭" - transcription_internal_model: "轉錄模型" - vr: "VR" - others: "其他" - others_send_message_formats: "訊息格式(發送)" - others_received_message_formats: "訊息格式(XSOverlay & 喇叭轉文字)" - others_speaker2chatbox: "喇叭轉文字" - advanced_settings: "進階設定" - - transparency: - label: "透明度" - desc: "變更主視窗的透明度。" - - appearance_theme: - label: "主題" - desc: "變更配色主題。" - - ui_size: - label: "介面大小" - - textbox_ui_size: - label: "訊息框字體大小" - desc: "你可以根據介面大小調整記錄中使用的字體大小。" - - message_box_ratio: - label: "訊息框大小" - desc: "你可以依介面比例縮放輸入訊息框。\n*可能不準確。" - - font_family: - label: "字型" - - ui_language: - label: "介面語言" - - to_restore_main_window_geometry: - label: "記住主視窗位置" - desc: "啟動時恢復上次視窗的位置和大小。" - - use_translation_feature: - label: "使用翻譯功能" - desc: "當此功能關閉時,無法使用翻譯功能。但 VRCT 會啟動得更快。適合不需要翻譯功能、只使用VRCT作為聊天框和轉錄工具的使用者。" - - ctranslate2_weight_type: - label: "選擇離線翻譯模型" - desc: "你可以選擇用於離線翻譯引擎的翻譯模型。" - small: "基本模型(%{capacity})" - large: "高準確率模型(%{capacity})" - - deepl_auth_key: - label: "DeepL 授權金鑰" - desc: "使用 DeepL API 時請在主螢幕選擇 %{translator}。※可能不支援某些語言。" - open_auth_key_webpage: "打開 DeepL 帳號頁面" - auth_key_success: "授權金鑰更新完成。" - auth_key_error: "授權金鑰錯誤或已達使用上限。" - - mic_host: - label: "麥克風 Host/Driver" - - mic_device: - label: "麥克風裝置" - - mic_dynamic_energy_threshold: - label_for_automatic: "麥克風能量閾值(當前設置:自動)" - desc_for_automatic: "自動判定麥克風輸入靈敏度。" - label_for_manual: "麥克風能量閾值(當前設置:手動)" - desc_for_manual: "使用滑桿調整麥克風輸入靈敏度,你可以按下麥克風圖示來測試。" - error_message: "可以設置 0 到 %{max} 之間的值。" - - mic_record_timeout: - label: "麥克風音訊 - 判定結束時間" - desc: "麥克風未收到音訊後,結束一段話的判定時間(秒)。" - error_message: "不能大於「%{mic_phrase_timeout_label}」,應為 0 或更高。" - - mic_phrase_timeout: - label: "麥克風音訊 - 紀錄間隔時間" - desc: "每隔多久要紀錄一次音訊。" - error_message: "不能小於「%{mic_record_timeout_label}」,應為 0 或更高。" - - mic_max_phrase: - label: "麥克風音訊 - 最大單詞數量" - desc: "只有在單詞超過此數量時,才會記錄結果並發送到 VRChat。" - error_message: "可以設置為 0 或更高的數值。" - - mic_word_filter: - label: "麥克風單詞過濾器" - desc: "如果偵測到清單內的單詞,則不會發送訊息。要一次新增多個詞語,請用「,」(半形逗號)分隔。\n*重複詞語會被忽略。" - add_button_label: "新增" - count_desc: "當前註冊詞語數量:%{count}" - - speaker_device: - label: "喇叭裝置" - - speaker_dynamic_energy_threshold: - label_for_automatic: "喇叭能量閾值(當前設置:自動)" - desc_for_automatic: "自動確定喇叭輸入靈敏度。" - label_for_manual: "喇叭能量閾值(當前設置:手動)" - desc_for_manual: "使用滑桿調整喇叭輸入靈敏度,你可以按下喇叭圖示來測試。" - error_message: "可以設置 0 到 %{max} 之間的值。" - no_device_error_message: "未偵測到喇叭裝置。" - - speaker_record_timeout: - label: "喇叭音訊 - 判定結束時間" - desc: "偵測到靜音並在指定秒數後認為喇叭輸入已結束。(秒)" - error_message: "不能大於「%{speaker_phrase_timeout_label}」,應為 0 或更高。" - - speaker_phrase_timeout: - label: "喇叭音訊 - 紀錄間隔時間" - desc: "以指定秒數間隔進行轉錄處理。" - error_message: "不能小於「%{speaker_record_timeout_label}」,應為 0 或更高。" - - speaker_max_phrase: - label: "喇叭音訊 - 最大單詞數量" - desc: "只有在單詞超過此數量時,才會記錄結果並發送到 VRChat。" - error_message: "可以設置 0 或更高的數值。" - - use_whisper_feature: - label: "使用 Whisper 模型進行轉錄" - desc: "在某些語言中,語音識別的準確性可能會提高。使用語音識別時,CPU使用率會增加,請根據你的PC規格考慮是否使用此功能。" - - whisper_weight_type: - label: "選擇 Whisper 模型" - desc: "一般來說,容量較大的模型往往具有更高的準確性,但這也導致轉錄時間較長和CPU使用率增加。請參考文檔了解各模型的說明。\n※特別是超過中等大小的模型,根據CPU性能可能難以運行。" - model_template: "%{model_name}模型(%{capacity})" - recommended_model_template: "%{model_name}模型(%{capacity})(推薦)" - - enable_overlay_small_log: - label: "啟用 Overlay" - open_overlay_settings: "打開 Overlay 自定義設定" - - auto_clear_the_message_box: - label: "自動清除 Chatbox" - - send_only_translated_messages: - label: "僅發送翻譯訊息" - - send_message_button_type: - label: "發送訊息按鈕" - hide: "隱藏(使用 Enter 鍵發送)" - show: "顯示" - show_and_disable_enter_key: "顯示並停用 Enter 鍵發送" - - notice_xsoverlay: - label: "XSOverlay 通知" - desc: "從 XSOverlay 的通知功能接收訊息。" - - auto_export_message_logs: - label: "自動匯出訊息記錄" - desc: "自動將對話訊息匯出為文字文件。" - - vrc_mic_mute_sync: - label: "VRC 麥克風靜音同步" - desc: "當 VRChat 的麥克風靜音時,VRCT 將不會向 VRChat 發送訊息。\n*存在一些延遲且不支援按鍵發話 (PTT)。" - - send_message_to_vrc: - label: "發送訊息到 VRChat" - desc: "當你打算向 VRChat 發送訊息時啟用此功能。" - - send_message_format: - label: "發送的訊息格式" - desc: "你可以設定要發送的訊息格式。\n[message] 將被替換為訊息。" - example_text: "這是一個範例。字體、換行等可能與實際顯示不同。" - error_message: "不能使用 [message] 。" - - send_message_format_with_t: - label: "發送的訊息格式(帶翻譯)" - desc: "你可以設定要發送的訊息格式。\n[message] 將被替換為訊息,並且 [translation] 將被替換為翻譯訊息。" - example_text: "這是一個範例。字體、換行等可能與實際顯示不同。" - error_message: "不能使用 [message] 和 [translation] 。" - - received_message_format: - label: "接收的訊息格式" - desc: "用於 XSOverlay 的通知接收功能。\n[message] 將被替換為訊息。\n※它也將用於喇叭轉文字功能。" - example_text: "這是一個範例。字體、換行等可能與實際顯示不同。" - error_message: "不能使用 [message] 。" - - received_message_format_with_t: - label: "接收的訊息格式(附翻譯)" - desc: "用於 XSOverlay 的通知接收功能。\n[message] 將被替換為訊息,並且 [translation] 將被替換為翻譯訊息。\n※它也將用於喇叭轉文字功能。" - example_text: "這是一個範例。字體、換行等可能與實際顯示不同。" - error_message: "不能使用 [message] 和 [translation] 。" - - osc_ip_address: - label: "OSC IP 位址" - - osc_port: - label: "OSC 端口" - - open_config_filepath: - label: "打開設定文件" \ No newline at end of file diff --git a/main.py b/main.py deleted file mode 100644 index 257a3a63..00000000 --- a/main.py +++ /dev/null @@ -1,33 +0,0 @@ -if __name__ == "__main__": - try: - import ctypes - ctypes.windll.shcore.SetProcessDpiAwareness(0) - - from vrct_gui.splash_window import SplashWindow - splash = SplashWindow() - splash.showSplash() - - from config import config - # version 2.2.0からweightフォルダをweightsに変更する - from utils import renameWeightFolder - renameWeightFolder(config.PATH_LOCAL) - - from models.translation.translation_utils import downloadCTranslate2Weight - if config.USE_TRANSLATION_FEATURE is True: - downloadCTranslate2Weight(config.PATH_LOCAL, config.CTRANSLATE2_WEIGHT_TYPE, splash.updateDownloadProgress) - - from models.transcription.transcription_whisper import downloadWhisperWeight - if config.USE_WHISPER_FEATURE is True: - downloadWhisperWeight(config.PATH_LOCAL, config.WHISPER_WEIGHT_TYPE, splash.updateDownloadProgress) - - splash.toProgress(0) - - import controller - controller.createMainWindow(splash) - splash.destroySplash() - controller.showMainWindow() - - except Exception: - import traceback - with open('error.log', 'a') as f: - traceback.print_exc(file=f) \ No newline at end of file diff --git a/model.py b/model.py deleted file mode 100644 index 58b587a4..00000000 --- a/model.py +++ /dev/null @@ -1,706 +0,0 @@ -import gc -from subprocess import Popen -from os import makedirs as os_makedirs -from os import path as os_path -from shutil import copyfile -from datetime import datetime -from logging import getLogger, FileHandler, Formatter, INFO -from time import sleep -from queue import Queue -from threading import Thread -from packaging.version import parse - -from requests import get as requests_get -from flashtext import KeywordProcessor -from models.translation.translation_translator import Translator -from models.transcription.transcription_utils import getInputDevices, getOutputDevices -from models.osc.osc_tools import sendTyping, sendMessage, receiveOscParameters, getOSCParameterValue -from models.transcription.transcription_recorder import SelectedMicEnergyAndAudioRecorder, SelectedSpeakerEnergyAndAudioRecorder -from models.transcription.transcription_recorder import SelectedMicEnergyRecorder, SelectedSpeakerEnergyRecorder -from models.transcription.transcription_transcriber import AudioTranscriber -from models.translation.translation_languages import translation_lang -from models.transcription.transcription_languages import transcription_lang -from models.translation.translation_utils import checkCTranslate2Weight -from models.transcription.transcription_whisper import checkWhisperWeight -from models.overlay.overlay import Overlay -from models.overlay.overlay_image import OverlayImage - -from config import config - -class threadFnc(Thread): - def __init__(self, fnc, end_fnc=None, daemon=True, *args, **kwargs): - super(threadFnc, self).__init__(daemon=daemon, target=fnc, *args, **kwargs) - self.fnc = fnc - self.end_fnc = end_fnc - self.loop = True - self._pause = False - - def stop(self): - self.loop = False - - def pause(self): - self._pause = True - - def resume(self): - self._pause = False - - def run(self): - while self.loop: - self.fnc(*self._args, **self._kwargs) - while self._pause: - sleep(0.1) - - if callable(self.end_fnc): - self.end_fnc() - return - -class Model: - _instance = None - - def __new__(cls): - if cls._instance is None: - cls._instance = super(Model, cls).__new__(cls) - cls._instance.init() - return cls._instance - - def init(self): - self.logger = None - self.mic_print_transcript = None - self.mic_audio_recorder = None - self.mic_energy_recorder = None - self.mic_energy_plot_progressbar = None - self.speaker_print_transcript = None - self.speaker_audio_recorder = None - self.speaker_energy_recorder = None - self.speaker_energy_plot_progressbar = None - self.previous_send_message = "" - self.previous_receive_message = "" - self.translator = Translator() - self.keyword_processor = KeywordProcessor() - self.overlay = Overlay( - config.OVERLAY_SMALL_LOG_SETTINGS["x_pos"], - config.OVERLAY_SMALL_LOG_SETTINGS["y_pos"], - config.OVERLAY_SMALL_LOG_SETTINGS["z_pos"], - config.OVERLAY_SMALL_LOG_SETTINGS["x_rotation"], - config.OVERLAY_SMALL_LOG_SETTINGS["y_rotation"], - config.OVERLAY_SMALL_LOG_SETTINGS["z_rotation"], - config.OVERLAY_SMALL_LOG_SETTINGS["display_duration"], - config.OVERLAY_SMALL_LOG_SETTINGS["fadeout_duration"], - config.OVERLAY_SETTINGS["opacity"], - config.OVERLAY_SETTINGS["ui_scaling"], - ) - self.overlay_image = OverlayImage() - self.pre_overlay_message = None - self.th_overlay = None - self.mic_audio_queue = None - self.mic_mute_status = None - self.mic_mute_status_check = None - - def checkCTranslatorCTranslate2ModelWeight(self): - return checkCTranslate2Weight(config.PATH_LOCAL, config.CTRANSLATE2_WEIGHT_TYPE) - - def changeTranslatorCTranslate2Model(self): - self.translator.changeCTranslate2Model(config.PATH_LOCAL, config.CTRANSLATE2_WEIGHT_TYPE) - - def isLoadedCTranslate2Model(self): - return self.translator.isLoadedCTranslate2Model() - - def checkTranscriptionWhisperModelWeight(self): - return checkWhisperWeight(config.PATH_LOCAL, config.WHISPER_WEIGHT_TYPE) - - def resetKeywordProcessor(self): - del self.keyword_processor - self.keyword_processor = KeywordProcessor() - - def authenticationTranslatorDeepLAuthKey(self, auth_key): - result = self.translator.authenticationDeepLAuthKey(auth_key) - return result - - def startLogger(self): - os_makedirs(config.PATH_LOGS, exist_ok=True) - logger = getLogger() - logger.setLevel(INFO) - file_name = os_path.join(config.PATH_LOGS, f"{datetime.now().strftime('%Y-%m-%d_%H-%M-%S')}.log") - file_handler = FileHandler(file_name, encoding="utf-8", delay=True) - formatter = Formatter("[%(asctime)s] %(message)s") - file_handler.setFormatter(formatter) - logger.addHandler(file_handler) - self.logger = logger - self.logger.disabled = False - - def stopLogger(self): - self.logger.disabled = True - self.logger = None - - def getListLanguageAndCountry(self): - transcription_langs = list(transcription_lang.keys()) - translation_langs = [] - for tl_key in translation_lang.keys(): - for lang in translation_lang[tl_key]["source"]: - translation_langs.append(lang) - translation_langs = list(set(translation_langs)) - supported_langs = list(filter(lambda x: x in transcription_langs, translation_langs)) - - languages = [] - for language in supported_langs: - for country in transcription_lang[language]: - languages.append( - { - "language" : language, - "country" : country, - } - ) - languages = sorted(languages, key=lambda x: x['language']) - return languages - - def findTranslationEngines(self, source_lang, target_lang): - compatible_engines = [] - for engine in list(translation_lang.keys()): - languages = translation_lang.get(engine, {}).get("source", {}) - if source_lang in languages and target_lang in languages: - compatible_engines.append(engine) - if "DeepL_API" in compatible_engines: - if config.AUTH_KEYS["DeepL_API"] is None: - compatible_engines.remove('DeepL_API') - return compatible_engines - - def getTranslate(self, translator_name, source_language, target_language, target_country, message): - success_flag = False - translation = self.translator.translate( - translator_name=translator_name, - source_language=source_language, - target_language=target_language, - target_country=target_country, - message=message - ) - - # 翻訳失敗時のフェールセーフ処理 - if isinstance(translation, str): - success_flag = True - else: - while True: - translation = self.translator.translate( - translator_name="CTranslate2", - source_language=source_language, - target_language=target_language, - target_country=target_country, - message=message - ) - if translation is not False: - break - sleep(0.1) - return translation, success_flag - - def getInputTranslate(self, message): - translator_name=config.CHOICE_INPUT_TRANSLATOR - source_language=config.SOURCE_LANGUAGE - target_language=config.TARGET_LANGUAGE - target_country = config.TARGET_COUNTRY - - translation, success_flag = self.getTranslate( - translator_name, - source_language, - target_language, - target_country, - message - ) - return translation, success_flag - - def getOutputTranslate(self, message): - translator_name=config.CHOICE_OUTPUT_TRANSLATOR - source_language=config.TARGET_LANGUAGE - target_language=config.SOURCE_LANGUAGE - target_country=config.SOURCE_COUNTRY - - translation, success_flag = self.getTranslate( - translator_name, - source_language, - target_language, - target_country, - message - ) - return translation, success_flag - - def addKeywords(self): - for f in config.INPUT_MIC_WORD_FILTER: - self.keyword_processor.add_keyword(f) - - def checkKeywords(self, message): - return len(self.keyword_processor.extract_keywords(message)) != 0 - - def detectRepeatSendMessage(self, message): - repeat_flag = False - if self.previous_send_message == message: - repeat_flag = True - self.previous_send_message = message - return repeat_flag - - def detectRepeatReceiveMessage(self, message): - repeat_flag = False - if self.previous_receive_message == message: - repeat_flag = True - self.previous_receive_message = message - return repeat_flag - - @staticmethod - def oscStartSendTyping(): - sendTyping(True, config.OSC_IP_ADDRESS, config.OSC_PORT) - - @staticmethod - def oscStopSendTyping(): - sendTyping(False, config.OSC_IP_ADDRESS, config.OSC_PORT) - - @staticmethod - def oscSendMessage(message): - sendMessage(message, config.OSC_IP_ADDRESS, config.OSC_PORT) - - @staticmethod - def getMuteSelfStatus(): - return getOSCParameterValue(address="/avatar/parameters/MuteSelf") - - def startCheckMuteSelfStatus(self): - def checkMuteSelfStatus(): - if self.mic_mute_status is not None: - self.changeMicTranscriptStatus() - self.stopCheckMuteSelfStatus() - - status = self.getMuteSelfStatus() - if status is not None: - self.mic_mute_status = status - self.changeMicTranscriptStatus() - self.stopCheckMuteSelfStatus() - - if not isinstance(self.mic_mute_status_check, threadFnc): - self.mic_mute_status_check = threadFnc(checkMuteSelfStatus) - self.mic_mute_status_check.daemon = True - self.mic_mute_status_check.start() - - def stopCheckMuteSelfStatus(self): - if isinstance(self.mic_mute_status_check, threadFnc): - self.mic_mute_status_check.stop() - self.mic_mute_status_check = None - - def startReceiveOSC(self): - osc_parameter_prefix = "/avatar/parameters/" - param_MuteSelf = "MuteSelf" - - def change_handler_mute(address, osc_arguments): - if osc_arguments is True and self.mic_mute_status is False: - self.mic_mute_status = osc_arguments - self.changeMicTranscriptStatus() - elif osc_arguments is False and self.mic_mute_status is True: - self.mic_mute_status = osc_arguments - self.changeMicTranscriptStatus() - - dict_filter_and_target = { - osc_parameter_prefix + param_MuteSelf: change_handler_mute, - } - - th_osc_server = Thread(target=receiveOscParameters, args=(dict_filter_and_target,)) - th_osc_server.daemon = True - th_osc_server.start() - - @staticmethod - def checkSoftwareUpdated(): - # check update - update_flag = False - response = requests_get(config.GITHUB_URL) - json_data = response.json() - - version = json_data.get("name", None) - if isinstance(version, str): - new_version = parse(version) - current_version = parse(config.VERSION) - if new_version > current_version: - update_flag = True - print("software version", "now:", config.VERSION, "new:", version) - - return update_flag - - @staticmethod - def updateSoftware(restart:bool=True, func=None): - # try to update at most 5 times - for _ in range(5): - try: - program_name = "update.exe" - current_directory = config.PATH_LOCAL - res = requests_get(config.UPDATER_URL) - assets = res.json()['assets'] - url = [i["browser_download_url"] for i in assets if i["name"] == program_name][0] - res = requests_get(url, stream=True) - with open(os_path.join(current_directory, program_name), 'wb') as file: - for chunk in res.iter_content(chunk_size=1024*5): - file.write(chunk) - break - except Exception: - import traceback - with open('error.log', 'a') as f: - traceback.print_exc(file=f) - # run updater - Popen(program_name, cwd=current_directory) - while True: - sleep(1) - - @staticmethod - def reStartSoftware(): - program_name = 'VRCT.exe' - folder_name = '_internal' - batch_name = 'restart.bat' - current_directory = config.PATH_LOCAL - copyfile(os_path.join(current_directory, folder_name, "batch", batch_name), os_path.join(current_directory, batch_name)) - command = [os_path.join(current_directory, batch_name), program_name] - Popen(command, cwd=current_directory) - - @staticmethod - def getListInputHost(): - return [host for host in getInputDevices().keys()] - - @staticmethod - def getInputDefaultDevice(): - return getInputDevices().get(config.CHOICE_MIC_HOST, [{"name": "NoDevice"}])[0]["name"] - - @staticmethod - def getListInputDevice(): - return [device["name"] for device in getInputDevices().get(config.CHOICE_MIC_HOST, [{"name": "NoDevice"}])] - - @staticmethod - def getListOutputDevice(): - return [device["name"] for device in getOutputDevices()] - - def startMicTranscript(self, fnc, error_fnc=None): - mic_device_list = getInputDevices().get(config.CHOICE_MIC_HOST, [{"name": "NoDevice"}]) - choice_mic_device = [device for device in mic_device_list if device["name"] == config.CHOICE_MIC_DEVICE] - if len(choice_mic_device) == 0: - try: - error_fnc() - except Exception: - pass - return - - self.mic_audio_queue = Queue() - # self.mic_energy_queue = Queue() - - mic_device = choice_mic_device[0] - record_timeout = config.INPUT_MIC_RECORD_TIMEOUT - phrase_timeout = config.INPUT_MIC_PHRASE_TIMEOUT - if record_timeout > phrase_timeout: - record_timeout = phrase_timeout - - self.mic_audio_recorder = SelectedMicEnergyAndAudioRecorder( - device=mic_device, - energy_threshold=config.INPUT_MIC_ENERGY_THRESHOLD, - dynamic_energy_threshold=config.INPUT_MIC_DYNAMIC_ENERGY_THRESHOLD, - record_timeout=record_timeout, - ) - # self.mic_audio_recorder.recordIntoQueue(self.mic_audio_queue, mic_energy_queue) - self.mic_audio_recorder.recordIntoQueue(self.mic_audio_queue, None) - self.mic_transcriber = AudioTranscriber( - speaker=False, - source=self.mic_audio_recorder.source, - phrase_timeout=phrase_timeout, - max_phrases=config.INPUT_MIC_MAX_PHRASES, - transcription_engine=config.SELECTED_TRANSCRIPTION_ENGINE, - root=config.PATH_LOCAL, - whisper_weight_type=config.WHISPER_WEIGHT_TYPE, - ) - def sendMicTranscript(): - try: - res = self.mic_transcriber.transcribeAudioQueue( - self.mic_audio_queue, - config.SOURCE_LANGUAGE, - config.SOURCE_COUNTRY, - config.INPUT_MIC_AVG_LOGPROB, - config.INPUT_MIC_NO_SPEECH_PROB - ) - if res: - message = self.mic_transcriber.getTranscript() - fnc(message) - except Exception: - pass - - def endMicTranscript(): - while not self.mic_audio_queue.empty(): - self.mic_audio_queue.get() - # while not self.mic_energy_queue.empty(): - # self.mic_energy_queue.get() - del self.mic_transcriber - gc.collect() - - # def sendMicEnergy(): - # if mic_energy_queue.empty() is False: - # energy = mic_energy_queue.get() - # # print("mic energy:", energy) - # try: - # fnc(energy) - # except Exception: - # pass - # sleep(0.01) - - self.mic_print_transcript = threadFnc(sendMicTranscript, end_fnc=endMicTranscript) - self.mic_print_transcript.daemon = True - self.mic_print_transcript.start() - - # self.mic_get_energy = threadFnc(sendMicEnergy) - # self.mic_get_energy.daemon = True - # self.mic_get_energy.start() - - self.changeMicTranscriptStatus() - - def resumeMicTranscript(self): - # キューをクリア - if isinstance(self.mic_audio_queue, Queue): - while not self.mic_audio_queue.empty(): - self.mic_audio_queue.get() - - # 文字起こしを再開 - # if isinstance(self.mic_print_transcript, threadFnc): - # self.mic_print_transcript.resume() - - # 音声のレコードを再開 - if isinstance(self.mic_audio_recorder, SelectedMicEnergyAndAudioRecorder): - self.mic_audio_recorder.resume() - - def pauseMicTranscript(self): - # 文字起こしを一時停止 - # if isinstance(self.mic_print_transcript, threadFnc): - # self.mic_print_transcript.pause() - - # 音声のレコードを一時停止 - if isinstance(self.mic_audio_recorder, SelectedMicEnergyAndAudioRecorder): - self.mic_audio_recorder.pause() - - def changeMicTranscriptStatus(self): - if config.ENABLE_VRC_MIC_MUTE_SYNC is True: - if self.mic_mute_status is True: - self.pauseMicTranscript() - elif self.mic_mute_status is False: - self.resumeMicTranscript() - else: - pass - else: - self.resumeMicTranscript() - - def stopMicTranscript(self): - if isinstance(self.mic_print_transcript, threadFnc): - self.mic_print_transcript.stop() - self.mic_print_transcript.join() - self.mic_print_transcript = None - if isinstance(self.mic_audio_recorder, SelectedMicEnergyAndAudioRecorder): - self.mic_audio_recorder.resume() - self.mic_audio_recorder.stop() - self.mic_audio_recorder = None - # if isinstance(self.mic_get_energy, threadFnc): - # self.mic_get_energy.stop() - # self.mic_get_energy = None - - def startCheckMicEnergy(self, fnc, end_fnc, error_fnc=None): - mic_device_list = getInputDevices().get(config.CHOICE_MIC_HOST, [{"name": "NoDevice"}]) - choice_mic_device = [device for device in mic_device_list if device["name"] == config.CHOICE_MIC_DEVICE] - if len(choice_mic_device) == 0: - try: - error_fnc() - except Exception: - pass - return - - def sendMicEnergy(): - if mic_energy_queue.empty() is False: - energy = mic_energy_queue.get() - try: - fnc(energy) - except Exception: - pass - sleep(0.01) - - mic_energy_queue = Queue() - mic_device = choice_mic_device[0] - self.mic_energy_recorder = SelectedMicEnergyRecorder(mic_device) - self.mic_energy_recorder.recordIntoQueue(mic_energy_queue) - self.mic_energy_plot_progressbar = threadFnc(sendMicEnergy, end_fnc=end_fnc) - self.mic_energy_plot_progressbar.daemon = True - self.mic_energy_plot_progressbar.start() - - def stopCheckMicEnergy(self): - if isinstance(self.mic_energy_plot_progressbar, threadFnc): - self.mic_energy_plot_progressbar.stop() - self.mic_energy_plot_progressbar = None - if isinstance(self.mic_energy_recorder, SelectedMicEnergyRecorder): - self.mic_energy_recorder.stop() - self.mic_energy_recorder = None - - def startSpeakerTranscript(self, fnc, error_fnc=None): - speaker_device_list = getOutputDevices() - choice_speaker_device = [device for device in speaker_device_list if device["name"] == config.CHOICE_SPEAKER_DEVICE] - if len(choice_speaker_device) == 0: - try: - error_fnc() - except Exception: - pass - return - - speaker_audio_queue = Queue() - # speaker_energy_queue = Queue() - speaker_device = choice_speaker_device[0] - record_timeout = config.INPUT_SPEAKER_RECORD_TIMEOUT - phrase_timeout = config.INPUT_SPEAKER_PHRASE_TIMEOUT - if record_timeout > phrase_timeout: - record_timeout = phrase_timeout - - self.speaker_audio_recorder = SelectedSpeakerEnergyAndAudioRecorder( - device=speaker_device, - energy_threshold=config.INPUT_SPEAKER_ENERGY_THRESHOLD, - dynamic_energy_threshold=config.INPUT_SPEAKER_DYNAMIC_ENERGY_THRESHOLD, - record_timeout=record_timeout, - ) - # self.speaker_audio_recorder.recordIntoQueue(speaker_audio_queue, speaker_energy_queue) - self.speaker_audio_recorder.recordIntoQueue(speaker_audio_queue, None) - self.speaker_transcriber = AudioTranscriber( - speaker=True, - source=self.speaker_audio_recorder.source, - phrase_timeout=phrase_timeout, - max_phrases=config.INPUT_SPEAKER_MAX_PHRASES, - transcription_engine=config.SELECTED_TRANSCRIPTION_ENGINE, - root=config.PATH_LOCAL, - whisper_weight_type=config.WHISPER_WEIGHT_TYPE, - ) - def sendSpeakerTranscript(): - try: - res = self.speaker_transcriber.transcribeAudioQueue( - speaker_audio_queue, - config.TARGET_LANGUAGE, - config.TARGET_COUNTRY, - config.INPUT_SPEAKER_AVG_LOGPROB, - config.INPUT_SPEAKER_NO_SPEECH_PROB - ) - if res: - message = self.speaker_transcriber.getTranscript() - fnc(message) - except Exception: - pass - - def endSpeakerTranscript(): - speaker_audio_queue.queue.clear() - # speaker_energy_queue.queue.clear() - del self.speaker_transcriber - gc.collect() - - # def sendSpeakerEnergy(): - # if speaker_energy_queue.empty() is False: - # energy = speaker_energy_queue.get() - # # print("speaker energy:", energy) - # try: - # fnc(energy) - # except Exception: - # pass - # sleep(0.01) - - self.speaker_print_transcript = threadFnc(sendSpeakerTranscript, end_fnc=endSpeakerTranscript) - self.speaker_print_transcript.daemon = True - self.speaker_print_transcript.start() - - # self.speaker_get_energy = threadFnc(sendSpeakerEnergy) - # self.speaker_get_energy.daemon = True - # self.speaker_get_energy.start() - - def stopSpeakerTranscript(self): - if isinstance(self.speaker_print_transcript, threadFnc): - self.speaker_print_transcript.stop() - self.speaker_print_transcript.join() - self.speaker_print_transcript = None - if isinstance(self.speaker_audio_recorder, SelectedSpeakerEnergyAndAudioRecorder): - self.speaker_audio_recorder.stop() - self.speaker_audio_recorder = None - # if isinstance(self.speaker_get_energy, threadFnc): - # self.speaker_get_energy.stop() - # self.speaker_get_energy = None - - def startCheckSpeakerEnergy(self, fnc, end_fnc, error_fnc=None): - speaker_device_list = getOutputDevices() - choice_speaker_device = [device for device in speaker_device_list if device["name"] == config.CHOICE_SPEAKER_DEVICE] - if len(choice_speaker_device) == 0: - try: - error_fnc() - except Exception: - pass - return - - def sendSpeakerEnergy(): - if speaker_energy_queue.empty() is False: - energy = speaker_energy_queue.get() - try: - fnc(energy) - except Exception: - pass - sleep(0.01) - - speaker_energy_queue = Queue() - speaker_device = choice_speaker_device[0] - self.speaker_energy_recorder = SelectedSpeakerEnergyRecorder(speaker_device) - self.speaker_energy_recorder.recordIntoQueue(speaker_energy_queue) - self.speaker_energy_plot_progressbar = threadFnc(sendSpeakerEnergy, end_fnc=end_fnc) - self.speaker_energy_plot_progressbar.daemon = True - self.speaker_energy_plot_progressbar.start() - - def stopCheckSpeakerEnergy(self): - if isinstance(self.speaker_energy_plot_progressbar, threadFnc): - self.speaker_energy_plot_progressbar.stop() - self.speaker_energy_plot_progressbar = None - if isinstance(self.speaker_energy_recorder, SelectedSpeakerEnergyRecorder): - self.speaker_energy_recorder.stop() - self.speaker_energy_recorder = None - - def createOverlayImageShort(self, message, translation): - your_language = config.TARGET_LANGUAGE - target_language = config.SOURCE_LANGUAGE - ui_type = config.OVERLAY_UI_TYPE - self.pre_overlay_message = { - "message" : message, - "your_language" : your_language, - "translation" : translation, - "target_language" : target_language, - "ui_type" : ui_type, - } - return self.overlay_image.createOverlayImageShort(message, your_language, translation, target_language, ui_type) - - # def createOverlayImageLong(self, message_type, message, translation): - # your_language = config.TARGET_LANGUAGE if message_type == "receive" else config.SOURCE_LANGUAGE - # target_language = config.SOURCE_LANGUAGE if message_type == "receive" else config.TARGET_LANGUAGE - # return self.overlay_image.create_overlay_image_long(message_type, message, your_language, translation, target_language) - - def clearOverlayImage(self): - self.overlay.clearImage() - - def updateOverlay(self, img): - self.overlay.updateImage(img) - - def startOverlay(self): - self.overlay.startOverlay() - - def updateOverlayPosition(self): - self.overlay.updatePosition( - config.OVERLAY_SMALL_LOG_SETTINGS["x_pos"], - config.OVERLAY_SMALL_LOG_SETTINGS["y_pos"], - config.OVERLAY_SMALL_LOG_SETTINGS["z_pos"], - config.OVERLAY_SMALL_LOG_SETTINGS["x_rotation"], - config.OVERLAY_SMALL_LOG_SETTINGS["y_rotation"], - config.OVERLAY_SMALL_LOG_SETTINGS["z_rotation"], - ) - - def updateOverlayTimes(self): - display_duration = config.OVERLAY_SMALL_LOG_SETTINGS["display_duration"] - self.overlay.updateDisplayDuration(display_duration) - fadeout_duration = config.OVERLAY_SMALL_LOG_SETTINGS["fadeout_duration"] - self.overlay.updateFadeoutDuration(fadeout_duration) - - def updateOverlayImageOpacity(self): - opacity = config.OVERLAY_SETTINGS["opacity"] - self.overlay.updateOpacity(opacity, with_fade=True) - - def updateOverlayImageUiScaling(self): - ui_scaling = config.OVERLAY_SETTINGS["ui_scaling"] - self.overlay.updateUiScaling(ui_scaling) - - def shutdownOverlay(self): - self.overlay.shutdownOverlay() - -model = Model() \ No newline at end of file diff --git a/models/osc/osc_tools.py b/models/osc/osc_tools.py deleted file mode 100644 index 67ceee5c..00000000 --- a/models/osc/osc_tools.py +++ /dev/null @@ -1,103 +0,0 @@ -from time import sleep -from pythonosc import osc_message_builder -from pythonosc import udp_client -from pythonosc import dispatcher -from pythonosc import osc_server -from tinyoscquery.queryservice import OSCQueryService -from tinyoscquery.query import OSCQueryBrowser, OSCQueryClient -from tinyoscquery.utility import get_open_udp_port, get_open_tcp_port - -# send OSC message typing -def sendTyping(flag=False, ip_address="127.0.0.1", port=9000): - typing = osc_message_builder.OscMessageBuilder(address="/chatbox/typing") - typing.add_arg(flag) - b_typing = typing.build() - client = udp_client.SimpleUDPClient(ip_address, port) - client.send(b_typing) - -# send OSC message -def sendMessage(message=None, ip_address="127.0.0.1", port=9000): - if message is not None: - msg = osc_message_builder.OscMessageBuilder(address="/chatbox/input") - msg.add_arg(f"{message}") - msg.add_arg(True) - msg.add_arg(True) - b_msg = msg.build() - client = udp_client.SimpleUDPClient(ip_address, port) - client.send(b_msg) - -def sendTestAction(ip_address="127.0.0.1", port=9000): - client = udp_client.SimpleUDPClient(ip_address, port) - client.send_message("/input/Vertical", 1) - sleep(0.01) - client.send_message("/input/Vertical", False) - -# send Input Voice -def sendInputVoice(flag=False, ip_address="127.0.0.1", port=9000): - input_voice = osc_message_builder.OscMessageBuilder(address="/input/Voice") - input_voice.add_arg(flag) - b_input_voice = input_voice.build() - client = udp_client.SimpleUDPClient(ip_address, port) - client.send(b_input_voice) - -def sendChangeVoice(ip_address="127.0.0.1", port=9000): - sendInputVoice(flag=0, ip_address=ip_address, port=port) - sleep(0.05) - sendInputVoice(flag=1, ip_address=ip_address, port=port) - sleep(0.05) - sendInputVoice(flag=0, ip_address=ip_address, port=port) - sleep(0.05) - -def getOSCParameterValue(address, server_name="VRChat-Client"): - value = None - try: - browser = OSCQueryBrowser() - sleep(1) - service = browser.find_service_by_name(server_name) - if service is not None: - oscq = OSCQueryClient(service) - mute_self_node = oscq.query_node(address) - value = mute_self_node.value[0] - browser.zc.close() - browser.browser.cancel() - - except Exception: - pass - return value - -def receiveOscParameters(dict_filter_and_target, ip_address="127.0.0.1", title="VRCT"): - osc_port = get_open_udp_port() - http_port = get_open_tcp_port() - osc_dispatcher = dispatcher.Dispatcher() - for filter, target in dict_filter_and_target.items(): - osc_dispatcher.map(filter, target) - osc_udp_server = osc_server.ThreadingOSCUDPServer((ip_address, osc_port), osc_dispatcher) - - osc_client = OSCQueryService(title, http_port, osc_port) - for filter, target in dict_filter_and_target.items(): - osc_client.advertise_endpoint(filter) - - osc_udp_server.serve_forever() - -if __name__ == "__main__": - osc_parameter_prefix = "/avatar/parameters/" - osc_avatar_change_path = "/avatar/change" - param_MuteSelf = "MuteSelf" - param_Voice = "Voice" - - def print_handler_all(address, *args): - print(f"all {address}: {args}") - - def print_handler_muteself(address, *args): - print(f"muteself {address}: {args}") - - def print_handler_voice(address, *args): - print(f"voice {address}: {args}") - - dict_filter_and_target = { - # osc_parameter_prefix + "*": print_handler_all, - osc_parameter_prefix + param_MuteSelf: print_handler_muteself, - osc_parameter_prefix + param_Voice: print_handler_voice, - } - - receiveOscParameters(dict_filter_and_target) \ No newline at end of file diff --git a/models/overlay/overlay.py b/models/overlay/overlay.py deleted file mode 100644 index 7ebb05bc..00000000 --- a/models/overlay/overlay.py +++ /dev/null @@ -1,317 +0,0 @@ -import os -import ctypes -import time -from psutil import process_iter -from threading import Thread -import openvr -import numpy as np -from PIL import Image -try: - from . import overlay_utils as utils -except ImportError: - import overlay_utils as utils - -def mat34Id(array): - arr = openvr.HmdMatrix34_t() - for i in range(3): - for j in range(4): - arr[i][j] = array[i][j] - return arr - -def getBaseMatrix(x_pos, y_pos, z_pos, x_rotation, y_rotation, z_rotation): - arr = np.zeros((3, 4)) - rot = utils.euler_to_rotation_matrix((x_rotation, y_rotation, z_rotation)) - - for i in range(3): - for j in range(3): - arr[i][j] = rot[i][j] - - arr[0][3] = x_pos * z_pos - arr[1][3] = y_pos * z_pos - arr[2][3] = - z_pos - return arr - -def getHMDBaseMatrix(): - x_pos = 0.0 - y_pos = -0.4 - z_pos = 1.0 - x_rotation = 0.0 - y_rotation = 0.0 - z_rotation = 0.0 - arr = getBaseMatrix(x_pos, y_pos, z_pos, x_rotation, y_rotation, z_rotation) - return arr - -def getLeftHandBaseMatrix(): - x_pos = 0.0 - y_pos = -0.06 - z_pos = -0.14 - x_rotation = -62.0 - y_rotation = 154.0 - z_rotation = 71.0 - arr = getBaseMatrix(x_pos, y_pos, z_pos, x_rotation, y_rotation, z_rotation) - return arr - -def getRightHandBaseMatrix(): - x_pos = 0.0 - y_pos = -0.06 - z_pos = -0.14 - x_rotation = -62.0 - y_rotation = -154.0 - z_rotation = -71.0 - arr = getBaseMatrix(x_pos, y_pos, z_pos, x_rotation, y_rotation, z_rotation) - return arr - -class Overlay: - def __init__(self, x_pos, y_pos, z_pos, x_rotation, y_rotation, z_rotation, display_duration, fadeout_duration, opacity, ui_scaling): - self.initialized = False - settings = { - "color": [1, 1, 1], - "opacity": opacity, - "x_pos": x_pos, - "y_pos": y_pos, - "z_pos": z_pos, - "x_rotation": x_rotation, - "y_rotation": y_rotation, - "z_rotation": z_rotation, - "display_duration": display_duration, - "fadeout_duration": fadeout_duration, - "ui_scaling": ui_scaling, - } - self.settings = settings - self.system = None - self.overlay = None - self.handle = None - self.lastUpdate = time.monotonic() - self.thread_overlay = None - self.fadeRatio = 1 - self.loop = True - - def init(self): - try: - self.system = openvr.init(openvr.VRApplication_Background) - self.overlay = openvr.IVROverlay() - self.overlay_system = openvr.IVRSystem() - self.handle = self.overlay.createOverlay("Overlay_Speaker2log", "Overlay_Speaker2log_UI") - self.overlay.showOverlay(self.handle) - self.initialized = True - - self.updateImage(Image.new("RGBA", (1, 1), (0, 0, 0, 0))) - self.updateColor(self.settings["color"]) - self.updateOpacity(self.settings["opacity"]) - self.updateUiScaling(self.settings["ui_scaling"]) - self.updatePosition( - self.settings["x_pos"], - self.settings["y_pos"], - self.settings["z_pos"], - self.settings["x_rotation"], - self.settings["y_rotation"], - self.settings["z_rotation"], - ) - - except Exception as e: - print("Could not initialise OpenVR", e) - - def updateImage(self, img): - if self.initialized is True: - width, height = img.size - img = img.tobytes() - img = (ctypes.c_char * len(img)).from_buffer_copy(img) - - try: - self.overlay.setOverlayRaw(self.handle, img, width, height, 4) - except Exception as e: - print("Could not update image", e) - self.initialized = False - self.reStartOverlay() - while self.initialized is False: - time.sleep(0.1) - self.overlay.setOverlayRaw(self.handle, img, width, height, 4) - self.updateOpacity(self.settings["opacity"]) - self.lastUpdate = time.monotonic() - - def clearImage(self): - if self.initialized is True: - self.updateImage(Image.new("RGBA", (1, 1), (0, 0, 0, 0))) - - def updateColor(self, col): - """ - col is a 3-tuple representing (r, g, b) - """ - self.settings["color"] = col - if self.initialized is True: - r, g, b = self.settings["color"] - self.overlay.setOverlayColor(self.handle, r, g, b) - - def updateOpacity(self, opacity, with_fade=False): - self.settings["opacity"] = opacity - - if self.initialized is True: - if with_fade is True: - if self.fadeRatio > 0: - self.overlay.setOverlayAlpha(self.handle, self.fadeRatio * self.settings["opacity"]) - else: - self.overlay.setOverlayAlpha(self.handle, self.settings["opacity"]) - - def updateUiScaling(self, ui_scaling): - self.settings["ui_scaling"] = ui_scaling - if self.initialized is True: - self.overlay.setOverlayWidthInMeters(self.handle, self.settings["ui_scaling"]) - - def updatePosition(self, x_pos, y_pos, z_pos, x_rotation, y_rotation, z_rotation, tracker="HMD"): - """ - x_pos, y_pos, z_pos are floats representing the position of overlay - x_rotation, y_rotation, z_rotation are floats representing the rotation of overlay - tracker is a string representing the tracker to use ("HMD", "LeftHand", "RightHand") - """ - - self.settings["x_pos"] = x_pos - self.settings["y_pos"] = y_pos - self.settings["z_pos"] = z_pos - self.settings["x_rotation"] = x_rotation - self.settings["y_rotation"] = y_rotation - self.settings["z_rotation"] = z_rotation - - match tracker: - case "HMD": - base_matrix = getHMDBaseMatrix() - trackerIndex = openvr.k_unTrackedDeviceIndex_Hmd - case "LeftHand": - base_matrix = getLeftHandBaseMatrix() - trackerIndex = self.overlay_system.getTrackedDeviceIndexForControllerRole(openvr.TrackedControllerRole_LeftHand) - case "RightHand": - base_matrix = getRightHandBaseMatrix() - trackerIndex = self.overlay_system.getTrackedDeviceIndexForControllerRole(openvr.TrackedControllerRole_RightHand) - case _: - base_matrix = getHMDBaseMatrix() - trackerIndex = openvr.k_unTrackedDeviceIndex_Hmd - - translation = (self.settings["x_pos"], self.settings["y_pos"], - self.settings["z_pos"]) - rotation = (self.settings["x_rotation"], self.settings["y_rotation"], self.settings["z_rotation"]) - transform = utils.transform_matrix(base_matrix, translation, rotation) - self.transform = mat34Id(transform) - - if self.initialized is True: - self.overlay.setOverlayTransformTrackedDeviceRelative( - self.handle, - trackerIndex, - self.transform - ) - - def updateDisplayDuration(self, display_duration): - self.settings["display_duration"] = display_duration - - def updateFadeoutDuration(self, fadeout_duration): - self.settings["fadeout_duration"] = fadeout_duration - - def checkActive(self): - try: - if self.system is not None and self.initialized is True: - new_event = openvr.VREvent_t() - while self.system.pollNextEvent(new_event): - if new_event.eventType == openvr.VREvent_Quit: - return False - return True - except Exception as e: - print("Could not check SteamVR running") - print(e) - return False - - def evaluateOpacityFade(self, lastUpdate, currentTime): - if (currentTime - lastUpdate) > self.settings["display_duration"]: - timeThroughInterval = currentTime - lastUpdate - self.settings["display_duration"] - self.fadeRatio = 1 - timeThroughInterval / self.settings["fadeout_duration"] - if self.fadeRatio < 0: - self.fadeRatio = 0 - self.overlay.setOverlayAlpha(self.handle, self.fadeRatio * self.settings["opacity"]) - - def update(self): - currTime = time.monotonic() - if self.settings["fadeout_duration"] != 0: - self.evaluateOpacityFade(self.lastUpdate, currTime) - else: - self.updateOpacity(self.settings["opacity"]) - - def mainloop(self): - self.loop = True - while self.checkActive() is True and self.loop is True: - startTime = time.monotonic() - self.update() - sleepTime = (1 / 16) - (time.monotonic() - startTime) - if sleepTime > 0: - time.sleep(sleepTime) - - def main(self): - self.init() - if self.initialized is True: - self.mainloop() - - def startOverlay(self): - self.thread_overlay = Thread(target=self.main) - self.thread_overlay.daemon = True - self.thread_overlay.start() - - def shutdownOverlay(self): - if isinstance(self.thread_overlay, Thread): - self.loop = False - self.thread_overlay.join() - self.thread_overlay = None - if isinstance(self.overlay, openvr.IVROverlay) and isinstance(self.handle, int): - self.overlay.destroyOverlay(self.handle) - self.overlay = None - if isinstance(self.system, openvr.IVRSystem): - openvr.shutdown() - self.system = None - self.initialized = False - - def reStartOverlay(self): - self.shutdownOverlay() - self.startOverlay() - - @staticmethod - def checkSteamvrRunning() -> bool: - _proc_name = "vrmonitor.exe" if os.name == "nt" else "vrmonitor" - return _proc_name in (p.name() for p in process_iter()) - -if __name__ == "__main__": - # from overlay_image import OverlayImage - # overlay_image = OverlayImage() - - # overlay = Overlay(0, 0, 1, 1, 0, 1, 1) - # overlay.startOverlay() - # time.sleep(1) - - # # Example usage - # img = overlay_image.createOverlayImageShort("こんにちは、世界!さようなら", "Japanese", "Hello,World!Goodbye", "Japanese") - # overlay.updateImage(img) - # time.sleep(100000) - - # for i in range(100): - # print(i) - # overlay = Overlay(0, 0, 1, 1, 1, 1, 1) - # overlay.startOverlay() - # time.sleep(1) - - # # Example usage - # img = overlay_image.createOverlayImageShort("こんにちは、世界!さようなら", "Japanese", "Hello,World!Goodbye", "Japanese", ui_type="sakura") - # overlay.updateImage(img) - # time.sleep(0.5) - - # img = overlay_image.createOverlayImageShort("こんにちは、世界!さようなら", "Japanese", "Hello,World!Goodbye", "Japanese") - # overlay.updateImage(img) - # time.sleep(0.5) - - # overlay.shutdownOverlay() - - x_pos = 0 - y_pos = 0 - z_pos = 0 - x_rotation = 0 - y_rotation = 0 - z_rotation = 0 - - base_matrix = getLeftHandBaseMatrix() - translation = (x_pos * z_pos, y_pos * z_pos, z_pos) - rotation = (x_rotation, y_rotation, z_rotation) - transform = utils.transform_matrix(base_matrix, translation, rotation) - transform = mat34Id(transform) - print(transform) \ No newline at end of file diff --git a/models/overlay/overlay_image.py b/models/overlay/overlay_image.py deleted file mode 100644 index c3150f5e..00000000 --- a/models/overlay/overlay_image.py +++ /dev/null @@ -1,231 +0,0 @@ -from os import path as os_path -# from datetime import datetime -from typing import Tuple -from PIL import Image, ImageDraw, ImageFont - -class OverlayImage: - # TEXT_COLOR_LARGE = (223, 223, 223) - # TEXT_COLOR_SMALL = (190, 190, 190) - # TEXT_COLOR_SEND = (70, 161, 146) - # TEXT_COLOR_RECEIVE = (220, 20, 60) - # TEXT_COLOR_TIME = (120, 120, 120) - # FONT_SIZE_LARGE = HEIGHT - # FONT_SIZE_SMALL = int(FONT_SIZE_LARGE * 2 / 3) - LANGUAGES = { - "Japanese": "NotoSansJP-Regular", - "Korean": "NotoSansKR-Regular", - "Chinese Simplified": "NotoSansSC-Regular", - "Chinese Traditional": "NotoSansTC-Regular", - } - - def __init__(self): - pass - - @staticmethod - def concatenateImagesVertically(img1: Image, img2: Image) -> Image: - dst = Image.new("RGBA", (img1.width, img1.height + img2.height)) - dst.paste(img1, (0, 0)) - dst.paste(img2, (0, img1.height)) - return dst - - @staticmethod - def addImageMargin(image: Image, top: int, right: int, bottom: int, left: int, color: Tuple[int, int, int, int]) -> Image: - width, height = image.size - new_width = width + right + left - new_height = height + top + bottom - result = Image.new(image.mode, (new_width, new_height), color) - result.paste(image, (left, top)) - return result - - # def create_textimage(self, message_type, size, text, language): - # font_size = self.FONT_SIZE_LARGE if size == "large" else self.FONT_SIZE_SMALL - # text_color = self.TEXT_COLOR_LARGE if size == "large" else self.TEXT_COLOR_SMALL - # anchor = "lm" if message_type == "receive" else "rm" - # text_x = 0 if message_type == "receive" else self.WIDTH - # align = "left" if message_type == "receive" else "right" - - # font_family = self.LANGUAGES.get(language, "NotoSansJP-Regular") - # img = Image.new("RGBA", (0, 0), (0, 0, 0, 0)) - # draw = ImageDraw.Draw(img) - # font = ImageFont.truetype(os_path.join(os_path.dirname(__file__), "fonts", f"{font_family}.ttf"), font_size) - # # font = ImageFont.truetype(os_path.join("./fonts", f"{font_family}.ttf"), font_size) - # text_width = draw.textlength(text, font) - # character_width = text_width // len(text) - # character_line_num = int(self.WIDTH // character_width) - # if len(text) > character_line_num: - # text = "\n".join([text[i:i+character_line_num] for i in range(0, len(text), character_line_num)]) - - # n_num = len(text.split("\n")) - 1 - # text_height = int(font_size*(n_num+2)) - - # img = Image.new("RGBA", (self.WIDTH, text_height), (0, 0, 0, 0)) - # draw = ImageDraw.Draw(img) - - # text_y = text_height // 2 - - # draw.multiline_text((text_x, text_y), text, text_color, anchor=anchor, stroke_width=0, font=font, align=align) - # return img - - # def create_textimage_message_type(self, message_type): - # anchor = "lm" if message_type == "receive" else "rm" - # text = "Receive" if message_type == "receive" else "Send" - # text_color = self.TEXT_COLOR_RECEIVE if message_type == "receive" else self.TEXT_COLOR_SEND - # text_color_time = self.TEXT_COLOR_TIME - - # now = datetime.now() - # formatted_time = now.strftime("%H:%M") - # font_size = self.FONT_SIZE_SMALL - # img = Image.new("RGBA", (0, 0), (0, 0, 0, 0)) - # draw = ImageDraw.Draw(img) - # font = ImageFont.truetype(os_path.join(os_path.dirname(__file__), "fonts", "NotoSansJP-Regular.ttf"), font_size) - # # font = ImageFont.truetype(os_path.join("./fonts", "NotoSansJP-Regular.ttf"), font_size) - # text_height = font_size*2 - # text_width = draw.textlength(formatted_time, font) - # character_width = text_width // len(formatted_time) - # img = Image.new("RGBA", (self.WIDTH, text_height), (0, 0, 0, 0)) - # draw = ImageDraw.Draw(img) - # text_y = text_height // 2 - # text_time_x = 0 if message_type == "receive" else self.WIDTH - (text_width + character_width) - # text_x = (text_width + character_width) if message_type == "receive" else self.WIDTH - - # draw.text((text_time_x, text_y), formatted_time, text_color_time, anchor=anchor, stroke_width=0, font=font) - # draw.text((text_x, text_y), text, text_color, anchor=anchor, stroke_width=0, font=font) - # return img - - # def create_textbox(self, message_type, message, your_language, translation, target_language): - # message_type_img = self.create_textimage_message_type(message_type) - # if len(translation) > 0 and target_language is not None: - # img = self.create_textimage(message_type, "small", message, your_language) - # translation_img = self.create_textimage(message_type, "large",translation, target_language) - # img = self.concatenateImagesVertically(img, translation_img) - # else: - # img = self.create_textimage(message_type, "large", message, your_language) - # return self.concatenateImagesVertically(message_type_img, img) - - # def create_overlay_image_long(self, message_type, message, your_language, translation="", target_language=None): - # if len(self.log_data) > 10: - # self.log_data.pop(0) - - # self.log_data.append( - # { - # "message_type":message_type, - # "message":message, - # "your_language":your_language, - # "translation":translation, - # "target_language":target_language, - # } - # ) - - # imgs = [] - # for log in self.log_data: - # message_type = log["message_type"] - # message = log["message"] - # your_language = log["your_language"] - # translation = log["translation"] - # target_language = log["target_language"] - # img = self.create_textbox(message_type, message, your_language, translation, target_language) - # imgs.append(img) - - # img = imgs[0] - # for i in imgs[1:]: - # img = self.concatenateImagesVertically(img, i) - # img = self.addImageMargin(img, 0, 20, 0, 20, (0, 0, 0, 0)) - - # width, height = img.size - # background = Image.new("RGBA", (width, height), (0, 0, 0, 0)) - # draw = ImageDraw.Draw(background) - # draw.rounded_rectangle([(0, 0), (width, height)], radius=15, fill=self.BACKGROUND_COLOR, outline=self.BACKGROUND_OUTLINE_COLOR, width=5) - # img = Image.alpha_composite(background, img) - # return img - - def getUiSize(self): - return { - "width": int(960*4), - "height": int(23*4), - "font_size": int(23*4), - } - - def getUiColors(self, ui_type): - match ui_type: - case "default": - background_color = (41, 42, 45) - background_outline_color = (41, 42, 45) - text_color = (223, 223, 223) - case "sakura": - background_color = (225, 40, 30) - background_outline_color = (255, 255, 255) - text_color = (223, 223, 223) - return { - "background_color": background_color, - "background_outline_color": background_outline_color, - "text_color": text_color - } - - def createDecorationImage(self, ui_type, image_size): - decoration_image = Image.new("RGBA", image_size, (0, 0, 0, 0)) - match ui_type: - case "default": - pass - case "sakura": - margin = 7 - alpha_ratio = 0.4 - overlay_tl = Image.open(os_path.join(os_path.dirname(os_path.dirname(os_path.dirname(__file__))), "img", "overlay_tl_sakura.png")) - overlay_br = Image.open(os_path.join(os_path.dirname(os_path.dirname(os_path.dirname(__file__))), "img", "overlay_br_sakura.png")) - if overlay_tl.size[1] > image_size[1]: - overlay_tl = overlay_tl.resize((image_size[1]-margin, image_size[1]-margin)) - if overlay_br.size[1] > image_size[1]: - overlay_br = overlay_br.resize((image_size[1]-margin, image_size[1]-margin)) - - alpha = overlay_tl.getchannel("A") - alpha = alpha.point(lambda x: x * alpha_ratio) - overlay_tl.putalpha(alpha) - alpha = overlay_br.getchannel("A") - alpha = alpha.point(lambda x: x * alpha_ratio) - overlay_br.putalpha(alpha) - decoration_image.paste(overlay_tl, (margin, margin)) - decoration_image.paste(overlay_br, (image_size[0]-overlay_br.size[0]-margin, image_size[1]-overlay_br.size[1]-margin)) - return decoration_image - - def createTextboxShort(self, text, language, text_color, base_width, base_height, font_size): - font_family = self.LANGUAGES.get(language, "NotoSansJP-Regular") - img = Image.new("RGBA", (base_width, base_height), (0, 0, 0, 0)) - draw = ImageDraw.Draw(img) - font = ImageFont.truetype(os_path.join(os_path.dirname(os_path.dirname(os_path.dirname(__file__))), "fonts", f"{font_family}.ttf"), font_size) - text_width = draw.textlength(text, font) - character_width = text_width // len(text) - character_line_num = int((base_width) // character_width) - 12 - if len(text) > character_line_num: - text = "\n".join([text[i:i+character_line_num] for i in range(0, len(text), character_line_num)]) - text_height = font_size * (len(text.split("\n")) + 1) + 20 - img = Image.new("RGBA", (base_width, text_height), (0, 0, 0, 0)) - draw = ImageDraw.Draw(img) - - text_x = base_width // 2 - text_y = text_height // 2 - draw.text((text_x, text_y), text, text_color, anchor="mm", stroke_width=0, font=font, align="center") - return img - - def createOverlayImageShort(self, message, your_language, translation="", target_language=None, ui_type="default"): - ui_size = self.getUiSize() - height = ui_size["height"] - width = ui_size["width"] - font_size = ui_size["font_size"] - - ui_colors = self.getUiColors(ui_type) - text_color = ui_colors["text_color"] - background_color = ui_colors["background_color"] - background_outline_color = ui_colors["background_outline_color"] - - img = self.createTextboxShort(message, your_language, text_color, width, height, font_size) - if len(translation) > 0 and target_language is not None: - translation_img = self.createTextboxShort(translation, target_language, text_color, width, height, font_size) - img = self.concatenateImagesVertically(img, translation_img) - - background = Image.new("RGBA", img.size, (0, 0, 0, 0)) - draw = ImageDraw.Draw(background) - draw.rounded_rectangle([(0, 0), img.size], radius=30, fill=background_color, outline=background_outline_color, width=5) - - decoration_image = self.createDecorationImage(ui_type, img.size) - background = Image.alpha_composite(background, decoration_image) - img = Image.alpha_composite(background, img) - return img \ No newline at end of file diff --git a/models/overlay/overlay_utils.py b/models/overlay/overlay_utils.py deleted file mode 100644 index 0a379dd0..00000000 --- a/models/overlay/overlay_utils.py +++ /dev/null @@ -1,87 +0,0 @@ -import numpy as np - -def toHomogeneous(matrix): - homogeneous_matrix = np.vstack([matrix, [0, 0, 0, 1]]) - return homogeneous_matrix - -# 移動行列を生成する関数 -def calcTranslationMatrix(translation): - tx, ty, tz = translation - return np.array([ - [1, 0, 0, tx], - [0, 1, 0, ty], - [0, 0, 1, tz], - [0, 0, 0, 1] - ]) - -# X軸周りの回転行列を生成する関数 -def calcRotationMatrixX(angle): - c = np.cos(np.pi/180*angle) - s = np.sin(np.pi/180*angle) - return np.array([ - [1, 0, 0, 0], - [0, c, -s, 0], - [0, s, c, 0], - [0, 0, 0, 1] - ]) - -# Y軸周りの回転行列を生成する関数 -def calcRotationMatrixY(angle): - c = np.cos(np.pi/180*angle) - s = np.sin(np.pi/180*angle) - return np.array([ - [c, 0, s, 0], - [0, 1, 0, 0], - [-s, 0, c, 0], - [0, 0, 0, 1] - ]) - -# Z軸周りの回転行列を生成する関数 -def calcRotationMatrixZ(angle): - c = np.cos(np.pi/180*angle) - s = np.sin(np.pi/180*angle) - return np.array([ - [c, -s, 0, 0], - [s, c, 0, 0], - [0, 0, 1, 0], - [0, 0, 0, 1] - ]) - -# 3x4行列の座標を基準として回転や移動を行う関数 -def transform_matrix(base_matrix, translation, rotation): - homogeneous_base_matrix = toHomogeneous(base_matrix) - translation_matrix = calcTranslationMatrix(translation) - rotation_matrix_x = calcRotationMatrixX(rotation[0]) - rotation_matrix_y = calcRotationMatrixY(rotation[1]) - rotation_matrix_z = calcRotationMatrixZ(rotation[2]) - rotation_matrix = np.dot(rotation_matrix_z, np.dot(rotation_matrix_y, rotation_matrix_x)) - transformation_matrix = translation_matrix.copy() - transformation_matrix[:3, :3] = rotation_matrix[:3, :3] - result_matrix = np.dot(homogeneous_base_matrix, transformation_matrix) - return result_matrix[:3, :] - -def euler_to_rotation_matrix(angles): - phi = angles[0] * np.pi / 180 - theta = angles[1] * np.pi / 180 - psi = angles[2]* np.pi / 180 - R_x = np.array([[1, 0, 0], - [0, np.cos(phi), -np.sin(phi)], - [0, np.sin(phi), np.cos(phi)]]) - R_y = np.array([[np.cos(theta), 0, np.sin(theta)], - [0, 1, 0], - [-np.sin(theta), 0, np.cos(theta)]]) - R_z = np.array([[np.cos(psi), -np.sin(psi), 0], - [np.sin(psi), np.cos(psi), 0], - [0, 0, 1]]) - return np.dot(R_z, np.dot(R_y, R_x)) - -if __name__ == "__main__": - base_matrix = np.array([ - [1, 0, 0, 1], - [0, 1, 0, 1], - [0, 0, 1, 1] - ]) - translation = [1, 2, 3] - rotation = [0, 0, 90] - result_matrix = transform_matrix(base_matrix, translation, rotation) - print(result_matrix) \ No newline at end of file diff --git a/models/transcription/transcription_languages.py b/models/transcription/transcription_languages.py deleted file mode 100644 index 12625df7..00000000 --- a/models/transcription/transcription_languages.py +++ /dev/null @@ -1,730 +0,0 @@ -transcription_lang = { - "Afrikaans":{ - "South Africa":{ - "Google": "af-ZA", - "Whisper": "af", - }, - }, - "Albanian":{ - "Albania":{ - "Google": "sq-AL", - "Whisper": "sq", - }, - }, - "Amharic":{ - "Ethiopia":{ - "Google": "am-ET", - "Whisper": "am", - }, - }, - "Arabic":{ - "Algeria":{ - "Google": "ar-DZ", - "Whisper": "ar", - }, - "Bahrain":{ - "Google": "ar-BH", - "Whisper": "ar", - }, - "Egypt":{ - "Google": "ar-EG", - "Whisper": "ar", - }, - "Israel":{ - "Google": "ar-IL", - "Whisper": "ar", - }, - "Iraq":{ - "Google": "ar-IQ", - "Whisper": "ar", - }, - "Jordan":{ - "Google": "ar-JO", - "Whisper": "ar", - }, - "Kuwait":{ - "Google": "ar-KW", - "Whisper": "ar", - }, - "Lebanon":{ - "Google": "ar-LB", - "Whisper": "ar", - }, - "Mauritania":{ - "Google": "ar-MR", - "Whisper": "ar", - }, - "Morocco":{ - "Google": "ar-MA", - "Whisper": "ar", - }, - "Oman":{ - "Google": "ar-OM", - "Whisper": "ar", - }, - "Qatar":{ - "Google": "ar-QA", - "Whisper": "ar", - }, - "Saudi Arabia":{ - "Google": "ar-SA", - "Whisper": "ar", - }, - "Palestine":{ - "Google": "ar-PS", - "Whisper": "ar", - }, - "Syria":{ - "Google": "ar-SY", - "Whisper": "ar", - }, - "Tunisia":{ - "Google": "ar-TN", - "Whisper": "ar", - }, - "United Arab Emirates":{ - "Google": "ar-AE", - "Whisper": "ar", - }, - "Yemen":{ - "Google": "ar-YE", - "Whisper": "ar", - }, - }, - "Armenian": { - "Armenia": { - "Google": "hy-AM", - "Whisper": "hy", - }, - }, - "Azerbaijani": { - "Azerbaijan": { - "Google": "az-AZ", - "Whisper": "az", - }, - }, - "Basque":{ - "Spain":{ - "Google": "eu-ES", - "Whisper": "eu", - }, - }, - "Bengali":{ - "Bangladesh":{ - "Google": "bn-BD", - "Whisper": "bn", - }, - "India":{ - "Google": "bn-IN", - "Whisper": "bn", - }, - }, - "Bosnian":{ - "Bosnia and Herzegovina":{ - "Google": "bs-BA", - "Whisper": "bs", - } - }, - "Bulgarian":{ - "Bulgaria":{ - "Google": "bg-BG", - "Whisper": "bg", - }, - }, - "Burmese":{ - "Myanmar":{ - "Google": "my-MM", - "Whisper": "my", - }, - }, - "Catalan":{ - "Spain":{ - "Google": "ca-ES", - "Whisper": "ca", - }, - }, - "Chinese Simplified":{ - "China":{ - "Google": "cmn-Hans-CN", - "Whisper": "zh", - }, - "Hong Kong":{ - "Google": "cmn-Hans-HK", - "Whisper": "zh", - }, - }, - "Chinese Traditional":{ - "Taiwan":{ - "Google": "cmn-Hant-TW", - "Whisper": "zh", - }, - "Hong Kong":{ - "Google": "yue-Hant-HK", - "Whisper": "yue", - }, - }, - "Croatian":{ - "Croatia":{ - "Google": "hr-HR", - "Whisper": "hr", - }, - }, - "Czech":{ - "Czech Republic":{ - "Google": "cs-CZ", - "Whisper": "cs", - }, - }, - "Danish":{ - "Denmark":{ - "Google": "da-DK", - "Whisper": "da", - }, - }, - "Dutch":{ - "Belgium":{ - "Google": "nl-BE", - "Whisper": "nl", - }, - "Netherlands":{ - "Google": "nl-NL", - "Whisper": "nl", - }, - }, - "English": { - "Australia":{ - "Google": "en-AU", - "Whisper": "en", - }, - "Canada":{ - "Google": "en-CA", - "Whisper": "en", - }, - "Ghana":{ - "Google": "en-GH", - "Whisper": "en", - }, - "Hong Kong":{ - "Google": "en-HK", - "Whisper": "en", - }, - "India":{ - "Google": "en-IN", - "Whisper": "en", - }, - "Ireland":{ - "Google": "en-IE", - "Whisper": "en", - }, - "Kenya":{ - "Google": "en-KE", - "Whisper": "en", - }, - "New Zealand":{ - "Google": "en-NZ", - "Whisper": "en", - }, - "Nigeria":{ - "Google": "en-NG", - "Whisper": "en", - }, - "Philippines":{ - "Google": "en-PH", - "Whisper": "en", - }, - "Singapore":{ - "Google": "en-SG", - "Whisper": "en", - }, - "South Africa":{ - "Google": "en-ZA", - "Whisper": "en", - }, - "Tanzania":{ - "Google": "en-TZ", - "Whisper": "en", - }, - "United Kingdom":{ - "Google": "en-GB", - "Whisper": "en", - }, - "United States":{ - "Google": "en-US", - "Whisper": "en", - }, - }, - "Estonian":{ - "Estonia":{ - "Google": "et-EE", - "Whisper": "et", - }, - }, - "Filipino":{ - "Philippines":{ - "Google": "fil-PH", - "Whisper": "tl", - }, - }, - "Finnish":{ - "Finland":{ - "Google": "fi-FI", - "Whisper": "fi", - }, - }, - "French":{ - "Belgium":{ - "Google": "fr-BE", - "Whisper": "fr", - }, - "Canada":{ - "Google": "fr-CA", - "Whisper": "fr", - }, - "France":{ - "Google": "fr-FR", - "Whisper": "fr", - }, - "Switzerland":{ - "Google": "fr-CH", - "Whisper": "fr", - }, - }, - "Galician":{ - "Spain":{ - "Google": "gl-ES", - "Whisper": "gl", - }, - }, - "Georgian":{ - "Georgia":{ - "Google": "ka-GE", - "Whisper": "ka", - }, - }, - "German":{ - "Austria":{ - "Google": "de-AT", - "Whisper": "de", - }, - "Germany":{ - "Google": "de-DE", - "Whisper": "de", - }, - "Switzerland":{ - "Google": "de-CH", - "Whisper": "de", - }, - }, - "Greek":{ - "Greece":{ - "Google": "el-GR", - "Whisper": "el", - }, - }, - "Gujarati":{ - "India":{ - "Google": "gu-IN", - "Whisper": "gu", - }, - }, - "Hebrew":{ - "Israel":{ - "Google": "iw-IL", - "Whisper": "he", - }, - }, - "Hindi": { - "India":{ - "Google": "hi-IN", - "Whisper": "hi", - }, - }, - "Hungarian":{ - "Hungary":{ - "Google": "hu-HU", - "Whisper": "hu", - }, - }, - "Icelandic":{ - "Iceland":{ - "Google": "is-IS", - "Whisper": "is", - }, - }, - "Indonesian":{ - "Indonesia":{ - "Google": "id-ID", - "Whisper": "id", - }, - }, - "Italian":{ - "Italy":{ - "Google": "it-IT", - "Whisper": "it", - }, - "Switzerland":{ - "Google": "it-CH", - "Whisper": "it", - }, - }, - "Japanese":{ - "Japan":{ - "Google": "ja-JP", - "Whisper": "ja", - }, - }, - # "Javanese":{ - # "Indonesia":{ - # "Google": "jv-ID", - # }, - # }, - "Kannada":{ - "India":{ - "Google": "kn-IN", - "Whisper": "kn", - }, - }, - "Kazakh":{ - "Kazakhstan":{ - "Google": "kk-KZ", - "Whisper": "kk", - }, - }, - "Khmer":{ - "Cambodia":{ - "Google": "km-KH", - "Whisper": "km", - }, - }, - # "Kinyarwanda":{ - # "rwanda":{ - # "Google": "rw-RW", - # }, - # }, - "Korean":{ - "South Korea":{ - "Google": "ko-KR", - "Whisper": "ko", - }, - }, - "Lao":{ - "Laos":{ - "Google": "lo-LA", - "Whisper": "lo", - }, - }, - "Latvian":{ - "Latvia":{ - "Google": "lv-LV", - "Whisper": "lv", - }, - }, - "Lithuanian":{ - "Lithuania":{ - "Google": "lt-LT", - "Whisper": "lt", - }, - }, - "Macedonian":{ - "North Macedonia":{ - "Google": "mk-MK", - "Whisper": "mk", - }, - }, - "Malay":{ - "Malaysia":{ - "Google": "ms-MY", - "Whisper": "ms", - }, - }, - "Malayalam":{ - "India":{ - "Google": "ml-IN", - "Whisper": "ml", - }, - }, - "Mongolian":{ - "Mongolia":{ - "Google": "mn-MN", - "Whisper": "mn", - }, - }, - "Nepali":{ - "Nepal":{ - "Google": "ne-NP", - "Whisper": "ne", - }, - }, - "Norwegian":{ - "Norway":{ - "Google": "no-NO", - "Whisper": "no", - }, - }, - "Persian":{ - "Iran":{ - "Google": "fa-IR", - "Whisper": "fa", - }, - }, - "Polish":{ - "Poland":{ - "Google": "pl-PL", - "Whisper": "pl", - }, - }, - "Portuguese":{ - "Brazil":{ - "Google": "pt-BR", - "Whisper": "pt", - }, - "Portugal":{ - "Google": "pt-PT", - "Whisper": "pt", - }, - }, - # "Punjabi":{ - # "India":{ - # "Google": "pa-Guru-IN", - # }, - # }, - "Romanian":{ - "Romania":{ - "Google": "ro-RO", - "Whisper": "ro", - }, - }, - "Russian":{ - "Russia":{ - "Google": "ru-RU", - "Whisper": "ru", - }, - }, - "Serbian":{ - "Serbia":{ - "Google": "sr-RS", - "Whisper": "sr", - }, - }, - "Sinhala":{ - "Sri Lanka":{ - "Google": "si-LK", - "Whisper": "si", - }, - }, - "Slovak":{ - "Slovakia":{ - "Google": "sk-SK", - "Whisper": "sk", - }, - }, - "Slovenian":{ - "Slovenia":{ - "Google": "sl-SI", - "Whisper": "sl", - }, - }, - # "Sesotho":{ - # "South Africa":{ - # "Google": "st-ZA", - # }, - # }, - "Spanish":{ - "Argentina":{ - "Google": "es-AR", - "Whisper": "es", - }, - "Bolivia":{ - "Google": "es-BO", - "Whisper": "es", - }, - "Chile":{ - "Google": "es-CL", - "Whisper": "es", - }, - "Colombia":{ - "Google": "es-CO", - "Whisper": "es", - }, - "Costa Rica":{ - "Google": "es-CR", - "Whisper": "es", - }, - "Dominican Republic":{ - "Google": "es-DO", - "Whisper": "es", - }, - "Ecuador":{ - "Google": "es-EC", - "Whisper": "es", - }, - "El Salvador":{ - "Google": "es-SV", - "Whisper": "es", - }, - "Guatemala":{ - "Google": "es-GT", - "Whisper": "es", - }, - "Honduras":{ - "Google": "es-HN", - "Whisper": "es", - }, - "Mexico":{ - "Google": "es-MX", - "Whisper": "es", - }, - "Nicaragua":{ - "Google": "es-NI", - "Whisper": "es", - }, - "Panama":{ - "Google": "es-PA", - "Whisper": "es", - }, - "Paraguay":{ - "Google": "es-PY", - "Whisper": "es", - }, - "Peru":{ - "Google": "es-PE", - "Whisper": "es", - }, - "Puerto Rico":{ - "Google": "es-PR", - "Whisper": "es", - }, - "Spain":{ - "Google": "es-ES", - "Whisper": "es", - }, - "United States":{ - "Google": "es-US", - "Whisper": "es", - }, - "Uruguay":{ - "Google": "es-UY", - "Whisper": "es", - }, - "Venezuela":{ - "Google": "es-VE", - "Whisper": "es", - }, - }, - "Sundanese":{ - "Indonesia":{ - "Google": "su-ID", - "Whisper": "su", - }, - }, - "Swahili":{ - "Kenya":{ - "Google": "sw-KE", - "Whisper": "sw", - }, - "Tanzania":{ - "Google": "sw-TZ", - "Whisper": "sw", - }, - }, - # "Swazi":{ - # "Eswatini":{ - # "Google": "ss-Latn-ZA", - # }, - # }, - "Swedish":{ - "Sweden":{ - "Google": "sv-SE", - "Whisper": "sv", - }, - }, - "Tamil":{ - "India":{ - "Google": "ta-IN", - "Whisper": "ta", - }, - "malaysia":{ - "Google": "ta-MY", - "Whisper": "ta", - }, - "Singapore":{ - "Google": "ta-SG", - "Whisper": "ta", - }, - "Sri Lanka":{ - "Google": "ta-LK", - "Whisper": "ta", - }, - }, - "Telugu":{ - "India":{ - "Google": "te-IN", - "Whisper": "te", - }, - }, - "Thai":{ - "Thailand":{ - "Google": "th-TH", - "Whisper": "th", - }, - }, - # "Tsonga":{ - # "South Africa":{ - # "Google": "ts-ZA", - # }, - # }, - # "Setswana":{ - # "South Africa":{ - # "Google": "tn-Latn-ZA", - # }, - # }, - "Turkish":{ - "Turkey":{ - "Google": "tr-TR", - "Whisper": "tr", - }, - }, - "Ukrainian":{ - "Ukraine":{ - "Google": "uk-UA", - "Whisper": "uk", - }, - }, - "Urdu":{ - "India":{ - "Google": "ur-IN", - "Whisper": "ur", - }, - "Pakistan":{ - "Google": "ur-PK", - "Whisper": "ur", - }, - }, - "Uzbek":{ - "Uzbekistan":{ - "Google": "uz-UZ", - "Whisper": "uz", - }, - }, - # "Venda":{ - # "South Africa":{ - # "Google": "ve-ZA", - # }, - # }, - "Vietnamese":{ - "Vietnam":{ - "Google": "vi-VN", - "Whisper": "vi", - }, - }, - # "Xhosa":{ - # "South Africa":{ - # "Google": "xh-ZA", - # }, - # }, - # "Zulu":{ - # "South Africa":{ - # "Google": "zu-ZA", - # }, - # }, -} \ No newline at end of file diff --git a/models/transcription/transcription_recorder.py b/models/transcription/transcription_recorder.py deleted file mode 100644 index 0e9b147d..00000000 --- a/models/transcription/transcription_recorder.py +++ /dev/null @@ -1,142 +0,0 @@ -from speech_recognition import Recognizer, Microphone -from pyaudiowpatch import get_sample_size, paInt16 -from datetime import datetime -from queue import Queue - -class BaseRecorder: - def __init__(self, source, energy_threshold, dynamic_energy_threshold, record_timeout): - self.recorder = Recognizer() - self.recorder.energy_threshold = energy_threshold - self.recorder.dynamic_energy_threshold = dynamic_energy_threshold - self.record_timeout = record_timeout - self.stop = None - - if source is None: - raise ValueError("audio source can't be None") - - self.source = source - - def adjustForNoise(self): - with self.source: - self.recorder.adjust_for_ambient_noise(self.source) - - def recordIntoQueue(self, audio_queue): - def record_callback(_, audio): - audio_queue.put((audio.get_raw_data(), datetime.now())) - - self.stop, self.pause, self.resume = self.recorder.listen_in_background(self.source, record_callback, phrase_time_limit=self.record_timeout) - -class SelectedMicRecorder(BaseRecorder): - def __init__(self, device, energy_threshold, dynamic_energy_threshold, record_timeout): - source=Microphone( - device_index=device['index'], - sample_rate=int(device["defaultSampleRate"]), - ) - super().__init__(source=source, energy_threshold=energy_threshold, dynamic_energy_threshold=dynamic_energy_threshold, record_timeout=record_timeout) - # self.adjustForNoise() - -class SelectedSpeakerRecorder(BaseRecorder): - def __init__(self, device, energy_threshold, dynamic_energy_threshold, record_timeout): - - source = Microphone(speaker=True, - device_index= device["index"], - sample_rate=int(device["defaultSampleRate"]), - chunk_size=get_sample_size(paInt16), - channels=device["maxInputChannels"] - ) - super().__init__(source=source, energy_threshold=energy_threshold, dynamic_energy_threshold=dynamic_energy_threshold, record_timeout=record_timeout) - # self.adjustForNoise() - -class BaseEnergyRecorder: - def __init__(self, source): - self.recorder = Recognizer() - self.recorder.energy_threshold = 0 - self.recorder.dynamic_energy_threshold = False - self.record_timeout = 0 - self.stop = None - - if source is None: - raise ValueError("audio source can't be None") - - self.source = source - - def adjustForNoise(self): - with self.source: - self.recorder.adjust_for_ambient_noise(self.source) - - def recordIntoQueue(self, energy_queue): - def recordCallback(_, energy): - energy_queue.put(energy) - - self.stop, self.pause, self.resume = self.recorder.listen_energy_in_background(self.source, recordCallback) - -class SelectedMicEnergyRecorder(BaseEnergyRecorder): - def __init__(self, device): - source=Microphone( - device_index=device['index'], - sample_rate=int(device["defaultSampleRate"]), - ) - super().__init__(source=source) - # self.adjustForNoise() - -class SelectedSpeakerEnergyRecorder(BaseEnergyRecorder): - def __init__(self, device): - - source = Microphone(speaker=True, - device_index= device["index"], - sample_rate=int(device["defaultSampleRate"]), - channels=device["maxInputChannels"] - ) - super().__init__(source=source) - # self.adjustForNoise() - -class BaseEnergyAndAudioRecorder: - def __init__(self, source, energy_threshold, dynamic_energy_threshold, record_timeout): - self.recorder = Recognizer() - self.recorder.energy_threshold = energy_threshold - self.recorder.dynamic_energy_threshold = dynamic_energy_threshold - self.record_timeout = record_timeout - self.stop = None - - if source is None: - raise ValueError("audio source can't be None") - - self.source = source - - def adjustForNoise(self): - with self.source: - self.recorder.adjust_for_ambient_noise(self.source) - - def recordIntoQueue(self, audio_queue, energy_queue=None): - def audioRecordCallback(_, audio): - audio_queue.put((audio.get_raw_data(), datetime.now())) - - def energyRecordCallback(energy): - energy_queue.put(energy) - - self.stop, self.pause, self.resume = self.recorder.listen_energy_and_audio_in_background( - source=self.source, - callback=audioRecordCallback, - phrase_time_limit=self.record_timeout, - callback_energy=energyRecordCallback if energy_queue is not None else None) - -class SelectedMicEnergyAndAudioRecorder(BaseEnergyAndAudioRecorder): - def __init__(self, device, energy_threshold, dynamic_energy_threshold, record_timeout): - source=Microphone( - device_index=device['index'], - sample_rate=int(device["defaultSampleRate"]), - ) - super().__init__(source=source, energy_threshold=energy_threshold, dynamic_energy_threshold=dynamic_energy_threshold, record_timeout=record_timeout) - # self.adjustForNoise() - -class SelectedSpeakerEnergyAndAudioRecorder(BaseEnergyAndAudioRecorder): - def __init__(self, device, energy_threshold, dynamic_energy_threshold, record_timeout): - - source = Microphone(speaker=True, - device_index= device["index"], - sample_rate=int(device["defaultSampleRate"]), - chunk_size=get_sample_size(paInt16), - channels=device["maxInputChannels"] - ) - super().__init__(source=source, energy_threshold=energy_threshold, dynamic_energy_threshold=dynamic_energy_threshold, record_timeout=record_timeout) - # self.adjustForNoise() \ No newline at end of file diff --git a/models/transcription/transcription_transcriber.py b/models/transcription/transcription_transcriber.py deleted file mode 100644 index a535cd8a..00000000 --- a/models/transcription/transcription_transcriber.py +++ /dev/null @@ -1,141 +0,0 @@ -import time -from io import BytesIO -from threading import Event -import wave -from speech_recognition import Recognizer, AudioData, AudioFile -from datetime import timedelta -from pyaudiowpatch import get_sample_size, paInt16 -from .transcription_languages import transcription_lang -from .transcription_whisper import getWhisperModel, checkWhisperWeight - -import torch -import numpy as np -from pydub import AudioSegment - -PHRASE_TIMEOUT = 3 -MAX_PHRASES = 10 - -class AudioTranscriber: - def __init__(self, speaker, source, phrase_timeout, max_phrases, transcription_engine, root=None, whisper_weight_type=None): - self.speaker = speaker - self.phrase_timeout = phrase_timeout - self.max_phrases = max_phrases - self.transcript_data = [] - self.transcript_changed_event = Event() - self.audio_recognizer = Recognizer() - self.transcription_engine = "Google" - self.whisper_model = None - self.audio_sources = { - "sample_rate": source.SAMPLE_RATE, - "sample_width": source.SAMPLE_WIDTH, - "channels": source.channels, - "last_sample": bytes(), - "last_spoken": None, - "new_phrase": True, - "process_data_func": self.processSpeakerData if speaker else self.processSpeakerData - } - - if transcription_engine == "Whisper" and checkWhisperWeight(root, whisper_weight_type) is True: - self.whisper_model = getWhisperModel(root, whisper_weight_type) - self.transcription_engine = "Whisper" - - def transcribeAudioQueue(self, audio_queue, language, country, avg_logprob=-0.8, no_speech_prob=0.6): - if audio_queue.empty(): - time.sleep(0.01) - return False - audio, time_spoken = audio_queue.get() - self.updateLastSampleAndPhraseStatus(audio, time_spoken) - - text = '' - try: - audio_data = self.audio_sources["process_data_func"]() - match self.transcription_engine: - case "Google": - text = self.audio_recognizer.recognize_google(audio_data, language=transcription_lang[language][country][self.transcription_engine]) - case "Whisper": - audio_data = np.frombuffer(audio_data.get_raw_data(convert_rate=16000, convert_width=2), np.int16).flatten().astype(np.float32) / 32768.0 - if isinstance(audio_data, torch.Tensor): - audio_data = audio_data.detach().numpy() - segments, _ = self.whisper_model.transcribe( - audio_data, - beam_size=5, - temperature=0.0, - log_prob_threshold=-0.8, - no_speech_threshold=0.6, - language=transcription_lang[language][country][self.transcription_engine], - word_timestamps=False, - without_timestamps=True, - task="transcribe", - vad_filter=False, - ) - for s in segments: - if s.avg_logprob < avg_logprob or s.no_speech_prob > no_speech_prob: - continue - text += s.text - - except Exception: - pass - finally: - pass - - if text != '': - self.updateTranscript(text) - return True - - def updateLastSampleAndPhraseStatus(self, data, time_spoken): - source_info = self.audio_sources - if source_info["last_spoken"] and time_spoken - source_info["last_spoken"] > timedelta(seconds=self.phrase_timeout): - source_info["last_sample"] = bytes() - source_info["new_phrase"] = True - else: - source_info["new_phrase"] = False - - source_info["last_sample"] += data - source_info["last_spoken"] = time_spoken - - def processMicData(self): - audio_data = AudioData(self.audio_sources["last_sample"], self.audio_sources["sample_rate"], self.audio_sources["sample_width"]) - return audio_data - - def processSpeakerData(self): - temp_file = BytesIO() - with wave.open(temp_file, 'wb') as wf: - wf.setnchannels(self.audio_sources["channels"]) - wf.setsampwidth(get_sample_size(paInt16)) - wf.setframerate(self.audio_sources["sample_rate"]) - wf.writeframes(self.audio_sources["last_sample"]) - temp_file.seek(0) - - if self.audio_sources["channels"] > 2: - audio = AudioSegment.from_file(temp_file, format="wav") - mono_audio = audio.set_channels(1) - temp_file = BytesIO() - mono_audio.export(temp_file, format="wav") - temp_file.seek(0) - - with AudioFile(temp_file) as source: - audio = self.audio_recognizer.record(source) - return audio - - def updateTranscript(self, text): - source_info = self.audio_sources - transcript = self.transcript_data - - if source_info["new_phrase"] or len(transcript) == 0: - if len(transcript) > self.max_phrases: - transcript.pop(-1) - transcript.insert(0, text) - else: - transcript[0] = text - - def getTranscript(self): - if len(self.transcript_data) > 0: - text = self.transcript_data.pop(-1) - else: - text = "" - return text - - def clearTranscriptData(self): - self.transcript_data.clear() - self.audio_sources["last_sample"] = bytes() - self.audio_sources["new_phrase"] = True \ No newline at end of file diff --git a/models/transcription/transcription_utils.py b/models/transcription/transcription_utils.py deleted file mode 100644 index 4292ba23..00000000 --- a/models/transcription/transcription_utils.py +++ /dev/null @@ -1,70 +0,0 @@ -from pyaudiowpatch import PyAudio, paWASAPI - -def getInputDevices(): - devices = {} - with PyAudio() as p: - for host_index in range(0, p.get_host_api_count()): - host = p.get_host_api_info_by_index(host_index) - for device_index in range(0, p.get_host_api_info_by_index(host_index)['deviceCount']): - device = p.get_device_info_by_host_api_device_index(host_index, device_index) - if device["maxInputChannels"] > 0 and device["isLoopbackDevice"] is False: - if host["name"] in devices.keys(): - devices[host["name"]].append(device) - else: - devices[host["name"]] = [device] - if len(devices) == 0: - devices = {"NoHost": [{"name": "NoDevice"}]} - return devices - -def getDefaultInputDevice(): - with PyAudio() as p: - api_info = p.get_default_host_api_info() - defaultInputDevice = api_info["defaultInputDevice"] - - for host_index in range(0, p.get_host_api_count()): - host = p.get_host_api_info_by_index(host_index) - for device_index in range(0, p.get_host_api_info_by_index(host_index)['deviceCount']): - device = p.get_device_info_by_host_api_device_index(host_index, device_index) - if device["index"] == defaultInputDevice: - return {"host": host, "device": device} - return {"host": {"name": "NoHost"}, "device": {"name": "NoDevice"}} - -def getOutputDevices(): - devices = [] - with PyAudio() as p: - wasapi_info = p.get_host_api_info_by_type(paWASAPI) - for host_index in range(0, p.get_host_api_count()): - host = p.get_host_api_info_by_index(host_index) - if host["name"] == wasapi_info["name"]: - for device_index in range(0, p.get_host_api_info_by_index(host_index)['deviceCount']): - device = p.get_device_info_by_host_api_device_index(host_index, device_index) - if not device["isLoopbackDevice"]: - for loopback in p.get_loopback_device_info_generator(): - if device["name"] in loopback["name"]: - devices.append(loopback) - - if len(devices) == 0: - devices = [{"name": "NoDevice"}] - else: - devices = [dict(t) for t in {tuple(d.items()) for d in devices}] - return devices - -def getDefaultOutputDevice(): - with PyAudio() as p: - wasapi_info = p.get_host_api_info_by_type(paWASAPI) - defaultOutputDevice = wasapi_info["defaultOutputDevice"] - - for host_index in range(0, p.get_host_api_count()): - for device_index in range(0, p. get_host_api_info_by_index(host_index)['deviceCount']): - device = p.get_device_info_by_host_api_device_index(host_index, device_index) - if device["index"] == defaultOutputDevice: - default_speakers = device - if not default_speakers["isLoopbackDevice"]: - for loopback in p.get_loopback_device_info_generator(): - if default_speakers["name"] in loopback["name"]: - return {"device": loopback} - return {"device": {"name": "NoDevice"}} - -if __name__ == "__main__": - print("getOutputDevices()", getOutputDevices()) - print("getDefaultOutputDevice()", getDefaultOutputDevice()) \ No newline at end of file diff --git a/models/transcription/transcription_whisper.py b/models/transcription/transcription_whisper.py deleted file mode 100644 index c6412d35..00000000 --- a/models/transcription/transcription_whisper.py +++ /dev/null @@ -1,98 +0,0 @@ -from os import path as os_path, makedirs as os_makedirs -from requests import get as requests_get -from typing import Callable -import huggingface_hub -from faster_whisper import WhisperModel -import logging -logger = logging.getLogger('faster_whisper') -logger.setLevel(logging.CRITICAL) - -_MODELS = { - "tiny": "Systran/faster-whisper-tiny", - "base": "Systran/faster-whisper-base", - "small": "Systran/faster-whisper-small", - "medium": "Systran/faster-whisper-medium", - "large-v1": "Systran/faster-whisper-large-v1", - "large-v2": "Systran/faster-whisper-large-v2", - "large-v3": "Systran/faster-whisper-large-v3", -} - -_FILENAMES = [ - "config.json", - "preprocessor_config.json", - "model.bin", - "tokenizer.json", - "vocabulary.txt", - "vocabulary.json", -] - -def downloadFile(url, path, func=None): - try: - res = requests_get(url, stream=True) - res.raise_for_status() - file_size = int(res.headers.get('content-length', 0)) - total_chunk = 0 - with open(os_path.join(path), 'wb') as file: - for chunk in res.iter_content(chunk_size=1024*5): - file.write(chunk) - if isinstance(func, Callable): - total_chunk += len(chunk) - func(total_chunk/file_size) - - except Exception as e: - print("error:downloadFile()", e) - -def checkWhisperWeight(root, weight_type): - path = os_path.join(root, "weights", "whisper", weight_type) - result = False - try: - WhisperModel( - path, - device="cpu", - device_index=0, - compute_type="int8", - cpu_threads=4, - num_workers=1, - local_files_only=True, - ) - result = True - except Exception: - pass - return result - -def downloadWhisperWeight(root, weight_type, callbackFunc): - path = os_path.join(root, "weights", "whisper", weight_type) - os_makedirs(path, exist_ok=True) - if checkWhisperWeight(root, weight_type) is True: - return - - for filename in _FILENAMES: - print("Downloading", filename, "...") - file_path = os_path.join(path, filename) - url = huggingface_hub.hf_hub_url(_MODELS[weight_type], filename) - downloadFile(url, file_path, func=callbackFunc) - -def getWhisperModel(root, weight_type): - path = os_path.join(root, "weights", "whisper", weight_type) - return WhisperModel( - path, - device="cpu", - device_index=0, - compute_type="int8", - cpu_threads=4, - num_workers=1, - local_files_only=True, - ) - -if __name__ == "__main__": - def callback(value): - print(value) - pass - - downloadWhisperWeight("./", "tiny", callback) - downloadWhisperWeight("./", "base", callback) - downloadWhisperWeight("./", "small", callback) - downloadWhisperWeight("./", "medium", callback) - downloadWhisperWeight("./", "large-v1", callback) - downloadWhisperWeight("./", "large-v2", callback) - downloadWhisperWeight("./", "large-v3", callback) \ No newline at end of file diff --git a/models/translation/translation_languages.py b/models/translation/translation_languages.py deleted file mode 100644 index a697960b..00000000 --- a/models/translation/translation_languages.py +++ /dev/null @@ -1,384 +0,0 @@ -translation_lang = {} -dict_deepl_languages = { - "Arabic":"ar", - "Bulgarian":"bg", - "Czech":"cs", - "Danish":"da", - "German":"de", - "Greek":"el", - "English":"en", - "Spanish":"es", - "Estonian":"et", - "Finnish":"fi", - "French":"fr", - "Irish":"ga", - "Croatian":"hr", - "Hungarian":"hu", - "Indonesian":"id", - "Icelandic":"is", - "Italian":"it", - "Japanese":"ja", - "Korean":"ko", - "Lithuanian":"lt", - "Latvian":"lv", - "Maltese":"mt", - "Bokmal":"nb", - "Dutch":"nl", - "Norwegian":"no", - "Polish":"pl", - "Portuguese":"pt", - "Romanian":"ro", - "Russian":"ru", - "Slovak":"sk", - "Slovenian":"sl", - "Swedish":"sv", - "Turkish":"tr", - "Ukrainian":"uk", - "Chinese Simplified":"zh", - "Chinese Traditional":"zh" -} -translation_lang["DeepL"] = { - "source":dict_deepl_languages, - "target":dict_deepl_languages, -} - -dict_deepl_api_source_languages = { - "Japanese":"ja", - "English":"en", - "Bulgarian":"bg", - "Czech":"cs", - "Danish":"da", - "German":"de", - "Greek":"el", - "Spanish":"es", - "Estonian":"et", - "Finnish":"fi", - "French":"fr", - "Hungarian":"hu", - "Indonesian":"id", - "Italian":"it", - "Korean":"ko", - "Lithuanian":"lt", - "Latvian":"lv", - "Norwegian":"nb", - "Dutch":"nl", - "Polish":"pl", - "Portuguese":"pt", - "Romanian":"ro", - "Russian":"ru", - "Slovak":"sk", - "Slovenian":"sl", - "Swedish":"sv", - "Turkish":"tr", - "Ukrainian":"uk", - "Chinese Simplified":"zh", - "Chinese Traditional":"zh" -} -dict_deepl_api_target_languages = { - "Japanese":"ja", - "English American":"en-US", - "English British":"en-GB", - "Bulgarian":"bg", - "Czech":"cs", - "Danish":"da", - "German":"de", - "Greek":"el", - "English":"en", - "Spanish":"es", - "Estonian":"et", - "Finnish":"fi", - "French":"fr", - "Hungarian":"hu", - "Indonesian":"id", - "Italian":"it", - "Korean":"ko", - "Lithuanian":"lt", - "Latvian":"lv", - "Norwegian":"nb", - "Dutch":"nl", - "Polish":"pl", - "Portuguese Brazilian":"pt-BR", - "Portuguese European":"pt-PT", - "Romanian":"ro", - "Russian":"ru", - "Slovak":"sk", - "Slovenian":"sl", - "Swedish":"sv", - "Turkish":"tr", - "Ukrainian":"uk", - "Chinese Simplified":"zh", - "Chinese Traditional":"zh" -} -translation_lang["DeepL_API"] = { - "source": dict_deepl_api_source_languages, - "target": dict_deepl_api_target_languages, -} - -dict_google_languages = { - "Japanese":"ja", - "English":"en", - "Chinese Simplified":"zh", - "Chinese Traditional":"zh-TW", - "Arabic":"ar", - "Russian":"ru", - "French":"fr", - "German":"de", - "Spanish":"es", - "Portuguese":"pt", - "Italian":"it", - "Korean":"ko", - "Greek":"el", - "Dutch":"nl", - "Hindi":"hi", - "Turkish":"tr", - "Malay":"ms", - "Thai":"th", - "Vietnamese":"vi", - "Indonesian":"id", - "Hebrew":"he", - "Polish":"pl", - "Mongolian":"mn", - "Czech":"cs", - "Hungarian":"hu", - "Estonian":"et", - "Bulgarian":"bg", - "Danish":"da", - "Finnish":"fi", - "Romanian":"ro", - "Swedish":"sv", - "Slovenian":"sl", - "Persian/Farsi":"fa", - "Bosnian":"bs", - "Serbian":"sr", - "Filipino":"tl", - "Haitiancreole":"ht", - "Catalan":"ca", - "Croatian":"hr", - "Latvian":"lv", - "Lithuanian":"lt", - "Urdu":"ur", - "Ukrainian":"uk", - "Welsh":"cy", - "Swahili":"sw", - "Samoan":"sm", - "Slovak":"sk", - "Afrikaans":"af", - "Norwegian":"no", - "Bengali":"bn", - "Malagasy":"mg", - "Maltese":"mt", - "Gujarati":"gu", - "Tamil":"ta", - "Telugu":"te", - "Punjabi":"pa", - "Amharic":"am", - "Azerbaijani":"az", - "Belarusian":"be", - "Cebuano":"ceb", - "Esperanto":"eo", - "Basque":"eu", - "Irish":"ga" -} -translation_lang["Google"] = { - "source":dict_google_languages, - "target":dict_google_languages, -} - -dict_bing_languages = { - "Japanese":"ja", - "English":"en", - "Chinese Simplified":"zh", - "Chinese Traditional":"zh-Hant", - "Arabic":"ar", - "Russian":"ru", - "French":"fr", - "German":"de", - "Spanish":"es", - "Portuguese":"pt", - "Italian":"it", - "Korean":"ko", - "Greek":"el", - "Dutch":"nl", - "Hindi":"hi", - "Turkish":"tr", - "Malay":"ms", - "Thai":"th", - "Vietnamese":"vi", - "Indonesian":"id", - "Hebrew":"he", - "Polish":"pl", - "Czech":"cs", - "Hungarian":"hu", - "Estonian":"et", - "Bulgarian":"bg", - "Danish":"da", - "Finnish":"fi", - "Romanian":"ro", - "Swedish":"sv", - "Slovenian":"sl", - "Persian/Farsi":"fa", - "Bosnian":"bs", - "Serbian":"sr", - "Fijian":"fj", - "Filipino":"tl", - "Haitiancreole":"ht", - "Catalan":"ca", - "Croatian":"hr", - "Latvian":"lv", - "Lithuanian":"lt", - "Urdu":"ur", - "Ukrainian":"uk", - "Welsh":"cy", - "Tahiti":"ty", - "Tongan":"to", - "Swahili":"sw", - "Samoan":"sm", - "Slovak":"sk", - "Afrikaans":"af", - "Norwegian":"no", - "Bengali":"bn", - "Malagasy":"mg", - "Maltese":"mt", - "Queretaro otomi":"otq", - "Klingon/tlhingan Hol":"tlh", - "Gujarati":"gu", - "Tamil":"ta", - "Telugu":"te", - "Punjabi":"pa", - "Irish":"ga" -} -translation_lang["Bing"] = { - "source":dict_bing_languages, - "target":dict_bing_languages, -} - -dict_papago_languages = { - "German": "de", - "English": "en", - "Spanish":"es", - "French": "fr", - "Hindi": "hi", - "Indonesian": "id", - "Italian": "it", - "Japanese": "ja", - "Korean": "ko", - "Portuguese": "pt", - "Russian": "ru", - "Thai": "th", - "Vietnamese": "vi", - "Chinese Simplified":"zh-CN", - "Chinese Traditional":"zh-TW", -} - -translation_lang["Papago"] = { - "source":dict_papago_languages, - "target":dict_papago_languages, -} - -dict_ctranslate2_languages = { - "English": "en", - "Chinese Simplified": "zh", - "Chinese Traditional":"zh", - "German": "de", - "Spanish": "es", - "Russian": "ru", - "Korean": "ko", - "French": "fr", - "Japanese": "ja", - "Portuguese": "pt", - "Turkish": "tr", - "Polish": "pl", - "Catalan": "ca", - "Dutch": "nl", - "Arabic": "ar", - "Swedish": "sv", - "Italian": "it", - "Indonesian": "id", - "Hindi": "hi", - "Finnish": "fi", - "Vietnamese": "vi", - "Hebrew": "he", - "Ukrainian": "uk", - "Greek": "el", - "Malay": "ms", - "Czech": "cs", - "Romanian": "ro", - "Danish": "da", - "Hungarian": "hu", - "Tamil": "ta", - "Norwegian": "no", - "Thai": "th", - "Urdu": "ur", - "Croatian": "hr", - "Bulgarian": "bg", - "Lithuanian": "lt", - "Latin": "la", - "Maori": "mi", - "Malayalam": "ml", - "Welsh": "cy", - "Slovak": "sk", - "Telugu": "te", - "Persian": "fa", - "Latvian": "lv", - "Bengali": "bn", - "Serbian": "sr", - "Azerbaijani": "az", - "Slovenian": "sl", - "Kannada": "kn", - "Estonian": "et", - "Macedonian": "mk", - "Breton": "br", - "Basque": "eu", - "Icelandic": "is", - "Armenian": "hy", - "Nepali": "ne", - "Mongolian": "mn", - "Bosnian": "bs", - "Kazakh": "kk", - "Albanian": "sq", - "Swahili": "sw", - "Galician": "gl", - "Marathi": "mr", - "Punjabi": "pa", - "Sinhala": "si", - "Khmer": "km", - "Shona": "sn", - "Yoruba": "yo", - "Somali": "so", - "Afrikaans": "af", - "Occitan": "oc", - "Georgian": "ka", - "Belarusian": "be", - "Tajik": "tg", - "Sindhi": "sd", - "Gujarati": "gu", - "Amharic": "am", - "Yiddish": "yi", - "Lao": "lo", - "Uzbek": "uz", - "Faroese": "fo", - "Haitian creole": "ht", - "Pashto": "ps", - "Turkmen": "tk", - "Nynorsk": "nn", - "Maltese": "mt", - "Sanskrit": "sa", - "Luxembourgish": "lb", - "Myanmar": "my", - "Tibetan": "bo", - "Filipino": "tl", - "Malagasy": "mg", - "Assamese": "as", - "Tatar": "tt", - "Hawaiian": "haw", - "Lingala": "ln", - "Hausa": "ha", - "Bashkir": "ba", - "Javanese": "jw", - "Sundanese": "su" -} - -translation_lang["CTranslate2"] = { - "source":dict_ctranslate2_languages, - "target":dict_ctranslate2_languages, -} \ No newline at end of file diff --git a/models/translation/translation_translator.py b/models/translation/translation_translator.py deleted file mode 100644 index 56c5cf64..00000000 --- a/models/translation/translation_translator.py +++ /dev/null @@ -1,140 +0,0 @@ -import os -from deepl import Translator as deepl_Translator -from translators import translate_text as other_web_Translator -from .translation_languages import translation_lang -from .translation_utils import ctranslate2_weights - -import ctranslate2 -import transformers - -# Translator -class Translator(): - def __init__(self): - self.deepl_client = None - self.ctranslate2_translator = None - self.ctranslate2_tokenizer = None - self.is_loaded_ctranslate2_model = False - - def authenticationDeepLAuthKey(self, authkey): - result = True - try: - self.deepl_client = deepl_Translator(authkey) - self.deepl_client.translate_text(" ", target_lang="EN-US") - except Exception: - self.deepl_client = None - result = False - return result - - def changeCTranslate2Model(self, path, model_type): - self.is_loaded_ctranslate2_model = False - directory_name = ctranslate2_weights[model_type]["directory_name"] - tokenizer = ctranslate2_weights[model_type]["tokenizer"] - weight_path = os.path.join(path, "weights", "ctranslate2", directory_name) - tokenizer_path = os.path.join(path, "weights", "ctranslate2", directory_name, "tokenizer") - self.ctranslate2_translator = ctranslate2.Translator( - weight_path, - device="cpu", - device_index=0, - compute_type="int8", - inter_threads=1, - intra_threads=4 - ) - try: - self.ctranslate2_tokenizer = transformers.AutoTokenizer.from_pretrained(tokenizer, cache_dir=tokenizer_path) - except Exception as e: - print("Error: changeCTranslate2Model()", e) - tokenizer_path = os.path.join("./weights", "ctranslate2", directory_name, "tokenizer") - self.ctranslate2_tokenizer = transformers.AutoTokenizer.from_pretrained(tokenizer, cache_dir=tokenizer_path) - self.is_loaded_ctranslate2_model = True - - def isLoadedCTranslate2Model(self): - return self.is_loaded_ctranslate2_model - - def translateCTranslate2(self, message, source_language, target_language): - result = False - if self.is_loaded_ctranslate2_model is True: - try: - self.ctranslate2_tokenizer.src_lang = source_language - source = self.ctranslate2_tokenizer.convert_ids_to_tokens(self.ctranslate2_tokenizer.encode(message)) - target_prefix = [self.ctranslate2_tokenizer.lang_code_to_token[target_language]] - results = self.ctranslate2_translator.translate_batch([source], target_prefix=[target_prefix]) - target = results[0].hypotheses[0][1:] - result = self.ctranslate2_tokenizer.decode(self.ctranslate2_tokenizer.convert_tokens_to_ids(target)) - except Exception: - pass - return result - - @staticmethod - def getLanguageCode(translator_name, target_country, source_language, target_language): - match translator_name: - case "DeepL_API": - if target_language == "English": - if target_country in ["United States", "Canada", "Philippines"]: - target_language = "English American" - else: - target_language = "English British" - elif target_language == "Portuguese": - if target_country in ["Portugal"]: - target_language = "Portuguese European" - else: - target_language = "Portuguese Brazilian" - case _: - pass - source_language=translation_lang[translator_name]["source"][source_language] - target_language=translation_lang[translator_name]["target"][target_language] - return source_language, target_language - - def translate(self, translator_name, source_language, target_language, target_country, message): - try: - result = "" - source_language, target_language = self.getLanguageCode(translator_name, target_country, source_language, target_language) - match translator_name: - case "DeepL": - result = other_web_Translator( - query_text=message, - translator="deepl", - from_language=source_language, - to_language=target_language, - ) - case "DeepL_API": - if self.deepl_client is None: - result = False - else: - result = self.deepl_client.translate_text( - message, - source_lang=source_language, - target_lang=target_language, - ).text - case "Google": - result = other_web_Translator( - query_text=message, - translator="google", - from_language=source_language, - to_language=target_language, - ) - case "Bing": - result = other_web_Translator( - query_text=message, - translator="bing", - from_language=source_language, - to_language=target_language, - ) - case "Papago": - result = other_web_Translator( - query_text=message, - translator="papago", - from_language=source_language, - to_language=target_language, - ) - case "CTranslate2": - result = self.translateCTranslate2( - message=message, - source_language=source_language, - target_language=target_language, - ) - except Exception: - import traceback - with open('error.log', 'a') as f: - traceback.print_exc(file=f) - result = False - return result \ No newline at end of file diff --git a/models/translation/translation_utils.py b/models/translation/translation_utils.py deleted file mode 100644 index 308a3eab..00000000 --- a/models/translation/translation_utils.py +++ /dev/null @@ -1,86 +0,0 @@ -import tempfile -from zipfile import ZipFile -from os import path as os_path -from os import makedirs as os_makedirs -from requests import get as requests_get -from typing import Callable -import hashlib - -ctranslate2_weights = { - "Small": { # M2M-100 418M-parameter model - "url": "https://github.com/misyaguziya/VRCT-weights/releases/download/v1.0/m2m100_418m.zip", - "directory_name": "m2m100_418m", - "tokenizer": "facebook/m2m100_418M", - "hash": { - "model.bin": "e7c26a9abb5260abd0268fbe3040714070dec254a990b4d7fd3f74c5230e3acb", - "sentencepiece.model": "d8f7c76ed2a5e0822be39f0a4f95a55eb19c78f4593ce609e2edbc2aea4d380a", - "shared_vocabulary.txt": "bd440aa21b8ca3453fc792a0018a1f3fe68b3464aadddd4d16a4b72f73c86d8c", - } - }, - "Large": { # M2M-100 1.2B-parameter model - "url": "https://github.com/misyaguziya/VRCT-weights/releases/download/v1.0/m2m100_12b.zip", - "directory_name": "m2m100_12b", - "tokenizer": "facebook/m2m100_1.2b", - "hash": { - "model.bin": "abb7bf4ba7e5e016b6e3ed480c752459b2f783ac8fca372e7587675e5bf3a919", - "sentencepiece.model": "d8f7c76ed2a5e0822be39f0a4f95a55eb19c78f4593ce609e2edbc2aea4d380a", - "shared_vocabulary.txt": "bd440aa21b8ca3453fc792a0018a1f3fe68b3464aadddd4d16a4b72f73c86d8c", - } - }, -} - -def calculate_file_hash(file_path, block_size=65536): - hash_object = hashlib.sha256() - - with open(file_path, 'rb') as file: - for block in iter(lambda: file.read(block_size), b''): - hash_object.update(block) - - return hash_object.hexdigest() - -def checkCTranslate2Weight(path, weight_type="Small"): - weight_directory_name = ctranslate2_weights[weight_type]["directory_name"] - hash_data = ctranslate2_weights[weight_type]["hash"] - files = [ - "model.bin", - "sentencepiece.model", - "shared_vocabulary.txt" - ] - - # check already downloaded - already_downloaded = False - if all(os_path.exists(os_path.join(path, weight_directory_name, file)) for file in files): - # check hash - for file in files: - original_hash = hash_data[file] - current_hash = calculate_file_hash(os_path.join(path, weight_directory_name, file)) - if original_hash != current_hash: - break - already_downloaded = True - return already_downloaded - -def downloadCTranslate2Weight(root, weight_type="Small", func=None): - url = ctranslate2_weights[weight_type]["url"] - filename = "weight.zip" - path = os_path.join(root, "weights", "ctranslate2") - os_makedirs(path, exist_ok=True) - - if checkCTranslate2Weight(path, weight_type): - return - - try: - with tempfile.TemporaryDirectory() as tmp_path: - res = requests_get(url, stream=True) - file_size = int(res.headers.get('content-length', 0)) - total_chunk = 0 - with open(os_path.join(tmp_path, filename), 'wb') as file: - for chunk in res.iter_content(chunk_size=1024*5): - file.write(chunk) - if isinstance(func, Callable): - total_chunk += len(chunk) - func(total_chunk/file_size) - - with ZipFile(os_path.join(tmp_path, filename)) as zf: - zf.extractall(path) - except Exception as e: - print("error:downloadCTranslate2Weight()", e) \ No newline at end of file diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index e5b4bc5a..00000000 --- a/requirements.txt +++ /dev/null @@ -1,22 +0,0 @@ -pillow == 10.0.0 -PyAudioWPatch == 0.2.12.6 -python-osc == 1.8.3 -customtkinter == 5.2.0 -deepl == 1.15.0 -flashtext == 2.7 -pyyaml == 6.0.1 -python-i18n == 0.3.9 -CTkToolTip == 0.8 -pyinstaller==6.2.0 -numpy==1.26.4 -torch==2.2.2 -transformers==4.37.2 -sentencepiece==0.1.99 -ctranslate2==4.1.0 -faster-whisper==1.0.3 -openvr==1.26.701 -pydub==0.25.1 -psutil==5.9.8 -translators @ git+https://github.com/misyaguziya/translators@5.9.2.1 -SpeechRecognition @ git+https://github.com/misyaguziya/custom_speech_recognition@3.10.4 -tinyoscquery @ git+https://github.com/cyberkitsune/tinyoscquery@0.1.2 \ No newline at end of file diff --git a/utils.py b/utils.py deleted file mode 100644 index b80923f8..00000000 --- a/utils.py +++ /dev/null @@ -1,72 +0,0 @@ -import random -from typing import Union -from os import path as os_path, rename as os_rename -from PIL.Image import open as Image_open - -def getImageFile(file_name): - img = Image_open(os_path.join(os_path.dirname(__file__), "img", file_name)) - return img - -def getKeyByValue(dictionary, value): - for key, val in dictionary.items(): - if val == value: - return key - return None - -def callFunctionIfCallable(function, *args): - if callable(function) is True: - function(*args) - -def isEven(number): - return number % 2 == 0 - -def makeEven(number, minus:bool=False): - if minus is True: - return number if isEven(number) else number - 1 - return number if isEven(number) else number + 1 - -def generatePercentageStringsList(start:int, end:int, step:int): - strings = [] - for percent in range(start, end + 1, step): - strings.append(f"{percent}%") - return strings - -def intToPctStr(value:int): - return f"{value}%" - -def floatToPctStr(value:float): - return f"{int(value*100)}%" - -def strPctToInt(value:str): - return int(value.replace("%", "")) - -def isUniqueStrings(unique_strings:Union[str, list], input_string:str, require=False): - import re - if isinstance(unique_strings, str): - unique_strings = [unique_strings] - patterns = [re.escape(s) for s in unique_strings] - - counts = [len(re.findall(pattern, input_string)) for pattern in patterns] - - if require is True: - # If require is True, unique_strings must appear once - return all(count == 1 for count in counts) and counts.count(1) == 2 - else: - # If require is False, check if unique strings are used exactly once - return all(count == 1 for count in counts) - -# path先のweightフォルダがある場合にはそのフォルダ名をweightsに変更する -def renameWeightFolder(path): - weight_path = os_path.join(path, "weight") - if os_path.exists(weight_path): - os_rename(weight_path, os_path.join(path, "weights")) - -def splitList(lst:list, split_count:int, to_shuffle:bool=False): - if to_shuffle is True: - random.shuffle(lst) - - split_lists = [] - for i in range(0, len(lst), split_count): - sub_list = lst[i:i+split_count] - split_lists.append(sub_list) - return split_lists \ No newline at end of file diff --git a/venv.bat b/venv.bat deleted file mode 100644 index 21f16485..00000000 --- a/venv.bat +++ /dev/null @@ -1,2 +0,0 @@ -python -m venv .venv -.venv/Scripts/Activate.ps1 \ No newline at end of file diff --git a/view.py b/view.py deleted file mode 100644 index 848e10a7..00000000 --- a/view.py +++ /dev/null @@ -1,2465 +0,0 @@ -from typing import Union -from os import path as os_path -from types import SimpleNamespace -from tkinter import font as tk_font -import webbrowser -import i18n - -from customtkinter import StringVar, IntVar, DoubleVar, BooleanVar, get_appearance_mode -from vrct_gui.ui_managers import ColorThemeManager, UiScalingManager, AboutVrctManager -from vrct_gui import vrct_gui -from utils import callFunctionIfCallable, intToPctStr, floatToPctStr - -from config import config - -class View(): - def __init__(self): - # Localization - 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) - - # Save settings at startup for items that require a restart VRCT for the changes to apply - self.restart_required_configs_pre_data = SimpleNamespace( - appearance_theme=config.APPEARANCE_THEME, - ui_scaling=config.UI_SCALING, - font_family=config.FONT_FAMILY, - ui_language=config.UI_LANGUAGE, - is_reset_button_displayed_for_translation=config.IS_RESET_BUTTON_DISPLAYED_FOR_TRANSLATION, - is_reset_button_displayed_for_whisper=config.IS_RESET_BUTTON_DISPLAYED_FOR_WHISPER, - ) - - if config.ENABLE_SPEAKER2CHATBOX is False: - VERSION_TEXT=i18n.t("config_window.version", version=config.VERSION) - else: - VERSION_TEXT=i18n.t("config_window.version", version=config.VERSION) + " (Speaker2Chatbox)" - - self.TEXT_TRANSLATOR_CTRANSLATE2=i18n.t("main_window.translator") + ": " + i18n.t("main_window.translator_ctranslate2") - - 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) - - common_args = { - "image_file": all_ctm.image_file, - "FONT_FAMILY": config.FONT_FAMILY, - } - - self.settings.main = SimpleNamespace( - ctm=all_ctm.main, - uism=all_uism.main, - geometry=SimpleNamespace( - width=config.MAIN_WINDOW_GEOMETRY["width"], - height=config.MAIN_WINDOW_GEOMETRY["height"], - x_pos=config.MAIN_WINDOW_GEOMETRY["x_pos"], - y_pos=config.MAIN_WINDOW_GEOMETRY["y_pos"], - ), - to_restore_main_window_geometry=config.ENABLE_RESTORE_MAIN_WINDOW_GEOMETRY, - **common_args - ) - - about_vrct = AboutVrctManager(config.UI_SCALING, config.UI_LANGUAGE, all_ctm.config_window) - self.settings.config_window = SimpleNamespace( - ctm=all_ctm.config_window, - uism=all_uism.config_window, - about_vrct=about_vrct, - **common_args - ) - - self.settings.selectable_language_window = SimpleNamespace( - ctm=all_ctm.selectable_language_window, - uism=all_uism.selectable_language_window, - **common_args - ) - - self.settings.main_window_cover = SimpleNamespace( - ctm=all_ctm.main_window_cover, - uism=all_uism.main_window_cover, - **common_args - ) - - self.settings.notification_message_window = SimpleNamespace( - uism=all_uism.notification_message_window, - **common_args - ) - - self.settings.confirmation_modal = SimpleNamespace( - ctm=all_ctm.confirmation_modal, - uism=all_uism.confirmation_modal, - **common_args - ) - - self.settings.dropdown_menu_window = SimpleNamespace( - # ctm=all_ctm.dropdown_menu_window, - uism=all_uism.dropdown_menu_window, - **common_args - ) - - self.view_variable = SimpleNamespace( - # Common - CALLBACK_ENABLE_EASTER_EGG=None, - - CALLBACK_RESTART_SOFTWARE=None, - CALLBACK_UPDATE_SOFTWARE=None, - CALLBACK_OPEN_FILEPATH_LOGS=None, - CALLBACK_OPEN_FILEPATH_CONFIG_FILE=None, - CALLBACK_OPEN_WEBPAGE_DEEPL_AUTH_KEY=self.openWebPage_DeepL_Auth_Key, - - CALLBACK_DELETE_MAIN_WINDOW=self.quitVRCT, - CALLBACK_QUIT_VRCT=None, - - CALLBACK_WHEN_DETECT_WINDOW_OVERED_SIZE=self._showDisplayOverUiSizeConfirmationModal, - - IS_ENTRY_MESSAGE_BOX_DISABLED=False, - - # Confirmation Modal - CALLBACK_HIDE_CONFIRMATION_MODAL=None, - CALLBACK_ACCEPTED_CONFIRMATION_MODAL=None, - CALLBACK_DENIED_CONFIRMATION_MODAL=None, - VAR_MESSAGE_CONFIRMATION_MODAL=StringVar(value=""), - VAR_LABEL_CONFIRMATION_MODAL_DENY_BUTTON=StringVar(value=""), - VAR_LABEL_CONFIRMATION_MODAL_ACCEPT_BUTTON=StringVar(value=""), - - # Window Control (Config Window) - CALLBACK_CLICKED_OPEN_CONFIG_WINDOW_BUTTON=self._openConfigWindow, - CALLBACK_CLICKED_CLOSE_CONFIG_WINDOW_BUTTON=self._closeConfigWindow, - 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 Confirmation Modal - CALLBACK_CLICKED_UPDATE_AVAILABLE=self._showUpdateSoftwareConfirmationModal, - - - - - # Overlay Settings - VAR_OVERLAY_SETTINGS=StringVar(value="Overlay (VR)"), - CALLBACK_SET_OPEN_OVERLAY_SETTINGS_WINDOW=self._openVrSettingsWindow, - VAR_TO_DEFAULT_OVERLAY_SETTINGS=StringVar(value=i18n.t("overlay_settings.restore_default_settings")), - CALLBACK_SET_TO_DEFAULT_OVERLAY_SETTINGS=self._toDefaultOverlaySettings, - VAR_OVERLAY_SMALL_LOG_STATE=StringVar(value=""), - - - CALLBACK_SET_OPEN_VRC_MIC_MUTE_SYNC_SETTINGS_WINDOW=self._openVrcMicMuteSyncSettingsWindow, - VAR_VRC_MIC_MUTE_SYNC_SETTINGS=StringVar(value=i18n.t("config_window.vrc_mic_mute_sync.label")), - VAR_VRC_MIC_MUTE_SYNC_STATE=StringVar(value=""), - - - VAR_LABEL_OVERLAY_OPACITY=StringVar(value=i18n.t("overlay_settings.opacity")), - SLIDER_RANGE_OVERLAY_OPACITY=(0.1, 1.0), - NUMBER_OF_STEPS_OVERLAY_OPACITY=18, - VAR_OVERLAY_OPACITY=DoubleVar(value=config.OVERLAY_SETTINGS["opacity"]), - VAR_CURRENT_VALUE_OVERLAY_OPACITY=StringVar(value=floatToPctStr(config.OVERLAY_SETTINGS["opacity"])), - - VAR_LABEL_OVERLAY_UI_SCALING=StringVar(value=i18n.t("overlay_settings.ui_scaling")), - SLIDER_RANGE_OVERLAY_UI_SCALING=(0.4, 2.0), - NUMBER_OF_STEPS_OVERLAY_UI_SCALING=16, - VAR_OVERLAY_UI_SCALING=DoubleVar(value=config.OVERLAY_SETTINGS["ui_scaling"]), - VAR_CURRENT_VALUE_OVERLAY_UI_SCALING=StringVar(value=floatToPctStr(config.OVERLAY_SETTINGS["ui_scaling"])), - - - - CALLBACK_SET_OVERLAY_SMALL_LOG_SETTINGS=None, - - VAR_LABEL_OVERLAY_SMALL_LOG_X_POS=StringVar(value=i18n.t("overlay_settings.x_position")), - # SLIDER_RANGE_OVERLAY_SMALL_LOG_X_POS=(-5, 5), - # NUMBER_OF_STEPS_OVERLAY_SMALL_LOG_X_POS=10000, - SLIDER_RANGE_OVERLAY_SMALL_LOG_X_POS=(-0.5, 0.5), - NUMBER_OF_STEPS_OVERLAY_SMALL_LOG_X_POS=100, - VAR_OVERLAY_SMALL_LOG_X_POS=DoubleVar(value=config.OVERLAY_SMALL_LOG_SETTINGS["x_pos"]), - VAR_CURRENT_VALUE_OVERLAY_SMALL_LOG_X_POS=StringVar(value=config.OVERLAY_SMALL_LOG_SETTINGS["x_pos"]), - - VAR_LABEL_OVERLAY_SMALL_LOG_Y_POS=StringVar(value=i18n.t("overlay_settings.y_position")), - # SLIDER_RANGE_OVERLAY_SMALL_LOG_Y_POS=(-5, 5), - # NUMBER_OF_STEPS_OVERLAY_SMALL_LOG_Y_POS=10000, - SLIDER_RANGE_OVERLAY_SMALL_LOG_Y_POS=(-0.8, 0.8), - NUMBER_OF_STEPS_OVERLAY_SMALL_LOG_Y_POS=160, - VAR_OVERLAY_SMALL_LOG_Y_POS=DoubleVar(value=config.OVERLAY_SMALL_LOG_SETTINGS["y_pos"]), - VAR_CURRENT_VALUE_OVERLAY_SMALL_LOG_Y_POS=StringVar(value=config.OVERLAY_SMALL_LOG_SETTINGS["y_pos"]), - - VAR_LABEL_OVERLAY_SMALL_LOG_Z_POS=StringVar(value=i18n.t("overlay_settings.z_position")), - # SLIDER_RANGE_OVERLAY_SMALL_LOG_Z_POS=(-5, 5), - # NUMBER_OF_STEPS_OVERLAY_SMALL_LOG_Z_POS=10000, - SLIDER_RANGE_OVERLAY_SMALL_LOG_Z_POS=(-0.5, 1.5), - NUMBER_OF_STEPS_OVERLAY_SMALL_LOG_Z_POS=100, - VAR_OVERLAY_SMALL_LOG_Z_POS=DoubleVar(value=config.OVERLAY_SMALL_LOG_SETTINGS["z_pos"]), - VAR_CURRENT_VALUE_OVERLAY_SMALL_LOG_Z_POS=StringVar(value=config.OVERLAY_SMALL_LOG_SETTINGS["z_pos"]), - - VAR_LABEL_OVERLAY_SMALL_LOG_X_ROTATION=StringVar(value=i18n.t("overlay_settings.x_rotation")), - SLIDER_RANGE_OVERLAY_SMALL_LOG_X_ROTATION=(-180, 180), - NUMBER_OF_STEPS_OVERLAY_SMALL_LOG_X_ROTATION=360, - VAR_OVERLAY_SMALL_LOG_X_ROTATION=DoubleVar(value=config.OVERLAY_SMALL_LOG_SETTINGS["x_rotation"]), - VAR_CURRENT_VALUE_OVERLAY_SMALL_LOG_X_ROTATION=StringVar(value=config.OVERLAY_SMALL_LOG_SETTINGS["x_rotation"]), - - VAR_LABEL_OVERLAY_SMALL_LOG_Y_ROTATION=StringVar(value=i18n.t("overlay_settings.y_rotation")), - SLIDER_RANGE_OVERLAY_SMALL_LOG_Y_ROTATION=(-180, 180), - NUMBER_OF_STEPS_OVERLAY_SMALL_LOG_Y_ROTATION=360, - VAR_OVERLAY_SMALL_LOG_Y_ROTATION=DoubleVar(value=config.OVERLAY_SMALL_LOG_SETTINGS["y_rotation"]), - VAR_CURRENT_VALUE_OVERLAY_SMALL_LOG_Y_ROTATION=StringVar(value=config.OVERLAY_SMALL_LOG_SETTINGS["y_rotation"]), - - VAR_LABEL_OVERLAY_SMALL_LOG_Z_ROTATION=StringVar(value=i18n.t("overlay_settings.z_rotation")), - SLIDER_RANGE_OVERLAY_SMALL_LOG_Z_ROTATION=(-180, 180), - NUMBER_OF_STEPS_OVERLAY_SMALL_LOG_Z_ROTATION=360, - VAR_OVERLAY_SMALL_LOG_Z_ROTATION=DoubleVar(value=config.OVERLAY_SMALL_LOG_SETTINGS["z_rotation"]), - VAR_CURRENT_VALUE_OVERLAY_SMALL_LOG_Z_ROTATION=StringVar(value=config.OVERLAY_SMALL_LOG_SETTINGS["z_rotation"]), - - - VAR_LABEL_OVERLAY_SMALL_LOG_DISPLAY_DURATION=StringVar(value=i18n.t("overlay_settings.display_duration")), - SLIDER_RANGE_OVERLAY_SMALL_LOG_DISPLAY_DURATION=(1, 60), - NUMBER_OF_STEPS_OVERLAY_SMALL_LOG_DISPLAY_DURATION=59, - VAR_OVERLAY_SMALL_LOG_DISPLAY_DURATION=IntVar(value=config.OVERLAY_SMALL_LOG_SETTINGS["display_duration"]), - VAR_CURRENT_VALUE_OVERLAY_SMALL_LOG_DISPLAY_DURATION=StringVar(value=f"{config.OVERLAY_SMALL_LOG_SETTINGS['display_duration']} second(s)"), - - VAR_LABEL_OVERLAY_SMALL_LOG_FADEOUT_DURATION=StringVar(value=i18n.t("overlay_settings.fadeout_duration")), - SLIDER_RANGE_OVERLAY_SMALL_LOG_FADEOUT_DURATION=(0, 5), - NUMBER_OF_STEPS_OVERLAY_SMALL_LOG_FADEOUT_DURATION=5, - VAR_OVERLAY_SMALL_LOG_FADEOUT_DURATION=IntVar(value=config.OVERLAY_SMALL_LOG_SETTINGS["fadeout_duration"]), - VAR_CURRENT_VALUE_OVERLAY_SMALL_LOG_FADEOUT_DURATION=StringVar(value=f"{config.OVERLAY_SMALL_LOG_SETTINGS['fadeout_duration']} second(s)"), - - - - - - - - - # 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=f"{config.SOURCE_LANGUAGE}\n({config.SOURCE_COUNTRY})"), - CALLBACK_OPEN_SELECTABLE_YOUR_LANGUAGE_WINDOW=None, - IS_OPENED_SELECTABLE_YOUR_LANGUAGE_WINDOW=False, - CALLBACK_SELECTED_YOUR_LANGUAGE=None, - - VAR_LABEL_BOTH_DIRECTION_SWAP_BUTTON=StringVar(value=""), - CALLBACK_SWAP_LANGUAGES=None, - CALLBACK_ENTERED_SWAP_LANGUAGES_BUTTON=self._enteredSwapLanguagesButton, - CALLBACK_LEAVED_SWAP_LANGUAGES_BUTTON=self._leavedSwapLanguagesButton, - - VAR_LABEL_TARGET_LANGUAGE=StringVar(value=i18n.t("main_window.target_language")), - VAR_TARGET_LANGUAGE=StringVar(value=f"{config.TARGET_LANGUAGE}\n({config.TARGET_COUNTRY})"), - CALLBACK_OPEN_SELECTABLE_TARGET_LANGUAGE_WINDOW=None, - IS_OPENED_SELECTABLE_TARGET_LANGUAGE_WINDOW=False, - CALLBACK_SELECTED_TARGET_LANGUAGE=None, - - VAR_SELECTED_TRANSLATION_ENGINE=StringVar(value="Translator: INIT"), - CALLBACK_SELECTED_TRANSLATION_ENGINE=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")), - - - CALLBACK_MESSAGE_BOX_BIND_KEYSYM__UP=None, - CALLBACK_MESSAGE_BOX_BIND_KEYSYM__DOWN=None, - # Main Window Cover - VAR_LABEL_MAIN_WINDOW_COVER_MESSAGE=StringVar(value=""), - - # 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=VERSION_TEXT), - 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")), - VAR_CONFIG_WINDOW_RESTART_BUTTON_LABEL=StringVar(value=i18n.t("config_window.restart_message")), - - CALLBACK_SLIDER_TOOLTIP_PERCENTAGE_FORMATTER=intToPctStr, - - - # 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_SECOND_TITLE_TRANSCRIPTION_INTERNAL_MODEL=StringVar(value=i18n.t("config_window.side_menu_labels.transcription_internal_model")), - VAR_SIDE_MENU_LABEL_VR=StringVar(value=i18n.t("config_window.side_menu_labels.vr")), - 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_SIDE_MENU_LABEL_ABOUT_VRCT=StringVar(value="About VRCT"), - # VAR_SIDE_MENU_LABEL_ABOUT_VRCT=StringVar(value=i18n.t("config_window.side_menu_labels.advanced_settings")), - - VAR_CURRENT_ACTIVE_CONFIG_TITLE=StringVar(value=""), - - # Appearance Tab - 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=config.TRANSPARENCY_RANGE, - 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=config.APPEARANCE_THEME_LIST, - 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=config.UI_SCALING_LIST, - CALLBACK_SET_UI_SCALING=None, - VAR_UI_SCALING=StringVar(value=config.UI_SCALING), - - VAR_LABEL_TEXTBOX_UI_SCALING=StringVar(value=i18n.t("config_window.textbox_ui_size.label")), - VAR_DESC_TEXTBOX_UI_SCALING=StringVar(value=i18n.t("config_window.textbox_ui_size.desc")), - SLIDER_RANGE_TEXTBOX_UI_SCALING=config.TEXTBOX_UI_SCALING_RANGE, - CALLBACK_SET_TEXTBOX_UI_SCALING=None, - VAR_TEXTBOX_UI_SCALING=IntVar(value=config.TEXTBOX_UI_SCALING), - CALLBACK_BUTTON_PRESS_TEXTBOX_UI_SCALING=self._closeTheCoverOfMainWindow, - CALLBACK_BUTTON_RELEASE_TEXTBOX_UI_SCALING=self._openTheCoverOfMainWindow, - - VAR_LABEL_MESSAGE_BOX_RATIO=StringVar(value=i18n.t("config_window.message_box_ratio.label")), - VAR_DESC_MESSAGE_BOX_RATIO=StringVar(value=i18n.t("config_window.message_box_ratio.desc")), - SLIDER_RANGE_MESSAGE_BOX_RATIO=config.MESSAGE_BOX_RATIO_RANGE, - CALLBACK_SET_MESSAGE_BOX_RATIO=None, - VAR_MESSAGE_BOX_RATIO=IntVar(value=config.MESSAGE_BOX_RATIO), - CALLBACK_BUTTON_PRESS_MESSAGE_BOX_RATIO=self._closeTheCoverOfMainWindow, - CALLBACK_BUTTON_RELEASE_MESSAGE_BOX_RATIO=self._openTheCoverOfMainWindow, - - 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(config.SELECTABLE_UI_LANGUAGES_DICT.values()), - CALLBACK_SET_UI_LANGUAGE=None, - VAR_UI_LANGUAGE=StringVar(value=config.SELECTABLE_UI_LANGUAGES_DICT[config.UI_LANGUAGE]), - - VAR_LABEL_ENABLE_RESTORE_MAIN_WINDOW_GEOMETRY=StringVar(value=i18n.t("config_window.to_restore_main_window_geometry.label")), - VAR_DESC_ENABLE_RESTORE_MAIN_WINDOW_GEOMETRY=StringVar(value=i18n.t("config_window.to_restore_main_window_geometry.desc")), - CALLBACK_SET_ENABLE_RESTORE_MAIN_WINDOW_GEOMETRY=None, - VAR_ENABLE_RESTORE_MAIN_WINDOW_GEOMETRY=BooleanVar(value=config.ENABLE_RESTORE_MAIN_WINDOW_GEOMETRY), - - # Translation Tab - VAR_LABEL_USE_TRANSLATION_FEATURE=StringVar(value=i18n.t("config_window.use_translation_feature.label")), - VAR_DESC_USE_TRANSLATION_FEATURE=StringVar(value=i18n.t("config_window.use_translation_feature.desc")), - CALLBACK_SET_USE_TRANSLATION_FEATURE=None, - VAR_USE_TRANSLATION_FEATURE=BooleanVar(value=config.USE_TRANSLATION_FEATURE), - - VAR_LABEL_CTRANSLATE2_WEIGHT_TYPE=StringVar(value=i18n.t("config_window.ctranslate2_weight_type.label")), - VAR_DESC_CTRANSLATE2_WEIGHT_TYPE=StringVar(value=i18n.t("config_window.ctranslate2_weight_type.desc")), - DICT_CTRANSLATE2_WEIGHT_TYPE=self.getSelectableCtranslate2WeightTypeDict(), - CALLBACK_SET_CTRANSLATE2_WEIGHT_TYPE=None, - VAR_CTRANSLATE2_WEIGHT_TYPE=StringVar(value=self.getSelectableCtranslate2WeightTypeDict()[config.CTRANSLATE2_WEIGHT_TYPE]), - - VAR_LABEL_DEEPL_AUTH_KEY=StringVar(value=i18n.t( "config_window.deepl_auth_key.label")), - VAR_DESC_DEEPL_AUTH_KEY=StringVar( - value=i18n.t( - "config_window.deepl_auth_key.desc", - translator=i18n.t("main_window.translator") - ) - ), - CALLBACK_SET_DEEPL_AUTH_KEY=None, - VAR_DEEPL_AUTH_KEY=StringVar(value=config.AUTH_KEYS["DeepL_API"]), - VAR_OPEN_DEEPL_WEB_PAGE=StringVar(value=i18n.t( "config_window.deepl_auth_key.open_auth_key_webpage")), - CALLBACK_FOCUS_OUT_DEEPL_AUTH_KEY=self.callbackBindFocusOut_DeeplAuthKey, - - - - # 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=""), - VAR_DESC_MIC_DYNAMIC_ENERGY_THRESHOLD=StringVar(value=""), - 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.callbackBindFocusOut_MicEnergyThreshold, - - - VAR_LABEL_MIC_RECORD_TIMEOUT=StringVar(value=i18n.t("config_window.mic_record_timeout.label")), - VAR_DESC_MIC_RECORD_TIMEOUT=StringVar(value=i18n.t("config_window.mic_record_timeout.desc")), - CALLBACK_SET_MIC_RECORD_TIMEOUT=None, - VAR_MIC_RECORD_TIMEOUT=StringVar(value=config.INPUT_MIC_RECORD_TIMEOUT), - CALLBACK_FOCUS_OUT_MIC_RECORD_TIMEOUT=self.callbackBindFocusOut_MicRecordTimeout, - - VAR_LABEL_MIC_PHRASE_TIMEOUT=StringVar(value=i18n.t("config_window.mic_phrase_timeout.label")), - VAR_DESC_MIC_PHRASE_TIMEOUT=StringVar(value=i18n.t("config_window.mic_phrase_timeout.desc")), - CALLBACK_SET_MIC_PHRASE_TIMEOUT=None, - VAR_MIC_PHRASE_TIMEOUT=StringVar(value=config.INPUT_MIC_PHRASE_TIMEOUT), - CALLBACK_FOCUS_OUT_MIC_PHRASE_TIMEOUT=self.callbackBindFocusOut_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.callbackBindFocusOut_MicMaxPhrases, - - CALLBACK_ARROW_SWITCH_MIC_WORD_FILTER_LIST_OPEN=self._openMicWordFilterList, - CALLBACK_ARROW_SWITCH_MIC_WORD_FILTER_LIST_CLOSE=self._closeMicWordFilterList, - - 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")), - VAR_SWITCH_DESC_MIC_WORD_FILTER=StringVar(value=i18n.t("config_window.mic_word_filter.count_desc", count=len(config.INPUT_MIC_WORD_FILTER))), - VAR_LABEL_MIC_WORD_FILTER_ADD_BUTTON=StringVar(value=i18n.t("config_window.mic_word_filter.add_button_label")), - CALLBACK_SET_MIC_WORD_FILTER=None, - MIC_WORD_FILTER_LIST=config.INPUT_MIC_WORD_FILTER, - - - # 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=""), - VAR_DESC_SPEAKER_DYNAMIC_ENERGY_THRESHOLD=StringVar(value=""), - 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.callbackBindFocusOut_SpeakerEnergyThreshold, - - - VAR_LABEL_SPEAKER_RECORD_TIMEOUT=StringVar(value=i18n.t("config_window.speaker_record_timeout.label")), - VAR_DESC_SPEAKER_RECORD_TIMEOUT=StringVar(value=i18n.t("config_window.speaker_record_timeout.desc")), - CALLBACK_SET_SPEAKER_RECORD_TIMEOUT=None, - VAR_SPEAKER_RECORD_TIMEOUT=StringVar(value=config.INPUT_SPEAKER_RECORD_TIMEOUT), - CALLBACK_FOCUS_OUT_SPEAKER_RECORD_TIMEOUT=self.callbackBindFocusOut_SpeakerRecordTimeout, - - VAR_LABEL_SPEAKER_PHRASE_TIMEOUT=StringVar(value=i18n.t("config_window.speaker_phrase_timeout.label")), - VAR_DESC_SPEAKER_PHRASE_TIMEOUT=StringVar(value=i18n.t("config_window.speaker_phrase_timeout.desc")), - CALLBACK_SET_SPEAKER_PHRASE_TIMEOUT=None, - VAR_SPEAKER_PHRASE_TIMEOUT=StringVar(value=config.INPUT_SPEAKER_PHRASE_TIMEOUT), - CALLBACK_FOCUS_OUT_SPEAKER_PHRASE_TIMEOUT=self.callbackBindFocusOut_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.callbackBindFocusOut_SpeakerMaxPhrases, - - - # Transcription Tab (Whisper Internal AI Model) - VAR_LABEL_USE_WHISPER_FEATURE=StringVar(value=i18n.t("config_window.use_whisper_feature.label")), - VAR_DESC_USE_WHISPER_FEATURE=StringVar(value=i18n.t("config_window.use_whisper_feature.desc")), - CALLBACK_SET_USE_WHISPER_FEATURE=None, - VAR_USE_WHISPER_FEATURE=BooleanVar(value=config.USE_WHISPER_FEATURE), - - VAR_LABEL_WHISPER_WEIGHT_TYPE=StringVar(value=i18n.t("config_window.whisper_weight_type.label")), - VAR_DESC_WHISPER_WEIGHT_TYPE=StringVar(value=i18n.t("config_window.whisper_weight_type.desc")), - DICT_WHISPER_WEIGHT_TYPE=self.getSelectableWhisperWeightTypeDict(), - CALLBACK_SET_WHISPER_WEIGHT_TYPE=None, - VAR_WHISPER_WEIGHT_TYPE=StringVar(value=self.getSelectableWhisperWeightTypeDict()[config.WHISPER_WEIGHT_TYPE]), - - - # VR Tab - VAR_LABEL_ENABLE_OVERLAY_SMALL_LOG=StringVar(value=i18n.t("config_window.enable_overlay_small_log.label")), - VAR_DESC_ENABLE_OVERLAY_SMALL_LOG=None, - # VAR_DESC_ENABLE_OVERLAY_SMALL_LOG=StringVar(value=i18n.t("config_window.enable_overlay_small_log.desc")), - CALLBACK_SET_ENABLE_OVERLAY_SMALL_LOG=None, - VAR_ENABLE_OVERLAY_SMALL_LOG=BooleanVar(value=config.ENABLE_OVERLAY_SMALL_LOG), - VAR_OPEN_OVERLAY_SETTINGS_BUTTON=StringVar(value=i18n.t("config_window.enable_overlay_small_log.open_overlay_settings")), - - - # 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_SEND_ONLY_TRANSLATED_MESSAGES=StringVar(value=i18n.t("config_window.send_only_translated_messages.label")), - VAR_DESC_ENABLE_SEND_ONLY_TRANSLATED_MESSAGES=None, - CALLBACK_SET_ENABLE_SEND_ONLY_TRANSLATED_MESSAGES=None, - VAR_ENABLE_SEND_ONLY_TRANSLATED_MESSAGES=BooleanVar(value=config.ENABLE_SEND_ONLY_TRANSLATED_MESSAGES), - - VAR_LABEL_SEND_MESSAGE_BUTTON_TYPE=StringVar(value=i18n.t("config_window.send_message_button_type.label")), - VAR_DESC_SEND_MESSAGE_BUTTON_TYPE=None, - CALLBACK_SET_SEND_MESSAGE_BUTTON_TYPE=None, - VAR_SEND_MESSAGE_BUTTON_TYPE=StringVar(value=config.SEND_MESSAGE_BUTTON_TYPE), - KEYS_VALUES_SEND_MESSAGE_BUTTON_TYPE={ - "hide": StringVar(value=i18n.t("config_window.send_message_button_type.hide")), - "show": StringVar(value=i18n.t("config_window.send_message_button_type.show")), - "show_and_disable_enter_key": StringVar(value=i18n.t("config_window.send_message_button_type.show_and_disable_enter_key")), - }, - - 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_ENABLE_VRC_MIC_MUTE_SYNC=StringVar(value=i18n.t("config_window.vrc_mic_mute_sync.label")), - VAR_DESC_ENABLE_VRC_MIC_MUTE_SYNC=StringVar(value=i18n.t("config_window.vrc_mic_mute_sync.desc")), - CALLBACK_SET_ENABLE_VRC_MIC_MUTE_SYNC=None, - VAR_ENABLE_VRC_MIC_MUTE_SYNC=BooleanVar(value=config.ENABLE_VRC_MIC_MUTE_SYNC), - - - 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), - - - - VAR_SECOND_TITLE_OTHERS_SEND_MESSAGE_FORMATS=StringVar(value=i18n.t("config_window.side_menu_labels.others_send_message_formats")), - - - VAR_LABEL_SEND_MESSAGE_FORMAT=StringVar(value=i18n.t("config_window.send_message_format.label")), - VAR_DESC_SEND_MESSAGE_FORMAT=StringVar(value=i18n.t("config_window.send_message_format.desc")), - CALLBACK_SET_SEND_MESSAGE_FORMAT=None, - VAR_SEND_MESSAGE_FORMAT=StringVar(value=config.SEND_MESSAGE_FORMAT), - VAR_LABEL_EXAMPLE_TEXT_SEND_MESSAGE_FORMAT=StringVar(value=""), - VAR_ENTRY_0_SEND_MESSAGE_FORMAT=StringVar(value=""), - VAR_ENTRY_1_SEND_MESSAGE_FORMAT=StringVar(value=""), - VAR_TEXT_REQUIRED_0_SEND_MESSAGE_FORMAT=StringVar(value="[message]"), - CALLBACK_FOCUS_OUT_SEND_MESSAGE_FORMAT=self.callbackBindFocusOut_SendMessageFormat, - - - VAR_LABEL_SEND_MESSAGE_FORMAT_WITH_T=StringVar(value=i18n.t("config_window.send_message_format_with_t.label")), - VAR_DESC_SEND_MESSAGE_FORMAT_WITH_T=StringVar(value=i18n.t("config_window.send_message_format_with_t.desc")), - CALLBACK_SET_SEND_MESSAGE_FORMAT_WITH_T=None, - CALLBACK_SWAP_SEND_MESSAGE_FORMAT_WITH_T_REQUIRED_TEXT=self._swapSendMessageFormatWithT_RequiredText, - VAR_SEND_MESSAGE_FORMAT_WITH_T=StringVar(value=config.SEND_MESSAGE_FORMAT_WITH_T), - VAR_LABEL_EXAMPLE_TEXT_SEND_MESSAGE_FORMAT_WITH_T=StringVar(value=""), - VAR_ENTRY_0_SEND_MESSAGE_FORMAT_WITH_T=StringVar(value=""), - VAR_ENTRY_1_SEND_MESSAGE_FORMAT_WITH_T=StringVar(value=""), - VAR_ENTRY_2_SEND_MESSAGE_FORMAT_WITH_T=StringVar(value=""), - VAR_TEXT_REQUIRED_0_SEND_MESSAGE_FORMAT_WITH_T=StringVar(value="[message]"), - VAR_TEXT_REQUIRED_1_SEND_MESSAGE_FORMAT_WITH_T=StringVar(value="[translation]"), - CALLBACK_FOCUS_OUT_SEND_MESSAGE_FORMAT_WITH_T=self.callbackBindFocusOut_SendMessageFormatWithT, - - - - VAR_LABEL_RECEIVED_MESSAGE_FORMAT=StringVar(value=i18n.t("config_window.received_message_format.label")), - VAR_DESC_RECEIVED_MESSAGE_FORMAT=StringVar(value=i18n.t("config_window.received_message_format.desc")), - CALLBACK_SET_RECEIVED_MESSAGE_FORMAT=None, - VAR_RECEIVED_MESSAGE_FORMAT=StringVar(value=config.RECEIVED_MESSAGE_FORMAT), - VAR_LABEL_EXAMPLE_TEXT_RECEIVED_MESSAGE_FORMAT=StringVar(value=""), - VAR_ENTRY_0_RECEIVED_MESSAGE_FORMAT=StringVar(value=""), - VAR_ENTRY_1_RECEIVED_MESSAGE_FORMAT=StringVar(value=""), - VAR_TEXT_REQUIRED_0_RECEIVED_MESSAGE_FORMAT=StringVar(value="[message]"), - CALLBACK_FOCUS_OUT_RECEIVED_MESSAGE_FORMAT=self.callbackBindFocusOut_ReceivedMessageFormat, - - - VAR_SECOND_TITLE_OTHERS_RECEIVED_MESSAGE_FORMATS=StringVar(value=i18n.t("config_window.side_menu_labels.others_received_message_formats")), - - VAR_LABEL_RECEIVED_MESSAGE_FORMAT_WITH_T=StringVar(value=i18n.t("config_window.received_message_format_with_t.label")), - VAR_DESC_RECEIVED_MESSAGE_FORMAT_WITH_T=StringVar(value=i18n.t("config_window.received_message_format_with_t.desc")), - CALLBACK_SET_RECEIVED_MESSAGE_FORMAT_WITH_T=None, - CALLBACK_SWAP_RECEIVED_MESSAGE_FORMAT_WITH_T_REQUIRED_TEXT=self._swapReceivedMessageFormatWithT_RequiredText, - VAR_RECEIVED_MESSAGE_FORMAT_WITH_T=StringVar(value=config.RECEIVED_MESSAGE_FORMAT_WITH_T), - VAR_LABEL_EXAMPLE_TEXT_RECEIVED_MESSAGE_FORMAT_WITH_T=StringVar(value=""), - VAR_ENTRY_0_RECEIVED_MESSAGE_FORMAT_WITH_T=StringVar(value=""), - VAR_ENTRY_1_RECEIVED_MESSAGE_FORMAT_WITH_T=StringVar(value=""), - VAR_ENTRY_2_RECEIVED_MESSAGE_FORMAT_WITH_T=StringVar(value=""), - VAR_TEXT_REQUIRED_0_RECEIVED_MESSAGE_FORMAT_WITH_T=StringVar(value="[message]"), - VAR_TEXT_REQUIRED_1_RECEIVED_MESSAGE_FORMAT_WITH_T=StringVar(value="[translation]"), - CALLBACK_FOCUS_OUT_RECEIVED_MESSAGE_FORMAT_WITH_T=self.callbackBindFocusOut_ReceivedMessageFormatWithT, - - - # -------------------Speaker2Chatbox----------- - VAR_SECOND_TITLE_OTHERS_SPEAKER2CHATBOX=StringVar(value=i18n.t("config_window.side_menu_labels.others_speaker2chatbox")), - - VAR_LABEL_ENABLE_SEND_RECEIVED_MESSAGE_TO_VRC=StringVar(value=i18n.t("config_window.send_received_message_to_vrc.label")), - VAR_DESC_ENABLE_SEND_RECEIVED_MESSAGE_TO_VRC=StringVar(value=i18n.t("config_window.send_received_message_to_vrc.desc")), - CALLBACK_SET_ENABLE_SEND_RECEIVED_MESSAGE_TO_VRC=None, - VAR_ENABLE_SEND_RECEIVED_MESSAGE_TO_VRC=BooleanVar(value=config.ENABLE_SEND_RECEIVED_MESSAGE_TO_VRC), - # -------------------Speaker2Chatbox----------- - - - - # 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), - - VAR_LABEL_OPEN_CONFIG_FILEPATH=StringVar(value=i18n.t("config_window.open_config_filepath.label")), - VAR_DESC_OPEN_CONFIG_FILEPATH=None, - - - # About VRCT Tab - CALLBACK_OPEN_WEBPAGE_ABOUT_VRCT=self.openWebPage_AboutVrct, - - CALLBACK_ABOUT_VRCT_POSTER_NEXT_BUTTON=None, - CALLBACK_ABOUT_VRCT_POSTER_PREV_BUTTON=None, - CALLBACK_ABOUT_VRCT_POSTER_IMAGE_CURRENT_PAGE_NUM=0, - - CALLBACK_ABOUT_VRCT_CHANGE_POSTER_SHOWCASE_WORLD_LIST=None, - CALLBACK_ABOUT_VRCT_POSTER_SHOWCASE_CURRENT_PAGE_NUM=0, - ) - - - - 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_ENABLE_EASTER_EGG=common_registers.get("callback_enable_easter_egg", None) - - self.view_variable.CALLBACK_UPDATE_SOFTWARE=common_registers.get("callback_update_software", None) - self.view_variable.CALLBACK_RESTART_SOFTWARE=common_registers.get("callback_restart_software", None) - self.view_variable.CALLBACK_OPEN_FILEPATH_LOGS=common_registers.get("callback_filepath_logs", None) - self.view_variable.CALLBACK_OPEN_FILEPATH_CONFIG_FILE=common_registers.get("callback_filepath_config_file", None) - self.view_variable.CALLBACK_QUIT_VRCT=common_registers.get("callback_quit_vrct", 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_SWAP_LANGUAGES=main_window_registers.get("callback_swap_languages", None) - - self.view_variable.CALLBACK_SELECTED_LANGUAGE_PRESET_TAB=main_window_registers.get("callback_selected_language_preset_tab", None) - - self.view_variable.CALLBACK_SELECTED_TRANSLATION_ENGINE=main_window_registers.get("callback_selected_translation_engine", None) - - def adjustedMessageBoxReturnFunction(_e): - if self.view_variable.IS_ENTRY_MESSAGE_BOX_DISABLED is True: - return - if config.SEND_MESSAGE_BUTTON_TYPE != "show_and_disable_enter_key": - main_window_registers.get("message_box_bind_Return")() - return "break" # For deleting the next line that will be inserted when the Enter key is pressed. - def pressedSendMessageButtonFunction(_e): - main_window_registers.get("message_box_bind_Return")() - vrct_gui.entry_message_box.focus() - - entry_message_box=getattr(vrct_gui, "entry_message_box") - entry_message_box.bind("", lambda _e: None) # This is to prevent message sending on Shift + Enter key press and just add a new line. - entry_message_box.bind("", adjustedMessageBoxReturnFunction) - entry_message_box.bind("", main_window_registers.get("message_box_bind_Any_KeyPress")) - self.view_variable.CALLBACK_CLICKED_SEND_MESSAGE_BUTTON=pressedSendMessageButtonFunction - - - self.view_variable.CALLBACK_MESSAGE_BOX_BIND_KEYSYM__UP=main_window_registers.get("message_box_bind_Up_KeyPress") - self.view_variable.CALLBACK_MESSAGE_BOX_BIND_KEYSYM__DOWN=main_window_registers.get("message_box_bind_Down_KeyPress") - - - entry_message_box.bind("", main_window_registers.get("message_box_bind_FocusIn")) - entry_message_box.bind("", main_window_registers.get("message_box_bind_FocusOut")) - - - 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_TEXTBOX_UI_SCALING=config_window_registers.get("callback_set_textbox_ui_scaling", None) - self.view_variable.CALLBACK_SET_MESSAGE_BOX_RATIO=config_window_registers.get("callback_set_message_box_ratio", 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) - self.view_variable.CALLBACK_SET_ENABLE_RESTORE_MAIN_WINDOW_GEOMETRY=config_window_registers.get("callback_set_enable_restore_main_window_geometry", None) - - - # Translation Tab - self.view_variable.CALLBACK_SET_USE_TRANSLATION_FEATURE=config_window_registers.get("callback_set_use_translation_feature", None) - self.view_variable.CALLBACK_SET_CTRANSLATE2_WEIGHT_TYPE=config_window_registers.get("callback_set_ctranslate2_weight_type", None) - self.view_variable.CALLBACK_SET_DEEPL_AUTH_KEY=config_window_registers.get("callback_set_deepl_auth_key", 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) - self.view_variable.CALLBACK_DELETE_MIC_WORD_FILTER=config_window_registers.get("callback_delete_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) - - # Transcription Tab (Internal AI Model) - self.view_variable.CALLBACK_SET_USE_WHISPER_FEATURE=config_window_registers.get("callback_set_use_whisper_feature", None) - self.view_variable.CALLBACK_SET_WHISPER_WEIGHT_TYPE=config_window_registers.get("callback_set_whisper_weight_type", None) - - # VR Tab - # VR Tab (Quick Settings) - self.view_variable.CALLBACK_SET_OVERLAY_SETTINGS=config_window_registers.get("callback_set_overlay_settings", None) - - self.view_variable.CALLBACK_SET_ENABLE_OVERLAY_SMALL_LOG=config_window_registers.get("callback_set_enable_overlay_small_log", None) - # VR Tab (Quick Settings) - self.view_variable.CALLBACK_SET_OVERLAY_SMALL_LOG_SETTINGS=config_window_registers.get("callback_set_overlay_small_log_settings", 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_SEND_ONLY_TRANSLATED_MESSAGES=config_window_registers.get("callback_set_send_only_translated_messages", None) - self.view_variable.CALLBACK_SET_SEND_MESSAGE_BUTTON_TYPE=config_window_registers.get("callback_set_send_message_button_type", 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_ENABLE_VRC_MIC_MUTE_SYNC=config_window_registers.get("callback_set_enable_vrc_mic_mute_sync", 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_SEND_MESSAGE_FORMAT=config_window_registers.get("callback_set_send_message_format", None) - self.view_variable.CALLBACK_SET_SEND_MESSAGE_FORMAT_WITH_T=config_window_registers.get("callback_set_send_message_format_with_t", None) - self.view_variable.CALLBACK_SET_RECEIVED_MESSAGE_FORMAT=config_window_registers.get("callback_set_received_message_format", None) - self.view_variable.CALLBACK_SET_RECEIVED_MESSAGE_FORMAT_WITH_T=config_window_registers.get("callback_set_received_message_format_with_t", None) - - # Speaker2Chatbox---------------- - self.view_variable.CALLBACK_SET_ENABLE_SEND_RECEIVED_MESSAGE_TO_VRC=config_window_registers.get("callback_set_enable_send_received_message_to_vrc", None) - # Speaker2Chatbox---------------- - - - - # 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() - - self.setMainWindowMessageBoxRatio(config.MESSAGE_BOX_RATIO) - - if config.USE_TRANSLATION_FEATURE is True: - self.useTranslationFeatureProcess("Normal") - self.view_variable.VAR_LABEL_BOTH_DIRECTION_SWAP_BUTTON.set(i18n.t("main_window.translate_each_other_label")) - else: - self.view_variable.VAR_LABEL_BOTH_DIRECTION_SWAP_BUTTON.set(i18n.t("main_window.swap_button_label")) - self.useTranslationFeatureProcess("Disable") - - - if config.ENABLE_VRC_MIC_MUTE_SYNC is True: - self.setStateVrcMicMuteSync("enabled") - elif config.ENABLE_VRC_MIC_MUTE_SYNC is False: - self.setStateVrcMicMuteSync("disabled") - - if config.ENABLE_OVERLAY_SMALL_LOG is True: - self.setStateOverlaySmallLog("enabled") - elif config.ENABLE_OVERLAY_SMALL_LOG is False: - self.setStateOverlaySmallLog("disabled") - - - 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.USE_WHISPER_FEATURE is True: - self.openWhisperWeightTypeWidget() - else: - self.closeWhisperWeightTypeWidget() - - if config.ENABLE_SPEAKER2CHATBOX is False: - vrct_gui._changeConfigWindowWidgetsStatus( - status="disabled", - target_names=[ - "sb__checkbox_enable_send_received_message_to_vrc", - ] - ) - - if config.INPUT_MIC_DYNAMIC_ENERGY_THRESHOLD is True: - self.closeMicEnergyThresholdWidget() - else: - self.openMicEnergyThresholdWidget() - - if config.INPUT_SPEAKER_DYNAMIC_ENERGY_THRESHOLD is True: - self.closeSpeakerEnergyThresholdWidget() - else: - self.openSpeakerEnergyThresholdWidget() - - - self.setSendMessageFormat_EntryWidgets(config.SEND_MESSAGE_FORMAT) - self.setSendMessageFormatWithT_EntryWidgets(config.SEND_MESSAGE_FORMAT_WITH_T) - self.setReceivedMessageFormat_EntryWidgets(config.RECEIVED_MESSAGE_FORMAT) - self.setReceivedMessageFormatWithT_EntryWidgets(config.RECEIVED_MESSAGE_FORMAT_WITH_T) - - - # Set Easter Egg - self.count = 0 - def clickedCounter(_e): - if self.count < 2: - self.count+=1 - print("Easter egg count:", self.count) - else: - print("Easter egg count:", self.count, "Easter egg has enabled.") - callFunctionIfCallable(self.view_variable.CALLBACK_ENABLE_EASTER_EGG) - print(config.OVERLAY_UI_TYPE) - - vrct_gui.sidebar_logo.bind( - "", - clickedCounter, - "+" - ) - - - # Insert sample conversation for testing. - # self._insertSampleConversationToTextbox() - - # vrct_gui.updating_window.showUpdatingWindow() - -# Send Message Format - def setSendMessageFormat_EntryWidgets(self, message_format:str): - result = self.extractMessageFormat(message_format) - - self.view_variable.VAR_ENTRY_0_SEND_MESSAGE_FORMAT.set(result.before) - self.view_variable.VAR_ENTRY_1_SEND_MESSAGE_FORMAT.set(result.after) - self.updateSendMessageFormat_ExampleTextWidget() - - def updateSendMessageFormat_ExampleTextWidget(self): - message = i18n.t("config_window.send_message_format.example_text") - example_message = config.SEND_MESSAGE_FORMAT.replace("[message]", message) - - self.view_variable.VAR_LABEL_EXAMPLE_TEXT_SEND_MESSAGE_FORMAT.set(example_message) - - -# Send Message Format With Translation - def setSendMessageFormatWithT_EntryWidgets(self, message_format:str): - result = self.extractMessageFormatWithT(message_format) - - if result.is_message_first is True: - self.view_variable.VAR_TEXT_REQUIRED_0_SEND_MESSAGE_FORMAT_WITH_T.set("[message]") - self.view_variable.VAR_TEXT_REQUIRED_1_SEND_MESSAGE_FORMAT_WITH_T.set("[translation]") - else: - self.view_variable.VAR_TEXT_REQUIRED_0_SEND_MESSAGE_FORMAT_WITH_T.set("[translation]") - self.view_variable.VAR_TEXT_REQUIRED_1_SEND_MESSAGE_FORMAT_WITH_T.set("[message]") - - self.view_variable.VAR_ENTRY_0_SEND_MESSAGE_FORMAT_WITH_T.set(result.before) - self.view_variable.VAR_ENTRY_1_SEND_MESSAGE_FORMAT_WITH_T.set(result.between) - self.view_variable.VAR_ENTRY_2_SEND_MESSAGE_FORMAT_WITH_T.set(result.after) - self.updateSendMessageFormatWithT_ExampleTextWidget() - - def _swapSendMessageFormatWithT_RequiredText(self): - text_0 = self.view_variable.VAR_TEXT_REQUIRED_0_SEND_MESSAGE_FORMAT_WITH_T.get() - text_1 = self.view_variable.VAR_TEXT_REQUIRED_1_SEND_MESSAGE_FORMAT_WITH_T.get() - self.view_variable.VAR_TEXT_REQUIRED_0_SEND_MESSAGE_FORMAT_WITH_T.set(text_1) - self.view_variable.VAR_TEXT_REQUIRED_1_SEND_MESSAGE_FORMAT_WITH_T.set(text_0) - self.updateSendMessageFormatWithT_ExampleTextWidget() - - new_message_format = self.getLatestMessageFormatWithT_FromWidget() - callFunctionIfCallable(self.view_variable.CALLBACK_SET_SEND_MESSAGE_FORMAT_WITH_T, new_message_format) - - - def getLatestMessageFormatWithT_FromWidget(self): - text_0 = self.view_variable.VAR_TEXT_REQUIRED_0_SEND_MESSAGE_FORMAT_WITH_T.get() - text_1 = self.view_variable.VAR_TEXT_REQUIRED_1_SEND_MESSAGE_FORMAT_WITH_T.get() - entry_0 = self.view_variable.VAR_ENTRY_0_SEND_MESSAGE_FORMAT_WITH_T.get() - entry_1 = self.view_variable.VAR_ENTRY_1_SEND_MESSAGE_FORMAT_WITH_T.get() - entry_2 = self.view_variable.VAR_ENTRY_2_SEND_MESSAGE_FORMAT_WITH_T.get() - return entry_0+text_0+entry_1+text_1+entry_2 - - def updateSendMessageFormatWithT_ExampleTextWidget(self): - message = i18n.t("config_window.send_message_format_with_t.example_text", locale=config.UI_LANGUAGE) - translation_locale = "ja" if config.UI_LANGUAGE == "en" else "en" - translation = i18n.t("config_window.send_message_format_with_t.example_text", locale=translation_locale) - - example_message = config.SEND_MESSAGE_FORMAT_WITH_T.replace("[message]", message) - example_message = example_message.replace("[translation]", translation) - - self.view_variable.VAR_LABEL_EXAMPLE_TEXT_SEND_MESSAGE_FORMAT_WITH_T.set(example_message) - - -# Received Message Format - def setReceivedMessageFormat_EntryWidgets(self, message_format:str): - result = self.extractMessageFormat(message_format) - - self.view_variable.VAR_ENTRY_0_RECEIVED_MESSAGE_FORMAT.set(result.before) - self.view_variable.VAR_ENTRY_1_RECEIVED_MESSAGE_FORMAT.set(result.after) - self.updateReceivedMessageFormat_ExampleTextWidget() - - def updateReceivedMessageFormat_ExampleTextWidget(self): - message = i18n.t("config_window.received_message_format.example_text") - example_message = config.RECEIVED_MESSAGE_FORMAT.replace("[message]", message) - - self.view_variable.VAR_LABEL_EXAMPLE_TEXT_RECEIVED_MESSAGE_FORMAT.set(example_message) - - -# Received Message Format With Translation - def setReceivedMessageFormatWithT_EntryWidgets(self, message_format:str): - result = self.extractMessageFormatWithT(message_format) - - if result.is_message_first is True: - self.view_variable.VAR_TEXT_REQUIRED_0_RECEIVED_MESSAGE_FORMAT_WITH_T.set("[message]") - self.view_variable.VAR_TEXT_REQUIRED_1_RECEIVED_MESSAGE_FORMAT_WITH_T.set("[translation]") - else: - self.view_variable.VAR_TEXT_REQUIRED_0_RECEIVED_MESSAGE_FORMAT_WITH_T.set("[translation]") - self.view_variable.VAR_TEXT_REQUIRED_1_RECEIVED_MESSAGE_FORMAT_WITH_T.set("[message]") - - self.view_variable.VAR_ENTRY_0_RECEIVED_MESSAGE_FORMAT_WITH_T.set(result.before) - self.view_variable.VAR_ENTRY_1_RECEIVED_MESSAGE_FORMAT_WITH_T.set(result.between) - self.view_variable.VAR_ENTRY_2_RECEIVED_MESSAGE_FORMAT_WITH_T.set(result.after) - self.updateReceivedMessageFormatWithT_ExampleTextWidget() - - def _swapReceivedMessageFormatWithT_RequiredText(self): - text_0 = self.view_variable.VAR_TEXT_REQUIRED_0_RECEIVED_MESSAGE_FORMAT_WITH_T.get() - text_1 = self.view_variable.VAR_TEXT_REQUIRED_1_RECEIVED_MESSAGE_FORMAT_WITH_T.get() - self.view_variable.VAR_TEXT_REQUIRED_0_RECEIVED_MESSAGE_FORMAT_WITH_T.set(text_1) - self.view_variable.VAR_TEXT_REQUIRED_1_RECEIVED_MESSAGE_FORMAT_WITH_T.set(text_0) - self.updateReceivedMessageFormatWithT_ExampleTextWidget() - - new_message_format = self.getLatestReceivedMessageFormatWithT_FromWidget() - callFunctionIfCallable(self.view_variable.CALLBACK_SET_RECEIVED_MESSAGE_FORMAT_WITH_T, new_message_format) - - - def getLatestReceivedMessageFormatWithT_FromWidget(self): - text_0 = self.view_variable.VAR_TEXT_REQUIRED_0_RECEIVED_MESSAGE_FORMAT_WITH_T.get() - text_1 = self.view_variable.VAR_TEXT_REQUIRED_1_RECEIVED_MESSAGE_FORMAT_WITH_T.get() - entry_0 = self.view_variable.VAR_ENTRY_0_RECEIVED_MESSAGE_FORMAT_WITH_T.get() - entry_1 = self.view_variable.VAR_ENTRY_1_RECEIVED_MESSAGE_FORMAT_WITH_T.get() - entry_2 = self.view_variable.VAR_ENTRY_2_RECEIVED_MESSAGE_FORMAT_WITH_T.get() - return entry_0+text_0+entry_1+text_1+entry_2 - - def updateReceivedMessageFormatWithT_ExampleTextWidget(self): - message = i18n.t("config_window.received_message_format_with_t.example_text", locale=config.UI_LANGUAGE) - translation_locale = "ja" if config.UI_LANGUAGE == "en" else "en" - translation = i18n.t("config_window.received_message_format_with_t.example_text", locale=translation_locale) - - example_message = config.RECEIVED_MESSAGE_FORMAT_WITH_T.replace("[message]", message) - example_message = example_message.replace("[translation]", translation) - - self.view_variable.VAR_LABEL_EXAMPLE_TEXT_RECEIVED_MESSAGE_FORMAT_WITH_T.set(example_message) - - - - - -# GUI process - 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() - - def quitVRCT(self): - callFunctionIfCallable(self.view_variable.CALLBACK_QUIT_VRCT) - vrct_gui._quitVRCT() - -# Common - @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) - - @staticmethod - def getMainWindowGeometry(return_int:bool=False): - if return_int is True: - return { - "width": vrct_gui.winfo_toplevel().winfo_width(), - "height": vrct_gui.winfo_toplevel().winfo_height(), - "x_pos": vrct_gui.winfo_toplevel().winfo_x(), - "y_pos": vrct_gui.winfo_toplevel().winfo_y(), - } - - return { - "width": str(vrct_gui.winfo_toplevel().winfo_width()), - "height": str(vrct_gui.winfo_toplevel().winfo_height()), - "x_pos": str(vrct_gui.winfo_toplevel().winfo_x()), - "y_pos": str(vrct_gui.winfo_toplevel().winfo_y()), - } - - def getPreUiScaling(self): - return self.restart_required_configs_pre_data.ui_scaling - - @staticmethod - def getSelectableCtranslate2WeightTypeDict(): - return { - config.SELECTABLE_CTRANSLATE2_WEIGHT_TYPE_DICT["Small"]: i18n.t("config_window.ctranslate2_weight_type.small", capacity="418MB"), - config.SELECTABLE_CTRANSLATE2_WEIGHT_TYPE_DICT["Large"]: i18n.t("config_window.ctranslate2_weight_type.large", capacity="1.2GB"), - } - - def useTranslationFeatureProcess(self, state:str): - def changeWidget_UseTranslationFeature(): - vrct_gui.sls__box_translation_optionmenu_wrapper.grid() - vrct_gui.compact_mode_translation_frame.grid() - vrct_gui.translation_frame.grid() - self.view_variable.VAR_LABEL_BOTH_DIRECTION_SWAP_BUTTON.set(i18n.t("main_window.translate_each_other_label")) - - def changeWidget_DontUseTranslationFeature(): - vrct_gui.sls__box_translation_optionmenu_wrapper.grid_remove() - vrct_gui.compact_mode_translation_frame.grid_remove() - vrct_gui.translation_frame.grid_remove() - self.view_variable.VAR_LABEL_BOTH_DIRECTION_SWAP_BUTTON.set(i18n.t("main_window.swap_button_label")) - - - if state == "Normal": - self.setLatestCTranslate2WeightType() - self.openCtranslate2WeightTypeWidget() - self.setTranslationSwitchStatus("normal", release_locked_state=True) - changeWidget_UseTranslationFeature() - - elif state == "Disable": - view.closeCtranslate2WeightTypeWidget() - view.setTranslationSwitchStatus("disabled", to_lock_state=True) - changeWidget_DontUseTranslationFeature() - - elif state == "Restart": - view.setLatestCTranslate2WeightType() - view.setTranslationSwitchStatus("disabled", to_lock_state=True) - changeWidget_UseTranslationFeature() - - vrct_gui.update() - vrct_gui.config_window.lift() - - @staticmethod - def getSelectableWhisperWeightTypeDict(): - def callI18n(model_name, capacity, is_recommended=False): - if is_recommended is True: - return i18n.t("config_window.whisper_weight_type.recommended_model_template", model_name=model_name, capacity=capacity) - else: - return i18n.t("config_window.whisper_weight_type.model_template", model_name=model_name, capacity=capacity) - - DICT_DATA = config.SELECTABLE_WHISPER_WEIGHT_TYPE_DICT - return { - DICT_DATA["tiny"]: callI18n("tiny", "74.5MB"), - DICT_DATA["base"]: callI18n("base", "141MB", True), - DICT_DATA["small"]: callI18n("small", "463MB"), - DICT_DATA["medium"]: callI18n("medium", "1.42GB"), - DICT_DATA["large-v1"]: callI18n("large-v1", "2.87GB"), - DICT_DATA["large-v2"]: callI18n("large-v2", "2.87GB"), - DICT_DATA["large-v3"]: callI18n("large-v3", "2.87GB"), - } - - - def _toDefaultOverlaySettings(self): - INIT_OVERLAY_SETTINGS = { - "opacity": 1.0, - "ui_scaling": 1.0, - } - INIT_OVERLAY_SMALL_LOG_SETTINGS = { - "x_pos": 0.0, - "y_pos": 0.0, - "z_pos": 0.0, - "x_rotation": 0.0, - "y_rotation": 0.0, - "z_rotation": 0.0, - "display_duration": 5, - "fadeout_duration": 2, - } - for key in INIT_OVERLAY_SETTINGS.keys(): - callFunctionIfCallable(self.view_variable.CALLBACK_SET_OVERLAY_SETTINGS, INIT_OVERLAY_SETTINGS[key], key) - - for key in INIT_OVERLAY_SMALL_LOG_SETTINGS.keys(): - callFunctionIfCallable(self.view_variable.CALLBACK_SET_OVERLAY_SMALL_LOG_SETTINGS, INIT_OVERLAY_SMALL_LOG_SETTINGS[key], key) - - self.setLatestConfigVariable("OverlayOpacity") - self.setLatestConfigVariable("OverlayUiScaling") - - self.setLatestConfigVariable("OverlaySmallLogXPos") - self.setLatestConfigVariable("OverlaySmallLogYPos") - self.setLatestConfigVariable("OverlaySmallLogZPos") - self.setLatestConfigVariable("OverlaySmallLogXRotation") - self.setLatestConfigVariable("OverlaySmallLogYRotation") - self.setLatestConfigVariable("OverlaySmallLogZRotation") - self.setLatestConfigVariable("OverlaySmallLogDisplayDuration") - self.setLatestConfigVariable("OverlaySmallLogFadeoutDuration") - -# Open Webpage Functions - def openWebPage_Booth(self): - self.openWebPage(config.BOOTH_URL) - self._printToTextbox_Info(i18n.t("main_window.textbox_system_message.opened_web_page_booth")) - - def openWebPage_VrctDocuments(self): - self.openWebPage(config.DOCUMENTS_URL) - self._printToTextbox_Info(i18n.t("main_window.textbox_system_message.opened_web_page_vrct_documents")) - - def openWebPage_DeepL_Auth_Key(self): - self.openWebPage(config.DEEPL_AUTH_KEY_PAGE_URL) - - def openWebPage_AboutVrct(self, target_type:str, arg=None): - url = "" - match (target_type): - case ("X_MISYA"): - url = "https://twitter.com/misya_ai" - case ("GITHUB_MISYA"): - url = "https://github.com/misyaguziya" - - case ("X_SHIINA"): - url = "https://twitter.com/Shiina_12siy" - - case ("X_DONE_SAN"): - url = "https://twitter.com/done_vrc" - - case ("X_IYA"): - url = "https://twitter.com/IYAA_HHHH" - - case ("X_RERA"): - url = "https://twitter.com/rerassi" - case ("GITHUB_RERA"): - url = "https://github.com/soumt-r" - - case ("X_POPOSUKE"): - url = "https://twitter.com/sig_popo" - - case ("X_KUMAGUMA"): - url = "https://twitter.com/K_kumaguma_A" - - - case ("BOOTH"): - url = "https://misyaguziya.booth.pm/items/5155325" - case ("VRCT_DOCUMENTS"): - url = config.DOCUMENTS_URL - case ("VRCT_GITHUB"): - url = "https://github.com/misyaguziya/VRCT" - case ("CONTACT_US"): - url = "https://docs.google.com/forms/d/e/1FAIpQLSei-xoydOY60ivXqhOjaTzNN8PiBQIDcNhzfy6cw2sjYkcg_g/viewform" - - case ("SUPPORTER_REGISTRATION"): - url = "https://docs.google.com/forms/d/e/1FAIpQLSepLzdEOTJQFVHdOOxAA0dix3zCmnNBlmH4XWon5FldXkIiqw/viewform" - - case ("POSTER_CONTACT_US"): - url = "https://docs.google.com/forms/d/e/1FAIpQLScwt19eX4Lkj_4w9J5H_3a-bkzXs6rkOc0B-0ZTVVfHKyiU7g/viewform" - - - case ("X_SHIINA_POSTER_SHOWCASE_POST"): - if arg is None: - print("arg that received is None. it mus be something number") - return - url = "https://twitter.com/Shiina_12siy/status/" + arg - - - case "TEMP": - print("here is still under construction.") - return - case (_): - raise ValueError(f"No matching case for target_type: {target_type}") - - self.openWebPage(url) - -# Widget Control - # Common - - # Note: The difference between _clearEntryBox and _clearTextBox - # idk why, but in CTkEntry and CTkTextbox, the first argument for the delete function is different. Otherwise, it throws an error. - @staticmethod - def _clearEntryBox(entry_widget): - entry_widget.delete(0, "end") - - @staticmethod - def _clearTextBox(entry_widget): - entry_widget.delete("1.0", "end") - - def clearNotificationMessage(self): - vrct_gui._clearNotificationMessage() - - - @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") - - @staticmethod - def setTranslationSwitchStatus(status:str, to_lock_state:bool=False, release_locked_state:bool=False): - vrct_gui._changeMainWindowWidgetsStatus(status, ["translation_switch"], to_lock_state, release_locked_state) - - 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 changeTranscriptionDisplayStatus(self, status): - match (status): - case "MIC_ON": - vrct_gui.sls__box_your_language_mic_status__enabled.place(relx=0.1, rely=0.2, anchor="center") - case "MIC_OFF": - vrct_gui.sls__box_your_language_mic_status__enabled.place_forget() - case "SPEAKER_ON": - vrct_gui.sls__box_target_language_speaker_status__enabled.place(relx=0.1, rely=0.2, anchor="center") - case "SPEAKER_OFF": - vrct_gui.sls__box_target_language_speaker_status__enabled.place_forget() - - def updateSelectableTranslationEngineList(self, selectable_translation_engines_list): - translation_dict = {item: item for item in selectable_translation_engines_list} - translation_dict["CTranslate2"] = i18n.t("main_window.translator_ctranslate2") - - vrct_gui.translation_engine_dropdown_menu_window.updateDropdownMenuValues( - dropdown_menu_widget_id="translation_engine_dropdown_menu", - dropdown_menu_values=translation_dict, - ) - - def setStateVrcMicMuteSync(self, state:str): - if state == "enabled": - self.view_variable.VAR_VRC_MIC_MUTE_SYNC_STATE.set(i18n.t("main_window.state_text_enabled")) - vrct_gui.vrc_mic_mute_sync_settings_state_label.configure(text_color=self.settings.main.ctm.TOP_BAR_BUTTON_STATE_TEXT_ENABLED_COLOR) - elif state == "disabled": - self.view_variable.VAR_VRC_MIC_MUTE_SYNC_STATE.set(i18n.t("main_window.state_text_disabled")) - vrct_gui.vrc_mic_mute_sync_settings_state_label.configure(text_color=self.settings.main.ctm.TOP_BAR_BUTTON_STATE_TEXT_DISABLED_COLOR) - - vrct_gui.config_window.after(200, vrct_gui.config_window.lift) - - def setStateOverlaySmallLog(self, state:str): - if state == "enabled": - self.view_variable.VAR_OVERLAY_SMALL_LOG_STATE.set(i18n.t("main_window.state_text_enabled")) - vrct_gui.overlay_settings_state_label.configure(text_color=self.settings.main.ctm.TOP_BAR_BUTTON_STATE_TEXT_ENABLED_COLOR) - elif state == "disabled": - self.view_variable.VAR_OVERLAY_SMALL_LOG_STATE.set(i18n.t("main_window.state_text_disabled")) - vrct_gui.overlay_settings_state_label.configure(text_color=self.settings.main.ctm.TOP_BAR_BUTTON_STATE_TEXT_DISABLED_COLOR) - - vrct_gui.config_window.after(200, vrct_gui.config_window.lift) - - - # Config Window - def enableConfigWindowCompactMode(self): - for additional_widget in vrct_gui.config_window.additional_widgets: - additional_widget.grid_remove() - self._closeMicWordFilterList() - - def disableConfigWindowCompactMode(self): - for additional_widget in vrct_gui.config_window.additional_widgets: - additional_widget.grid() - self._closeMicWordFilterList() - - def showRestartButton(self): - self._showRestartButton() - - def hideRestartButton(self): - self._hideRestartButton() - - def showRestartButtonIfRequired(self, locale:Union[None,str]=None): - is_restart_required = not ( - self.restart_required_configs_pre_data.appearance_theme == config.APPEARANCE_THEME and - self.restart_required_configs_pre_data.ui_scaling == config.UI_SCALING and - self.restart_required_configs_pre_data.font_family == config.FONT_FAMILY and - self.restart_required_configs_pre_data.ui_language == config.UI_LANGUAGE and - self.restart_required_configs_pre_data.is_reset_button_displayed_for_translation == config.IS_RESET_BUTTON_DISPLAYED_FOR_TRANSLATION and - self.restart_required_configs_pre_data.is_reset_button_displayed_for_whisper == config.IS_RESET_BUTTON_DISPLAYED_FOR_WHISPER - ) - - if locale is None: - locale = config.UI_LANGUAGE - - if is_restart_required is True: - self._showRestartButton(locale) - else: - self._hideRestartButton() - - - def _showRestartButton(self, locale:Union[None,str]=None): - self.view_variable.VAR_CONFIG_WINDOW_RESTART_BUTTON_LABEL.set(i18n.t("config_window.restart_message", locale=locale)) - vrct_gui.config_window.restart_button_container.grid() - def _hideRestartButton(self): - vrct_gui.config_window.restart_button_container.grid_remove() - - - - @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 setWidgetsStatus_changeWeightType_Pending(): - vrct_gui.config_window.sb__switch_use_translation_feature.configure(state="disabled") - vrct_gui._changeConfigWindowWidgetsStatus( - status="disabled", - target_names=[ - "sb__switch_use_translation_feature", - "sb__optionmenu_ctranslate2_weight_type", - ] - ) - @staticmethod - def setWidgetsStatus_changeWeightType_Done(): - vrct_gui.config_window.sb__switch_use_translation_feature.configure(state="normal") - vrct_gui._changeConfigWindowWidgetsStatus( - status="normal", - target_names=[ - "sb__switch_use_translation_feature", - "sb__optionmenu_ctranslate2_weight_type", - ] - ) - - - def updateSelectedCtranslate2WeightType(self, selected_weight_type:str): - self.view_variable.VAR_CTRANSLATE2_WEIGHT_TYPE.set(self.getSelectableCtranslate2WeightTypeDict()[selected_weight_type]) - - def setLatestCTranslate2WeightType(self): - selected_weight_type = self.getSelectableCtranslate2WeightTypeDict()[config.CTRANSLATE2_WEIGHT_TYPE] - self.view_variable.VAR_CTRANSLATE2_WEIGHT_TYPE.set(selected_weight_type) - - - def openCtranslate2WeightTypeWidget(self): - vrct_gui.config_window.sb__use_translation_feature.grid(pady=0) - vrct_gui.config_window.sb__ctranslate2_weight_type.grid() - - def closeCtranslate2WeightTypeWidget(self): - vrct_gui.config_window.sb__use_translation_feature.grid(pady=(0,1)) - vrct_gui.config_window.sb__ctranslate2_weight_type.grid_remove() - - - def openWhisperWeightTypeWidget(self): - vrct_gui.config_window.sb__use_whisper_feature.grid() - vrct_gui.config_window.sb__whisper_weight_type.grid() - - def closeWhisperWeightTypeWidget(self): - vrct_gui.config_window.sb__use_whisper_feature.grid() - vrct_gui.config_window.sb__whisper_weight_type.grid_remove() - - - def updateSelectedWhisperWeightType(self, selected_weight_type:str): - self.view_variable.VAR_WHISPER_WEIGHT_TYPE.set(self.getSelectableWhisperWeightTypeDict()[selected_weight_type]) - - def setLatestCTranslate2WeightType(self): - selected_weight_type = self.getSelectableWhisperWeightTypeDict()[config.WHISPER_WEIGHT_TYPE] - self.view_variable.VAR_WHISPER_WEIGHT_TYPE.set(selected_weight_type) - - - def openMicEnergyThresholdWidget(self): - self.view_variable.VAR_LABEL_MIC_DYNAMIC_ENERGY_THRESHOLD.set(i18n.t("config_window.mic_dynamic_energy_threshold.label_for_manual")) - self.view_variable.VAR_DESC_MIC_DYNAMIC_ENERGY_THRESHOLD.set(i18n.t("config_window.mic_dynamic_energy_threshold.desc_for_manual")) - vrct_gui.config_window.sb__mic_dynamic_energy_threshold.grid(pady=0) - vrct_gui.config_window.sb__mic_energy_threshold.grid() - - def closeMicEnergyThresholdWidget(self): - self.view_variable.VAR_LABEL_MIC_DYNAMIC_ENERGY_THRESHOLD.set(i18n.t("config_window.mic_dynamic_energy_threshold.label_for_automatic")) - self.view_variable.VAR_DESC_MIC_DYNAMIC_ENERGY_THRESHOLD.set(i18n.t("config_window.mic_dynamic_energy_threshold.desc_for_automatic")) - vrct_gui.config_window.sb__mic_dynamic_energy_threshold.grid(pady=(0,1)) - vrct_gui.config_window.sb__mic_energy_threshold.grid_remove() - - def openSpeakerEnergyThresholdWidget(self): - self.view_variable.VAR_LABEL_SPEAKER_DYNAMIC_ENERGY_THRESHOLD.set(i18n.t("config_window.speaker_dynamic_energy_threshold.label_for_manual")) - self.view_variable.VAR_DESC_SPEAKER_DYNAMIC_ENERGY_THRESHOLD.set(i18n.t("config_window.speaker_dynamic_energy_threshold.desc_for_manual")) - vrct_gui.config_window.sb__speaker_dynamic_energy_threshold.grid(pady=0) - vrct_gui.config_window.sb__speaker_energy_threshold.grid() - - def closeSpeakerEnergyThresholdWidget(self): - self.view_variable.VAR_LABEL_SPEAKER_DYNAMIC_ENERGY_THRESHOLD.set(i18n.t("config_window.speaker_dynamic_energy_threshold.label_for_automatic")) - self.view_variable.VAR_DESC_SPEAKER_DYNAMIC_ENERGY_THRESHOLD.set(i18n.t("config_window.speaker_dynamic_energy_threshold.desc_for_automatic")) - 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) - - - def updateSetProgressBar_MicEnergy(self, new_mic_energy): - self.updateProgressBar( - target_progressbar_widget=vrct_gui.config_window.sb__progressbar_x_slider__progressbar_mic_energy_threshold, - new_energy=new_mic_energy, - max_energy=config.MAX_MIC_ENERGY_THRESHOLD, - energy_threshold=config.INPUT_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, - ) - - def updateSetProgressBar_SpeakerEnergy(self, new_speaker_energy): - self.updateProgressBar( - target_progressbar_widget=vrct_gui.config_window.sb__progressbar_x_slider__progressbar_speaker_energy_threshold, - new_energy=new_speaker_energy, - max_energy=config.MAX_SPEAKER_ENERGY_THRESHOLD, - energy_threshold=config.INPUT_SPEAKER_ENERGY_THRESHOLD, - ) - - @staticmethod - def initProgressBar_SpeakerEnergy(): - vrct_gui.config_window.sb__progressbar_x_slider__progressbar_speaker_energy_threshold.set(0) - - - def updateProgressBar( - self, - target_progressbar_widget, - new_energy, - max_energy, - energy_threshold, - ): - target_progressbar_widget.set(new_energy/max_energy) - if new_energy >= energy_threshold: - target_progressbar_widget.configure(progress_color=self.settings.config_window.ctm.SB__PROGRESSBAR_X_SLIDER__PROGRESSBAR_PROGRESS_EXCEED_THRESHOLD_BG_COLOR) - else: - target_progressbar_widget.configure(progress_color=self.settings.config_window.ctm.SB__PROGRESSBAR_X_SLIDER__PROGRESSBAR_PROGRESS_BG_COLOR) - - - - def _openMicWordFilterList(self): - target_widget = vrct_gui.config_window.sb__widgets["sb__arrow_switch_mic_word_filter"] - target_widget.arrow_switch_open.grid_remove() - target_widget.arrow_switch_close.grid() - - vrct_gui.config_window.sb__mic_word_filter_list.grid() - - def _closeMicWordFilterList(self): - target_widget = vrct_gui.config_window.sb__widgets["sb__arrow_switch_mic_word_filter"] - target_widget.arrow_switch_close.grid_remove() - target_widget.arrow_switch_open.grid() - - vrct_gui.config_window.sb__mic_word_filter_list.grid_remove() - - - def addValueToList_WordFilter(self, values:list): - target_widget = vrct_gui.config_window.sb__widgets["sb__add_and_delete_able_list_mic_word_filter_list"] - for t_item in target_widget.items: - if t_item.label in values: - values.remove(t_item.label) - t_item.redoFunction() - mic_word_filter_item_row_wrapper, accumulated_labels_width, last_row, last_column = target_widget.addValues( - values, - target_widget.mic_word_filter_item_row_wrapper, - target_widget.accumulated_labels_width, - target_widget.last_row, - target_widget.last_column - ) - target_widget.mic_word_filter_item_row_wrapper = mic_word_filter_item_row_wrapper - target_widget.accumulated_labels_width = accumulated_labels_width - target_widget.last_row = last_row - target_widget.last_column = last_column - - def clearEntryBox_WordFilter(self): - self._clearEntryBox(vrct_gui.config_window.sb__entry_mic_word_filter_list) - - -# Widget Control - def foregroundOnIfForegroundEnabled(self): - if config.ENABLE_FOREGROUND: - self.foregroundOn() - - def foregroundOffIfForegroundEnabled(self): - if config.ENABLE_FOREGROUND: - self.foregroundOff() - - - @staticmethod - def foregroundOn(): - vrct_gui.attributes("-topmost", True) - - @staticmethod - def foregroundOff(): - vrct_gui.attributes("-topmost", False) - - - @staticmethod - def setMainWindowTransparency(transparency:float): - vrct_gui.wm_attributes("-alpha", transparency) - - @staticmethod - def setMainWindowTextboxUiSize(custom_font_size_scale:float): - vrct_gui.print_to_textbox.setTagsSettings(custom_font_size_scale=custom_font_size_scale) - - def setMainWindowMessageBoxRatio(self, message_box_ratio:int): - if message_box_ratio < config.MESSAGE_BOX_RATIO_RANGE[0] or message_box_ratio > config.MESSAGE_BOX_RATIO_RANGE[1]: - raise ValueError(f"Input must be between {config.MESSAGE_BOX_RATIO_RANGE[0]} and {config.MESSAGE_BOX_RATIO_RANGE[1]} (inclusive)") - - vrct_gui.main_bg_container.grid_rowconfigure(tuple(range(config.MESSAGE_BOX_RATIO_RANGE[0], config.MESSAGE_BOX_RATIO_RANGE[1]+2)), weight=1) - textbox_ratio = int((config.MESSAGE_BOX_RATIO_RANGE[1]+1) - message_box_ratio) - message_box_row = int(textbox_ratio + 1) - message_box_rowwpan = int((config.MESSAGE_BOX_RATIO_RANGE[1]+1) - textbox_ratio) - vrct_gui.main_textbox_container.grid(row=1, rowspan=textbox_ratio, column=0, sticky="nsew") - vrct_gui.main_entry_message_container.grid(row=message_box_row, rowspan=message_box_rowwpan, column=0, sticky="nsew") - - new_send_message_button_width = int(self.settings.main.uism.SEND_MESSAGE_BUTTON_RATE_WIDTH * message_box_ratio) - - if new_send_message_button_width > self.settings.main.uism.SEND_MESSAGE_BUTTON_MAX_WIDTH: - new_send_message_button_width = self.settings.main.uism.SEND_MESSAGE_BUTTON_MAX_WIDTH - - if new_send_message_button_width < self.settings.main.uism.SEND_MESSAGE_BUTTON_MIN_WIDTH: - new_send_message_button_width = self.settings.main.uism.SEND_MESSAGE_BUTTON_MIN_WIDTH - - vrct_gui.main_send_message_button_container.grid_columnconfigure(0, weight=0, minsize=new_send_message_button_width) - - @staticmethod - def changeMainWindowSendMessageButton(status:str): - match (status): - case "hide": - vrct_gui.main_send_message_button_container.grid_remove() - vrct_gui.config_window.after(200, vrct_gui.config_window.lift) - case "show" | "show_and_disable_enter_key": - vrct_gui.main_send_message_button_container.grid() - vrct_gui.config_window.after(200, vrct_gui.config_window.lift) - - def _enteredSwapLanguagesButton(self): - self.view_variable.VAR_LABEL_BOTH_DIRECTION_SWAP_BUTTON.set(i18n.t("main_window.swap_button_label")) - vrct_gui.sls__both_direction_desc.configure( - text_color=self.settings.main.ctm.SLS__BOX_ARROWS_SWAP_BUTTON_TEXT_COLOR, - ) - - def _leavedSwapLanguagesButton(self): - if config.USE_TRANSLATION_FEATURE is True: - self.view_variable.VAR_LABEL_BOTH_DIRECTION_SWAP_BUTTON.set(i18n.t("main_window.translate_each_other_label")) - vrct_gui.sls__both_direction_desc.configure( - text_color=self.settings.main.ctm.SLS__BOX_ARROWS_TEXT_COLOR, - ) - -# Function - def _adjustUiSizeAndRestart(self): - current_percentage = int(config.UI_SCALING.replace("%","")) - target_percentage = current_percentage - 20 - if target_percentage >= 40 and str(target_percentage) + "%" in self.view_variable.LIST_UI_SCALING: - index = self.view_variable.LIST_UI_SCALING.index(str(target_percentage) + "%") - callFunctionIfCallable(self.view_variable.CALLBACK_SET_UI_SCALING, self.view_variable.LIST_UI_SCALING[index]) - callFunctionIfCallable(self.view_variable.CALLBACK_RESTART_SOFTWARE) - else: - self._hideConfirmationModal() - # ※Below 40% of the UI size is not supported, and we cannot handle it at this time. - - - -# Show Modal - def _showDisplayOverUiSizeConfirmationModal(self): - self.foregroundOffIfForegroundEnabled() - - self.view_variable.VAR_LABEL_MAIN_WINDOW_COVER_MESSAGE.set("") - vrct_gui.main_window_cover.show() - - self.view_variable.CALLBACK_HIDE_CONFIRMATION_MODAL=self._hideConfirmationModal - self.view_variable.CALLBACK_ACCEPTED_CONFIRMATION_MODAL=self._adjustUiSizeAndRestart - self.view_variable.CALLBACK_DENIED_CONFIRMATION_MODAL=self._hideConfirmationModal - - self.view_variable.VAR_MESSAGE_CONFIRMATION_MODAL.set(i18n.t("main_window.confirmation_message.detected_over_ui_size", current_ui_size=config.UI_SCALING)) - self.view_variable.VAR_LABEL_CONFIRMATION_MODAL_DENY_BUTTON.set(i18n.t("main_window.confirmation_message.deny_adjust_ui_size")) - self.view_variable.VAR_LABEL_CONFIRMATION_MODAL_ACCEPT_BUTTON.set(i18n.t("main_window.confirmation_message.accept_adjust_ui_size")) - - vrct_gui.confirmation_modal.show(hide_title_bar=False, close_when_focusout=False) - - - - def _showUpdateSoftwareConfirmationModal(self): - self.foregroundOffIfForegroundEnabled() - - self.view_variable.VAR_LABEL_MAIN_WINDOW_COVER_MESSAGE.set("") - vrct_gui.main_window_cover.show() - - self.view_variable.CALLBACK_HIDE_CONFIRMATION_MODAL=self._hideConfirmationModal - self.view_variable.CALLBACK_ACCEPTED_CONFIRMATION_MODAL=self._startUpdateSoftware - self.view_variable.CALLBACK_DENIED_CONFIRMATION_MODAL=self._hideConfirmationModal - - self.view_variable.VAR_MESSAGE_CONFIRMATION_MODAL.set(i18n.t("main_window.confirmation_message.update_software")) - self.view_variable.VAR_LABEL_CONFIRMATION_MODAL_DENY_BUTTON.set(i18n.t("main_window.confirmation_message.deny_update_software")) - self.view_variable.VAR_LABEL_CONFIRMATION_MODAL_ACCEPT_BUTTON.set(i18n.t("main_window.confirmation_message.accept_update_software")) - vrct_gui.confirmation_modal.show() - - - - -# Hide Modal - def _hideInformationModal(self): - vrct_gui.information_modal.hide() - vrct_gui.main_window_cover.hide() - self.foregroundOnIfForegroundEnabled() - - - def _hideConfirmationModal(self): - vrct_gui.confirmation_modal.hide() - vrct_gui.main_window_cover.hide() - self.foregroundOnIfForegroundEnabled() - - -# Process - def _startUpdateSoftware(self): - self.view_variable.VAR_MESSAGE_CONFIRMATION_MODAL.set(i18n.t("main_window.confirmation_message.updating")) - vrct_gui.confirmation_modal.hide_buttons() - vrct_gui.update() - vrct_gui.confirmation_modal.update() - - self._hideConfirmationModal() - vrct_gui.withdraw() - # vrct_gui.updating_window.showUpdatingWindow() - - def func(**kwargs): - pass - # vrct_gui.updating_window.updateDownloadProgress(**kwargs) - callFunctionIfCallable(self.view_variable.CALLBACK_UPDATE_SOFTWARE, func) - - - -# Window Control - def _openConfigWindow(self): - self.view_variable.VAR_LABEL_MAIN_WINDOW_COVER_MESSAGE.set(i18n.t("main_window.cover_message")) - callFunctionIfCallable(self.view_variable.CALLBACK_OPEN_CONFIG_WINDOW) - vrct_gui._openConfigWindow() - - def _closeConfigWindow(self): - callFunctionIfCallable(self.view_variable.CALLBACK_CLOSE_CONFIG_WINDOW) - self._closeMicWordFilterList() - vrct_gui._closeConfigWindow() - - def _openVrSettingsWindow(self): - vrct_gui.quick_settings_window.show(target="overlay") - - def _openVrcMicMuteSyncSettingsWindow(self): - vrct_gui.quick_settings_window.show(target="vrc_mic_mute_sync") - -# Window Control (Main Window Cover) - def _openTheCoverOfMainWindow(self): - vrct_gui.main_window_cover.show() - vrct_gui.config_window.lift() - - @staticmethod - def _closeTheCoverOfMainWindow(): - vrct_gui.main_window_cover.withdraw() - -# Window Control (Selectable Languages Window) - 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") - - -# Update GuiVariable (view_variable) - def updateGuiVariableByPresetTabNo(self, tab_no:str): - select = config.SELECTED_TAB_YOUR_LANGUAGES[tab_no] - your_language = select["language"] - your_country = select["country"] - self.view_variable.VAR_YOUR_LANGUAGE.set(f"{your_language}\n({your_country})") - select = config.SELECTED_TAB_TARGET_LANGUAGES[tab_no] - target_language = select["language"] - target_country = select["country"] - self.view_variable.VAR_TARGET_LANGUAGE.set(f"{target_language}\n({target_country})") - - - def updateList_selectableLanguages(self, new_selectable_language_list:list): - self.view_variable.LIST_SELECTABLE_LANGUAGES = new_selectable_language_list - - # (Config Window Setting Box Tab) - 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 - - -# Set GuiVariable (view_variable) - def setGuiVariable_SelectedTranslationEngine(self, value): - if value == "CTranslate2": - self.view_variable.VAR_SELECTED_TRANSLATION_ENGINE.set(self.TEXT_TRANSLATOR_CTRANSLATE2) - value = self.TEXT_TRANSLATOR_CTRANSLATE2 - else: - self.view_variable.VAR_SELECTED_TRANSLATION_ENGINE.set(i18n.t("main_window.translator") + ": " + value) - - 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 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 setGuiVariable_MicRecordTimeout(self, value): - self.view_variable.VAR_MIC_RECORD_TIMEOUT.set(str(value)) - - - def setGuiVariable_MicPhraseTimeout(self, value): - self.view_variable.VAR_MIC_PHRASE_TIMEOUT.set(str(value)) - - - def setGuiVariable_MicMaxPhrases(self, value): - self.view_variable.VAR_MIC_MAX_PHRASES.set(str(value)) - - def setGuiVariable_MicWordFilter_Length(self, value): - self.view_variable.VAR_SWITCH_DESC_MIC_WORD_FILTER.set(i18n.t("config_window.mic_word_filter.count_desc", count=value)) - - def setGuiVariable_SpeakerRecordTimeout(self, value): - self.view_variable.VAR_SPEAKER_RECORD_TIMEOUT.set(str(value)) - - - def setGuiVariable_SpeakerPhraseTimeout(self, value): - self.view_variable.VAR_SPEAKER_PHRASE_TIMEOUT.set(str(value)) - - - def setGuiVariable_SpeakerMaxPhrases(self, value): - self.view_variable.VAR_SPEAKER_MAX_PHRASES.set(str(value)) - - - def setGuiVariable_OscIpAddress(self, value): - self.view_variable.VAR_OSC_IP_ADDRESS.set(str(value)) - - def setGuiVariable_OscPort(self, value): - self.view_variable.VAR_OSC_PORT.set(int(value)) - - - - def setLatestConfigVariable(self, target_name:str): - match (target_name): - case "MicEnergyThreshold": - self.setGuiVariable_MicEnergyThreshold(config.INPUT_MIC_ENERGY_THRESHOLD) - case "SpeakerEnergyThreshold": - self.setGuiVariable_SpeakerEnergyThreshold(config.INPUT_SPEAKER_ENERGY_THRESHOLD) - case "MicRecordTimeout": - self.setGuiVariable_MicRecordTimeout(config.INPUT_MIC_RECORD_TIMEOUT) - case "MicPhraseTimeout": - self.setGuiVariable_MicPhraseTimeout(config.INPUT_MIC_PHRASE_TIMEOUT) - case "MicMaxPhrases": - self.setGuiVariable_MicMaxPhrases(config.INPUT_MIC_MAX_PHRASES) - case "MicMicWordFilter": - self.setGuiVariable_MicWordFilter_Length(len(config.INPUT_MIC_WORD_FILTER)) - - case "SpeakerRecordTimeout": - self.setGuiVariable_SpeakerRecordTimeout(config.INPUT_SPEAKER_RECORD_TIMEOUT) - case "SpeakerPhraseTimeout": - self.setGuiVariable_SpeakerPhraseTimeout(config.INPUT_SPEAKER_PHRASE_TIMEOUT) - case "SpeakerMaxPhrases": - self.setGuiVariable_SpeakerMaxPhrases(config.INPUT_SPEAKER_MAX_PHRASES) - - case "SendMessageFormat": - self.setSendMessageFormat_EntryWidgets(config.SEND_MESSAGE_FORMAT) - case "SendMessageFormatWithT": - self.setSendMessageFormatWithT_EntryWidgets(config.SEND_MESSAGE_FORMAT_WITH_T) - case "ReceivedMessageFormat": - self.setReceivedMessageFormat_EntryWidgets(config.RECEIVED_MESSAGE_FORMAT) - case "ReceivedMessageFormatWithT": - self.setReceivedMessageFormatWithT_EntryWidgets(config.RECEIVED_MESSAGE_FORMAT_WITH_T) - - - - case "OverlayOpacity": - self.view_variable.VAR_OVERLAY_OPACITY.set(config.OVERLAY_SETTINGS["opacity"]) - self.view_variable.VAR_CURRENT_VALUE_OVERLAY_OPACITY.set(floatToPctStr(config.OVERLAY_SETTINGS["opacity"])) - - case "OverlayUiScaling": - self.view_variable.VAR_OVERLAY_UI_SCALING.set(config.OVERLAY_SETTINGS["ui_scaling"]) - self.view_variable.VAR_CURRENT_VALUE_OVERLAY_UI_SCALING.set(floatToPctStr(config.OVERLAY_SETTINGS["ui_scaling"])) - - - case "OverlaySmallLogXPos": - self.view_variable.VAR_OVERLAY_SMALL_LOG_X_POS.set(config.OVERLAY_SMALL_LOG_SETTINGS["x_pos"]) - self.view_variable.VAR_CURRENT_VALUE_OVERLAY_SMALL_LOG_X_POS.set(config.OVERLAY_SMALL_LOG_SETTINGS["x_pos"]) - - case "OverlaySmallLogYPos": - self.view_variable.VAR_OVERLAY_SMALL_LOG_Y_POS.set(config.OVERLAY_SMALL_LOG_SETTINGS["y_pos"]) - self.view_variable.VAR_CURRENT_VALUE_OVERLAY_SMALL_LOG_Y_POS.set(config.OVERLAY_SMALL_LOG_SETTINGS["y_pos"]) - - case "OverlaySmallLogZPos": - self.view_variable.VAR_OVERLAY_SMALL_LOG_Z_POS.set(config.OVERLAY_SMALL_LOG_SETTINGS["z_pos"]) - self.view_variable.VAR_CURRENT_VALUE_OVERLAY_SMALL_LOG_Z_POS.set(config.OVERLAY_SMALL_LOG_SETTINGS["z_pos"]) - - case "OverlaySmallLogXRotation": - self.view_variable.VAR_OVERLAY_SMALL_LOG_X_ROTATION.set(config.OVERLAY_SMALL_LOG_SETTINGS["x_rotation"]) - self.view_variable.VAR_CURRENT_VALUE_OVERLAY_SMALL_LOG_X_ROTATION.set(config.OVERLAY_SMALL_LOG_SETTINGS["x_rotation"]) - - case "OverlaySmallLogYRotation": - self.view_variable.VAR_OVERLAY_SMALL_LOG_Y_ROTATION.set(config.OVERLAY_SMALL_LOG_SETTINGS["y_rotation"]) - self.view_variable.VAR_CURRENT_VALUE_OVERLAY_SMALL_LOG_Y_ROTATION.set(config.OVERLAY_SMALL_LOG_SETTINGS["y_rotation"]) - - case "OverlaySmallLogZRotation": - self.view_variable.VAR_OVERLAY_SMALL_LOG_Z_ROTATION.set(config.OVERLAY_SMALL_LOG_SETTINGS["z_rotation"]) - self.view_variable.VAR_CURRENT_VALUE_OVERLAY_SMALL_LOG_Z_ROTATION.set(config.OVERLAY_SMALL_LOG_SETTINGS["z_rotation"]) - - case "OverlaySmallLogDisplayDuration": - self.view_variable.VAR_OVERLAY_SMALL_LOG_DISPLAY_DURATION.set(config.OVERLAY_SMALL_LOG_SETTINGS["display_duration"]) - self.view_variable.VAR_CURRENT_VALUE_OVERLAY_SMALL_LOG_DISPLAY_DURATION.set(f"{config.OVERLAY_SMALL_LOG_SETTINGS['display_duration']} second(s)") - - case "OverlaySmallLogFadeoutDuration": - self.view_variable.VAR_OVERLAY_SMALL_LOG_FADEOUT_DURATION.set(config.OVERLAY_SMALL_LOG_SETTINGS["fadeout_duration"]) - self.view_variable.VAR_CURRENT_VALUE_OVERLAY_SMALL_LOG_FADEOUT_DURATION.set(f"{config.OVERLAY_SMALL_LOG_SETTINGS['fadeout_duration']} second(s)") - - case _: - raise ValueError(f"No matching case for target_name: {target_name}") - - -# Print To Textbox. - def printToTextbox_enableEasterEgg(self): - self._printToTextbox_Info(i18n.t("main_window.textbox_system_message.enabled_easter_egg")) - - def printToTextbox_enableTranslation(self): - self._printToTextbox_Info(i18n.t("main_window.textbox_system_message.enabled_translation")) - def printToTextbox_disableTranslation(self): - self._printToTextbox_Info(i18n.t("main_window.textbox_system_message.disabled_translation")) - - def printToTextbox_enableTranscriptionSend(self): - self._printToTextbox_Info(i18n.t("main_window.textbox_system_message.enabled_voice2chatbox")) - def printToTextbox_disableTranscriptionSend(self): - self._printToTextbox_Info(i18n.t("main_window.textbox_system_message.disabled_voice2chatbox")) - - def printToTextbox_enableTranscriptionReceive(self): - self._printToTextbox_Info(i18n.t("main_window.textbox_system_message.enabled_speaker2log")) - def printToTextbox_disableTranscriptionReceive(self): - self._printToTextbox_Info(i18n.t("main_window.textbox_system_message.disabled_speaker2log")) - - def printToTextbox_enableForeground(self): - self._printToTextbox_Info(i18n.t("main_window.textbox_system_message.enabled_foreground")) - def printToTextbox_disableForeground(self): - self._printToTextbox_Info(i18n.t("main_window.textbox_system_message.disabled_foreground")) - - def printToTextbox_AuthenticationSuccess(self): - self._printToTextbox_Info(i18n.t("main_window.textbox_system_message.auth_key_success")) - def printToTextbox_AuthenticationError(self): - self._printToTextbox_Info(i18n.t("main_window.textbox_system_message.auth_key_error")) - - - def printToTextbox_TranscriptionSendNoDeviceError(self): - self._printToTextbox_Info(i18n.t("main_window.textbox_system_message.no_mic_device_detected_error")) - - def printToTextbox_TranscriptionReceiveNoDeviceError(self): - self._printToTextbox_Info(i18n.t("main_window.textbox_system_message.no_speaker_device_detected_error")) - - - def printToTextbox_TranslationEngineLimitError(self): - self._printToTextbox_Info(i18n.t("main_window.textbox_system_message.translation_engine_limit_error")) - - - def printToTextbox_DetectedByWordFilter(self, detected_message): - self._printToTextbox_Info(i18n.t("main_window.textbox_system_message.detected_by_word_filter", detected_message=detected_message)) - - - - def printToTextbox_selectedYourLanguages(self, selected_your_language): - language = selected_your_language["language"] - country = selected_your_language["country"] - your_language = f"{language} ({country})" - self._printToTextbox_Info(i18n.t("main_window.textbox_system_message.selected_your_language", your_language=your_language)) - - def printToTextbox_selectedTargetLanguages(self, selected_target_language): - language = selected_target_language["language"] - country = selected_target_language["country"] - target_language = f"{language} ({country})" - self._printToTextbox_Info(i18n.t("main_window.textbox_system_message.selected_target_language", target_language=target_language)) - - def printToTextbox_changedLanguagePresetTab(self, tab_no:str): - self._printToTextbox_Info(i18n.t("main_window.textbox_system_message.switched_language_preset_tab", tab_no=tab_no)) - self.printToTextbox_latestSelectedLanguages() - - 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(i18n.t("main_window.textbox_system_message.latest_language_setting", your_language=your_language, target_language=target_language)) - - - @staticmethod - def _printToTextbox_Info(info_message, **kwargs): - vrct_gui._printToTextbox( - target_type="SYSTEM", - original_message=info_message, - **kwargs, - ) - - - - 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, - ) - - -# Message Box - @staticmethod - def getTextFromMessageBox(): - return vrct_gui.entry_message_box.get('1.0', "end-1c") - - def clearMessageBox(self): - self._clearTextBox(vrct_gui.entry_message_box) - - @staticmethod - def insertMessageBox(text): - vrct_gui.entry_message_box.insert("end", text) - - def replaceMessageBox(self, text): - self.clearMessageBox() - self.insertMessageBox(text) - - - -# Callback Bind FocusOut - def callbackBindFocusOut_DeeplAuthKey(self, _e=None): - self.clearNotificationMessage() - - def callbackBindFocusOut_MicEnergyThreshold(self, _e=None): - self.setLatestConfigVariable("MicEnergyThreshold") - self.clearNotificationMessage() - - def callbackBindFocusOut_SpeakerEnergyThreshold(self, _e=None): - self.setLatestConfigVariable("SpeakerEnergyThreshold") - self.clearNotificationMessage() - - - def callbackBindFocusOut_MicRecordTimeout(self, _e=None): - self.setLatestConfigVariable("MicRecordTimeout") - self.clearNotificationMessage() - - def callbackBindFocusOut_MicPhraseTimeout(self, _e=None): - self.setLatestConfigVariable("MicPhraseTimeout") - self.clearNotificationMessage() - - def callbackBindFocusOut_MicMaxPhrases(self, _e=None): - self.setLatestConfigVariable("MicMaxPhrases") - self.clearNotificationMessage() - - - def callbackBindFocusOut_SpeakerRecordTimeout(self, _e=None): - self.setLatestConfigVariable("SpeakerRecordTimeout") - self.clearNotificationMessage() - - def callbackBindFocusOut_SpeakerPhraseTimeout(self, _e=None): - self.setLatestConfigVariable("SpeakerPhraseTimeout") - self.clearNotificationMessage() - - def callbackBindFocusOut_SpeakerMaxPhrases(self, _e=None): - self.setLatestConfigVariable("SpeakerMaxPhrases") - self.clearNotificationMessage() - - - def callbackBindFocusOut_SendMessageFormat(self, _e=None): - self.setLatestConfigVariable("SendMessageFormat") - self.clearNotificationMessage() - - def callbackBindFocusOut_SendMessageFormatWithT(self, _e=None): - self.setLatestConfigVariable("SendMessageFormatWithT") - self.clearNotificationMessage() - - def callbackBindFocusOut_ReceivedMessageFormat(self, _e=None): - self.setLatestConfigVariable("ReceivedMessageFormat") - self.clearNotificationMessage() - - def callbackBindFocusOut_ReceivedMessageFormatWithT(self, _e=None): - self.setLatestConfigVariable("ReceivedMessageFormatWithT") - self.clearNotificationMessage() - - - -# Show Notification Message (Config Window) - def showSuccessMessage_DeeplAuthKey(self): - self._showSuccessMessage( - vrct_gui.config_window.sb__entry_deepl_auth_key, - i18n.t("config_window.deepl_auth_key.auth_key_success") - ) - def showErrorMessage_DeeplAuthKey(self): - self._showErrorMessage( - vrct_gui.config_window.sb__entry_deepl_auth_key, - i18n.t("config_window.deepl_auth_key.auth_key_error") - ) - - def showErrorMessage_MicEnergyThreshold(self): - self._showErrorMessage( - vrct_gui.config_window.sb__progressbar_x_slider__entry_mic_energy_threshold, - self._makeInvalidValueErrorMessage(i18n.t("config_window.mic_dynamic_energy_threshold.error_message", max=config.MAX_MIC_ENERGY_THRESHOLD)) - ) - - def showErrorMessage_MicRecordTimeout(self): - self._showErrorMessage( - vrct_gui.config_window.sb__entry_mic_record_timeout, - self._makeInvalidValueErrorMessage( - i18n.t( - "config_window.mic_record_timeout.error_message", - mic_phrase_timeout_label=i18n.t("config_window.mic_phrase_timeout.label") - ) - ) - ) - - def showErrorMessage_MicPhraseTimeout(self): - self._showErrorMessage( - vrct_gui.config_window.sb__entry_mic_phrase_timeout, - self._makeInvalidValueErrorMessage( - i18n.t( - "config_window.mic_phrase_timeout.error_message", - mic_record_timeout_label=i18n.t("config_window.mic_record_timeout.label") - ) - ) - ) - - def showErrorMessage_MicMaxPhrases(self): - self._showErrorMessage( - vrct_gui.config_window.sb__entry_mic_max_phrases, - self._makeInvalidValueErrorMessage(i18n.t("config_window.mic_max_phrase.error_message")) - ) - - - def showErrorMessage_SpeakerEnergyThreshold(self): - self._showErrorMessage( - vrct_gui.config_window.sb__progressbar_x_slider__entry_speaker_energy_threshold, - self._makeInvalidValueErrorMessage(i18n.t("config_window.speaker_dynamic_energy_threshold.error_message", max=config.MAX_SPEAKER_ENERGY_THRESHOLD)) - ) - - def showErrorMessage_SpeakerRecordTimeout(self): - self._showErrorMessage( - vrct_gui.config_window.sb__entry_speaker_record_timeout, - self._makeInvalidValueErrorMessage( - i18n.t( - "config_window.speaker_record_timeout.error_message", - speaker_phrase_timeout_label=i18n.t("config_window.speaker_phrase_timeout.label") - ) - ) - ) - - def showErrorMessage_SpeakerPhraseTimeout(self): - self._showErrorMessage( - vrct_gui.config_window.sb__entry_speaker_phrase_timeout, - self._makeInvalidValueErrorMessage( - i18n.t( - "config_window.speaker_phrase_timeout.error_message", - speaker_record_timeout_label=i18n.t("config_window.speaker_record_timeout.label") - ) - ) - ) - - def showErrorMessage_SpeakerMaxPhrases(self): - self._showErrorMessage( - vrct_gui.config_window.sb__entry_speaker_max_phrases, - self._makeInvalidValueErrorMessage(i18n.t("config_window.speaker_max_phrase.error_message")) - ) - - - def showErrorMessage_CheckSpeakerThreshold_NoDevice(self): - self._showErrorMessage( - vrct_gui.config_window.sb__progressbar_x_slider__active_button_speaker_energy_threshold, - self._makeInvalidValueErrorMessage(i18n.t("config_window.speaker_dynamic_energy_threshold.no_device_error_message")) - ) - - - def showErrorMessage_SendMessageFormat(self): - self._showErrorMessage( - vrct_gui.config_window.sb__entry_send_message_format_1, - self._makeInvalidValueErrorMessage(i18n.t("config_window.send_message_format.error_message")) - ) - - def showErrorMessage_SendMessageFormatWithT(self): - self._showErrorMessage( - vrct_gui.config_window.sb__entry_send_message_format_with_t_2, - self._makeInvalidValueErrorMessage(i18n.t("config_window.send_message_format_with_t.error_message")) - ) - - def showErrorMessage_ReceivedMessageFormat(self): - self._showErrorMessage( - vrct_gui.config_window.sb__entry_received_message_format_1, - self._makeInvalidValueErrorMessage(i18n.t("config_window.received_message_format.error_message")) - ) - - def showErrorMessage_ReceivedMessageFormatWithT(self): - self._showErrorMessage( - vrct_gui.config_window.sb__entry_received_message_format_with_t_2, - self._makeInvalidValueErrorMessage(i18n.t("config_window.received_message_format_with_t.error_message")) - ) - - - @staticmethod - def _makeInvalidValueErrorMessage(error_message): - return i18n.t("config_window.common_error_message.invalid_value") + "\n" + error_message - - def _showSuccessMessage(self, target_widget, message): - self.view_variable.VAR_ERROR_MESSAGE.set(message) - vrct_gui._showSuccessMessage(target_widget=target_widget) - - def _showErrorMessage(self, target_widget, message): - self.view_variable.VAR_ERROR_MESSAGE.set(message) - vrct_gui._showErrorMessage(target_widget=target_widget) - - @staticmethod - def extractMessageFormat(text): - split_result = text.split("[message]") - result_data = SimpleNamespace( - before = split_result[0], - after = split_result[1], - ) - return result_data - - @staticmethod - def extractMessageFormatWithT(text): - import re - message_index = text.find("[message]") - translation_index = text.find("[translation]") - - result_data = SimpleNamespace( - is_message_first = True, - before = "", - between = "", - after = "", - ) - - if message_index < translation_index: - text_before_message = text[:message_index] - result_data.before = text_before_message - - match = re.search(r"\[message\](.*?)\[translation\]", text) - if match: - extracted_text = match.group(1) - result_data.between = extracted_text - - else: - raise ValueError("Invalid Message Format") - - text_after_translation = text[translation_index + len("[translation]"):] - result_data.after = text_after_translation - - - - - elif translation_index < message_index: - result_data.is_message_first = False - text_before_translation = text[:translation_index] - result_data.before = text_before_translation - - match = re.search(r"\[translation\](.*?)\[message\]", text) - if match: - extracted_text = match.group(1) - result_data.between = extracted_text - else: - raise ValueError("Invalid Message Format") - - text_after_message = text[message_index + len("[message]"):] - result_data.after = text_after_message - - else: - raise ValueError("Invalid Message Format") - - return result_data - - - - - - - # 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() \ No newline at end of file diff --git a/vrct_gui/_CreateConfirmationModal.py b/vrct_gui/_CreateConfirmationModal.py deleted file mode 100644 index 898e9c84..00000000 --- a/vrct_gui/_CreateConfirmationModal.py +++ /dev/null @@ -1,270 +0,0 @@ -from customtkinter import CTkToplevel, CTkFrame, CTkLabel, CTkFont, CTkProgressBar - -from .ui_utils import fadeInAnimation, setGeometryToCenterOfTheWidget, bindButtonFunctionAndColor, generateGradientColor - -from utils import callFunctionIfCallable - -class _CreateConfirmationModal(CTkToplevel): - def __init__(self, attach_window, settings, view_variable, modal_type=None): - super().__init__() - self.withdraw() - - self.attach_window = attach_window - self.settings = settings - self._view_variable = view_variable - - self.is_showed_progressbar = False - - self.title("") - self.overrideredirect(True) - self.wm_attributes("-toolwindow", True) - - self.BIND_FOCUS_OUT_FUNC_ID=None - - - - self.configure(fg_color=self.settings.ctm.FAKE_BORDER_COLOR) - self.protocol("WM_DELETE_WINDOW", lambda: callFunctionIfCallable(self._view_variable.CALLBACK_HIDE_CONFIRMATION_MODAL)) - - - - self.grid_rowconfigure(0,weight=1) - self.grid_columnconfigure(0,weight=1) - self.modal_container = CTkFrame(self, corner_radius=0, fg_color=self.settings.ctm.BG_COLOR) - self.modal_container.grid(row=0, column=0, padx=self.settings.uism.FAKE_BORDER_SIZE, pady=self.settings.uism.FAKE_BORDER_SIZE) - - - self.modal_contents_wrapper = CTkFrame(self.modal_container, corner_radius=0, fg_color=self.settings.ctm.BG_COLOR) - self.modal_contents_wrapper.grid(row=0, column=0, padx=self.settings.uism.CONTENTS_WRAPPER, pady=self.settings.uism.CONTENTS_WRAPPER) - - - - self.modal_contents_wrapper.grid_rowconfigure(1, minsize=self.settings.uism.MARGIN_BETWEEN_MESSAGE_AND_BUTTONS) - - self.modal_message_label_wrapper = CTkFrame(self.modal_contents_wrapper, corner_radius=0, fg_color=self.settings.ctm.BG_COLOR) - self.modal_message_label_wrapper.grid(row=0, column=0) - - self.modal_message_label_wrapper.grid_rowconfigure((0,2),weight=1) - self.modal_message_label_wrapper.grid_columnconfigure((0,2),weight=1) - - self.modal_message_label = CTkLabel( - self.modal_message_label_wrapper, - textvariable=self._view_variable.VAR_MESSAGE_CONFIRMATION_MODAL, - height=0, - corner_radius=0, - font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.MESSAGE_FONT_SIZE, weight="normal"), - anchor="w", - text_color=self.settings.ctm.MESSAGE_TEXT_COLOR, - ) - self.modal_message_label.grid(row=1, column=1) - - - - self.modal_buttons_container = CTkFrame(self.modal_contents_wrapper, corner_radius=0, fg_color=self.settings.ctm.BG_COLOR) - self.modal_buttons_container.grid(row=2, column=0, sticky="nsew") - - self.modal_buttons_container.grid_rowconfigure((0,2),weight=1) - self.modal_buttons_container.grid_columnconfigure(0,weight=1) - - self.modal_buttons_wrapper = CTkFrame(self.modal_buttons_container, corner_radius=0, fg_color=self.settings.ctm.BG_COLOR) - self.modal_buttons_wrapper.grid(row=1, column=0, sticky="ew") - - - # Progress bar - self.progressbar_widget = CTkProgressBar( - self.modal_contents_wrapper, - height=8, - corner_radius=0, - fg_color="black", - # fg_color="#4b4c4f", - progress_color="gray", - ) - self.progressbar_widget.set(0) - - - if modal_type == "information": - self.modal_buttons_wrapper.grid_columnconfigure((0,2), weight=1) - - - self.accept_button = CTkFrame(self.modal_buttons_wrapper, corner_radius=self.settings.uism.BUTTONS_CORNER_RADIUS, fg_color=self.settings.ctm.ACCEPT_BUTTON_BG_COLOR, cursor="hand2") - self.accept_button.grid(row=0, column=1, sticky="ew") - - - self.accept_button.grid_columnconfigure(0, weight=1) - self.accept_button_label_wrapper = CTkFrame(self.accept_button, corner_radius=0, fg_color=self.settings.ctm.ACCEPT_BUTTON_BG_COLOR) - self.accept_button_label_wrapper.grid(row=0, column=0, padx=self.settings.uism.BUTTONS_IPADX, pady=self.settings.uism.BUTTONS_IPADY, sticky="ew") - - self.accept_button_label_wrapper.grid_columnconfigure((0,2), weight=1) - self.accept_button_label = CTkLabel( - self.accept_button_label_wrapper, - textvariable=self._view_variable.VAR_LABEL_CONFIRMATION_MODAL_ACCEPT_BUTTON, - height=0, - corner_radius=0, - font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.CONFIRMATION_BUTTONS_TEXT_FONT_SIZE, weight="normal"), - anchor="w", - text_color=self.settings.ctm.CONFIRMATION_BUTTONS_TEXT_COLOR, - ) - self.accept_button_label.grid(row=0, column=1) - - - - bindButtonFunctionAndColor( - target_widgets=[ - self.accept_button, - self.accept_button_label_wrapper, - self.accept_button_label, - ], - enter_color=settings.ctm.ACCEPT_BUTTON_HOVERED_BG_COLOR, - leave_color=settings.ctm.ACCEPT_BUTTON_BG_COLOR, - clicked_color=settings.ctm.ACCEPT_BUTTON_CLICKED_BG_COLOR, - buttonReleasedFunction=lambda _e: callFunctionIfCallable(self._view_variable.CALLBACK_ACCEPTED_CONFIRMATION_MODAL), - ) - - - - - - - else: - self.modal_buttons_wrapper.grid_columnconfigure(1, weight=1, minsize=self.settings.uism.BUTTONS_BETWEEN_PADDING) - self.modal_buttons_wrapper.grid_columnconfigure((0,2), weight=0, uniform="button_wrapper") - - - - - - self.deny_button = CTkFrame(self.modal_buttons_wrapper, corner_radius=self.settings.uism.BUTTONS_CORNER_RADIUS, fg_color=self.settings.ctm.DENY_BUTTON_BG_COLOR, cursor="hand2") - self.deny_button.grid(row=0, column=0, sticky="ew") - - - self.deny_button.grid_columnconfigure(0, weight=1) - self.deny_button_label_wrapper = CTkFrame(self.deny_button, corner_radius=0, fg_color=self.settings.ctm.DENY_BUTTON_BG_COLOR) - self.deny_button_label_wrapper.grid(row=0, column=0, padx=self.settings.uism.BUTTONS_IPADX, pady=self.settings.uism.BUTTONS_IPADY, sticky="ew") - - self.deny_button_label_wrapper.grid_columnconfigure((0,2), weight=1) - - - self.deny_button_label_wrapper.grid_columnconfigure(0, weight=1) - self.deny_button_label = CTkLabel( - self.deny_button_label_wrapper, - textvariable=self._view_variable.VAR_LABEL_CONFIRMATION_MODAL_DENY_BUTTON, - height=0, - corner_radius=0, - font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.CONFIRMATION_BUTTONS_TEXT_FONT_SIZE, weight="normal"), - anchor="w", - text_color=self.settings.ctm.CONFIRMATION_BUTTONS_TEXT_COLOR, - ) - self.deny_button_label.grid(row=0, column=1) - - - - bindButtonFunctionAndColor( - target_widgets=[ - self.deny_button, - self.deny_button_label_wrapper, - self.deny_button_label, - ], - enter_color=settings.ctm.DENY_BUTTON_HOVERED_BG_COLOR, - leave_color=settings.ctm.DENY_BUTTON_BG_COLOR, - clicked_color=settings.ctm.DENY_BUTTON_CLICKED_BG_COLOR, - buttonReleasedFunction=lambda _e: callFunctionIfCallable(self._view_variable.CALLBACK_DENIED_CONFIRMATION_MODAL), - ) - - - - self.accept_button = CTkFrame(self.modal_buttons_wrapper, corner_radius=self.settings.uism.BUTTONS_CORNER_RADIUS, fg_color=self.settings.ctm.ACCEPT_BUTTON_BG_COLOR, cursor="hand2") - self.accept_button.grid(row=0, column=2, sticky="ew") - - - self.accept_button.grid_columnconfigure(0, weight=1) - self.accept_button_label_wrapper = CTkFrame(self.accept_button, corner_radius=0, fg_color=self.settings.ctm.ACCEPT_BUTTON_BG_COLOR) - self.accept_button_label_wrapper.grid(row=0, column=0, padx=self.settings.uism.BUTTONS_IPADX, pady=self.settings.uism.BUTTONS_IPADY, sticky="ew") - - self.accept_button_label_wrapper.grid_columnconfigure((0,2), weight=1) - self.accept_button_label = CTkLabel( - self.accept_button_label_wrapper, - textvariable=self._view_variable.VAR_LABEL_CONFIRMATION_MODAL_ACCEPT_BUTTON, - height=0, - corner_radius=0, - font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.CONFIRMATION_BUTTONS_TEXT_FONT_SIZE, weight="normal"), - anchor="w", - text_color=self.settings.ctm.CONFIRMATION_BUTTONS_TEXT_COLOR, - ) - self.accept_button_label.grid(row=0, column=1) - - - - bindButtonFunctionAndColor( - target_widgets=[ - self.accept_button, - self.accept_button_label_wrapper, - self.accept_button_label, - ], - enter_color=settings.ctm.ACCEPT_BUTTON_HOVERED_BG_COLOR, - leave_color=settings.ctm.ACCEPT_BUTTON_BG_COLOR, - clicked_color=settings.ctm.ACCEPT_BUTTON_CLICKED_BG_COLOR, - buttonReleasedFunction=lambda _e: callFunctionIfCallable(self._view_variable.CALLBACK_ACCEPTED_CONFIRMATION_MODAL), - ) - - - - def hide_buttons(self): - self.modal_buttons_wrapper.grid_remove() - - - def show(self, hide_title_bar:bool=True, close_when_focusout:bool=True): - self.modal_buttons_wrapper.grid() - - if hide_title_bar is False: - self.overrideredirect(False) - else: - self.overrideredirect(True) - - self.close_when_focusout = close_when_focusout - if self.close_when_focusout is True: - self.BIND_FOCUS_OUT_FUNC_ID = self.bind("", self.focusOutFunction, "+") - else: - self._grab_set() - - - self.attributes("-alpha", 0) - self.deiconify() - setGeometryToCenterOfTheWidget( - attach_widget=self.attach_window, - target_widget=self - ) - fadeInAnimation(self, steps=5, interval=0.005, max_alpha=1) - self.lift() - self.focus_set() - - - def hide(self): - if self.BIND_FOCUS_OUT_FUNC_ID is not None: - self.unbind("", self.BIND_FOCUS_OUT_FUNC_ID) - - self.withdraw() - self.grab_release() - - def focusOutFunction(self, e): - if str(e.widget) != ".!_createconfirmationmodal": - return - callFunctionIfCallable(self._view_variable.CALLBACK_HIDE_CONFIRMATION_MODAL) - - - def updateDownloadProgress(self, progress:float): - if self.is_showed_progressbar is False: - self.progressbar_widget.place(relwidth=0.9, relx=0.5, rely=0.84, anchor="s") - self.is_showed_progressbar = True - self.update() - - progress_color = generateGradientColor( - value=progress, - color_start=[242, 242, 242], # RGB values for #f2f2f2 - color_end=[72, 164, 149], # RGB values for #48a495 - ) - self.progressbar_widget.configure(progress_color=progress_color) - self.progressbar_widget.set(progress) - self.update_idletasks() - - def _grab_set(self): - self.grab_set() diff --git a/vrct_gui/_CreateDropdownMenuWindow.py b/vrct_gui/_CreateDropdownMenuWindow.py deleted file mode 100644 index d6853b35..00000000 --- a/vrct_gui/_CreateDropdownMenuWindow.py +++ /dev/null @@ -1,386 +0,0 @@ -from typing import Union -from types import SimpleNamespace - -from customtkinter import CTkToplevel, CTkFrame, CTkLabel, CTkFont -from time import sleep - -from .ui_utils import bindButtonReleaseFunction, bindEnterAndLeaveColor, bindButtonPressColor, getLatestHeight, applyUiScalingAndFixTheBugScrollBar, getLatestWidth, getLongestText, getLongestText_Dict, CustomizedCTkScrollableFrame -from functools import partial - -from utils import isEven, makeEven - -class _CreateDropdownMenuWindow(CTkToplevel): - def __init__( - self, - settings, - view_variable, - - window_additional_y_pos, - window_border_width, - scrollbar_ipadx, - scrollbar_width, - value_ipadx, - value_ipady, - value_pady, - value_font_size, - dropdown_menu_default_min_width, - - window_bg_color, - window_border_color, - values_bg_color, - values_hovered_bg_color, - values_clicked_bg_color, - values_text_color, - ): - - super().__init__() - self.withdraw() - self.hide = True - - self.window_additional_y_pos=window_additional_y_pos - self.window_border_width=window_border_width - self.scrollbar_ipadx=scrollbar_ipadx - self.scrollbar_width=scrollbar_width - self.value_ipadx=value_ipadx - self.value_ipady=value_ipady - self.value_pady=value_pady - self.value_font_size=value_font_size - self.dropdown_menu_default_min_width=dropdown_menu_default_min_width - - self.window_bg_color=window_bg_color - self.window_border_color=window_border_color - self.values_bg_color=values_bg_color - self.values_hovered_bg_color=values_hovered_bg_color - self.values_clicked_bg_color=values_clicked_bg_color - self.values_text_color=values_text_color - - - self.settings = settings - self.attach_widget = None - self._view_variable = view_variable - self.wrapper_widget = None - - self.dropdown_menu_widgets = {} - self.active_dropdown_menu_widget = None - - - - self.attach_widget_width = None - self.attach_widget_height = None - self.attach_widget_x_pos = None - self.attach_widget_y_pos = None - self.x_pos = None - self.y_pos = None - - self.init_height = 200 - self.new_height = self.init_height - self.init_width = 200 - self.new_width = self.init_width - - self.init_max_display_length = 8 - self.max_display_length = self.init_max_display_length - - self.title("") - self.overrideredirect(True) - - self.wm_attributes("-alpha", 0) - self.wm_attributes("-toolwindow", True) - - self.configure(fg_color=self.window_bg_color) - self.resizable(width=False, height=False) - - - - def updateDropdownMenuValues(self, dropdown_menu_widget_id, dropdown_menu_values:Union[dict, list],): - self.dropdown_menu_widgets[dropdown_menu_widget_id].widget.destroy() - self.createDropdownMenuBox( - dropdown_menu_widget_id=dropdown_menu_widget_id, - dropdown_menu_values=dropdown_menu_values, - command=self.dropdown_menu_widgets[dropdown_menu_widget_id].command, - wrapper_widget=self.dropdown_menu_widgets[dropdown_menu_widget_id].wrapper_widget, - attach_widget=self.dropdown_menu_widgets[dropdown_menu_widget_id].attach_widget, - - dropdown_menu_min_width=self.dropdown_menu_widgets[dropdown_menu_widget_id].dropdown_menu_settings.dropdown_menu_min_width, - dropdown_menu_height=self.dropdown_menu_widgets[dropdown_menu_widget_id].dropdown_menu_settings.dropdown_menu_height, - max_display_length=self.dropdown_menu_widgets[dropdown_menu_widget_id].dropdown_menu_settings.max_display_length, - ) - - - def createDropdownMenuBox(self, dropdown_menu_widget_id, dropdown_menu_values:Union[dict, list], command, wrapper_widget, attach_widget, dropdown_menu_min_width=None, dropdown_menu_height=None, max_display_length=None): - - self.attach_widget = attach_widget - self.wrapper_widget = wrapper_widget - - - self.new_width = dropdown_menu_min_width if dropdown_menu_min_width is not None else self.dropdown_menu_default_min_width - self.new_height = dropdown_menu_height if dropdown_menu_height is not None else self.init_height - self.max_display_length = max_display_length if max_display_length is not None else self.init_max_display_length - - - self.dropdown_menu_container = CTkFrame(self, corner_radius=0, fg_color=self.window_border_color, width=0, height=0) - self.dropdown_menu_container.grid(row=0, column=0, sticky="nsew") - - - BORDER_WIDTH=self.window_border_width - self.scroll_frame_container = CustomizedCTkScrollableFrame( - self.dropdown_menu_container, - corner_radius=0, - fg_color=self.window_bg_color, - width=0, - height=0, - border_width=0, - ) - self.scroll_frame_container.grid(row=0, column=0, padx=BORDER_WIDTH, pady=BORDER_WIDTH, sticky="nsew") - self.scroll_frame_container.grid_columnconfigure(0, weight=1) - - - - self._createDropdownMenuValues(dropdown_menu_widget_id, dropdown_menu_values, command) - - applyUiScalingAndFixTheBugScrollBar( - scrollbar_widget=self.scroll_frame_container, - padx=self.scrollbar_ipadx, - width=self.scrollbar_width, - ) - - geometry_width = int(self.new_width + self.scroll_frame_container._scrollbar.winfo_width() + (BORDER_WIDTH*2) + (self.scrollbar_ipadx[0] + self.scrollbar_ipadx[1])) - geometry_height = int(self.new_height + (BORDER_WIDTH*2)) - - self.dropdown_menu_widgets[dropdown_menu_widget_id] = SimpleNamespace() - - self.dropdown_menu_widgets[dropdown_menu_widget_id] = SimpleNamespace( - widget=self.dropdown_menu_container, - command=command, - wrapper_widget=wrapper_widget, - attach_widget=attach_widget, - dropdown_menu_settings=SimpleNamespace( - dropdown_menu_min_width=dropdown_menu_min_width, - dropdown_menu_height=dropdown_menu_height, - max_display_length=max_display_length, - ), - _settings=SimpleNamespace( - geometry_width=geometry_width, - geometry_height=geometry_height, - ), - ) - - self.dropdown_menu_container.grid_remove() - - - def _createDropdownMenuValues(self, dropdown_menu_widget_id, dropdown_menu_values:Union[dict, list], command): - if isinstance(dropdown_menu_values, list): - longest_text = getLongestText(dropdown_menu_values) - elif isinstance(dropdown_menu_values, dict): - longest_text = getLongestText_Dict(dropdown_menu_values) - - self.dropdown_menu_values_wrapper = CTkFrame(self.scroll_frame_container, corner_radius=0, fg_color=self.window_bg_color) - self.dropdown_menu_values_wrapper.grid(row=0, column=0, sticky="nsew") - self.dropdown_menu_values_wrapper.grid_columnconfigure(0, weight=1) - - # for get to the height__________________ - __dropdown_menu_value_wrapper = CTkFrame(self.dropdown_menu_values_wrapper, corner_radius=0, fg_color=self.values_bg_color, width=0, height=0) - __dropdown_menu_value_wrapper.grid(row=0, column=0, pady=self.value_pady, sticky="nsew") - setattr(self, f"{dropdown_menu_widget_id}__{0}", __dropdown_menu_value_wrapper) - - - __dropdown_menu_value_wrapper.grid_rowconfigure((0,2), weight=1) - __label_widget = CTkLabel( - __dropdown_menu_value_wrapper, - text=longest_text, - height=0, - corner_radius=0, - font=CTkFont(family=self.settings.FONT_FAMILY, size=self.value_font_size, weight="normal"), - anchor="w", - text_color=self.values_text_color, - ) - - __label_widget.grid(row=1, column=0, padx=self.value_ipadx, pady=self.value_ipady, sticky="w") - - label_height = getLatestHeight(__dropdown_menu_value_wrapper) - label_width = getLatestWidth(__label_widget) - label_width += self.scroll_frame_container._scrollbar.winfo_width() + (self.window_border_width*2) + (self.scrollbar_ipadx[0] + self.scrollbar_ipadx[1]) - if label_width > self.new_width: - additional_width = int(label_width - self.new_width + self.settings.uism.MARGIN_WIDTH) - self.new_width += additional_width - - # for fixing 1px bug - if isEven(label_height) is False: - self.value_ipady = (self.value_ipady[0], self.value_ipady[1] - 1) - - __dropdown_menu_value_wrapper.destroy() - # ______________________________________ - - dropdown_menu_values_length = len(dropdown_menu_values) - if dropdown_menu_values_length < self.max_display_length: - self.new_height = int(dropdown_menu_values_length * label_height) - else: - self.new_height = int(self.max_display_length * label_height) - - - # for fixing 1px bug - self.new_height = makeEven(self.new_height) - self.new_width = makeEven(self.new_width) - self.scroll_frame_container.configure(width=self.new_width, height=self.new_height) - - - - IS_LIST_TYPE = False - if isinstance(dropdown_menu_values, list): - for_in_values = dropdown_menu_values - IS_LIST_TYPE = True - elif isinstance(dropdown_menu_values, dict): - for_in_values = dropdown_menu_values.keys() - IS_LIST_TYPE = False - - row=0 - for dropdown_menu_value in for_in_values: - dropdown_menu_value_wrapper = CTkFrame(self.dropdown_menu_values_wrapper, corner_radius=0, fg_color=self.values_bg_color, width=0, height=0, cursor="hand2") - dropdown_menu_value_wrapper.grid(row=row, column=0, pady=self.value_pady, sticky="nsew") - setattr(self, f"{dropdown_menu_widget_id}__{row}", dropdown_menu_value_wrapper) - - - - if IS_LIST_TYPE is True: - dropdown_menu_value_text = dropdown_menu_value - else: - dropdown_menu_value_text = dropdown_menu_values[dropdown_menu_value] - - dropdown_menu_value_wrapper.grid_rowconfigure((0,2), weight=1) - label_widget = CTkLabel( - dropdown_menu_value_wrapper, - text=dropdown_menu_value_text, - height=0, - corner_radius=0, - font=CTkFont(family=self.settings.FONT_FAMILY, size=self.value_font_size, weight="normal"), - anchor="w", - text_color=self.values_text_color, - ) - - label_widget.grid(row=1, column=0, padx=self.value_ipadx, pady=self.value_ipady, sticky="w") - - - bindEnterAndLeaveColor([dropdown_menu_value_wrapper, label_widget], self.values_hovered_bg_color, self.values_bg_color) - bindButtonPressColor([dropdown_menu_value_wrapper, label_widget], self.values_clicked_bg_color, self.values_bg_color) - - - - def optimizedCommand(value, _e): - command(value) - self._withdraw() - - if IS_LIST_TYPE is True: - callback = partial(optimizedCommand, dropdown_menu_value_text) - else: - callback = partial(optimizedCommand, dropdown_menu_value) - - bindButtonReleaseFunction([dropdown_menu_value_wrapper, label_widget], callback) - - row+=1 - - - - def show(self, dropdown_menu_widget_id): - if self.hide is False: - return - self.wm_attributes("-alpha", 0) - - - - if self.active_dropdown_menu_widget is not None: - try: - self.active_dropdown_menu_widget.grid_remove() - except: - pass - - target_data = self.dropdown_menu_widgets[dropdown_menu_widget_id] - self.attach_widget = target_data.attach_widget - - target_data.widget.grid() - self.active_dropdown_menu_widget = target_data.widget - - self.geometry("{}x{}".format(target_data._settings.geometry_width, target_data._settings.geometry_height)) - - - self.deiconify() - self._adjustToTargetWidgetGeometry() - self.BIND_CONFIGURE_FUNC_ID = self.attach_widget.winfo_toplevel().bind("", self._adjustToTargetWidgetGeometry, "+") - self.BIND_UNMAP_FUNC_ID = self.attach_widget.bind("", self._withdraw, "+") - - self.BIND_BUTTON_1_FUNC_ID = self.attach_widget.winfo_toplevel().bind("", self._withdraw, "+") - - - self.hide = False - - - - for i in range(0,91,10): - if not self.winfo_exists(): - break - self.attributes("-alpha", i/100) - self.update() - sleep(1/100) - self.wm_attributes("-alpha", 1) - self.update() - - - - def _withdraw(self, e=None): - self.withdraw() - try: - self.attach_widget.winfo_toplevel().unbind("", self.BIND_CONFIGURE_FUNC_ID) - except Exception: - pass - try: - self.attach_widget.unbind("", self.BIND_UNMAP_FUNC_ID) - except Exception: - pass - try: - self.attach_widget.winfo_toplevel().unbind("", self.BIND_BUTTON_1_FUNC_ID) - except Exception: - pass - self.hide = True - - - def _adjustToTargetWidgetGeometry(self, e=None): - if not self.attach_widget.winfo_exists(): - return - self.attach_widget.update_idletasks() - - - - self.update() - if self.attach_widget_x_pos == self.attach_widget.winfo_rootx() and self.attach_widget_y_pos == self.attach_widget.winfo_rooty(): - self.lift() - return - - self.wrapper_widget_y_pos = self.wrapper_widget.winfo_rooty() - self.wrapper_widget_bottom_y_pos = self.wrapper_widget_y_pos + self.wrapper_widget.winfo_height() - - self.attach_widget_width = self.attach_widget.winfo_width() - self.attach_widget_height = self.attach_widget.winfo_height() - self.attach_widget_x_pos = self.attach_widget.winfo_rootx() - self.attach_widget_y_pos = self.attach_widget.winfo_rooty() - - - self.y_pos = int(self.attach_widget_y_pos + self.attach_widget_height + self.window_additional_y_pos) - - if self.wrapper_widget_y_pos > self.y_pos or self.y_pos > self.wrapper_widget_bottom_y_pos: - self.hideTemporarily() - else: - if self.winfo_exists(): - self.deiconify() - - - if self.winfo_width() >= self.attach_widget_width: - self.x_pos = int(self.attach_widget_x_pos - (self.winfo_width() - self.attach_widget_width)) - else: - self.x_pos = self.attach_widget_x_pos - - self.geometry("+{}+{}".format(self.x_pos, self.y_pos)) - - self.lift() - - def hideTemporarily(self): - self.withdraw() - - diff --git a/vrct_gui/_CreateNotificationWindow.py b/vrct_gui/_CreateNotificationWindow.py deleted file mode 100644 index e7fa2226..00000000 --- a/vrct_gui/_CreateNotificationWindow.py +++ /dev/null @@ -1,186 +0,0 @@ -from customtkinter import CTkToplevel, CTkFrame, CTkLabel, CTkFont -from time import sleep - -from .ui_utils import getLatestWidth, getLatestHeight -from utils import isEven - - -class _CreateNotificationWindow(CTkToplevel): - def __init__( - self, - settings, - view_variable, - wrapper_widget, - - message_ipadx, - message_ipady, - message_font_size, - - error_message_bg_color, - success_message_bg_color, - message_text_color, - ): - - super().__init__() - self.withdraw() - self.hide = True - - self.settings = settings - self.attach_widget = None - self._view_variable = view_variable - self.wrapper_widget = wrapper_widget - - - self.message_ipadx = message_ipadx - self.message_ipady = message_ipady - self.message_font_size = message_font_size - - self.error_message_bg_color = error_message_bg_color - self.success_message_bg_color = success_message_bg_color - self.message_text_color = message_text_color - - - self.attach_widget_width = None - self.attach_widget_height = None - self.attach_widget_x_pos = None - self.attach_widget_y_pos = None - self.x_pos = None - self.y_pos = None - - self.title("") - self.overrideredirect(True) - - self.wm_attributes("-alpha", 0) - self.wm_attributes("-toolwindow", True) - - - self.grid_rowconfigure(0,weight=1) - self.grid_columnconfigure(0,weight=1) - - self.notification_message_container = CTkFrame(self, corner_radius=0, width=0, height=0) - self.notification_message_container.grid(row=0, column=0, sticky="nsew") - - - self.notification_message_container_label_wrapper = CTkLabel( - self.notification_message_container, - # text=message, - textvariable=self._view_variable.VAR_ERROR_MESSAGE, - height=0, - corner_radius=0, - font=CTkFont(family=self.settings.FONT_FAMILY, size=self.message_font_size, weight="normal"), - anchor="w", - justify="left", - text_color=self.message_text_color, - ) - self.notification_message_container_label_wrapper.grid(row=0, column=0, padx=self.message_ipadx, pady=self.message_ipady, sticky="nsew") - - - - - def show(self, target_widget, message_type): - if message_type == "Error": - self.notification_message_container.configure(fg_color=self.error_message_bg_color) - elif message_type == "Success": - self.notification_message_container.configure(fg_color=self.success_message_bg_color) - else: - raise ValueError("message_type is not selected") - - if self.hide is False: - return - - self.attach_widget = target_widget - - self.deiconify() - self._adjustToTargetWidgetGeometry() - self.BIND_CONFIGURE_FUNC_ID = self.attach_widget.winfo_toplevel().bind("", self._adjustToTargetWidgetGeometry, "+") - self.BIND_UNMAP_FUNC_ID = self.attach_widget.bind("", self._withdraw, "+") - - self.hide = False - - label_width = getLatestWidth(self.notification_message_container_label_wrapper) - label_height = getLatestHeight(self.notification_message_container_label_wrapper) - - # for fixing 1px bug - if isEven(label_width) is False: - self.notification_message_container_label_wrapper.grid(padx=(self.message_ipadx[0], self.message_ipadx[1]-1)) - else: - self.notification_message_container_label_wrapper.grid(padx=self.message_ipadx) - - # for fixing 1px bug - if isEven(label_height) is False: - self.notification_message_container_label_wrapper.grid(pady=(self.message_ipady[0], self.message_ipady[1]-1)) - else: - self.notification_message_container_label_wrapper.grid(pady=self.message_ipady) - - - # First show animation - for i in range(0,101,20): - if not self.winfo_exists(): - break - self.attributes("-alpha", i/100) - self.update() - sleep(1/100) - - sleep(0.1) - - # Blink animation - if message_type == "Error": - for i in range(0,91,10): - if not self.winfo_exists(): - break - self.attributes("-alpha", i/100) - self.update() - sleep(1/80) - - - def _withdraw(self, e=None): - self.withdraw() - self.attach_widget.winfo_toplevel().unbind("", self.BIND_CONFIGURE_FUNC_ID) - self.attach_widget.unbind("", self.BIND_UNMAP_FUNC_ID) - self.hide = True - - - - def _adjustToTargetWidgetGeometry(self, e=None): - if not self.attach_widget.winfo_exists(): - return - self.attach_widget.update_idletasks() - - - - self.update() - if self.attach_widget_x_pos == self.attach_widget.winfo_rootx() and self.attach_widget_y_pos == self.attach_widget.winfo_rooty(): - self.lift() - return - - self.wrapper_widget_y_pos = self.wrapper_widget.winfo_rooty() - self.wrapper_widget_bottom_y_pos = self.wrapper_widget_y_pos + self.wrapper_widget.winfo_height() - - self.attach_widget_width = self.attach_widget.winfo_width() - self.attach_widget_height = self.attach_widget.winfo_height() - self.attach_widget_x_pos = self.attach_widget.winfo_rootx() - self.attach_widget_y_pos = self.attach_widget.winfo_rooty() - - - self.y_pos = int(self.attach_widget_y_pos + self.attach_widget_height + 4) - - if self.wrapper_widget_y_pos > self.y_pos or self.y_pos > self.wrapper_widget_bottom_y_pos: - self.hideTemporarily() - else: - if self.winfo_exists(): - self.deiconify() - - - if self.winfo_width() >= self.attach_widget_width: - self.x_pos = int(self.attach_widget_x_pos - (self.winfo_width() - self.attach_widget_width)) - else: - self.x_pos = self.attach_widget_x_pos - - self.geometry("+{}+{}".format(self.x_pos, self.y_pos)) - - self.lift() - - def hideTemporarily(self): - self.withdraw() - - diff --git a/vrct_gui/_CreateSelectableLanguagesWindow.py b/vrct_gui/_CreateSelectableLanguagesWindow.py deleted file mode 100644 index 4c5482cd..00000000 --- a/vrct_gui/_CreateSelectableLanguagesWindow.py +++ /dev/null @@ -1,190 +0,0 @@ -from functools import partial - -from .ui_utils import bindButtonReleaseFunction, bindEnterAndLeaveColor, bindButtonPressColor, applyUiScalingAndFixTheBugScrollBar, CustomizedCTkScrollableFrame -from utils import callFunctionIfCallable, makeEven - -from customtkinter import CTkToplevel, CTkFrame, CTkLabel, CTkFont - -class _CreateSelectableLanguagesWindow(CTkToplevel): - def __init__(self, vrct_gui, settings, view_variable): - super().__init__() - self.withdraw() - - self.attach = vrct_gui.main_bg_container - self.vrct_gui = vrct_gui - self.settings = settings - self._view_variable = view_variable - - self.is_created = False - self.selectable_language_window_type = None - - - self.title("_CreateSelectableLanguagesWindow") - self.overrideredirect(True) - self.configure(fg_color=self.settings.ctm.TOP_BG_COLOR) - self.protocol("WM_DELETE_WINDOW", vrct_gui._closeSelectableLanguagesWindow) - self.bind("", self.focusOutFunction) - - - - - def createContainer(self, selectable_language_window_type): - self.selectable_language_window_type = selectable_language_window_type - - self.attach.update_idletasks() - self.x_pos = self.attach.winfo_rootx() - self.y_pos = self.attach.winfo_rooty() - self.width_new = makeEven(self.attach.winfo_width()) - self.height_new = makeEven(self.attach.winfo_height()) - - - self.geometry("{}x{}+{}+{}".format(self.width_new, self.height_new, self.x_pos, self.y_pos)) - - - - if self.is_created is True: - pass - else: - self._createContainer() - - - def callbackSelectableLanguages(self, value, _e): - language = value["language"] - country = value["country"] - callback_value = { - "language" : language, - "country" : country, - } - set_value = f"{language}\n({country})" - - if self.selectable_language_window_type == "your_language": - callback = self._view_variable.CALLBACK_SELECTED_YOUR_LANGUAGE - target_variable = self._view_variable.VAR_YOUR_LANGUAGE - elif self.selectable_language_window_type == "target_language": - callback = self._view_variable.CALLBACK_SELECTED_TARGET_LANGUAGE - target_variable = self._view_variable.VAR_TARGET_LANGUAGE - - target_variable.set(set_value) - callFunctionIfCallable(callback, callback_value) - self.vrct_gui._closeSelectableLanguagesWindow() - - - - - - def _createContainer(self): - self.grid_rowconfigure(0, minsize=self.settings.uism.TOP_BAR_MIN_HEIGHT) - self.grid_rowconfigure(1, weight=1) - self.grid_columnconfigure(0, weight=1) - self.top_container = CTkFrame(self, corner_radius=0, fg_color=self.settings.ctm.TOP_BG_COLOR, width=0, height=0) - self.top_container.grid(row=0, column=0, sticky="nsew") - - - self.top_container.grid_rowconfigure((0,2), weight=1) - self.top_container.grid_columnconfigure(1, weight=1) - self.go_back_button_container = CTkFrame(self.top_container, corner_radius=0, fg_color=self.settings.ctm.GO_BACK_BUTTON_BG_COLOR, width=0, height=0, cursor="hand2") - self.go_back_button_container.grid(row=1, column=0) - - self.go_back_button_label = CTkLabel( - self.go_back_button_container, - textvariable=self._view_variable.VAR_GO_BACK_LABEL_SELECTABLE_LANGUAGE, - height=0, - corner_radius=0, - font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.GO_BACK_BUTTON_LABEL_FONT_SIZE, weight="normal"), - anchor="w", - text_color=self.settings.ctm.BASIC_TEXT_COLOR, - ) - self.go_back_button_label.grid(row=0, column=0, padx=self.settings.uism.GO_BACK_BUTTON_IPADX, pady=self.settings.uism.GO_BACK_BUTTON_IPADY) - - - bindEnterAndLeaveColor([self.go_back_button_container, self.go_back_button_label], self.settings.ctm.GO_BACK_BUTTON_BG_HOVERED_COLOR, self.settings.ctm.GO_BACK_BUTTON_BG_COLOR) - bindButtonPressColor([self.go_back_button_container, self.go_back_button_label], self.settings.ctm.GO_BACK_BUTTON_BG_CLICKED_COLOR, self.settings.ctm.GO_BACK_BUTTON_BG_COLOR) - - - bindButtonReleaseFunction([self.go_back_button_container, self.go_back_button_label], lambda _e: self.vrct_gui._closeSelectableLanguagesWindow()) - - - - self.title_container = CTkFrame(self.top_container, corner_radius=0, fg_color=self.settings.ctm.TOP_BG_COLOR, width=0, height=0) - self.title_container.grid(row=1, column=1, sticky="nsew") - - self.title_container.grid_columnconfigure((0,2), weight=1) - self.title_container.grid_rowconfigure((0,2), weight=1) - self.title_label = CTkLabel( - self.title_container, - textvariable=self._view_variable.VAR_TITLE_LABEL_SELECTABLE_LANGUAGE, - height=0, - corner_radius=0, - font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.TITLE_FONT_SIZE, weight="normal"), - anchor="w", - text_color=self.settings.ctm.TITLE_TEXT_COLOR, - ) - self.title_label.grid(row=1, column=1) - - - - - self.scroll_frame_container = CustomizedCTkScrollableFrame(self, corner_radius=0, fg_color=self.settings.ctm.MAIN_BG_COLOR, width=self.width_new, height=self.height_new) - self.scroll_frame_container.grid(row=1, column=0, sticky="nsew") - - applyUiScalingAndFixTheBugScrollBar( - scrollbar_widget=self.scroll_frame_container, - padx=self.settings.uism.SCROLLBAR_IPADX, - width=self.settings.uism.SCROLLBAR_WIDTH, - ) - - - self.container = CTkFrame(self.scroll_frame_container, corner_radius=0, fg_color=self.settings.ctm.MAIN_BG_COLOR, width=0, height=0) - self.container.grid(row=0, column=0, sticky="nsew") - - - - max_row = int(len(self._view_variable.LIST_SELECTABLE_LANGUAGES)/3) + 1 - max_row+=1 - row=0 - column=0 - for selectable_language_dict in self._view_variable.LIST_SELECTABLE_LANGUAGES: - - self.wrapper = CTkFrame(self.container, corner_radius=0, fg_color=self.settings.ctm.LANGUAGE_BUTTON_BG_COLOR, width=0, height=0, cursor="hand2") - self.wrapper.grid(row=row, column=column, sticky="nsew") - setattr(self, f"{row}_{column}", self.wrapper) - - - - self.wrapper.grid_rowconfigure((0,2), weight=1) - label_widget = CTkLabel( - self.wrapper, - text=f"{selectable_language_dict['language']} ({selectable_language_dict['country']})", - height=0, - corner_radius=0, - font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.VALUES_TEXT_FONT_SIZE, weight="normal"), - anchor="w", - text_color=self.settings.ctm.BASIC_TEXT_COLOR, - ) - - label_widget.grid(row=1, column=0, padx=self.settings.uism.VALUES_TEXT_IPADX, pady=self.settings.uism.VALUES_TEXT_IPADY) - - - - bindEnterAndLeaveColor([self.wrapper, label_widget], self.settings.ctm.LANGUAGE_BUTTON_BG_HOVERED_COLOR, self.settings.ctm.LANGUAGE_BUTTON_BG_COLOR) - bindButtonPressColor([self.wrapper, label_widget], self.settings.ctm.LANGUAGE_BUTTON_BG_CLICKED_COLOR, self.settings.ctm.LANGUAGE_BUTTON_BG_COLOR) - - - - callback = partial(self.callbackSelectableLanguages, selectable_language_dict) - bindButtonReleaseFunction([self.wrapper, label_widget], callback) - - if row == max_row: - row=0 - column+=1 - else: - row+=1 - - - self.is_created = True - - - def focusOutFunction(self, e): - if str(e.widget) != ".!_createselectablelanguageswindow": - return - self.vrct_gui._closeSelectableLanguagesWindow() \ No newline at end of file diff --git a/vrct_gui/_CreateWindowCover.py b/vrct_gui/_CreateWindowCover.py deleted file mode 100644 index 2b88a3d8..00000000 --- a/vrct_gui/_CreateWindowCover.py +++ /dev/null @@ -1,80 +0,0 @@ -from customtkinter import CTkToplevel, CTkFrame, CTkLabel, CTkFont - -from .ui_utils import fadeInAnimation -from utils import makeEven - -class _CreateWindowCover(CTkToplevel): - def __init__(self, attach_window, settings, view_variable): - super().__init__() - self.withdraw() - - self.BIND_CONFIGURE_ADJUSTED_GEOMETRY_FUNC_ID=None - self.BIND_FOCUS_IN_FUNC_ID=None - - self.attach_window = attach_window - self.settings = settings - self._view_variable = view_variable - - self.title("") - self.overrideredirect(True) - self.wm_attributes("-toolwindow", True) - self.configure(fg_color=self.settings.ctm.BG_COLOR) - self.protocol("WM_DELETE_WINDOW", lambda: self.withdraw()) - - - self.grid_rowconfigure(0,weight=1) - self.grid_columnconfigure(0,weight=1) - self.cover_container = CTkFrame(self, corner_radius=0, fg_color=self.settings.ctm.BG_COLOR, width=0, height=0) - self.cover_container.grid(row=0, column=0, sticky="nsew") - - - self.cover_container_label_wrapper = CTkLabel( - self.cover_container, - textvariable=self._view_variable.VAR_LABEL_MAIN_WINDOW_COVER_MESSAGE, - height=0, - corner_radius=0, - font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.TEXT_FONT_SIZE, weight="normal"), - anchor="w", - text_color=self.settings.ctm.TEXT_COLOR, - ) - self.cover_container_label_wrapper.place(relx=0.5, rely=0.5, anchor="center") - - - def show(self, bind_focusin=None): - self.BIND_CONFIGURE_ADJUSTED_GEOMETRY_FUNC_ID = self.attach_window.bind("", self._adjustToMainWindowGeometry, "+") - if bind_focusin is not None: - self.BIND_FOCUS_IN_FUNC_ID = self.bind("", lambda _e: bind_focusin(), "+") - else: - self.BIND_FOCUS_IN_FUNC_ID = None - - - self.attributes("-alpha", 0) - self.deiconify() - self.attach_window.update_idletasks() - self.x_pos = self.attach_window.winfo_rootx() - self.y_pos = self.attach_window.winfo_rooty() - self.width_new = self.attach_window.winfo_width() - self.height_new = self.attach_window.winfo_height() - self.geometry("{}x{}+{}+{}".format(self.width_new, self.height_new, self.x_pos, self.y_pos)) - fadeInAnimation(self, steps=5, interval=0.005, max_alpha=0.8) - - - - def hide(self): - self.attach_window.unbind("", self.BIND_CONFIGURE_ADJUSTED_GEOMETRY_FUNC_ID) - if self.BIND_FOCUS_IN_FUNC_ID is not None: - self.unbind("", self.BIND_FOCUS_IN_FUNC_ID) - - self.withdraw() - - - - def _adjustToMainWindowGeometry(self, e=None): - self.attach_window.update_idletasks() - x_pos = self.attach_window.winfo_rootx() - y_pos = self.attach_window.winfo_rooty() - width_new = makeEven(self.attach_window.winfo_width()) - height_new = makeEven(self.attach_window.winfo_height()) - self.geometry("{}x{}+{}+{}".format(width_new, height_new, x_pos, y_pos)) - - self.lift() \ No newline at end of file diff --git a/vrct_gui/_PrintToTextbox.py b/vrct_gui/_PrintToTextbox.py deleted file mode 100644 index 0c8597c3..00000000 --- a/vrct_gui/_PrintToTextbox.py +++ /dev/null @@ -1,170 +0,0 @@ -from datetime import datetime -from customtkinter import CTkFont -from .ui_utils import calculateUiSize - -class _PrintToTextbox(): - def __init__( - self, - vrct_gui, - settings, - init_scaling:float, - ): - - self.vrct_gui = vrct_gui - self.settings = settings - self.init_scaling = init_scaling - - self._DEFAULT_TEXTBOX_FIRST_INSERT_SPACING = self.settings.uism.TEXTBOX_FIRST_INSERT_SPACING - self._DEFAULT_TEXTBOX_FONT_SIZE__LABEL = self.settings.uism.TEXTBOX_FONT_SIZE__LABEL - self._DEFAULT_TEXTBOX_FONT_SIZE__TIMESTAMP = self.settings.uism.TEXTBOX_FONT_SIZE__TIMESTAMP - self._DEFAULT_TEXTBOX_FONT_SIZE__SYSTEM_TEXT_FONT = self.settings.uism.TEXTBOX_FONT_SIZE__SYSTEM_TEXT_FONT - self._DEFAULT_TEXTBOX_FONT_SIZE__SECONDARY_TEXT_FONT = self.settings.uism.TEXTBOX_FONT_SIZE__SECONDARY_TEXT_FONT - self._DEFAULT_TEXTBOX_FONT_SIZE__MAIN_TEXT_FONT = self.settings.uism.TEXTBOX_FONT_SIZE__MAIN_TEXT_FONT - - - - self.textbox_first_insert_spacing = None - self.textbox_font_size__label = None - self.textbox_font_size__timestamp = None - self.textbox_font_size__system_text_font = None - self.textbox_font_size__secondary_text_font = None - self.textbox_font_size__main_text_font = None - - - # self.all_textbox_widgets = [self.vrct_gui.textbox_all, self.vrct_gui.textbox_system, self.vrct_gui.textbox_sent, self.vrct_gui.textbox_received] - self.all_textbox_widgets = [self.vrct_gui.textbox_all] - - - self.setTagsSettings(self.init_scaling) - - - def printToTextbox(self, target_type, original_message=None, translated_message=None, to_print_to_textbox_all:bool=True): - # [Deprecated] Print to textbox to only all-tab. sent received system tabs are deprecated. - # self._printEachTextbox( - # target_textbox=self._getTargetTextboxWidget(target_type), - # print_type=target_type, - # original_message=original_message, - # translated_message=translated_message, - # ) - - # To automatically print the same log to the textbox_all widget as well. - # if to_print_to_textbox_all is True: - self._printEachTextbox( - target_textbox=self._getTargetTextboxWidget("ALL"), - print_type=target_type, - original_message=original_message, - translated_message=translated_message, - ) - - def setTagsSettings(self, custom_font_size_scale:float=1.0): - # Calculate Textbox's ui size by default size * textbox_ui_scale - self.textbox_first_insert_spacing = calculateUiSize(self._DEFAULT_TEXTBOX_FIRST_INSERT_SPACING, custom_font_size_scale) - self.textbox_font_size__label = calculateUiSize(self._DEFAULT_TEXTBOX_FONT_SIZE__LABEL, custom_font_size_scale) - self.textbox_font_size__timestamp = calculateUiSize(self._DEFAULT_TEXTBOX_FONT_SIZE__TIMESTAMP, custom_font_size_scale) - self.textbox_font_size__system_text_font = calculateUiSize(self._DEFAULT_TEXTBOX_FONT_SIZE__SYSTEM_TEXT_FONT, custom_font_size_scale) - self.textbox_font_size__secondary_text_font = calculateUiSize(self._DEFAULT_TEXTBOX_FONT_SIZE__SECONDARY_TEXT_FONT, custom_font_size_scale) - self.textbox_font_size__main_text_font = calculateUiSize(self._DEFAULT_TEXTBOX_FONT_SIZE__MAIN_TEXT_FONT, custom_font_size_scale) - - for each_textbox_widget in self.all_textbox_widgets: - self._setTagsSettings(target_textbox=each_textbox_widget) - each_textbox_widget.see("end") - - - - def _setTagsSettings(self, target_textbox): - target_textbox.tag_config("JUSTIFY_CENTER", justify="center") - target_textbox.tag_config("JUSTIFY_RIGHT", justify="right") - target_textbox.tag_config("JUSTIFY_LEFT", justify="left") - - # common tag settings - # target_textbox._textbox.tag_configure("START", spacing1=16) - target_textbox.tag_config("FIRST_INSERT_SPACING", spacing1=self.textbox_first_insert_spacing) - target_textbox._textbox.tag_configure("LABEL", font=CTkFont(family=self.settings.FONT_FAMILY, size=self.textbox_font_size__label, weight="normal")) - target_textbox._textbox.tag_configure("TIMESTAMP", font=CTkFont(family=self.settings.FONT_FAMILY, size=self.textbox_font_size__timestamp, weight="normal"), foreground=self.settings.ctm.TEXTBOX_TIMESTAMP_TEXT_COLOR) - target_textbox._textbox.tag_configure("SECONDARY_TEXT_FONT", font=CTkFont(family=self.settings.FONT_FAMILY, size=self.textbox_font_size__secondary_text_font, weight="normal")) - target_textbox._textbox.tag_configure("MAIN_TEXT_FONT", font=CTkFont(family=self.settings.FONT_FAMILY, size=self.textbox_font_size__main_text_font, weight="normal")) - - # System Tag Settings - target_textbox.tag_config("SYSTEM_TAG", foreground=self.settings.ctm.TEXTBOX_SYSTEM_TAG_TEXT_COLOR) - target_textbox.tag_config("SYSTEM_TEXT", foreground=self.settings.ctm.TEXTBOX_TEXT_SUB_COLOR) - target_textbox._textbox.tag_configure("SYSTEM_TEXT_FONT", font=CTkFont(family=self.settings.FONT_FAMILY, size=self.textbox_font_size__system_text_font, weight="normal")) - - # Sent Tag Settings - target_textbox.tag_config("SENT_TAG", foreground=self.settings.ctm.TEXTBOX_SENT_TAG_TEXT_COLOR) - target_textbox.tag_config("SENT_TEXT", foreground=self.settings.ctm.TEXTBOX_TEXT_COLOR) - target_textbox.tag_config("SENT_SUB_TEXT", foreground=self.settings.ctm.TEXTBOX_TEXT_SUB_COLOR) - - # Received Tag Settings - target_textbox.tag_config("RECEIVED_TAG", foreground=self.settings.ctm.TEXTBOX_RECEIVED_TAG_TEXT_COLOR) - target_textbox.tag_config("RECEIVED_TEXT", foreground=self.settings.ctm.TEXTBOX_TEXT_COLOR) - target_textbox.tag_config("RECEIVED_SUB_TEXT", foreground=self.settings.ctm.TEXTBOX_TEXT_SUB_COLOR) - - - def _printEachTextbox( - self, - target_textbox, - print_type, - original_message, - translated_message, - ): - now_raw_data = datetime.now() - now_hm = now_raw_data.strftime("%H:%M") - - is_only_one_message = True if original_message is None or translated_message is None or translated_message == "" else False - - FAKE_MARGIN = " " - # insert - target_textbox.configure(state="normal") - target_textbox.insert("end", "\n") - match (print_type): - case "SYSTEM": - target_textbox.insert("end", "System", ("SYSTEM_TAG", "FIRST_INSERT_SPACING", "JUSTIFY_CENTER", "LABEL")) - target_textbox.insert("end", FAKE_MARGIN+original_message+FAKE_MARGIN, ("SYSTEM_TEXT", "SYSTEM_TEXT_FONT", "JUSTIFY_CENTER")) - target_textbox.insert("end", now_hm, ("TIMESTAMP", "JUSTIFY_CENTER")) - - case "SENT": - target_textbox.insert("end", now_hm, ("TIMESTAMP", "FIRST_INSERT_SPACING", "JUSTIFY_RIGHT")) - target_textbox.insert("end", FAKE_MARGIN+"Sent", ("SENT_TAG", "LABEL")) - target_textbox.insert("end", "\n") - if is_only_one_message is False: - target_textbox.insert("end", original_message, ("SENT_SUB_TEXT", "SECONDARY_TEXT_FONT", "JUSTIFY_RIGHT")) - target_textbox.insert("end", "\n") - target_textbox.insert("end", translated_message, ("SENT_TEXT", "MAIN_TEXT_FONT", "JUSTIFY_RIGHT")) - else: - target_textbox.insert("end", original_message, ("SENT_TEXT", "MAIN_TEXT_FONT", "JUSTIFY_RIGHT")) - - case "RECEIVED": - target_textbox.insert("end", "Received", ("RECEIVED_TAG", "FIRST_INSERT_SPACING", "JUSTIFY_LEFT", "LABEL")) - target_textbox.insert("end", FAKE_MARGIN+now_hm, ("TIMESTAMP")) - if is_only_one_message is False: - target_textbox.insert("end", "\n") - target_textbox.insert("end", original_message, ("RECEIVED_SUB_TEXT", "SECONDARY_TEXT_FONT")) - target_textbox.insert("end", "\n") - target_textbox.insert("end", translated_message, ("RECEIVED_TEXT", "MAIN_TEXT_FONT", "JUSTIFY_LEFT")) - else: - target_textbox.insert("end", "\n") - target_textbox.insert("end", original_message, ("RECEIVED_TEXT", "MAIN_TEXT_FONT", "JUSTIFY_LEFT")) - - target_textbox.configure(state="disabled") - target_textbox.see("end") - - - - - - - - def _getTargetTextboxWidget(self, target_type): - match (target_type): - case "ALL": - target_textbox = self.vrct_gui.textbox_all - # case "SYSTEM": - # target_textbox = self.vrct_gui.textbox_system - # case "SENT": - # target_textbox = self.vrct_gui.textbox_sent - # case "RECEIVED": - # target_textbox = self.vrct_gui.textbox_received - case (_): - raise ValueError(f"No matching case for target_type: {target_type}") - - return target_textbox \ No newline at end of file diff --git a/vrct_gui/__init__.py b/vrct_gui/__init__.py deleted file mode 100644 index 5c2e8cca..00000000 --- a/vrct_gui/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .vrct_gui import vrct_gui \ No newline at end of file diff --git a/vrct_gui/_changeConfigWindowWidgetsStatus.py b/vrct_gui/_changeConfigWindowWidgetsStatus.py deleted file mode 100644 index 8f3b6b80..00000000 --- a/vrct_gui/_changeConfigWindowWidgetsStatus.py +++ /dev/null @@ -1,97 +0,0 @@ -from customtkinter import CTkImage - -def _changeConfigWindowWidgetsStatus(config_window, settings, view_variable, status, target_names): - # if target_names == "All": - # target_names = [] - - - def disableLabelsWidgets(target_widget): - target_widget.label_widget.configure(text_color=settings.ctm.LABELS_TEXT_DISABLED_COLOR) - if target_widget.desc_widget is not None: - target_widget.desc_widget.configure(text_color=settings.ctm.LABELS_TEXT_DISABLED_COLOR) - - def normalLabelsWidgets(target_widget): - target_widget.label_widget.configure(text_color=settings.ctm.LABELS_TEXT_COLOR) - if target_widget.desc_widget is not None: - target_widget.desc_widget.configure(text_color=settings.ctm.LABELS_DESC_TEXT_COLOR) - - - def disableOptionmenuWidget(target_widget): - target_widget.optionmenu_label_widget.configure(text_color=settings.ctm.LABELS_TEXT_DISABLED_COLOR) - target_widget.optionmenu_img_widget.configure(image=CTkImage(settings.image_file.ARROW_LEFT_DISABLED.rotate(90), size=settings.uism.SB__OPTIONMENU_IMG_SIZE)) - target_widget.optionmenu_box.unbindFunction() - target_widget.optionmenu_box.configure(cursor="") - - def normalOptionmenuWidget(target_widget): - target_widget.optionmenu_label_widget.configure(text_color=settings.ctm.LABELS_TEXT_COLOR) - target_widget.optionmenu_img_widget.configure(image=CTkImage(settings.image_file.ARROW_LEFT.rotate(90), size=settings.uism.SB__OPTIONMENU_IMG_SIZE)) - target_widget.optionmenu_box.bindFunction() - target_widget.optionmenu_box.configure(cursor="hand2") - - - for target_name in target_names: - match target_name: - case "sb__optionmenu_mic_host": - if status == "disabled": - target_widget = config_window.sb__widgets["sb__optionmenu_mic_host"] - disableLabelsWidgets(target_widget) - disableOptionmenuWidget(target_widget) - - case "sb__optionmenu_mic_device": - if status == "disabled": - target_widget = config_window.sb__widgets["sb__optionmenu_mic_device"] - disableLabelsWidgets(target_widget) - disableOptionmenuWidget(target_widget) - - case "sb__optionmenu_speaker_device": - if status == "disabled": - target_widget = config_window.sb__widgets["sb__optionmenu_speaker_device"] - disableLabelsWidgets(target_widget) - disableOptionmenuWidget(target_widget) - - case "sb__optionmenu_appearance_theme": - if status == "disabled": - target_widget = config_window.sb__widgets["sb__optionmenu_appearance_theme"] - disableLabelsWidgets(target_widget) - disableOptionmenuWidget(target_widget) - - case "sb__optionmenu_ctranslate2_weight_type": - target_widget = config_window.sb__widgets["sb__optionmenu_ctranslate2_weight_type"] - if status == "disabled": - disableOptionmenuWidget(target_widget) - elif status == "normal": - normalOptionmenuWidget(target_widget) - - - case "sb__switch_use_translation_feature": - target_widget = config_window.sb__widgets["sb__switch_use_translation_feature"] - if status == "disabled": - target_widget.switch_box.configure( - state="disabled", - fg_color=settings.ctm.SB__SWITCH_BOX_BG_DISABLED_COLOR, - progress_color=settings.ctm.SB__SWITCH_BOX_ACTIVE_BG_DISABLED_COLOR, - button_color=settings.ctm.SB__SWITCH_BOX_BUTTON_DISABLED_COLOR, - ) - elif status == "normal": - target_widget.switch_box.configure( - state="normal", - fg_color=settings.ctm.SB__SWITCH_BOX_BG_COLOR, - progress_color=settings.ctm.SB__SWITCH_BOX_ACTIVE_BG_COLOR, - button_color=settings.ctm.SB__SWITCH_BOX_BUTTON_COLOR, - ) - - case "sb__checkbox_enable_send_received_message_to_vrc": - if status == "disabled": - target_widget = config_window.sb__widgets["sb__checkbox_enable_send_received_message_to_vrc"] - disableLabelsWidgets(target_widget) - target_widget.checkbox.configure( - state="disabled", - border_color=settings.ctm.SB__CHECKBOX_BORDER_DISABLED_COLOR - ) - - case _: - raise ValueError(f"No matching case for target_name: {target_name}") - - - - config_window.update() \ No newline at end of file diff --git a/vrct_gui/_changeMainWindowWidgetsStatus.py b/vrct_gui/_changeMainWindowWidgetsStatus.py deleted file mode 100644 index 3b6eaf74..00000000 --- a/vrct_gui/_changeMainWindowWidgetsStatus.py +++ /dev/null @@ -1,170 +0,0 @@ -from customtkinter import CTkImage -lock_state_list=[] -def _changeMainWindowWidgetsStatus(vrct_gui, settings, view_variable, status, target_names:list, to_lock_state:bool=False, release_locked_state:bool=False): - global lock_state_list - if target_names == "All": - target_names = ["translation_switch", "transcription_send_switch", "transcription_receive_switch", "foreground_switch", "quick_language_settings", "config_button", "minimize_sidebar_button", "entry_message_box", "send_message_button"] - - if release_locked_state is True: - for item in target_names: - if item in lock_state_list: - lock_state_list.remove(item) - - for item in lock_state_list: - if item in target_names: - target_names.remove(item) - - - def update_switch_status( - widget_frame, - widget_label, - widget_switch_box, - widget_selected_mark, - widget_compact_mode_icon, - icon_name, - disabled_icon_name, - ): - - if status == "disabled": - widget_frame.configure(cursor="") - widget_label.configure(text_color=settings.ctm.SF__TEXT_DISABLED_COLOR) - widget_switch_box.configure(state="disabled", progress_color=settings.ctm.SF__SWITCH_BOX_DISABLE_BG_COLOR, button_color=settings.ctm.SF__SWITCH_BOX_BUTTON_DISABLED_COLOR) - widget_selected_mark.configure(fg_color=settings.ctm.SF__SELECTED_MARK_DISABLE_BG_COLOR) - icon_file = disabled_icon_name - elif status == "normal": - widget_frame.configure(cursor="hand2") - widget_label.configure(text_color=settings.ctm.LABELS_TEXT_COLOR) - widget_switch_box.configure(state="normal", progress_color=settings.ctm.SF__SWITCH_BOX_ACTIVE_BG_COLOR, button_color=settings.ctm.SF__SWITCH_BOX_BUTTON_COLOR) - widget_selected_mark.configure(fg_color=settings.ctm.SF__SELECTED_MARK_ACTIVE_BG_COLOR) - icon_file = icon_name - - image = CTkImage(icon_file, size=settings.uism.SF__COMPACT_MODE_IMAGE_SIZE) - widget_compact_mode_icon.configure(image=image) - - - - - for target_name in target_names: - match target_name: - case "translation_switch": - update_switch_status( - widget_frame=vrct_gui.translation_frame, - widget_label=vrct_gui.label_translation, - widget_switch_box=vrct_gui.translation_switch_box, - widget_selected_mark=vrct_gui.translation_selected_mark, - widget_compact_mode_icon=vrct_gui.translation_compact_mode_icon, - icon_name=settings.image_file.TRANSLATION_ICON, - disabled_icon_name=settings.image_file.TRANSLATION_ICON_DISABLED - ) - case "transcription_send_switch": - update_switch_status( - widget_frame=vrct_gui.transcription_send_frame, - widget_label=vrct_gui.label_transcription_send, - widget_switch_box=vrct_gui.transcription_send_switch_box, - widget_selected_mark=vrct_gui.transcription_send_selected_mark, - widget_compact_mode_icon=vrct_gui.transcription_send_compact_mode_icon, - icon_name=settings.image_file.MIC_ICON, - disabled_icon_name=settings.image_file.MIC_ICON_DISABLED - ) - case "transcription_receive_switch": - update_switch_status( - widget_frame=vrct_gui.transcription_receive_frame, - widget_label=vrct_gui.label_transcription_receive, - widget_switch_box=vrct_gui.transcription_receive_switch_box, - widget_selected_mark=vrct_gui.transcription_receive_selected_mark, - widget_compact_mode_icon=vrct_gui.transcription_receive_compact_mode_icon, - icon_name=settings.image_file.HEADPHONES_ICON, - disabled_icon_name=settings.image_file.HEADPHONES_ICON_DISABLED - ) - case "foreground_switch": - update_switch_status( - widget_frame=vrct_gui.foreground_frame, - widget_label=vrct_gui.label_foreground, - widget_switch_box=vrct_gui.foreground_switch_box, - widget_selected_mark=vrct_gui.foreground_selected_mark, - widget_compact_mode_icon=vrct_gui.foreground_compact_mode_icon, - icon_name=settings.image_file.FOREGROUND_ICON, - disabled_icon_name=settings.image_file.FOREGROUND_ICON_DISABLED - ) - - - - - - - case "quick_language_settings": - if status == "disabled": - vrct_gui.sls__container_title.configure(text_color=settings.ctm.SF__TEXT_DISABLED_COLOR) - vrct_gui.sls__title_text_your_language.configure(text_color=settings.ctm.SF__TEXT_DISABLED_COLOR) - vrct_gui.sls__title_text_target_language.configure(text_color=settings.ctm.SF__TEXT_DISABLED_COLOR) - if view_variable.IS_MAIN_WINDOW_SIDEBAR_COMPACT_MODE is False: - vrct_gui.current_active_preset_tab.children["!ctklabel"].configure(text_color=settings.ctm.SLS__PRESETS_TAB_ACTIVE_TEXT_COLOR_PASSIVE) - - - elif status == "normal": - vrct_gui.sls__container_title.configure(text_color=settings.ctm.LABELS_TEXT_COLOR) - vrct_gui.sls__title_text_your_language.configure(text_color=settings.ctm.LABELS_TEXT_COLOR) - vrct_gui.sls__title_text_target_language.configure(text_color=settings.ctm.LABELS_TEXT_COLOR) - if view_variable.IS_MAIN_WINDOW_SIDEBAR_COMPACT_MODE is False: - vrct_gui.current_active_preset_tab.children["!ctklabel"].configure(text_color=settings.ctm.SLS__PRESETS_TAB_ACTIVE_TEXT_COLOR) - vrct_gui.current_active_preset_tab.children["!ctklabel"].configure(text_color=settings.ctm.SLS__PRESETS_TAB_ACTIVE_TEXT_COLOR) - - - - case "config_button": - if status == "disabled": - vrct_gui.sidebar_config_button_wrapper.configure(cursor="") - vrct_gui.sidebar_config_button.configure( - image=CTkImage(settings.image_file.CONFIGURATION_ICON_DISABLED, size=settings.uism.SF__COMPACT_MODE_IMAGE_SIZE), - ) - elif status == "normal": - vrct_gui.sidebar_config_button_wrapper.configure(cursor="hand2") - vrct_gui.sidebar_config_button.configure( - image=CTkImage(settings.image_file.CONFIGURATION_ICON, size=settings.uism.SF__COMPACT_MODE_IMAGE_SIZE), - ) - - - case "minimize_sidebar_button": - MINIMIZE_SIDEBAR_IMAGE_SIZE = vrct_gui.minimize_sidebar_button__for_opening.cget("image").cget("size") - if status == "disabled": - vrct_gui.minimize_sidebar_button_container__for_opening.configure(cursor="") - vrct_gui.minimize_sidebar_button_container__for_closing.configure(cursor="") - - image_file__for_opening = CTkImage((settings.image_file.ARROW_LEFT_DISABLED).rotate(180), size=MINIMIZE_SIDEBAR_IMAGE_SIZE) - image_file__for_closing = CTkImage((settings.image_file.ARROW_LEFT_DISABLED), size=MINIMIZE_SIDEBAR_IMAGE_SIZE) - - elif status == "normal": - vrct_gui.minimize_sidebar_button_container__for_opening.configure(cursor="hand2") - vrct_gui.minimize_sidebar_button_container__for_closing.configure(cursor="hand2") - - image_file__for_opening = CTkImage((settings.image_file.ARROW_LEFT).rotate(180), size=MINIMIZE_SIDEBAR_IMAGE_SIZE) - image_file__for_closing = CTkImage((settings.image_file.ARROW_LEFT), size=MINIMIZE_SIDEBAR_IMAGE_SIZE) - vrct_gui.minimize_sidebar_button__for_opening.configure(image=image_file__for_opening) - vrct_gui.minimize_sidebar_button__for_closing.configure(image=image_file__for_closing) - - - case "entry_message_box": - if status == "disabled": - vrct_gui.entry_message_box.configure(state="disabled", text_color=settings.ctm.TEXTBOX_ENTRY_TEXT_DISABLED_COLOR) - view_variable.IS_ENTRY_MESSAGE_BOX_DISABLED = True - elif status == "normal": - vrct_gui.entry_message_box.configure(state="normal", text_color=settings.ctm.TEXTBOX_ENTRY_TEXT_COLOR) - view_variable.IS_ENTRY_MESSAGE_BOX_DISABLED = False - - - case "send_message_button": - if status == "disabled": - vrct_gui.main_send_message_button__disabled.grid() - elif status == "normal": - vrct_gui.main_send_message_button__disabled.grid_remove() - - case _: - raise ValueError(f"No matching case for target_name: {target_name}") - - - if to_lock_state is True: - for item in target_names: - if item not in lock_state_list: - lock_state_list.append(item) - - vrct_gui.update() \ No newline at end of file diff --git a/vrct_gui/config_window/ConfigWindow.py b/vrct_gui/config_window/ConfigWindow.py deleted file mode 100644 index 42272110..00000000 --- a/vrct_gui/config_window/ConfigWindow.py +++ /dev/null @@ -1,66 +0,0 @@ -from .widgets import createConfigWindowTitle, createSideMenuAndSettingsBoxContainers, createSettingBoxTopBar - - -from customtkinter import CTkToplevel, CTkFrame, CTkLabel, CTkFont - -from ..ui_utils import getImagePath, getLatestWidth -from utils import isEven - -class ConfigWindow(CTkToplevel): - def __init__(self, vrct_gui, settings, view_variable): - super().__init__() - self.withdraw() - - self.settings = settings - self._view_variable = view_variable - - # configure window - self.after(200, lambda: self.iconbitmap(getImagePath("vrct_logo_mark_black.ico"))) - self.geometry(f"{self.settings.uism.DEFAULT_WIDTH}x{self.settings.uism.DEFAULT_HEIGHT}") - - - self.configure(fg_color=self.settings.ctm.MAIN_BG_COLOR) - self.protocol("WM_DELETE_WINDOW", self._view_variable.CALLBACK_CLICKED_CLOSE_CONFIG_WINDOW_BUTTON) - - - self.title(self._view_variable.VAR_CONFIG_WINDOW_TITLE.get()) - # When the configuration window's compact mode is turned on, it will call `grid_remove()` on each widget appended to this array. In the opposite case, `grid()` will be called. - self.additional_widgets = [] - - self.sb__widgets = {} - - createConfigWindowTitle(config_window=self, settings=self.settings, view_variable=self._view_variable) - - createSettingBoxTopBar(config_window=self, settings=self.settings, view_variable=self._view_variable) - - createSideMenuAndSettingsBoxContainers(config_window=self, settings=self.settings, view_variable=self._view_variable) - - # for fixing 1px bug - l_width = getLatestWidth(self.side_menu_bg_container) - if isEven(l_width) is False: - self.side_menu_bg_container.grid_columnconfigure(0, weight=0, minsize=l_width+1) - - # for fixing 1px bug - # self.side_menu_bg_container.grid_rowconfigure(2, weight=1) - # sls__box_optionmenu_wrapper_fix_1px_bug = CTkFrame(self.side_menu_bg_container, corner_radius=0, width=0, height=0) - # sls__box_optionmenu_wrapper_fix_1px_bug.grid(row=3, column=0, sticky="sew") - - # for fixing 1px bug - l_width = getLatestWidth(self.side_menu_bg_container) - - - - # VRCT Now Version Label(Tmp) - version_label = CTkLabel( - self.side_menu_bg_container, - textvariable=self._view_variable.VAR_VERSION, - height=0, - corner_radius=0, - font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.NOW_VERSION_FONT_SIZE, weight="normal"), - anchor="w", - text_color=self.settings.ctm.NOW_VERSION_TEXT_COLOR, - ) - version_label.place(relx=0.05, rely=0.99, anchor="sw") - - - self.bind_all("", lambda event: event.widget.focus_set(), "+") \ No newline at end of file diff --git a/vrct_gui/config_window/__init__.py b/vrct_gui/config_window/__init__.py deleted file mode 100644 index c6dbe941..00000000 --- a/vrct_gui/config_window/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .ConfigWindow import ConfigWindow \ No newline at end of file diff --git a/vrct_gui/config_window/widgets/__init__.py b/vrct_gui/config_window/widgets/__init__.py deleted file mode 100644 index e3651955..00000000 --- a/vrct_gui/config_window/widgets/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from .createConfigWindowTitle import createConfigWindowTitle -from .createSettingBoxTopBar import createSettingBoxTopBar - -from .createSideMenuAndSettingsBoxContainers import createSideMenuAndSettingsBoxContainers \ No newline at end of file diff --git a/vrct_gui/config_window/widgets/createConfigWindowTitle.py b/vrct_gui/config_window/widgets/createConfigWindowTitle.py deleted file mode 100644 index 4db6b4f4..00000000 --- a/vrct_gui/config_window/widgets/createConfigWindowTitle.py +++ /dev/null @@ -1,36 +0,0 @@ -from customtkinter import CTkFont, CTkFrame, CTkLabel, CTkImage - -def createConfigWindowTitle(config_window, settings, view_variable): - - config_window.grid_columnconfigure(0, weight=0, minsize=settings.uism.TOP_BAR_SIDE_AREA_MIN_WIDTH) - config_window.grid_rowconfigure(0, weight=0, minsize=settings.uism.TOP_BAR__MIN_HEIGHT) - config_window.side_menu_config_window_title_logo_frame = CTkFrame(config_window, corner_radius=0, fg_color=settings.ctm.TOP_BAR_BG_COLOR, width=0, height=0) - config_window.side_menu_config_window_title_logo_frame.grid(row=0, column=0, sticky="nsew") - - config_window.side_menu_config_window_title_logo_frame.grid_rowconfigure(0,weight=1) - config_window.side_menu_config_window_title_logo_frame.grid_columnconfigure(0,weight=1) - config_window.side_menu_config_window_title_logo_wrapper = CTkFrame(config_window.side_menu_config_window_title_logo_frame, corner_radius=0, fg_color=settings.ctm.TOP_BAR_BG_COLOR, width=0, height=0) - config_window.side_menu_config_window_title_logo_wrapper.grid(row=0, column=0, padx=settings.uism.TOP_BAR_SIDE__TITLE_PADX, pady=settings.uism.TOP_BAR__IPADY, sticky="nsew") - - - - - config_window.side_menu_config_window_title_logo_wrapper.grid_rowconfigure(0,weight=1) - config_window.side_menu_config_window_title = CTkLabel( - config_window.side_menu_config_window_title_logo_frame, - textvariable=view_variable.VAR_CONFIG_WINDOW_TITLE, - height=0, - anchor="w", - font=CTkFont(family=settings.FONT_FAMILY, size=settings.uism.TOP_BAR_SIDE__CONFIG_TITLE_FONT_SIZE, weight="bold"), - text_color=settings.ctm.LABELS_TEXT_COLOR, - ) - config_window.side_menu_config_window_title.place(relx=0.255, rely=0.5, anchor="w") - - config_window.side_menu_config_window_title_logo = CTkLabel( - config_window.side_menu_config_window_title_logo_frame, - text=None, - height=0, - anchor="w", - image=CTkImage(settings.image_file.VRCT_LOGO_MARK, size=settings.uism.TOP_BAR_SIDE__CONFIG_LOGO_MARK_SIZE), - ) - config_window.side_menu_config_window_title_logo.place(relx=0.08, rely=0.58, anchor="w") diff --git a/vrct_gui/config_window/widgets/createSettingBoxTopBar/__init__.py b/vrct_gui/config_window/widgets/createSettingBoxTopBar/__init__.py deleted file mode 100644 index b5be1139..00000000 --- a/vrct_gui/config_window/widgets/createSettingBoxTopBar/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .createSettingBoxTopBar import createSettingBoxTopBar \ No newline at end of file diff --git a/vrct_gui/config_window/widgets/createSettingBoxTopBar/_createRestartButton.py b/vrct_gui/config_window/widgets/createSettingBoxTopBar/_createRestartButton.py deleted file mode 100644 index 91e08761..00000000 --- a/vrct_gui/config_window/widgets/createSettingBoxTopBar/_createRestartButton.py +++ /dev/null @@ -1,37 +0,0 @@ -from customtkinter import CTkFont, CTkFrame, CTkLabel -from utils import callFunctionIfCallable -from ....ui_utils import bindButtonFunctionAndColor - -def _createRestartButton(parent_widget, config_window, settings, view_variable, column_num): - - parent_widget.grid_columnconfigure(0, weight=1) - config_window.restart_button_container = CTkFrame(parent_widget, corner_radius=settings.uism.RESTART_BUTTON_CORNER_RADIUS, fg_color=settings.ctm.RESTART_BUTTON_BG_COLOR, width=0, height=0, cursor="hand2") - config_window.restart_button_container.grid(row=0, column=column_num, padx=settings.uism.RESTART_BUTTON_PADX, sticky="ew") - - - config_window.restart_button_container.grid_rowconfigure(0, weight=1) - config_window.restart_button_label = CTkLabel( - config_window.restart_button_container, - height=0, - textvariable=view_variable.VAR_CONFIG_WINDOW_RESTART_BUTTON_LABEL, - anchor="w", - font=CTkFont(family=settings.FONT_FAMILY, size=settings.uism.RESTART_BUTTON_LABEL_FONT_SIZE, weight="normal"), - text_color=settings.ctm.LABELS_TEXT_COLOR - ) - config_window.restart_button_label.grid(row=0, column=0, padx=settings.uism.RESTART_BUTTON_IPADX, pady=settings.uism.RESTART_BUTTON_IPADY) - - - - bindButtonFunctionAndColor( - target_widgets=[ - config_window.restart_button_container, - config_window.restart_button_label, - ], - enter_color=settings.ctm.RESTART_BUTTON_HOVERED_BG_COLOR, - leave_color=settings.ctm.RESTART_BUTTON_BG_COLOR, - clicked_color=settings.ctm.RESTART_BUTTON_CLICKED_BG_COLOR, - buttonReleasedFunction=lambda _e: callFunctionIfCallable(view_variable.CALLBACK_RESTART_SOFTWARE), - ) - - - config_window.restart_button_container.grid_remove() diff --git a/vrct_gui/config_window/widgets/createSettingBoxTopBar/_createSettingBoxCompactModeButton.py b/vrct_gui/config_window/widgets/createSettingBoxTopBar/_createSettingBoxCompactModeButton.py deleted file mode 100644 index 80a5d152..00000000 --- a/vrct_gui/config_window/widgets/createSettingBoxTopBar/_createSettingBoxCompactModeButton.py +++ /dev/null @@ -1,66 +0,0 @@ -from customtkinter import CTkFont, CTkFrame, CTkLabel, CTkSwitch - -def _createSettingBoxCompactModeButton(parent_widget, config_window, settings, view_variable, column_num): - - def switchConfigWindowCompactMode(): - if config_window.setting_box_compact_mode_switch_box.get() is True: - if callable(view_variable.CALLBACK_ENABLE_CONFIG_WINDOW_COMPACT_MODE) is True: - view_variable.CALLBACK_ENABLE_CONFIG_WINDOW_COMPACT_MODE() - else: - if callable(view_variable.CALLBACK_DISABLE_CONFIG_WINDOW_COMPACT_MODE) is True: - view_variable.CALLBACK_DISABLE_CONFIG_WINDOW_COMPACT_MODE() - - - - config_window.setting_box_compact_mode_button_container = CTkFrame(parent_widget, corner_radius=0, fg_color=settings.ctm.TOP_BAR_BG_COLOR, width=0, height=0) - config_window.setting_box_compact_mode_button_container.grid(row=0, column=column_num, padx=settings.uism.COMPACT_MODE_PADX, sticky="nse") - - - - config_window.setting_box_compact_mode_button_container.grid_rowconfigure((0,2), weight=1) - config_window.setting_box_compact_mode_button_container = CTkFrame(config_window.setting_box_compact_mode_button_container, corner_radius=0, fg_color=settings.ctm.TOP_BAR_BG_COLOR, width=0, height=0) - config_window.setting_box_compact_mode_button_container.grid(row=1, column=0, sticky="nsew") - - - config_window.setting_box_compact_mode_button_container.grid_rowconfigure(0, weight=1) - config_window.setting_box_compact_mode_label = CTkLabel( - config_window.setting_box_compact_mode_button_container, - height=0, - # text="Compact Mode", - textvariable=view_variable.VAR_CONFIG_WINDOW_COMPACT_MODE_LABEL, - anchor="w", - font=CTkFont(family=settings.FONT_FAMILY, size=settings.uism.COMPACT_MODE_LABEL_FONT_SIZE, weight="normal"), - text_color=settings.ctm.LABELS_TEXT_COLOR - ) - config_window.setting_box_compact_mode_label.grid(row=0, column=0, padx=settings.uism.COMPACT_MODE_LABEL_PADX) - - - - - - - - - config_window.setting_box_compact_mode_switch_frame = CTkFrame(config_window.setting_box_compact_mode_button_container, corner_radius=0, width=0, height=0, fg_color=settings.ctm.TOP_BAR_BG_COLOR) - config_window.setting_box_compact_mode_switch_frame.grid(row=0, column=1, padx=0, sticky="e") - - config_window.setting_box_compact_mode_switch_box = CTkSwitch( - config_window.setting_box_compact_mode_switch_frame, - text=None, - height=0, - width=0, - # corner_radius=0, - border_width=0, - switch_width=settings.uism.COMPACT_MODE_SWITCH_WIDTH, - switch_height=settings.uism.COMPACT_MODE_SWITCH_HEIGHT, - onvalue=True, - offvalue=False, - command=switchConfigWindowCompactMode, - fg_color=settings.ctm.COMPACT_MODE_SWITCH_BOX_BG_COLOR, - # bg_color="red", - progress_color=settings.ctm.COMPACT_MODE_SWITCH_BOX_ACTIVE_BG_COLOR, - button_color=settings.ctm.COMPACT_MODE_SWITCH_BOX_BUTTON_COLOR, - button_hover_color=settings.ctm.COMPACT_MODE_SWITCH_BOX_BUTTON_HOVERED_COLOR, - ) - - config_window.setting_box_compact_mode_switch_box.grid(row=0, column=0) \ No newline at end of file diff --git a/vrct_gui/config_window/widgets/createSettingBoxTopBar/_createSettingBoxTitle.py b/vrct_gui/config_window/widgets/createSettingBoxTopBar/_createSettingBoxTitle.py deleted file mode 100644 index 199a12fb..00000000 --- a/vrct_gui/config_window/widgets/createSettingBoxTopBar/_createSettingBoxTitle.py +++ /dev/null @@ -1,19 +0,0 @@ -from customtkinter import CTkFont, CTkFrame, CTkLabel - -def _createSettingBoxTitle(parent_widget, config_window, settings, view_variable, column_num): - - parent_widget.grid_columnconfigure(0, weight=1) - config_window.main_current_active_config_title_container = CTkFrame(parent_widget, corner_radius=0, fg_color=settings.ctm.TOP_BAR_BG_COLOR, width=0, height=0) - config_window.main_current_active_config_title_container.grid(row=0, column=column_num, sticky="nsew") - - - config_window.main_current_active_config_title_container.grid_rowconfigure(0, weight=1) - config_window.main_current_active_config_title = CTkLabel( - config_window.main_current_active_config_title_container, - height=0, - textvariable=view_variable.VAR_CURRENT_ACTIVE_CONFIG_TITLE, - anchor="w", - font=CTkFont(family=settings.FONT_FAMILY, size=settings.uism.TOP_BAR_MAIN__TITLE_FONT_SIZE, weight="bold"), - text_color=settings.ctm.LABELS_TEXT_COLOR - ) - config_window.main_current_active_config_title.grid(row=0, column=0, padx=0, pady=settings.uism.TOP_BAR__IPADY) \ No newline at end of file diff --git a/vrct_gui/config_window/widgets/createSettingBoxTopBar/createSettingBoxTopBar.py b/vrct_gui/config_window/widgets/createSettingBoxTopBar/createSettingBoxTopBar.py deleted file mode 100644 index 12a0403c..00000000 --- a/vrct_gui/config_window/widgets/createSettingBoxTopBar/createSettingBoxTopBar.py +++ /dev/null @@ -1,40 +0,0 @@ -from customtkinter import CTkFrame - -from ._createSettingBoxTitle import _createSettingBoxTitle -from ._createRestartButton import _createRestartButton -from ._createSettingBoxCompactModeButton import _createSettingBoxCompactModeButton - -from ....ui_utils import getLatestHeight -from utils import isEven - -def createSettingBoxTopBar(config_window, settings, view_variable): - - config_window.grid_columnconfigure(1, weight=1) - config_window.setting_box_top_bar = CTkFrame(config_window, corner_radius=0, fg_color=settings.ctm.TOP_BAR_BG_COLOR, width=0, height=0) - config_window.setting_box_top_bar.grid(row=0, column=1, sticky="nsew") - - - config_window.setting_box_top_bar.grid_rowconfigure(0, weight=1) - - column_num=0 - _createSettingBoxTitle(parent_widget=config_window.setting_box_top_bar, config_window=config_window, settings=settings, view_variable=view_variable, column_num=column_num) - column_num+=1 - - config_window.setting_box_top_bar.grid_columnconfigure(column_num, weight=1) - column_num+=1 - - # Restart Button(Tmp) - _createRestartButton(parent_widget=config_window.setting_box_top_bar, config_window=config_window, settings=settings, view_variable=view_variable, column_num=column_num) - column_num+=1 - - _createSettingBoxCompactModeButton(parent_widget=config_window.setting_box_top_bar, config_window=config_window, settings=settings, view_variable=view_variable, column_num=column_num) - column_num+=1 - - - l_height = getLatestHeight(config_window.side_menu_config_window_title_logo_frame) - if isEven(l_height) is False: - config_window.grid_rowconfigure(0, weight=0, minsize=l_height+1) - - # for fixing 1px bug - setting_box_top_bar_fix_1px_bug = CTkFrame(config_window.setting_box_top_bar, corner_radius=0, width=0, height=0) - setting_box_top_bar_fix_1px_bug.grid(row=0, column=column_num, sticky="nse") \ No newline at end of file diff --git a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/__init__.py b/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/__init__.py deleted file mode 100644 index 245472c9..00000000 --- a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .createSideMenuAndSettingsBoxContainers import createSideMenuAndSettingsBoxContainers \ No newline at end of file diff --git a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/_addConfigSideMenuItem.py b/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/_addConfigSideMenuItem.py deleted file mode 100644 index 39d83009..00000000 --- a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/_addConfigSideMenuItem.py +++ /dev/null @@ -1,107 +0,0 @@ -from customtkinter import CTkFont, CTkFrame, CTkLabel - -from ....ui_utils import bindEnterAndLeaveColor, bindButtonPressColor, bindButtonReleaseFunction, switchActiveTabAndPassiveTab, switchTabsColor - -from utils import callFunctionIfCallable - - -def _addConfigSideMenuItem(config_window, settings, view_variable, side_menu_settings, side_menu_row, all_side_menu_tab_attr_name): - - - def switchActiveAndPassiveSettingBoxContainerTabsColor(target_active_widget): - - setting_box_container_tabs = [] - for tab_attr_name in all_side_menu_tab_attr_name: - tab_attr = getattr(config_window, tab_attr_name) - setting_box_container_tabs.append(tab_attr) - - switchTabsColor( - target_widget=target_active_widget, - tab_buttons=setting_box_container_tabs, - active_bg_color=settings.ctm.SIDE_MENU_LABELS_BG_COLOR, - active_text_color=settings.ctm.SIDE_MENU_LABELS_SELECTED_TEXT_COLOR, - passive_bg_color=settings.ctm.SIDE_MENU_LABELS_BG_COLOR, - passive_text_color=settings.ctm.LABELS_TEXT_COLOR - ) - - for setting_box_container_tab in setting_box_container_tabs: - setting_box_container_tab.children["!ctkframe"].place(relx=-1) - - target_active_widget.children["!ctkframe"].place(relx=0) - - - - - def switchSettingBoxContainerTabFunction(target_active_widget): - switchActiveAndPassiveSettingBoxContainerTabsColor(target_active_widget) - switchActiveTabAndPassiveTab(target_active_widget, config_window.current_active_side_menu_tab, config_window.current_active_side_menu_tab.passive_function, settings.ctm.SIDE_MENU_LABELS_HOVERED_BG_COLOR, settings.ctm.SIDE_MENU_LABELS_CLICKED_BG_COLOR, settings.ctm.SIDE_MENU_LABELS_BG_COLOR) - config_window.current_active_side_menu_tab = target_active_widget - - - - - - - def switchSettingBoxContainer(target_setting_box_container_attr_name): - config_window.current_active_setting_box_container.grid_remove() - config_window.current_active_setting_box_container = getattr(config_window, target_setting_box_container_attr_name) - config_window.current_active_setting_box_container.grid() - - # Move to the top position when the setting box is switched. - config_window.main_setting_box_scrollable_container._parent_canvas.yview_moveto("0") - - - def switchToTargetSettingBoxContainer(textvariable, target_active_tab_widget_attr_name, target_setting_box_container_attr_name): - view_variable.VAR_CURRENT_ACTIVE_CONFIG_TITLE.set(textvariable.get()) - target_active_tab_widget = getattr(config_window, target_active_tab_widget_attr_name) - switchSettingBoxContainerTabFunction(target_active_tab_widget) - switchSettingBoxContainer(target_setting_box_container_attr_name) - callFunctionIfCallable(view_variable.CALLBACK_SELECTED_SETTING_BOX_TAB, target_active_tab_widget_attr_name) - - - - - - side_menu_tab_attr_name = side_menu_settings["side_menu_tab_attr_name"] - label_attr_name = side_menu_settings["label_attr_name"] - selected_mark_attr_name = side_menu_settings["selected_mark_attr_name"] - textvariable = side_menu_settings["textvariable"] - setting_box_container_attr_name = side_menu_settings["setting_box_container_settings"]["setting_box_container_attr_name"] - command = lambda _e: switchToTargetSettingBoxContainer( - textvariable=textvariable, - target_active_tab_widget_attr_name=side_menu_tab_attr_name, - target_setting_box_container_attr_name=setting_box_container_attr_name, - ) - - - # Side menu - frame_widget = CTkFrame(config_window.side_menu_container, corner_radius=0, fg_color=settings.ctm.SIDE_MENU_LABELS_BG_COLOR, cursor="hand2", width=0, height=0) - setattr(config_window, side_menu_tab_attr_name, frame_widget) - - frame_widget.grid(row=side_menu_row, column=0, pady=(0,1), sticky="ew") - frame_widget.grid_columnconfigure(0, weight=1) - - label_widget = CTkLabel( - frame_widget, - textvariable=textvariable, - height=0, - corner_radius=0, - font=CTkFont(family=settings.FONT_FAMILY, size=settings.uism.SIDE_MENU_LABELS_FONT_SIZE, weight="normal"), - anchor="w", - text_color=settings.ctm.LABELS_TEXT_COLOR, - ) - setattr(config_window, label_attr_name, label_widget) - - selected_mark_widget = CTkFrame(frame_widget, corner_radius=0, fg_color=settings.ctm.SIDE_MENU_SELECTED_MARK_ACTIVE_BG_COLOR, width=3, height=0) - setattr(config_window, selected_mark_attr_name, selected_mark_widget) - - - # Arrange - selected_mark_widget.place(relx=-1, rely=0.5, relheight=1, anchor="w") - label_widget.grid(row=0, column=0, padx=settings.uism.SIDE_MENU_LABELS_IPADX, pady=settings.uism.SIDE_MENU_LABELS_IPADY, sticky="ew") - - bindEnterAndLeaveColor([frame_widget, label_widget], settings.ctm.SIDE_MENU_LABELS_HOVERED_BG_COLOR, settings.ctm.SIDE_MENU_LABELS_BG_COLOR) - bindButtonPressColor([frame_widget, label_widget], settings.ctm.SIDE_MENU_LABELS_CLICKED_BG_COLOR, settings.ctm.SIDE_MENU_LABELS_BG_COLOR) - - frame_widget.passive_function = command - bindButtonReleaseFunction([frame_widget, label_widget], command) diff --git a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/_createSettingBoxContainer.py b/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/_createSettingBoxContainer.py deleted file mode 100644 index a140ecc3..00000000 --- a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/_createSettingBoxContainer.py +++ /dev/null @@ -1,68 +0,0 @@ -from customtkinter import CTkFont, CTkFrame, CTkLabel - - -def _createSettingBoxContainer(config_window, settings, view_variable, setting_box_container_settings, bottom_margin): - - - def createSectionTitle(container_widget, var_section_title): - - setting_box_wrapper_section_title = CTkLabel( - container_widget, - textvariable=var_section_title, - anchor="w", - height=0, - font=CTkFont(family=settings.FONT_FAMILY, size=settings.uism.SB__SECTION_TITLE_FONT_SIZE, weight="normal"), - text_color=settings.ctm.LABELS_TEXT_COLOR - ) - setting_box_wrapper_section_title.place(relx=0, rely=0) - - return container_widget - - - # Setting box container - setting_box_container_widget = CTkFrame(config_window.main_setting_box_bg_wrapper, corner_radius=0, fg_color=settings.ctm.MAIN_BG_COLOR, width=0, height=0) - setattr(config_window, setting_box_container_settings["setting_box_container_attr_name"], setting_box_container_widget) - setting_box_container_widget.grid(row=0, pady=bottom_margin) - setting_box_container_widget.grid_remove() - - - - setting_box_row=0 - for setting_box_setting in setting_box_container_settings["setting_boxes"]: - # Top-Padding that can be container the section title - if setting_box_setting.get("about_vrct", False) is True: - setting_box_top_padding = CTkFrame(setting_box_container_widget, corner_radius=0, fg_color=settings.ctm.ABOUT_VRCT_BG, width=0, height=settings.uism.ABOUT_VRCT_SB__TOP_PADY) - setting_box_wrapper = CTkFrame(setting_box_container_widget, fg_color=settings.ctm.MAIN_BG_COLOR, corner_radius=0, width=0, height=0) - else: - setting_box_top_padding = CTkFrame(setting_box_container_widget, corner_radius=0, fg_color=settings.ctm.MAIN_BG_COLOR, width=0, height=settings.uism.SB__TOP_PADY) - setting_box_wrapper = CTkFrame(setting_box_container_widget, fg_color=settings.ctm.SB__WRAPPER_BG_COLOR, corner_radius=0, width=0, height=0) - - setting_box_top_padding.grid(row=setting_box_row, column=0, sticky="ew", padx=0, pady=0) - setting_box_top_padding.grid_columnconfigure(0, weight=1) - setting_box_row+=1 - - if setting_box_setting["var_section_title"] is not None: - setting_box_wrapper_section_title = CTkLabel( - setting_box_top_padding, - textvariable=setting_box_setting["var_section_title"], - anchor="w", - height=0, - font=CTkFont(family=settings.FONT_FAMILY, size=settings.uism.SB__SECTION_TITLE_FONT_SIZE, weight="normal"), - text_color=settings.ctm.LABELS_TEXT_COLOR - ) - setting_box_wrapper_section_title.place(relx=0, rely=0.4, anchor="nw") - - - setting_box_wrapper.grid(row=setting_box_row, column=0, sticky="ew") - setting_box_wrapper.grid_columnconfigure(0, weight=1) - setting_box_row+=1 - - - if setting_box_setting["setting_box"] is not None: - setting_box_setting["setting_box"]( - setting_box_wrapper=setting_box_wrapper, - config_window=config_window, - settings=settings, - view_variable=view_variable, - ) - diff --git a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/createSideMenuAndSettingsBoxContainers.py b/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/createSideMenuAndSettingsBoxContainers.py deleted file mode 100644 index 85e2d20e..00000000 --- a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/createSideMenuAndSettingsBoxContainers.py +++ /dev/null @@ -1,213 +0,0 @@ -from customtkinter import CTkFrame - -from ....ui_utils import setDefaultActiveTab, applyUiScalingAndFixTheBugScrollBar, CustomizedCTkScrollableFrame - -from ._addConfigSideMenuItem import _addConfigSideMenuItem -from ._createSettingBoxContainer import _createSettingBoxContainer - - -from .setting_box_containers.setting_box_appearance import createSettingBox_Appearance -from .setting_box_containers.setting_box_transcription import createSettingBox_Mic, createSettingBox_Speaker, createSettingBox_InternalModel -from .setting_box_containers.setting_box_others import createSettingBox_Others, createSettingBox_Others_SendMessageFormats, createSettingBox_Others_ReceivedMessageFormats, createSettingBox_Others_Additional -from .setting_box_containers.setting_box_advanced_settings import createSettingBox_AdvancedSettings -from .setting_box_containers.setting_box_translation import createSettingBox_Translation -from .setting_box_containers.setting_box_vr import createSettingBox_Vr - -from .setting_box_containers.setting_box_about_vrct import createSettingBox_AboutVrct - - -def createSideMenuAndSettingsBoxContainers(config_window, settings, view_variable): - - # Main container - config_window.main_bg_container = CTkFrame(config_window, corner_radius=0, fg_color=settings.ctm.MAIN_BG_COLOR, width=0, height=0) - config_window.main_bg_container.grid(row=1, column=1, sticky="nsew") - - config_window.main_bg_container.grid_columnconfigure(0, weight=1) - config_window.main_bg_container.grid_rowconfigure(0, weight=0) - - - - - # Side menu Base - config_window.grid_rowconfigure(1, weight=1) - config_window.side_menu_bg_container = CTkFrame(config_window, corner_radius=0, fg_color=settings.ctm.SIDE_MENU_BG_COLOR, width=0, height=0) - config_window.side_menu_bg_container.grid(row=1, column=0, sticky="nsew") - config_window.side_menu_bg_container.grid_columnconfigure(0, weight=1) - config_window.side_menu_bg_container.grid_rowconfigure(0, weight=1) - config_window.side_menu_container = CTkFrame(config_window.side_menu_bg_container, corner_radius=0, fg_color=settings.ctm.SIDE_MENU_LABELS_BG_FOR_FAKE_BORDER_COLOR, width=0, height=0) - config_window.side_menu_container.grid(row=0, column=0, padx=settings.uism.TOP_BAR_SIDE__TITLE_PADX, pady=settings.uism.SIDE_MENU_PADY, sticky="nsew") - - - - # Setting box container - config_window.main_bg_container.grid_rowconfigure(1, weight=1) - config_window.main_setting_box_scrollable_container = CustomizedCTkScrollableFrame(config_window.main_bg_container, corner_radius=0, fg_color=settings.ctm.MAIN_BG_COLOR) - config_window.main_setting_box_scrollable_container.grid(row=1, column=0, sticky="nsew") - - applyUiScalingAndFixTheBugScrollBar( - scrollbar_widget=config_window.main_setting_box_scrollable_container, - padx=settings.uism.SCROLLBAR_IPADX, - width=settings.uism.SCROLLBAR_WIDTH, - ) - - - config_window.main_setting_box_bg_wrapper = CTkFrame(config_window.main_setting_box_scrollable_container, corner_radius=0, width=0, height=0, fg_color=settings.ctm.MAIN_BG_COLOR) - config_window.main_setting_box_bg_wrapper.grid(row=0, column=0, pady=0, sticky="n") - - - - side_menu_and_setting_box_containers_settings = [ - { - "side_menu_tab_attr_name": "side_menu_tab_appearance", - "label_attr_name": "label_appearance", - "selected_mark_attr_name": "selected_mark_appearance", - "textvariable": view_variable.VAR_SIDE_MENU_LABEL_APPEARANCE, - "setting_box_container_settings": { - "setting_box_container_attr_name": "setting_box_container_appearance", - "setting_boxes": [ - { "var_section_title": None, "setting_box": createSettingBox_Appearance }, - ] - }, - }, - { - "side_menu_tab_attr_name": "side_menu_tab_translation", - "label_attr_name": "label_translation", - "selected_mark_attr_name": "selected_mark_translation", - "textvariable": view_variable.VAR_SIDE_MENU_LABEL_TRANSLATION, - "setting_box_container_settings": { - "setting_box_container_attr_name": "setting_box_container_translation", - "setting_boxes": [ - { "var_section_title": None, "setting_box": createSettingBox_Translation }, - ] - }, - }, - { - "side_menu_tab_attr_name": "side_menu_tab_transcription", - "label_attr_name": "label_transcription", - "selected_mark_attr_name": "selected_mark_transcription", - "textvariable": view_variable.VAR_SIDE_MENU_LABEL_TRANSCRIPTION, - "setting_box_container_settings": { - "setting_box_container_attr_name": "setting_box_container_transcription", - "setting_boxes": [ - { - "var_section_title": view_variable.VAR_SECOND_TITLE_TRANSCRIPTION_MIC, - "setting_box": createSettingBox_Mic - }, - { - "var_section_title": view_variable.VAR_SECOND_TITLE_TRANSCRIPTION_SPEAKER, - "setting_box": createSettingBox_Speaker - }, - { - "var_section_title": view_variable.VAR_SECOND_TITLE_TRANSCRIPTION_INTERNAL_MODEL, - "setting_box": createSettingBox_InternalModel - }, - ] - }, - }, - { - "side_menu_tab_attr_name": "side_menu_tab_vr", - "label_attr_name": "label_vr", - "selected_mark_attr_name": "selected_mark_vr", - "textvariable": view_variable.VAR_SIDE_MENU_LABEL_VR, - "setting_box_container_settings": { - "setting_box_container_attr_name": "setting_box_container_vr", - "setting_boxes": [ - { - "var_section_title": None, - "setting_box": createSettingBox_Vr - } - ] - }, - }, - { - "side_menu_tab_attr_name": "side_menu_tab_others", - "label_attr_name": "label_others", - "selected_mark_attr_name": "selected_mark_others", - "textvariable": view_variable.VAR_SIDE_MENU_LABEL_OTHERS, - "setting_box_container_settings": { - "setting_box_container_attr_name": "setting_box_container_others", - "setting_boxes": [ - { "var_section_title": None, "setting_box": createSettingBox_Others }, - { "var_section_title": view_variable.VAR_SECOND_TITLE_OTHERS_SEND_MESSAGE_FORMATS, "setting_box": createSettingBox_Others_SendMessageFormats }, - { "var_section_title": view_variable.VAR_SECOND_TITLE_OTHERS_RECEIVED_MESSAGE_FORMATS, "setting_box": createSettingBox_Others_ReceivedMessageFormats }, - { "var_section_title": view_variable.VAR_SECOND_TITLE_OTHERS_SPEAKER2CHATBOX, "setting_box": createSettingBox_Others_Additional }, - ] - }, - }, - { - "side_menu_tab_attr_name": "side_menu_tab_advanced", - "label_attr_name": "label_advanced", - "selected_mark_attr_name": "selected_mark_advanced", - "textvariable": view_variable.VAR_SIDE_MENU_LABEL_ADVANCED_SETTINGS, - "setting_box_container_settings": { - "setting_box_container_attr_name": "setting_box_container_advanced", - "setting_boxes": [ - { "var_section_title": None, "setting_box": createSettingBox_AdvancedSettings }, - ] - }, - }, - - # About VRCT. It is separated from the others. - { - "side_menu_tab_attr_name": "side_menu_tab_about_vrct", - "label_attr_name": "label_about_vrct", - "selected_mark_attr_name": "selected_mark_about_vrct", - "textvariable": view_variable.VAR_SIDE_MENU_LABEL_ABOUT_VRCT, - "setting_box_container_settings": { - "setting_box_container_attr_name": "setting_box_container_about_vrct", - "setting_boxes": [ - { "var_section_title": None, "setting_box": createSettingBox_AboutVrct, "about_vrct": True }, - ] - }, - }, - ] - SEPARATE_ROW_COUNT=1 # It's just count the row and separate from below. - SEPARATE_ROW_NUMBER = len(side_menu_and_setting_box_containers_settings) - SEPARATE_ROW_COUNT - - all_side_menu_tab_attr_name = [item["side_menu_tab_attr_name"] for item in side_menu_and_setting_box_containers_settings] - - side_menu_row=0 - for sm_and_sbc_setting in side_menu_and_setting_box_containers_settings: - - if side_menu_row == SEPARATE_ROW_NUMBER: - side_menu_separator = CTkFrame(config_window.side_menu_container, corner_radius=0, fg_color=settings.ctm.SIDE_MENU_LABELS_BG_COLOR, width=0, height=0) - config_window.side_menu_container.grid_rowconfigure(side_menu_row, weight=1, minsize=settings.uism.SIDE_MENU_LABELS_SEPARATE_MIN_HEIGHT) - side_menu_separator.grid(row=side_menu_row, column=0, sticky="nsew") - side_menu_row+=1 - - - _addConfigSideMenuItem( - config_window=config_window, - settings=settings, - view_variable=view_variable, - side_menu_settings=sm_and_sbc_setting, - side_menu_row=side_menu_row, - all_side_menu_tab_attr_name=all_side_menu_tab_attr_name, - ) - side_menu_row+=1 - - - bottom_margin = 0 if sm_and_sbc_setting["setting_box_container_settings"]["setting_box_container_attr_name"] == "setting_box_container_about_vrct" else settings.uism.SB__BOTTOM_MARGIN - _createSettingBoxContainer( - config_window=config_window, - settings=settings, - view_variable=view_variable, - setting_box_container_settings=sm_and_sbc_setting["setting_box_container_settings"], - bottom_margin=bottom_margin, - ) - - - if sm_and_sbc_setting["side_menu_tab_attr_name"] == view_variable.ACTIVE_SETTING_BOX_TAB_ATTR_NAME: - # Set default active side menu tab - view_variable.VAR_CURRENT_ACTIVE_CONFIG_TITLE.set(sm_and_sbc_setting["textvariable"].get()) - config_window.current_active_side_menu_tab = getattr(config_window, sm_and_sbc_setting["side_menu_tab_attr_name"]) - setDefaultActiveTab( - active_tab_widget=config_window.current_active_side_menu_tab, - active_bg_color=settings.ctm.SIDE_MENU_LABELS_BG_COLOR, - active_text_color=settings.ctm.SIDE_MENU_LABELS_SELECTED_TEXT_COLOR - ) - config_window.current_active_side_menu_tab.children["!ctkframe"].place(relx=0) - - # Set default active setting box container - config_window.current_active_setting_box_container = getattr(config_window, sm_and_sbc_setting["setting_box_container_settings"]["setting_box_container_attr_name"]) - config_window.current_active_setting_box_container.grid() \ No newline at end of file diff --git a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/_SettingBoxGenerator.py b/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/_SettingBoxGenerator.py deleted file mode 100644 index 724ccfa5..00000000 --- a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/_SettingBoxGenerator.py +++ /dev/null @@ -1,1448 +0,0 @@ -from functools import partial -from types import SimpleNamespace -from typing import Union - -from customtkinter import CTkFont, CTkFrame, CTkLabel, CTkEntry, CTkSlider, CTkSwitch, CTkCheckBox, CTkProgressBar, CTkImage, CTkRadioButton -from CTkToolTip import * - -from vrct_gui.ui_utils import createButtonWithImage, getLatestWidth, createOptionMenuBox, getLatestHeight, bindButtonFunctionAndColor, bindEnterAndLeaveFunction, bindButtonReleaseFunction, bindButtonPressFunction, createLabelButton -from vrct_gui import vrct_gui -from utils import isEven, callFunctionIfCallable - -SETTING_BOX_COLUMN = 1 - -class _SettingBoxGenerator(): - def __init__(self, parent_widget, config_window, settings, view_variable): - self.view_variable = view_variable - self.config_window = config_window - self.parent_widget = parent_widget - self.settings = settings - - self.MAIN_INNER_AREA_MIN_WIDTH = int(self.settings.uism.MAIN_AREA_MIN_WIDTH - self.settings.uism.SB__IPADX) - - self.dropdown_menu_window = vrct_gui.vrct_gui.dropdown_menu_window - - def _createSettingBoxFrame(self, sb__attr_name, for_var_label_text=None, for_var_desc_text=None, expand_label_frame:bool=False): - self.config_window.sb__widgets[sb__attr_name] = SimpleNamespace() - - setting_box_frame = CTkFrame(self.parent_widget, corner_radius=0, fg_color=self.settings.ctm.SB__BG_COLOR, width=0, height=0) - - # "pady=(0,1)" is for bottom padding. It can be removed(override) when you do like "self.attr_name.grid(row=row, pady=0)" - setting_box_frame.grid(column=0, padx=0, pady=self.settings.uism.SB__FAKE_BOTTOM_BORDER_SIZE, sticky="ew") - setting_box_frame.grid_columnconfigure(0, weight=1) - - - setting_box_frame_wrapper = CTkFrame(setting_box_frame, corner_radius=0, fg_color=self.settings.ctm.SB__BG_COLOR, width=0, height=0) - setting_box_frame_wrapper.grid(row=0, column=0, padx=self.settings.uism.SB__IPADX, pady=self.settings.uism.SB__IPADY, sticky="ew") - - - setting_box_frame_wrapper_fix_border = CTkFrame(setting_box_frame, corner_radius=0, width=0, height=0) - setting_box_frame_wrapper_fix_border.grid(row=1, column=0, sticky="ew") - - setting_box_frame_wrapper_fix_border2 = CTkFrame(setting_box_frame, corner_radius=0, width=0, height=0) - setting_box_frame_wrapper_fix_border2.grid(row=0, column=1, sticky="ns") - - - - if for_var_label_text is not None: - self._setSettingBoxLabels(sb__attr_name, setting_box_frame_wrapper, for_var_label_text, for_var_desc_text, expand_label_frame) - if expand_label_frame is True: - setting_box_frame_wrapper.grid_columnconfigure(0, weight=1, minsize=int(self.settings.uism.MAIN_AREA_MIN_WIDTH)) - setting_box_frame_wrapper.grid(columnspan=3) - return setting_box_frame - - - setting_box_frame_wrapper.grid_columnconfigure(0, weight=0, minsize=int(self.settings.uism.MAIN_AREA_MIN_WIDTH / 2)) - setting_box_frame_wrapper.grid_columnconfigure(2, weight=1, minsize=int(self.settings.uism.MAIN_AREA_MIN_WIDTH / 2)) - - - - - setting_box_item_frame = CTkFrame(setting_box_frame_wrapper, corner_radius=0, width=0, height=0, fg_color=self.settings.ctm.SB__BG_COLOR) - if for_var_label_text is not None: - setting_box_item_frame.grid(row=0, column=2, padx=0, sticky="nsew") - else: - setting_box_item_frame.grid(row=0, columnspan=3, padx=0, sticky="nsew") - setting_box_item_frame.grid_rowconfigure((0,2), weight=1) - setting_box_item_frame.grid_columnconfigure(0, weight=1) - - return (setting_box_frame, setting_box_item_frame) - - def _setSettingBoxLabels(self, sb__attr_name, setting_box_frame_wrapper, for_var_label_text, for_var_desc_text=None, expand_label_frame:bool=False): - - setting_box_labels_frame = CTkFrame(setting_box_frame_wrapper, corner_radius=0, fg_color=self.settings.ctm.SB__BG_COLOR, width=0, height=0) - setting_box_labels_frame.grid(row=0, column=0, padx=0, pady=0, sticky="nsew") - - setting_box_labels_frame.grid_rowconfigure((0,3), weight=1) - setting_box_label = CTkLabel( - setting_box_labels_frame, - textvariable=for_var_label_text, - anchor="w", - height=0, - font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.SB__LABEL_FONT_SIZE, weight="normal"), - text_color=self.settings.ctm.LABELS_TEXT_COLOR - ) - setting_box_label.grid(row=1, column=0, padx=0, pady=0, sticky="ew") - self.config_window.sb__widgets[sb__attr_name].label_widget = setting_box_label - - - if for_var_desc_text is not None: - setting_box_desc = CTkLabel( - setting_box_labels_frame, - textvariable=for_var_desc_text, - anchor="w", - justify="left", - height=0, - wraplength=int(self.settings.uism.MAIN_AREA_MIN_WIDTH / 2), - font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.SB__DESC_FONT_SIZE, weight="normal"), - text_color=self.settings.ctm.LABELS_DESC_TEXT_COLOR - ) - if expand_label_frame is True: - setting_box_desc.configure(wraplength=self.settings.uism.MAIN_AREA_MIN_WIDTH) - - setting_box_desc.grid(row=2, column=0, padx=0, pady=(self.settings.uism.SB__DESC_TOP_PADY,0), sticky="ew") - self.config_window.additional_widgets.append(setting_box_desc) - self.config_window.sb__widgets[sb__attr_name].desc_widget=setting_box_desc - else: - self.config_window.sb__widgets[sb__attr_name].desc_widget=None - - - def createSettingBox_Labels( - self, - for_var_label_text, - labels_attr_name, - for_var_desc_text=None, - ): - - setting_box_frame= self._createSettingBoxFrame(labels_attr_name, for_var_label_text, for_var_desc_text, expand_label_frame=True) - - return setting_box_frame - - - - def createSettingBoxDropdownMenu( - self, - for_var_label_text, for_var_desc_text, - optionmenu_attr_name, - command, - dropdown_menu_min_width=None, - dropdown_menu_values=None, - variable=None, - ): - - (setting_box_frame, setting_box_item_frame) = self._createSettingBoxFrame(optionmenu_attr_name, for_var_label_text, for_var_desc_text) - - def adjustedCommand(value): - variable.set(value) - command(value) - - - (option_menu_widget, optionmenu_label_widget, optionmenu_img_widget) = createOptionMenuBox( - parent_widget=setting_box_item_frame, - optionmenu_bg_color=self.settings.ctm.SB__OPTIONMENU_BG_COLOR, - optionmenu_hovered_bg_color=self.settings.ctm.SB__OPTIONMENU_HOVERED_BG_COLOR, - optionmenu_clicked_bg_color=self.settings.ctm.SB__OPTIONMENU_CLICKED_BG_COLOR, - optionmenu_ipadx=self.settings.uism.SB__OPTIONMENU_IPADX, - optionmenu_ipady=self.settings.uism.SB__OPTIONMENU_IPADY, - optionmenu_padx_between_img=self.settings.uism.SB__OPTIONMENU_IPADX_BETWEEN_IMG, - optionmenu_min_height=self.settings.uism.SB__OPTIONMENU_MIN_HEIGHT, - optionmenu_min_width=self.settings.uism.SB__OPTIONMENU_MIN_WIDTH, - variable=variable, - font_family=self.settings.FONT_FAMILY, - font_size=self.settings.uism.SB__OPTION_MENU_FONT_SIZE, - text_color=self.settings.ctm.LABELS_TEXT_COLOR, - image_file=self.settings.image_file.ARROW_LEFT.rotate(90), - image_size=self.settings.uism.SB__OPTIONMENU_IMG_SIZE, - optionmenu_clicked_command=lambda _e: self.dropdown_menu_window.show( - dropdown_menu_widget_id=optionmenu_attr_name, - ), - ) - - - self.config_window.sb__widgets[optionmenu_attr_name].optionmenu_box = option_menu_widget - self.config_window.sb__widgets[optionmenu_attr_name].optionmenu_label_widget = optionmenu_label_widget - self.config_window.sb__widgets[optionmenu_attr_name].optionmenu_img_widget = optionmenu_img_widget - - - option_menu_widget.grid(row=1, column=SETTING_BOX_COLUMN, sticky="e") - setattr(self.config_window, optionmenu_attr_name, option_menu_widget) - - self.dropdown_menu_window.createDropdownMenuBox( - dropdown_menu_widget_id=optionmenu_attr_name, - dropdown_menu_values=dropdown_menu_values, - command=adjustedCommand, - wrapper_widget=self.config_window.main_bg_container, - attach_widget=option_menu_widget, - dropdown_menu_min_width=dropdown_menu_min_width, - ) - - return setting_box_frame - - - - - def createSettingBoxSwitch(self, - for_var_label_text, for_var_desc_text, - switch_attr_name, - variable, - command, - ): - - (setting_box_frame, setting_box_item_frame) = self._createSettingBoxFrame(switch_attr_name, for_var_label_text, for_var_desc_text) - - switch_widget = CTkSwitch( - setting_box_item_frame, - text=None, - height=0, - width=0, - corner_radius=int(self.settings.uism.SB__SWITCH_BOX_HEIGHT/2), - border_width=0, - switch_height=self.settings.uism.SB__SWITCH_BOX_HEIGHT, - switch_width=self.settings.uism.SB__SWITCH_BOX_WIDTH, - onvalue=True, - offvalue=False, - variable=variable, - command=command, - fg_color=self.settings.ctm.SB__SWITCH_BOX_BG_COLOR, - progress_color=self.settings.ctm.SB__SWITCH_BOX_ACTIVE_BG_COLOR, - button_color=self.settings.ctm.SB__SWITCH_BOX_BUTTON_COLOR, - button_hover_color=self.settings.ctm.SB__SWITCH_BOX_BUTTON_HOVERED_COLOR, - ) - setattr(self.config_window, switch_attr_name, switch_widget) - - self.config_window.sb__widgets[switch_attr_name].switch_box = switch_widget - - switch_widget.grid(row=1, column=SETTING_BOX_COLUMN, sticky="e") - - return setting_box_frame - - - - def createSettingBoxCheckbox(self, - for_var_label_text, - checkbox_attr_name, - command, - variable, - for_var_desc_text=None, - ): - - (setting_box_frame, setting_box_item_frame) = self._createSettingBoxFrame(checkbox_attr_name, for_var_label_text, for_var_desc_text) - - checkbox_widget = CTkCheckBox( - setting_box_item_frame, - text=None, - width=0, - checkbox_width=self.settings.uism.SB__CHECKBOX_SIZE, - checkbox_height=self.settings.uism.SB__CHECKBOX_SIZE, - onvalue=True, - offvalue=False, - variable=variable, - command=command, - corner_radius=self.settings.uism.SB__CHECKBOX_CORNER_RADIUS, - border_width=self.settings.uism.SB__CHECKBOX_BORDER_WIDTH, - border_color=self.settings.ctm.SB__CHECKBOX_BORDER_COLOR, - hover_color=self.settings.ctm.SB__CHECKBOX_HOVER_COLOR, - checkmark_color=self.settings.ctm.SB__CHECKBOX_CHECKMARK_COLOR, - fg_color=self.settings.ctm.SB__CHECKBOX_CHECKED_COLOR, - ) - setattr(self.config_window, checkbox_attr_name, checkbox_widget) - - self.config_window.sb__widgets[checkbox_attr_name].checkbox = checkbox_widget - - checkbox_widget.grid(row=1, column=SETTING_BOX_COLUMN, sticky="e") - - return setting_box_frame - - - - # 3 Options - def createSettingBoxRadioButtons( - self, - for_var_label_text, for_var_desc_text, - radio_button_attr_name, - variable, - command, - radiobutton_keys_values=dict, - ): - - (setting_box_frame, setting_box_item_frame) = self._createSettingBoxFrame(radio_button_attr_name, for_var_label_text, for_var_desc_text) - - row=0 - for key, value in radiobutton_keys_values.items(): - radiobutton_wrapper = CTkFrame(setting_box_item_frame, corner_radius=6, fg_color=self.settings.ctm.SB__BG_COLOR, width=0, height=0, cursor="hand2") - radiobutton_wrapper.grid(row=row, column=0, sticky="ew") - row+=1 - - radiobutton_wrapper.grid_rowconfigure((0,2), weight=1) - setting_box_radio_button = CTkRadioButton( - radiobutton_wrapper, - textvariable=value, - font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.SB__RADIO_BUTTON_FONT_SIZE, weight="normal"), - variable=variable, - value=key, - text_color=self.settings.ctm.SB__RADIOBUTTON_TEXT_COLOR, - fg_color=self.settings.ctm.SB__RADIOBUTTON_SELECTED_COLOR, - border_color=self.settings.ctm.SB__RADIOBUTTON_BORDER_COLOR, - hover=False - ) - setting_box_radio_button.grid(row=1, column=0, padx=10, pady=10, sticky="ew") - - if key == variable.get(): - setting_box_radio_button.select() - - setting_box_radio_button._canvas.unbind("") - setting_box_radio_button._text_label.unbind("") - setting_box_radio_button._text_label.grid(padx=(10,0)) - - - def buttonPressedFunction(radiobutton_wrapper, radiobutton_widget, _e): - radiobutton_wrapper.configure(fg_color=self.settings.ctm.SB__RADIOBUTTON_BG_CLICKED_COLOR) - - def buttonReleasedFunction(radiobutton_wrapper, radiobutton_widget, _e): - radiobutton_wrapper.configure(fg_color=self.settings.ctm.SB__RADIOBUTTON_BG_HOVERED_COLOR) - radiobutton_widget.select() - command() - - def enterFunction(radiobutton_wrapper, _e): - radiobutton_wrapper.configure(fg_color=self.settings.ctm.SB__RADIOBUTTON_BG_HOVERED_COLOR) - - def leaveFunction(radiobutton_wrapper, _e): - radiobutton_wrapper.configure(fg_color=self.settings.ctm.SB__BG_COLOR) - - - bindEnterAndLeaveFunction( - target_widgets=[radiobutton_wrapper, setting_box_radio_button, setting_box_radio_button._bg_canvas], - enterFunction=partial(enterFunction, radiobutton_wrapper), - leaveFunction=partial(leaveFunction, radiobutton_wrapper) - ) - - bindButtonPressFunction( - target_widgets=[radiobutton_wrapper, setting_box_radio_button, setting_box_radio_button._bg_canvas], - buttonPressedFunction=partial(buttonPressedFunction, radiobutton_wrapper, setting_box_radio_button) - ) - - bindButtonReleaseFunction( - target_widgets=[radiobutton_wrapper, setting_box_radio_button, setting_box_radio_button._bg_canvas], - buttonReleasedFunction=partial(buttonReleasedFunction, radiobutton_wrapper, setting_box_radio_button) - ) - - - return setting_box_frame - - - - def createSettingBoxAutoExportMessageLogs( - self, - for_var_label_text, for_var_desc_text, - checkbox_attr_name, - checkbox_command, - button_command, - variable, - ): - - (setting_box_frame, setting_box_item_frame) = self._createSettingBoxFrame(checkbox_attr_name, for_var_label_text, for_var_desc_text) - - - - all_wrapper = CTkFrame(setting_box_item_frame, corner_radius=0, fg_color=self.settings.ctm.SB__BG_COLOR, width=0, height=0) - all_wrapper.grid(row=1, column=0, sticky="ew") - - all_wrapper.grid_columnconfigure(1, weight=1) - - - - - button_widget = createButtonWithImage( - parent_widget=all_wrapper, - button_fg_color=self.settings.ctm.SB__BUTTON_COLOR, - button_enter_color=self.settings.ctm.SB__BUTTON_HOVERED_COLOR, - button_clicked_color=self.settings.ctm.SB__BUTTON_CLICKED_COLOR, - button_image_file=self.settings.image_file.FOLDER_OPEN_ICON, - button_image_size=self.settings.uism.SB__BUTTON_ICON_SIZE, - corner_radius=self.settings.uism.SB__BUTTON_CORNER_RADIUS, - button_ipadxy=self.settings.uism.SB__BUTTON_IPADXY, - button_command=button_command, - ) - button_widget.grid(row=0, column=0, padx=0, sticky="w") - - - - checkbox_widget = CTkCheckBox( - all_wrapper, - text=None, - width=0, - checkbox_width=self.settings.uism.SB__CHECKBOX_SIZE, - checkbox_height=self.settings.uism.SB__CHECKBOX_SIZE, - onvalue=True, - offvalue=False, - variable=variable, - command=checkbox_command, - corner_radius=self.settings.uism.SB__CHECKBOX_CORNER_RADIUS, - border_width=self.settings.uism.SB__CHECKBOX_BORDER_WIDTH, - border_color=self.settings.ctm.SB__CHECKBOX_BORDER_COLOR, - hover_color=self.settings.ctm.SB__CHECKBOX_HOVER_COLOR, - checkmark_color=self.settings.ctm.SB__CHECKBOX_CHECKMARK_COLOR, - fg_color=self.settings.ctm.SB__CHECKBOX_CHECKED_COLOR, - ) - setattr(self.config_window, checkbox_attr_name, checkbox_widget) - - checkbox_widget.grid(row=0, column=2, sticky="e") - - return setting_box_frame - - - - - - - def createSettingBoxSlider( - self, - for_var_label_text, for_var_desc_text, - slider_attr_name, - slider_range, - command, - variable, - slider_number_of_steps: Union[int, - None] = None, - slider_bind__ButtonPress=None, - slider_bind__ButtonRelease=None, - sliderTooltipFormatter=None, - ): - - (setting_box_frame, setting_box_item_frame) = self._createSettingBoxFrame(slider_attr_name, for_var_label_text, for_var_desc_text) - - if slider_number_of_steps is None: - slider_number_of_steps = int(slider_range[1] - slider_range[0]) - - slider_widget = CTkSlider( - setting_box_item_frame, - width=self.settings.uism.SB__SLIDER_WIDTH, - height=self.settings.uism.SB__SLIDER_HEIGHT, - from_=slider_range[0], - to=slider_range[1], - number_of_steps=slider_number_of_steps, - fg_color=self.settings.ctm.SB__SLIDER_BG_COLOR, - progress_color=self.settings.ctm.SB__SLIDER_PROGRESS_BG_COLOR, - button_color=self.settings.ctm.SB__SLIDER_BUTTON_COLOR, - button_hover_color=self.settings.ctm.SB__SLIDER_BUTTON_HOVERED_COLOR, - command=command, - variable=variable, - ) - setattr(self.config_window, slider_attr_name, slider_widget) - - def getSliderValueWAfterFormatting(): - return sliderTooltipFormatter(variable.get()) if sliderTooltipFormatter else variable.get() - - - - slider_tooltip = CTkToolTip( - slider_widget, - message=getSliderValueWAfterFormatting(), - delay=0, - bg_color=self.settings.ctm.SB__SLIDER_TOOLTIP_BG_COLOR, - corner_radius=0, - text_color=self.settings.ctm.SB__SLIDER_TOOLTIP_TEXT_COLOR, - font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.SB__SLIDER_TOOLTIP_FONT_SIZE, weight="normal"), - ) - - slider_widget.grid(row=1, column=SETTING_BOX_COLUMN, sticky="e") - - if slider_bind__ButtonPress is not None: - def adjusted_slider_bind__ButtonPress(_e): - command(_e) - slider_tooltip.configure(message=getSliderValueWAfterFormatting()) - slider_bind__ButtonPress() - slider_widget.configure(command=adjusted_slider_bind__ButtonPress) - - if slider_bind__ButtonRelease is not None: - def adjusted_slider_bind__ButtonRelease(_e): - slider_bind__ButtonRelease() - slider_widget.bind("", adjusted_slider_bind__ButtonRelease, "+") - - return setting_box_frame - - - - - def createSettingBoxProgressbarXSlider( - self, - command, progressbar_x_slider_attr_name, - entry_attr_name, entry_bind__FocusOut, - slider_attr_name, slider_range, - progressbar_attr_name, - passive_button_attr_name, passive_button_command, - active_button_attr_name, active_button_command, - disabled_button_attr_name, disabled_button_image_file, - button_image_file, - - entry_variable, - slider_variable, - - slider_number_of_steps: Union[int, None] = None, - ): - - (setting_box_frame, setting_box_item_frame) = self._createSettingBoxFrame(progressbar_x_slider_attr_name) - - def adjusted_command__for_entry_bind__Any_KeyRelease(e): - command(e.widget.get()) - def adjusted_command__for_slider(value): - command(value) - - setting_box_item_frame.grid_columnconfigure((0,2), weight=0) - setting_box_item_frame.grid_columnconfigure(1, weight=1) - entry_widget = CTkEntry( - setting_box_item_frame, - text_color=self.settings.ctm.SB__ENTRY_TEXT_COLOR, - fg_color=self.settings.ctm.SB__ENTRY_BG_COLOR, - border_color=self.settings.ctm.SB__ENTRY_BORDER_COLOR, - width=self.settings.uism.SB__PROGRESSBAR_X_SLIDER__ENTRY_WIDTH, - height=self.settings.uism.SB__PROGRESSBAR_X_SLIDER__ENTRY_HEIGHT, - textvariable=entry_variable, - font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.SB__ENTRY_FONT_SIZE, weight="normal"), - ) - - entry_widget.bind("", adjusted_command__for_entry_bind__Any_KeyRelease) - if entry_bind__FocusOut is not None: - entry_widget.bind("", entry_bind__FocusOut, "+") - - entry_widget.grid(row=1, column=2, padx=0, pady=0, sticky="e") - setattr(self.config_window, entry_attr_name, entry_widget) - - - - # at least 2px is needed otherwise the slider button is gonna broken. - SLIDER_BORDER_WIDTH = max(2,self.settings.uism.SB__PROGRESSBAR_X_SLIDER__SLIDER_BUTTON_LENGTH) - SLIDER_BUTTON_LENGTH = int(SLIDER_BORDER_WIDTH/2) - slider_widget = CTkSlider( - setting_box_item_frame, - from_=slider_range[0], - to=slider_range[1], - number_of_steps=slider_number_of_steps, - command=adjusted_command__for_slider, - variable=slider_variable, - height=self.settings.uism.SB__PROGRESSBAR_X_SLIDER__SLIDER_HEIGHT, - border_width=0, - button_length=SLIDER_BORDER_WIDTH, - button_corner_radius=SLIDER_BUTTON_LENGTH, - corner_radius=0, - button_color=self.settings.ctm.SB__PROGRESSBAR_X_SLIDER__SLIDER_BUTTON_COLOR, - button_hover_color=self.settings.ctm.SB__PROGRESSBAR_X_SLIDER__SLIDER_BUTTON_HOVERED_COLOR, - fg_color=self.settings.ctm.SB__BG_COLOR, - progress_color=self.settings.ctm.SB__BG_COLOR, - border_color=self.settings.ctm.SB__BG_COLOR, - ) - slider_widget.grid(row=1, column=1, padx=self.settings.uism.SB__PROGRESSBAR_X_SLIDER__BAR_PADX, sticky="ew") - setattr(self.config_window, slider_attr_name, slider_widget) - - - - - progressbar_widget = CTkProgressBar( - setting_box_item_frame, - height=self.settings.uism.SB__PROGRESSBAR_X_SLIDER__PROGRESSBAR_HEIGHT, - corner_radius=0, - fg_color=self.settings.ctm.SB__PROGRESSBAR_X_SLIDER__PROGRESSBAR_BG_COLOR, - progress_color=self.settings.ctm.SB__PROGRESSBAR_X_SLIDER__PROGRESSBAR_PROGRESS_BG_COLOR, - ) - setattr(self.config_window, progressbar_attr_name, progressbar_widget) - progressbar_widget.grid(row=1, column=1, padx=self.settings.uism.SB__PROGRESSBAR_X_SLIDER__BAR_PADX, sticky="ew") - progressbar_widget.set(0) - - - - - passive_button_wrapper = self._createPassiveButtonForProgressbarXSlider(setting_box_item_frame, passive_button_command, button_image_file) - setattr(self.config_window, passive_button_attr_name, passive_button_wrapper) - - disabled_button_wrapper = self._createDisabledButtonForProgressbarXSlider(setting_box_item_frame, disabled_button_image_file) - setattr(self.config_window, disabled_button_attr_name, disabled_button_wrapper) - - active_button_wrapper = self._createActiveButtonForProgressbarXSlider(setting_box_item_frame, active_button_command, button_image_file) - setattr(self.config_window, active_button_attr_name, active_button_wrapper) - - passive_button_wrapper.grid(row=1, column=0, padx=0, sticky="w") - passive_button_wrapper.configure(corner_radius=int(getLatestWidth(passive_button_wrapper)/2)) - - disabled_button_wrapper.grid(row=1, column=0, padx=0, sticky="w") - disabled_button_wrapper.configure(corner_radius=int(getLatestWidth(passive_button_wrapper)/2)) - - active_button_wrapper.grid(row=1, column=0, padx=0, sticky="w") - active_button_wrapper.configure(corner_radius=int(getLatestWidth(passive_button_wrapper)/2)) - - passive_button_wrapper.grid_remove() - disabled_button_wrapper.grid_remove() - active_button_wrapper.grid_remove() - - passive_button_wrapper.grid() - return setting_box_frame - - - - - def createSettingBoxEntry(self, - for_var_label_text, for_var_desc_text, - entry_attr_name, - entry_width, - entry_textvariable, - entry_bind__Any_KeyRelease, - entry_bind__FocusOut=None, - ): - - (setting_box_frame, setting_box_item_frame) = self._createSettingBoxFrame(entry_attr_name, for_var_label_text, for_var_desc_text) - - def adjusted_command__for_entry_bind__Any_KeyRelease(e): - entry_bind__Any_KeyRelease(e.widget.get()) - - entry_widget = CTkEntry( - setting_box_item_frame, - text_color=self.settings.ctm.SB__ENTRY_TEXT_COLOR, - fg_color=self.settings.ctm.SB__ENTRY_BG_COLOR, - border_color=self.settings.ctm.SB__ENTRY_BORDER_COLOR, - width=entry_width, - height=self.settings.uism.SB__PROGRESSBAR_X_SLIDER__ENTRY_HEIGHT, - textvariable=entry_textvariable, - font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.SB__ENTRY_FONT_SIZE, weight="normal"), - ) - entry_widget.bind("", adjusted_command__for_entry_bind__Any_KeyRelease) - setattr(self.config_window, entry_attr_name, entry_widget) - - - entry_widget.grid(row=1, column=SETTING_BOX_COLUMN, sticky="e") - - if entry_bind__FocusOut is not None: - entry_widget.bind("", entry_bind__FocusOut, "+") - - return setting_box_frame - - - def createSettingBoxEntry_AuthKey(self, - for_var_label_text, for_var_desc_text, - entry_attr_name, - entry_width, - entry_textvariable, - entry_bind__Any_KeyRelease, - entry_bind__FocusOut=None, - open_authkey_page_command=None, - open_authkey_text_variable=None, - image_file=None, - ): - - (setting_box_frame, setting_box_item_frame) = self._createSettingBoxFrame(entry_attr_name, for_var_label_text, for_var_desc_text) - - - all_wrapper = CTkFrame(setting_box_item_frame, corner_radius=0, fg_color=self.settings.ctm.SB__BG_COLOR, width=0, height=0) - all_wrapper.grid(row=1, column=0, sticky="ew") - - all_wrapper.grid_columnconfigure(0, weight=1) - - - def adjusted_command__for_entry_bind__Any_KeyRelease(e): - entry_bind__Any_KeyRelease(e.widget.get()) - - entry_widget = CTkEntry( - all_wrapper, - text_color=self.settings.ctm.SB__ENTRY_TEXT_COLOR, - fg_color=self.settings.ctm.SB__ENTRY_BG_COLOR, - border_color=self.settings.ctm.SB__ENTRY_BORDER_COLOR, - width=entry_width, - height=self.settings.uism.SB__PROGRESSBAR_X_SLIDER__ENTRY_HEIGHT, - textvariable=entry_textvariable, - font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.SB__ENTRY_FONT_SIZE, weight="normal"), - ) - entry_widget.bind("", adjusted_command__for_entry_bind__Any_KeyRelease) - setattr(self.config_window, entry_attr_name, entry_widget) - - - entry_widget.grid(row=0, column=SETTING_BOX_COLUMN, sticky="e") - - if entry_bind__FocusOut is not None: - entry_widget.bind("", entry_bind__FocusOut, "+") - - - - (open_page_button, label_button_label_widget, label_button_img_widget) = createLabelButton( - parent_widget=all_wrapper, - label_button_bg_color=self.settings.ctm.SB__BUTTON_COLOR, - label_button_hovered_bg_color=self.settings.ctm.SB__BUTTON_HOVERED_COLOR, - label_button_clicked_bg_color=self.settings.ctm.SB__BUTTON_CLICKED_COLOR, - label_button_ipadx=self.settings.uism.SB__AUTHKEY_WEBPAGE_BUTTON_IPADX, - label_button_ipady=self.settings.uism.SB__AUTHKEY_WEBPAGE_BUTTON_IPADY, - variable=open_authkey_text_variable, - font_family=self.settings.FONT_FAMILY, - font_size=self.settings.uism.SB__AUTHKEY_WEBPAGE_BUTTON_LABEL_FONT_SIZE, - text_color=self.settings.ctm.LABELS_TEXT_COLOR, - label_button_clicked_command=open_authkey_page_command, - - label_button_position="center", - - image_file=image_file, - image_size=self.settings.uism.SB__AUTHKEY_WEBPAGE_BUTTON_IMG_SIZE, - label_button_padx_between_img=self.settings.uism.SB__AUTHKEY_WEBPAGE_PADX_BETWEEN_LABEL_AND_ICON, - ) - open_page_button.grid(row=1, column=SETTING_BOX_COLUMN, pady=(self.settings.uism.SB__AUTHKEY_WEBPAGE_BUTTON_TOP_PADY,0)) - - - return setting_box_frame - - - - - def createSettingBoxMessageFormatEntries_WithTranslation(self, - base_entry_attr_name, - entry_textvariable_0, - entry_textvariable_1, - entry_textvariable_2, - textvariable_0, - textvariable_1, - example_label_textvariable, - swap_button_command, - entry_bind__Any_KeyRelease, - entry_bind__FocusOut=None, - ): - - (setting_box_frame, setting_box_item_frame) = self._createSettingBoxFrame(base_entry_attr_name) - - - all_wrapper = CTkFrame(setting_box_item_frame, corner_radius=0, fg_color=self.settings.ctm.SB__BG_COLOR, width=0, height=0) - all_wrapper.grid(row=1, column=0, sticky="ew") - - all_wrapper.grid_columnconfigure(0, weight=1) - - - example_box_wrapper = CTkFrame(all_wrapper, corner_radius=0, fg_color=self.settings.ctm.SB__BG_COLOR, width=0, height=0) - example_box_wrapper.grid(row=0, column=0, pady=self.settings.uism.SB__MESSAGE_FORMAT__ENTRIES_BOTTOM_PADY, sticky="ew") - - entries_wrapper = CTkFrame(all_wrapper, corner_radius=0, fg_color=self.settings.ctm.SB__BG_COLOR, width=0, height=0) - entries_wrapper.grid(row=1, column=0, pady=self.settings.uism.SB__MESSAGE_FORMAT__ENTRIES_BOTTOM_PADY, sticky="ew") - - swap_button_wrapper = CTkFrame(all_wrapper, corner_radius=0, fg_color=self.settings.ctm.SB__BG_COLOR, width=0, height=0) - swap_button_wrapper.grid(row=2, column=0, sticky="e") - - - - - - example_box_wrapper.grid_columnconfigure((0,2), weight=1) - example_frame_widget = CTkFrame(example_box_wrapper, corner_radius=self.settings.uism.SB__MESSAGE_FORMAT__EXAMPLE_CORNER_RADIUS, fg_color=self.settings.ctm.SB__MESSAGE_FORMAT__EXAMPLE_BG_COLOR, width=0, height=0) - example_frame_widget.grid(row=0, column=1) - - example_frame_widget.grid_rowconfigure((0,2), weight=1) - example_frame_widget.grid_columnconfigure((0,2), weight=1) - example_label_widget = CTkLabel( - example_frame_widget, - textvariable=example_label_textvariable, - anchor="center", - justify="center", - wraplength=self.settings.uism.SB__MESSAGE_FORMAT__EXAMPLE_WRAP_LENGTH, - height=0, - font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.SB__MESSAGE_FORMAT__REQUIRED_TEXT_FONT_SIZE, weight="normal"), - text_color=self.settings.ctm.SB__MESSAGE_FORMAT__EXAMPLE_TEXT_COLOR, - ) - example_label_widget.grid(row=1, column=1, padx=self.settings.uism.SB__MESSAGE_FORMAT__EXAMPLE_IPADXY, pady=self.settings.uism.SB__MESSAGE_FORMAT__EXAMPLE_IPADXY, sticky="ew") - - self.config_window.additional_widgets.append(example_box_wrapper) - - - - - entry_textvariables = [entry_textvariable_0, entry_textvariable_1, entry_textvariable_2] - for i in range(3): - entry_widget = CTkEntry( - entries_wrapper, - text_color=self.settings.ctm.SB__ENTRY_TEXT_COLOR, - fg_color=self.settings.ctm.SB__ENTRY_BG_COLOR, - border_color=self.settings.ctm.SB__ENTRY_BORDER_COLOR, - height=self.settings.uism.SB__MESSAGE_FORMAT__ENTRY_HEIGHT, - textvariable=entry_textvariables[i], - justify="center", - font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.SB__ENTRY_FONT_SIZE, weight="normal"), - ) - setattr(self.config_window, base_entry_attr_name + "_" + str(i), entry_widget) - - - - if entry_bind__FocusOut is not None: - entry_widget.bind("", entry_bind__FocusOut, "+") - - - label_frame_widget_0 = CTkFrame(entries_wrapper, corner_radius=0, fg_color=self.settings.ctm.SB__BG_COLOR, width=0, height=0) - - label_frame_widget_0.grid_rowconfigure((0,2), weight=1) - label_frame_widget_0.grid_columnconfigure(0, weight=1) - label_widget_0 = CTkLabel( - label_frame_widget_0, - textvariable=textvariable_0, - anchor="center", - height=0, - font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.SB__MESSAGE_FORMAT__REQUIRED_TEXT_FONT_SIZE, weight="normal"), - text_color=self.settings.ctm.LABELS_TEXT_COLOR - ) - label_widget_0.grid(row=1, column=0, padx=0, pady=0, sticky="ew") - - - label_frame_widget_1 = CTkFrame(entries_wrapper, corner_radius=0, fg_color=self.settings.ctm.SB__BG_COLOR, width=0, height=0) - - label_frame_widget_1.grid_rowconfigure((0,2), weight=1) - label_frame_widget_1.grid_columnconfigure(0, weight=1) - label_widget_1 = CTkLabel( - label_frame_widget_1, - textvariable=textvariable_1, - anchor="center", - height=0, - font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.SB__MESSAGE_FORMAT__REQUIRED_TEXT_FONT_SIZE, weight="normal"), - text_color=self.settings.ctm.LABELS_TEXT_COLOR - ) - label_widget_1.grid(row=1, column=0, padx=0, pady=0, sticky="ew") - - - entries_wrapper.grid_columnconfigure((0,2,4), weight=1) - entries_wrapper.grid_columnconfigure((1,3), weight=0, uniform="message_format_fixed_labels") - - entry_widget_0 = getattr(self.config_window, base_entry_attr_name+"_0") - entry_widget_1 = getattr(self.config_window, base_entry_attr_name+"_1") - entry_widget_2 = getattr(self.config_window, base_entry_attr_name+"_2") - entry_widget_0.grid(row=0, column=0, sticky="ew") - entry_widget_1.grid(row=0, column=2, sticky="ew") - entry_widget_2.grid(row=0, column=4, sticky="ew") - label_frame_widget_0.grid(row=0, column=1, padx=self.settings.uism.SB__MESSAGE_FORMAT__REQUIRED_TEXT_PADX, sticky="ew") - label_frame_widget_1.grid(row=0, column=3, padx=self.settings.uism.SB__MESSAGE_FORMAT__REQUIRED_TEXT_PADX, sticky="ew") - - def adjusted_command__for_entry_bind__Any_KeyRelease(_e): - message_format = entry_widget_0.get() + textvariable_0.get() + entry_widget_1.get() + textvariable_1.get() + entry_widget_2.get() - entry_bind__Any_KeyRelease(message_format) - - - entry_widget_0.bind("", adjusted_command__for_entry_bind__Any_KeyRelease) - entry_widget_1.bind("", adjusted_command__for_entry_bind__Any_KeyRelease) - entry_widget_2.bind("", adjusted_command__for_entry_bind__Any_KeyRelease) - - - - - - - swap_button = CTkFrame(swap_button_wrapper, corner_radius=self.settings.uism.BUTTONS_CORNER_RADIUS, fg_color=self.settings.ctm.SB__MESSAGE_FORMAT__SWAP_BUTTON_COLOR, cursor="hand2") - swap_button.grid(row=0, column=2, sticky="ew") - - - swap_button.grid_columnconfigure(0, weight=1) - swap_button_label_wrapper = CTkFrame(swap_button, corner_radius=0, fg_color=self.settings.ctm.SB__MESSAGE_FORMAT__SWAP_BUTTON_COLOR) - swap_button_label_wrapper.grid(row=0, column=0, padx=self.settings.uism.SB__MESSAGE_FORMAT__SWAP_BUTTON_IPADX, pady=self.settings.uism.SB__MESSAGE_FORMAT__SWAP_BUTTON_IPADY, sticky="ew") - - - swap_button_label_wrapper.grid_columnconfigure((0,4), weight=1) - swap_button_label_wrapper.grid_rowconfigure((0,2), weight=1) - - swap_button_label_0 = CTkLabel( - swap_button_label_wrapper, - textvariable=textvariable_0, - height=0, - corner_radius=0, - font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.SB__MESSAGE_FORMAT__SWAP_BUTTON_FONT_SIZE, weight="normal"), - anchor="w", - text_color=self.settings.ctm.LABELS_TEXT_COLOR, - ) - swap_button_label_0.grid(row=1, column=1) - - swap_button_both_direction_arrow_img = CTkLabel( - swap_button_label_wrapper, - text=None, - height=0, - corner_radius=0, - image=CTkImage((self.settings.image_file.SWAP_ICON), size=self.settings.uism.SB__MESSAGE_FORMAT__SWAP_BUTTON_ARROWS_IMG_SIZE), - anchor="w", - text_color=self.settings.ctm.LABELS_TEXT_COLOR, - ) - swap_button_both_direction_arrow_img.grid(row=1, column=2, padx=self.settings.uism.SB__MESSAGE_FORMAT__SWAP_TEXT_PADX) - - swap_button_label_1 = CTkLabel( - swap_button_label_wrapper, - textvariable=textvariable_1, - height=0, - corner_radius=0, - font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.SB__MESSAGE_FORMAT__SWAP_BUTTON_FONT_SIZE, weight="normal"), - anchor="w", - text_color=self.settings.ctm.LABELS_TEXT_COLOR, - ) - swap_button_label_1.grid(row=1, column=3) - - bindButtonFunctionAndColor( - target_widgets=[ - swap_button, - swap_button_label_wrapper, - swap_button_label_0, - swap_button_both_direction_arrow_img, - swap_button_label_1, - ], - enter_color=self.settings.ctm.SB__MESSAGE_FORMAT__SWAP_BUTTON_HOVERED_COLOR, - leave_color=self.settings.ctm.SB__MESSAGE_FORMAT__SWAP_BUTTON_COLOR, - clicked_color=self.settings.ctm.SB__MESSAGE_FORMAT__SWAP_BUTTON_CLICKED_COLOR, - buttonReleasedFunction=swap_button_command, - ) - - - return setting_box_frame - - - - - def createSettingBoxMessageFormatEntries(self, - base_entry_attr_name, - entry_textvariable_0, - entry_textvariable_1, - textvariable_0, - example_label_textvariable, - entry_bind__Any_KeyRelease, - entry_bind__FocusOut=None, - ): - - (setting_box_frame, setting_box_item_frame) = self._createSettingBoxFrame(base_entry_attr_name) - - - all_wrapper = CTkFrame(setting_box_item_frame, corner_radius=0, fg_color=self.settings.ctm.SB__BG_COLOR, width=0, height=0) - all_wrapper.grid(row=1, column=0, sticky="ew") - - all_wrapper.grid_columnconfigure(0, weight=1) - - - example_box_wrapper = CTkFrame(all_wrapper, corner_radius=0, fg_color=self.settings.ctm.SB__BG_COLOR, width=0, height=0) - example_box_wrapper.grid(row=0, column=0, pady=self.settings.uism.SB__MESSAGE_FORMAT__ENTRIES_BOTTOM_PADY, sticky="ew") - - entries_wrapper = CTkFrame(all_wrapper, corner_radius=0, fg_color=self.settings.ctm.SB__BG_COLOR, width=0, height=0) - entries_wrapper.grid(row=1, column=0, pady=self.settings.uism.SB__MESSAGE_FORMAT__ENTRIES_BOTTOM_PADY, sticky="ew") - - - - - example_box_wrapper.grid_columnconfigure((0,2), weight=1) - example_frame_widget = CTkFrame(example_box_wrapper, corner_radius=self.settings.uism.SB__MESSAGE_FORMAT__EXAMPLE_CORNER_RADIUS, fg_color=self.settings.ctm.SB__MESSAGE_FORMAT__EXAMPLE_BG_COLOR, width=0, height=0) - example_frame_widget.grid(row=0, column=1) - - example_frame_widget.grid_rowconfigure((0,2), weight=1) - example_frame_widget.grid_columnconfigure((0,2), weight=1) - example_label_widget = CTkLabel( - example_frame_widget, - textvariable=example_label_textvariable, - anchor="center", - justify="center", - wraplength=self.settings.uism.SB__MESSAGE_FORMAT__EXAMPLE_WRAP_LENGTH, - height=0, - font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.SB__MESSAGE_FORMAT__REQUIRED_TEXT_FONT_SIZE, weight="normal"), - text_color=self.settings.ctm.SB__MESSAGE_FORMAT__EXAMPLE_TEXT_COLOR, - ) - example_label_widget.grid(row=1, column=1, padx=self.settings.uism.SB__MESSAGE_FORMAT__EXAMPLE_IPADXY, pady=self.settings.uism.SB__MESSAGE_FORMAT__EXAMPLE_IPADXY, sticky="ew") - - self.config_window.additional_widgets.append(example_box_wrapper) - - - - - entry_textvariables = [entry_textvariable_0, entry_textvariable_1] - for i in range(2): - entry_widget = CTkEntry( - entries_wrapper, - text_color=self.settings.ctm.SB__ENTRY_TEXT_COLOR, - fg_color=self.settings.ctm.SB__ENTRY_BG_COLOR, - border_color=self.settings.ctm.SB__ENTRY_BORDER_COLOR, - height=self.settings.uism.SB__MESSAGE_FORMAT__ENTRY_HEIGHT, - textvariable=entry_textvariables[i], - justify="center", - font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.SB__ENTRY_FONT_SIZE, weight="normal"), - ) - setattr(self.config_window, base_entry_attr_name + "_" + str(i), entry_widget) - - - - if entry_bind__FocusOut is not None: - entry_widget.bind("", entry_bind__FocusOut, "+") - - - label_frame_widget_0 = CTkFrame(entries_wrapper, corner_radius=0, fg_color=self.settings.ctm.SB__BG_COLOR, width=0, height=0) - - label_frame_widget_0.grid_rowconfigure((0,2), weight=1) - label_frame_widget_0.grid_columnconfigure(0, weight=1) - label_widget_0 = CTkLabel( - label_frame_widget_0, - textvariable=textvariable_0, - anchor="center", - height=0, - font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.SB__MESSAGE_FORMAT__REQUIRED_TEXT_FONT_SIZE, weight="normal"), - text_color=self.settings.ctm.LABELS_TEXT_COLOR - ) - label_widget_0.grid(row=1, column=0, padx=0, pady=0, sticky="ew") - - - - - - entries_wrapper.grid_columnconfigure((0,2), weight=1) - entries_wrapper.grid_columnconfigure(1, weight=0) - - entry_widget_0 = getattr(self.config_window, base_entry_attr_name+"_0") - entry_widget_1 = getattr(self.config_window, base_entry_attr_name+"_1") - entry_widget_0.grid(row=0, column=0, sticky="ew") - entry_widget_1.grid(row=0, column=2, sticky="ew") - label_frame_widget_0.grid(row=0, column=1, padx=self.settings.uism.SB__MESSAGE_FORMAT__REQUIRED_TEXT_PADX, sticky="ew") - - def adjusted_command__for_entry_bind__Any_KeyRelease(_e): - message_format = entry_widget_0.get() + textvariable_0.get() + entry_widget_1.get() - entry_bind__Any_KeyRelease(message_format) - - - entry_widget_0.bind("", adjusted_command__for_entry_bind__Any_KeyRelease) - entry_widget_1.bind("", adjusted_command__for_entry_bind__Any_KeyRelease) - - - - return setting_box_frame - - - - def createSettingBox_Overlay(self, - for_var_label_text, for_var_desc_text, - switch_attr_name, - variable, - command, - for_var_button_label, - label_button_clicked_command, - ): - - (setting_box_frame, setting_box_item_frame) = self._createSettingBoxFrame(switch_attr_name, for_var_label_text, for_var_desc_text) - - - all_wrapper = CTkFrame(setting_box_item_frame, corner_radius=0, fg_color=self.settings.ctm.SB__BG_COLOR, width=0, height=0) - all_wrapper.grid(row=1, column=0, sticky="ew") - - all_wrapper.grid_columnconfigure(1, weight=1) - - - - - switch_widget = CTkSwitch( - all_wrapper, - text=None, - height=0, - width=0, - corner_radius=int(self.settings.uism.SB__SWITCH_BOX_HEIGHT/2), - border_width=0, - switch_height=self.settings.uism.SB__SWITCH_BOX_HEIGHT, - switch_width=self.settings.uism.SB__SWITCH_BOX_WIDTH, - onvalue=True, - offvalue=False, - variable=variable, - command=command, - fg_color=self.settings.ctm.SB__SWITCH_BOX_BG_COLOR, - progress_color=self.settings.ctm.SB__SWITCH_BOX_ACTIVE_BG_COLOR, - button_color=self.settings.ctm.SB__SWITCH_BOX_BUTTON_COLOR, - button_hover_color=self.settings.ctm.SB__SWITCH_BOX_BUTTON_HOVERED_COLOR, - ) - setattr(self.config_window, switch_attr_name, switch_widget) - - self.config_window.sb__widgets[switch_attr_name].switch_box = switch_widget - - switch_widget.grid(row=0, pady=20, column=SETTING_BOX_COLUMN) - - - (open_page_button, label_button_label_widget) = createLabelButton( - parent_widget=all_wrapper, - label_button_bg_color=self.settings.ctm.SB__BUTTON_COLOR, - label_button_hovered_bg_color=self.settings.ctm.SB__BUTTON_HOVERED_COLOR, - label_button_clicked_bg_color=self.settings.ctm.SB__BUTTON_CLICKED_COLOR, - label_button_ipadx=self.settings.uism.SB__AUTHKEY_WEBPAGE_BUTTON_IPADX, - label_button_ipady=self.settings.uism.SB__AUTHKEY_WEBPAGE_BUTTON_IPADY, - variable=for_var_button_label, - font_family=self.settings.FONT_FAMILY, - font_size=self.settings.uism.SB__AUTHKEY_WEBPAGE_BUTTON_LABEL_FONT_SIZE, - text_color=self.settings.ctm.LABELS_TEXT_COLOR, - label_button_clicked_command=label_button_clicked_command, - - label_button_position="center", - ) - open_page_button.grid(row=1, column=SETTING_BOX_COLUMN, pady=(self.settings.uism.SB__OPEN_OVERLAY_SETTINGS_WINDOW,0)) - - - return setting_box_frame - - - def createSettingBoxButtonWithImage( - self, - for_var_label_text, for_var_desc_text, - button_attr_name, - button_image, - button_command, - ): - - (setting_box_frame, setting_box_item_frame) = self._createSettingBoxFrame(button_attr_name, for_var_label_text, for_var_desc_text) - - - button_with_image_widget = createButtonWithImage( - parent_widget=setting_box_item_frame, - button_fg_color=self.settings.ctm.SB__BUTTON_COLOR, - button_enter_color=self.settings.ctm.SB__BUTTON_HOVERED_COLOR, - button_clicked_color=self.settings.ctm.SB__BUTTON_CLICKED_COLOR, - button_image_file=button_image, - button_image_size=self.settings.uism.SB__BUTTON_ICON_SIZE, - corner_radius=self.settings.uism.SB__BUTTON_CORNER_RADIUS, - button_ipadxy=self.settings.uism.SB__OPEN_CONFIG_FILE_BUTTON_IPADXY, - button_command=button_command, - ) - button_with_image_widget.grid(row=1, column=SETTING_BOX_COLUMN, sticky="e") - - return setting_box_frame - - - - - def createSettingBoxArrowSwitch( - self, - for_var_label_text, for_var_desc_text, - arrow_switch_attr_name, - open_command, - close_command, - var_switch_desc=None, - ): - - (setting_box_frame, setting_box_item_frame) = self._createSettingBoxFrame(arrow_switch_attr_name, for_var_label_text, for_var_desc_text) - - ARROW_BUTTON_COLUMN = SETTING_BOX_COLUMN - - if var_switch_desc is not None: - label_widget = CTkLabel( - setting_box_item_frame, - textvariable=var_switch_desc, - height=0, - corner_radius=0, - font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.SB__ARROW_SWITCH_DESC_FONT_SIZE, weight="normal"), - anchor="w", - text_color=self.settings.ctm.LABELS_DESC_TEXT_COLOR, - ) - - label_widget.grid(row=1, column=SETTING_BOX_COLUMN) - ARROW_BUTTON_COLUMN = SETTING_BOX_COLUMN + 1 - - - for_opening_button_wrapper = createButtonWithImage( - parent_widget=setting_box_item_frame, - button_fg_color=self.settings.ctm.SB__BUTTON_COLOR, - button_enter_color=self.settings.ctm.SB__BUTTON_HOVERED_COLOR, - button_clicked_color=self.settings.ctm.SB__BUTTON_CLICKED_COLOR, - button_image_file=self.settings.image_file.ARROW_LEFT.rotate(90), - button_image_size=self.settings.uism.SB__BUTTON_ICON_SIZE, - corner_radius=self.settings.uism.SB__BUTTON_CORNER_RADIUS, - button_ipadxy=self.settings.uism.SB__BUTTON_IPADXY, - button_command=open_command, - ) - for_opening_button_wrapper.grid(row=1, column=ARROW_BUTTON_COLUMN, padx=self.settings.uism.SB__ARROW_SWITCH_LEFT_PADX, sticky="e") - - self.config_window.sb__widgets[arrow_switch_attr_name].arrow_switch_open = for_opening_button_wrapper - - for_closing_button_wrapper = createButtonWithImage( - parent_widget=setting_box_item_frame, - button_fg_color=self.settings.ctm.SB__BUTTON_COLOR, - button_enter_color=self.settings.ctm.SB__BUTTON_HOVERED_COLOR, - button_clicked_color=self.settings.ctm.SB__BUTTON_CLICKED_COLOR, - button_image_file=self.settings.image_file.ARROW_LEFT.rotate(270), - button_image_size=self.settings.uism.SB__BUTTON_ICON_SIZE, - corner_radius=self.settings.uism.SB__BUTTON_CORNER_RADIUS, - button_ipadxy=self.settings.uism.SB__BUTTON_IPADXY, - button_command=close_command, - ) - for_closing_button_wrapper.grid(row=1, column=ARROW_BUTTON_COLUMN, padx=self.settings.uism.SB__ARROW_SWITCH_LEFT_PADX, sticky="e") - for_closing_button_wrapper.grid_remove() - - self.config_window.sb__widgets[arrow_switch_attr_name].arrow_switch_close = for_closing_button_wrapper - - - return setting_box_frame - - - - # I've added it for the word filter, but it's not currently generalized. If you want to use it in the same way elsewhere, it will require refactoring. - def createSettingBoxAddAndDeleteAbleList( - self, - add_and_delete_able_list_attr_name, - entry_attr_name, - entry_width, - mic_word_filter_list, - ): - - (setting_box_frame, setting_box_item_frame) = self._createSettingBoxFrame(add_and_delete_able_list_attr_name) - - self.config_window.sb__widgets[add_and_delete_able_list_attr_name].items = [] - - - list_container = CTkFrame(setting_box_item_frame, corner_radius=0, fg_color=self.settings.ctm.SB__BG_COLOR, width=0, height=0) - list_container.grid(row=1, column=0, sticky="nsew") - - - max_width = int(self.MAIN_INNER_AREA_MIN_WIDTH - (self.settings.uism.SB__IPADX*2)) - - def addValues(mic_word_filter_list, mic_word_filter_item_row_wrapper, accumulated_labels_width, row, column): - for mic_word_filter_item in mic_word_filter_list: - mic_word_filter_item_wrapper = self._createValue(add_and_delete_able_list_attr_name, mic_word_filter_item_row_wrapper, row, column, mic_word_filter_item) - - if int(accumulated_labels_width + getLatestWidth(mic_word_filter_item_wrapper) + self.settings.uism.ADD_AND_DELETE_ABLE_LIST__VALUES_LEFT_PADX[1]) >= max_width: - accumulated_labels_width = 0 - column = 0 - row += 1 - mic_word_filter_item_wrapper.destroy() - mic_word_filter_item_row_wrapper = self._createRowFrame(list_container, row) - mic_word_filter_item_wrapper = self._createValue(add_and_delete_able_list_attr_name, mic_word_filter_item_row_wrapper, row, column, mic_word_filter_item) - column += 1 - else: - column += 1 - - accumulated_labels_width += int(getLatestWidth(mic_word_filter_item_wrapper) + self.settings.uism.ADD_AND_DELETE_ABLE_LIST__VALUES_LEFT_PADX[1]) - - - - return mic_word_filter_item_row_wrapper, accumulated_labels_width, row, column - - accumulated_labels_width = 0 - row=0 - column=0 - mic_word_filter_item_row_wrapper = self._createRowFrame(list_container, row) - - - mic_word_filter_list = self.view_variable.MIC_WORD_FILTER_LIST - - mic_word_filter_item_row_wrapper, accumulated_labels_width, row, column = addValues(mic_word_filter_list, mic_word_filter_item_row_wrapper, accumulated_labels_width, row, column) - - - self.config_window.sb__widgets[add_and_delete_able_list_attr_name].mic_word_filter_item_row_wrapper = mic_word_filter_item_row_wrapper - self.config_window.sb__widgets[add_and_delete_able_list_attr_name].accumulated_labels_width = accumulated_labels_width - self.config_window.sb__widgets[add_and_delete_able_list_attr_name].last_row = row - self.config_window.sb__widgets[add_and_delete_able_list_attr_name].last_column = column - self.config_window.sb__widgets[add_and_delete_able_list_attr_name].addValues = lambda values, mic_word_filter_item_row_wrapper, accumulated_labels_width, last_row, last_column: addValues(values, mic_word_filter_item_row_wrapper, accumulated_labels_width, last_row, last_column) - - - entry_and_add_button_wrapper = CTkFrame(setting_box_item_frame, corner_radius=0, fg_color=self.settings.ctm.SB__BG_COLOR) - entry_and_add_button_wrapper.grid(row=2, column=0, pady=(self.settings.uism.SB__IPADY, 0), sticky="ew") - - entry_and_add_button_wrapper.grid_columnconfigure((0,3), weight=1) - - - - entry_widget = CTkEntry( - entry_and_add_button_wrapper, - text_color=self.settings.ctm.SB__ENTRY_TEXT_COLOR, - fg_color=self.settings.ctm.SB__ENTRY_BG_COLOR, - border_color=self.settings.ctm.SB__ENTRY_BORDER_COLOR, - width=entry_width, - placeholder_text="AAA or AAA,BBB,CCC", - height=self.settings.uism.SB__PROGRESSBAR_X_SLIDER__ENTRY_HEIGHT, - font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.SB__ENTRY_FONT_SIZE, weight="normal"), - ) - setattr(self.config_window, entry_attr_name, entry_widget) - - entry_widget.grid(row=0, column=1, sticky="ew") - - - - add_button = CTkFrame(entry_and_add_button_wrapper, corner_radius=self.settings.uism.BUTTONS_CORNER_RADIUS, fg_color=self.settings.ctm.SB__ADD_AND_DELETE_ABLE_LIST__ADD_BUTTON_COLOR, cursor="hand2") - add_button.grid(row=0, column=2, padx=self.settings.uism.ADD_AND_DELETE_ABLE_LIST__ADD_BUTTON_LEFT_PADX, sticky="ew") - - - add_button.grid_columnconfigure(0, weight=1) - add_button_label_wrapper = CTkFrame(add_button, corner_radius=0, fg_color=self.settings.ctm.SB__ADD_AND_DELETE_ABLE_LIST__ADD_BUTTON_COLOR) - add_button_label_wrapper.grid(row=0, column=0, padx=self.settings.uism.ADD_AND_DELETE_ABLE_LIST__ADD_BUTTON_IPADX, pady=self.settings.uism.ADD_AND_DELETE_ABLE_LIST__ADD_BUTTON_IPADY, sticky="ew") - - add_button_label_wrapper.grid_columnconfigure((0,2), weight=1) - add_button_label = CTkLabel( - add_button_label_wrapper, - textvariable=self.view_variable.VAR_LABEL_MIC_WORD_FILTER_ADD_BUTTON, - height=0, - corner_radius=0, - font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.ADD_AND_DELETE_ABLE_LIST__ADD_BUTTON_FONT_SIZE, weight="normal"), - anchor="w", - text_color=self.settings.ctm.LABELS_TEXT_COLOR, - ) - add_button_label.grid(row=0, column=1) - - - def adjustedCommand(): - callFunctionIfCallable(self.view_variable.CALLBACK_SET_MIC_WORD_FILTER, entry_widget.get()) - entry_widget.focus_set() - - bindButtonFunctionAndColor( - target_widgets=[ - add_button, - add_button_label_wrapper, - add_button_label, - ], - enter_color=self.settings.ctm.SB__ADD_AND_DELETE_ABLE_LIST__ADD_BUTTON_HOVERED_COLOR, - leave_color=self.settings.ctm.SB__ADD_AND_DELETE_ABLE_LIST__ADD_BUTTON_COLOR, - clicked_color=self.settings.ctm.SB__ADD_AND_DELETE_ABLE_LIST__ADD_BUTTON_CLICKED_COLOR, - buttonReleasedFunction=lambda _e: adjustedCommand(), - ) - - - return setting_box_frame - - - def _createRowFrame(self, parent_widget, row): - mic_word_filter_item_row_wrapper = CTkFrame(parent_widget, corner_radius=0, fg_color=self.settings.ctm.SB__BG_COLOR, width=0, height=0) - mic_word_filter_item_row_wrapper.grid(row=row, column=0, pady=self.settings.uism.ADD_AND_DELETE_ABLE_LIST__VALUES_BOTTOM_PADY, sticky="nsew") - - return mic_word_filter_item_row_wrapper - - - - def _createValue(self, add_and_delete_able_list_attr_name, parent_row_frame, row, column, mic_word_filter_item): - mic_word_filter_item_wrapper = CTkFrame(parent_row_frame, corner_radius=self.settings.uism.ADD_AND_DELETE_ABLE_LIST__VALUES_CORNER_RADIUS, fg_color=self.settings.ctm.SB__ADD_AND_DELETE_ABLE_LIST_BG_COLOR, width=0, height=0) - mic_word_filter_item_wrapper.grid(row=0, column=column, padx=self.settings.uism.ADD_AND_DELETE_ABLE_LIST__VALUES_LEFT_PADX, sticky="nsew") - setattr(self, f"{row}_{column}", mic_word_filter_item_wrapper) - - - - mic_word_filter_item_wrapper.grid_rowconfigure((0,2), weight=1) - label_widget = CTkLabel( - mic_word_filter_item_wrapper, - text=mic_word_filter_item, - height=0, - corner_radius=0, - font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.ADD_AND_DELETE_ABLE_LIST__VALUES_TEXT_FONT_SIZE, weight="normal"), - anchor="w", - text_color=self.settings.ctm.BASIC_TEXT_COLOR, - ) - - label_widget.grid(row=1, column=0, padx=self.settings.uism.ADD_AND_DELETE_ABLE_LIST__VALUES_TEXT_IPADX, pady=self.settings.uism.ADD_AND_DELETE_ABLE_LIST__VALUES_TEXT_IPADY) - - - if isEven(getLatestHeight(label_widget)) is False: - label_widget.grid( - pady=( - self.settings.uism.ADD_AND_DELETE_ABLE_LIST__VALUES_TEXT_IPADY, - self.settings.uism.ADD_AND_DELETE_ABLE_LIST__VALUES_TEXT_IPADY + 1 - ) - ) - - - if isEven(getLatestWidth(label_widget)) is False: - label_widget.grid( - padx=( - self.settings.uism.ADD_AND_DELETE_ABLE_LIST__VALUES_TEXT_IPADX[0], - self.settings.uism.ADD_AND_DELETE_ABLE_LIST__VALUES_TEXT_IPADX[1] + 1 - ) - ) - - - - def pressedDeleteButtonCommand(_e, delete_button, redo_button): - # overstrike true - label_widget.configure(font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.ADD_AND_DELETE_ABLE_LIST__VALUES_TEXT_FONT_SIZE, weight="normal", overstrike=True)) - # change fg_color - mic_word_filter_item_wrapper.configure(fg_color=self.settings.ctm.SB__ADD_AND_DELETE_ABLE_LIST_DELETED_BG_COLOR) - # change button img to redo button - delete_button.grid_remove() - redo_button.grid() - # callback delete function - callFunctionIfCallable(self.view_variable.CALLBACK_DELETE_MIC_WORD_FILTER, mic_word_filter_item) - - def pressedRedoButtonCommand(_e, delete_button, redo_button): - # overstrike false - label_widget.configure(font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.ADD_AND_DELETE_ABLE_LIST__VALUES_TEXT_FONT_SIZE, weight="normal", overstrike=False)) - # change fg_color - mic_word_filter_item_wrapper.configure(fg_color=self.settings.ctm.SB__ADD_AND_DELETE_ABLE_LIST_BG_COLOR) - # change button img to delete button - redo_button.grid_remove() - delete_button.grid() - # callback add function - callFunctionIfCallable(self.view_variable.CALLBACK_SET_MIC_WORD_FILTER, mic_word_filter_item) - - - - delete_button = createButtonWithImage( - parent_widget=mic_word_filter_item_wrapper, - button_fg_color=self.settings.ctm.SB__ADD_AND_DELETE_ABLE_LIST_BG_COLOR, - button_enter_color=self.settings.ctm.SB__ADD_AND_DELETE_ABLE_LIST__VALUES_ACTION_BUTTON_HOVERED_BG_COLOR, - button_clicked_color=self.settings.ctm.SB__ADD_AND_DELETE_ABLE_LIST__VALUES_ACTION_BUTTON_CLICKED_BG_COLOR, - button_image_file=self.settings.image_file.CANCEL_ICON, - button_image_size=self.settings.uism.ADD_AND_DELETE_ABLE_LIST__VALUES_ACTION_BUTTON_IMG_SIZE, - corner_radius=self.settings.uism.ADD_AND_DELETE_ABLE_LIST__VALUES_ACTION_BUTTON_CORNER_RADIUS, - button_ipadxy=self.settings.uism.ADD_AND_DELETE_ABLE_LIST__VALUES_ACTION_BUTTON_IPADXY, - button_command=lambda _e: pressedDeleteButtonCommand(_e, delete_button, redo_button), - ) - delete_button.grid(row=1, column=1, padx=self.settings.uism.ADD_AND_DELETE_ABLE_LIST__VALUES_ACTION_BUTTON_PADX, sticky="e") - - redo_button = createButtonWithImage( - parent_widget=mic_word_filter_item_wrapper, - button_fg_color=self.settings.ctm.SB__ADD_AND_DELETE_ABLE_LIST_DELETED_BG_COLOR, - button_enter_color=self.settings.ctm.SB__ADD_AND_DELETE_ABLE_LIST__VALUES_DELETED_BUTTON_HOVERED_BG_COLOR, - button_clicked_color=self.settings.ctm.SB__ADD_AND_DELETE_ABLE_LIST__VALUES_DELETED_BUTTON_CLICKED_BG_COLOR, - button_image_file=self.settings.image_file.REDO_ICON, - button_image_size=self.settings.uism.ADD_AND_DELETE_ABLE_LIST__VALUES_ACTION_BUTTON_IMG_SIZE, - corner_radius=self.settings.uism.ADD_AND_DELETE_ABLE_LIST__VALUES_ACTION_BUTTON_CORNER_RADIUS, - button_ipadxy=self.settings.uism.ADD_AND_DELETE_ABLE_LIST__VALUES_ACTION_BUTTON_IPADXY, - button_command=lambda _e: pressedRedoButtonCommand(_e, delete_button, redo_button), - ) - redo_button.grid(row=1, column=1, padx=self.settings.uism.ADD_AND_DELETE_ABLE_LIST__VALUES_ACTION_BUTTON_PADX, sticky="e") - redo_button.grid_remove() - - - partial_pressedRedoButtonCommand = partial(pressedRedoButtonCommand, _e=None, delete_button=delete_button, redo_button=redo_button) - item_data = SimpleNamespace( - label = mic_word_filter_item, - redoFunction = lambda: partial_pressedRedoButtonCommand(), - ) - - - items = self.config_window.sb__widgets[add_and_delete_able_list_attr_name].items - if len(items) == 0: - items.append(item_data) - else: - is_replaced = False - for i, item in enumerate(items): - if item.label == mic_word_filter_item: - items[i] = item_data - is_replaced = True - break - if is_replaced is False: - items.append(item_data) - - - return mic_word_filter_item_wrapper - - - - - def _createPassiveButtonForProgressbarXSlider(self, setting_box_progressbar_x_slider_frame, button_command, button_image_file): - button_wrapper = createButtonWithImage( - parent_widget=setting_box_progressbar_x_slider_frame, - button_fg_color=self.settings.ctm.SB__PROGRESSBAR_X_SLIDER__PASSIVE_BUTTON_COLOR, - button_enter_color=self.settings.ctm.SB__PROGRESSBAR_X_SLIDER__PASSIVE_BUTTON_HOVERED_COLOR, - button_clicked_color=self.settings.ctm.SB__PROGRESSBAR_X_SLIDER__PASSIVE_BUTTON_CLICKED_COLOR, - button_image_file=button_image_file, - button_image_size=self.settings.uism.SB__PROGRESSBAR_X_SLIDER__BUTTON_ICON_SIZE, - button_ipadxy=self.settings.uism.SB__PROGRESSBAR_X_SLIDER__BUTTON_IPADXY, - button_command=button_command, - ) - return button_wrapper - - - - def _createActiveButtonForProgressbarXSlider(self, setting_box_progressbar_x_slider_frame, button_command, button_image_file): - button_wrapper = createButtonWithImage( - parent_widget=setting_box_progressbar_x_slider_frame, - button_fg_color=self.settings.ctm.SB__PROGRESSBAR_X_SLIDER__ACTIVE_BUTTON_COLOR, - button_enter_color=self.settings.ctm.SB__PROGRESSBAR_X_SLIDER__ACTIVE_BUTTON_HOVERED_COLOR, - button_clicked_color=self.settings.ctm.SB__PROGRESSBAR_X_SLIDER__ACTIVE_BUTTON_CLICKED_COLOR, - button_image_file=button_image_file, - button_image_size=self.settings.uism.SB__PROGRESSBAR_X_SLIDER__BUTTON_ICON_SIZE, - button_ipadxy=self.settings.uism.SB__PROGRESSBAR_X_SLIDER__BUTTON_IPADXY, - button_command=button_command, - ) - return button_wrapper - - - - def _createDisabledButtonForProgressbarXSlider(self, setting_box_progressbar_x_slider_frame, button_image_file): - button_wrapper = createButtonWithImage( - parent_widget=setting_box_progressbar_x_slider_frame, - button_fg_color=self.settings.ctm.SB__PROGRESSBAR_X_SLIDER__PASSIVE_BUTTON_DISABLED_COLOR, - button_image_file=button_image_file, - button_image_size=self.settings.uism.SB__PROGRESSBAR_X_SLIDER__BUTTON_ICON_SIZE, - button_ipadxy=self.settings.uism.SB__PROGRESSBAR_X_SLIDER__BUTTON_IPADXY, - no_bind=True, - ) - return button_wrapper \ No newline at end of file diff --git a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_about_vrct/__init__.py b/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_about_vrct/__init__.py deleted file mode 100644 index 61b104ec..00000000 --- a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_about_vrct/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .createSettingBox_AboutVrct import createSettingBox_AboutVrct \ No newline at end of file diff --git a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_about_vrct/about_vrct_store.py b/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_about_vrct/about_vrct_store.py deleted file mode 100644 index f327449c..00000000 --- a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_about_vrct/about_vrct_store.py +++ /dev/null @@ -1,183 +0,0 @@ -poster_showcase_worlds_settings = [ - # トサカひよ - { - "author_name": "tosaka_hiyo", - "data": [ - { "image_file_name": "kokekkopiyopiyo.png", "x_post_num": "1779076974369276014" }, - ] - }, - - # MiuJepang - { - "author_name": "miu_jepang", - "data": [ - { "image_file_name": "ippaidou.png", "x_post_num": "1787801976354513319" }, - { "image_file_name": "nihongokurabu.png", "x_post_num": "1779004631936614893" }, - { "image_file_name": "language_exchange_tervern.png", "x_post_num": "1779749425923150317" }, - { "image_file_name": "japanese_culture_osenbeito.png", "x_post_num": "1788522972409721137" }, - { "image_file_name": "silakan_datang_ke_rumahku.png", "x_post_num": "1788522607631056941" }, - { "image_file_name": "uj_club.png", "x_post_num": "1780791654196388201" }, - { "image_file_name": "sushi_stand_guruguru.png", "x_post_num": "1788523302404952218" }, - { "image_file_name": "sushi_guru_annex.png", "x_post_num": None }, - { "image_file_name": "una_yosh.png", "x_post_num": "1820329216598311065" }, - { "image_file_name": "cam.png", "x_post_num": None }, - ] - }, - - # poposuke_sig - { - "author_name": "poposuke_sig", - "data": [ - { "image_file_name": "usanezumi_shrine2.png", "x_post_num": "1781224020383506649" }, - ] - }, - - # KUROINU_YOUHEI - { - "author_name": "kuroinu_youhei", - "data": [ - { "image_file_name": "kuroinu_work_room.png", "x_post_num": "1779750007564112146" }, - ] - }, - - # いちや_ICHIYA - { - "author_name": "ichiya", - "data": [ - { "image_file_name": "ehon_no_heikousekai.png", "x_post_num": None }, - { "image_file_name": "ehon_no_heikousekai_jimusho.png", "x_post_num": "1780792306976850285" }, - { "image_file_name": "ikoiba.png", "x_post_num": "1782723006923780580" }, - { "image_file_name": "kimodameshi.png", "x_post_num": "1781224391692714133" }, - { "image_file_name": "parallel_collar.png", "x_post_num": "1820693442105934068" }, - ] - }, - - # HayaTikaze - { - "author_name": "haya_tikaze", - "data": [ - { "image_file_name": "study_japanese_world_japanichijou.png", "x_post_num": "1781539871829766550" }, - ] - }, - - # aji_3 - { - "author_name": "aji_3", - "data": [ - { "image_file_name": "yuttari_eikaiwa.png", "x_post_num": "1779002892999078046" }, - ] - }, - - # 八葉そるち - { - "author_name": "yatuha_soruti", - "data": [ - { "image_file_name": "re_yatuha_room.png", "x_post_num": "1779830390435590196" }, - ] - }, - - # chakamoto - { - "author_name": "chakamoto", - "data": [ - { "image_file_name": "chakachaka_multipurpose_room.png", "x_post_num": "1818107831289295065" }, - ] - }, - - # MloYolM (よるむ) - { - "author_name": "yolm", - "data": [ - { "image_file_name": "cafe_cian.png", "x_post_num": "1787802552907739504" }, - ] - }, - - # ミラクル・オルカ - { - "author_name": "miracle_orca", - "data": [ - { "image_file_name": "mamehinata_dogrun.png", "x_post_num": "1782723423179100471" }, - ] - }, - - # いんく(Eenkoo) - { - "author_name": "eenkoo", - "data": [ - { "image_file_name": "tyuuniti_kouryuukai.png", "x_post_num": "1818109101731422617" }, - ] - }, - - # 1ban_meno - { - "author_name": "1ban_meno", - "data": [ - { "image_file_name": "bar_asagao.png", "x_post_num": "1788523857642758370" }, - ] - }, - - # 沈黙静寂 - { - "author_name": "sizudama_sizusabi", - "data": [ - { "image_file_name": "monogatari_meetup.png", "x_post_num": "1781538415789674976" }, - ] - }, - - - # tommie_500 - { - "author_name": "tommie_500", - "data": [ - { "image_file_name": "stretch_club_starting_from_minus.png", "x_post_num": None }, - ] - }, - - # MiMi_Sorahana # VRC日韓交流会 (KRJPEX.1355) - { - "author_name": "mimi_sorahana", - "data": [ - { "image_file_name": "kr_jp_exchange.png", "x_post_num": "1820328755950473668" }, - ] - }, - - # Ein(アイン) - { - "author_name": "ein", - "data": [ - { "image_file_name": "smokerz_guild_v2.png", "x_post_num": None }, - ] - }, - - # KokiM1018 - { - "author_name": "kokim1018", - "data": [ - { "image_file_name": "poker_room_elysion.png", "x_post_num": "1818880695344980208" }, - ] - }, - - # NEET ENGINEER - { - "author_name": "neet_engineer", - "data": [ - { "image_file_name": "japan_street.png", "x_post_num": "1818881593114861924" }, - ] - }, - - # RIKU_VR - { - "author_name": "riku_vr", - "data": [ - { "image_file_name": "celestial_blooms.png", "x_post_num": "1820694531568001061" }, - ] - }, - - # ღKAEDEಇ - { - "author_name": "kaede", - "data": [ - { "image_file_name": "omoshiro_kotoba_asobi_game.png", "x_post_num": None }, - ] - }, -] \ No newline at end of file diff --git a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_about_vrct/createSettingBox_AboutVrct.py b/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_about_vrct/createSettingBox_AboutVrct.py deleted file mode 100644 index aeb2e629..00000000 --- a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_about_vrct/createSettingBox_AboutVrct.py +++ /dev/null @@ -1,587 +0,0 @@ -from random import randint -from types import SimpleNamespace -from customtkinter import CTkFrame, CTkLabel, CTkImage, CTkFont - -from utils import callFunctionIfCallable, splitList -from ......ui_utils import bindButtonFunctionAndColor, animateRotation, bindEnterAndLeaveFunction -from .about_vrct_store import poster_showcase_worlds_settings - -def createSettingBox_AboutVrct(setting_box_wrapper, config_window, settings, view_variable): - setting_box_wrapper.grid_columnconfigure(0, weight=1, minsize=settings.uism.MAIN_AREA_MIN_WIDTH) - about_vrct_uism = settings.about_vrct.uism - ABOUT_VRCT_BG = settings.ctm.ABOUT_VRCT_BG - - - # For padding left. without this, setting_box_wrapper's bg shows... - about_vrct_container_wrapper = CTkFrame(setting_box_wrapper, fg_color=ABOUT_VRCT_BG, corner_radius=0, width=0, height=0) - about_vrct_container_wrapper.grid(column=0, row=0, padx=0, pady=0, sticky="nsew") - about_vrct_container_wrapper.grid_columnconfigure(0, weight=1) - - - about_vrct_container = CTkFrame(about_vrct_container_wrapper, fg_color=ABOUT_VRCT_BG, corner_radius=0, width=0, height=0) - about_vrct_container.grid(column=0, row=0, padx=about_vrct_uism.ABOUT_VRCT_CONTAINER_LEFT_PADX, pady=0, sticky="nsew") - about_vrct_container.grid_columnconfigure(0, weight=1) - - - def createSectionContainer(section_row, section_title_image_file_name:str=None, section_bottom_padding:int=0, section_title_bottom_padding:int=0): - section_container = CTkFrame(about_vrct_container, fg_color=ABOUT_VRCT_BG, corner_radius=0, width=0, height=0) - section_container.grid(column=0, row=section_row, padx=0, pady=(0, section_bottom_padding), sticky="nsew") - section_container.grid_columnconfigure(0, weight=1) - - contents_row=0 - if section_title_image_file_name is not None: - section_title_frame = settings.about_vrct.embedImageCTkLabel(section_container, section_title_image_file_name) - section_title_frame.grid(column=0, row=contents_row, padx=0, pady=(0,section_title_bottom_padding), sticky="nw") - contents_row = 1 - - - - section_contents_wrapper = CTkFrame(section_container, fg_color=ABOUT_VRCT_BG, corner_radius=0, width=0, height=0) - section_contents_wrapper.grid(column=0, row=contents_row, padx=0, pady=0, sticky="nsew") - section_contents_wrapper.grid_columnconfigure(0, weight=1) - - return (section_container, section_contents_wrapper) - - - - def createImageButtonRows(parent_frame, image_buttons_settings:list, bottom_pady, directly_type:str=None, corner_radius:int=0, ipadx:int=0, ipady:int=0): - button_row=0 - setting_length = len(image_buttons_settings) - for index, each_setting in enumerate(image_buttons_settings): - each_button = settings.about_vrct.embedImageButtonCTkLabel( - parent_frame=parent_frame, - image_file_name=each_setting["image_file_name"], - callback=each_setting.get("callback", None), - directly_type=directly_type, - corner_radius=corner_radius, - no_bind=each_setting.get("no_bind", False), - ) - each_button.grid(column=0, row=button_row, padx=0, pady=(0, bottom_pady), sticky="nsew") - each_button.img_label.grid(padx=ipadx, pady=ipady, sticky="nsew") - if index == setting_length-1: - each_button.grid(pady=0) - button_row+=1 - - def createContactButton(parent_frame, image_file_name, callback_arg, fg_color=ABOUT_VRCT_BG): - frame = settings.about_vrct.embedImageButtonCTkLabel( - parent_frame=parent_frame, - image_file_name=image_file_name, - callback=lambda _e: callFunctionIfCallable(view_variable.CALLBACK_OPEN_WEBPAGE_ABOUT_VRCT, callback_arg), - fg_color=fg_color, - hovered_color=fg_color, - clicked_color=fg_color, - ) - return frame - - - - section_row=0 - # The Developers ---------------------------------- - _the_developers, the_developers_contents_wrapper = createSectionContainer( - section_row=section_row, - section_title_image_file_name="dev_section_title.png", - section_bottom_padding=about_vrct_uism.SECTION_BOTTOM_PADY, - section_title_bottom_padding=about_vrct_uism.THE_DEVELOPERS_SECTION_TITLE_BOTTOM_PADY - ) - - dev_misya_label = settings.about_vrct.embedImageCTkLabel(the_developers_contents_wrapper, "dev_misya.png") - dev_misya_label.grid(column=0, row=0, padx=0, pady=0, sticky="nsw") - - dev_misya_x = createContactButton( - parent_frame=dev_misya_label, - image_file_name="dev_x_icon.png", - callback_arg="X_MISYA", - fg_color=settings.ctm.ABOUT_VRCT_DEV_BG - ) - dev_misya_x.place(x=about_vrct_uism.DEVS_MISYA_X_X, y=about_vrct_uism.DEVS_CONTACTS_Y1, anchor="nw") - - dev_misya_github = createContactButton( - parent_frame=dev_misya_label, - image_file_name="dev_github_icon.png", - callback_arg="GITHUB_MISYA", - fg_color=settings.ctm.ABOUT_VRCT_DEV_BG - ) - dev_misya_github.place(x=about_vrct_uism.DEVS_MISYA_GITHUB_X, y=about_vrct_uism.DEVS_CONTACTS_Y1, anchor="nw") - - - - dev_shiina_label = settings.about_vrct.embedImageCTkLabel(the_developers_contents_wrapper, "dev_shiina.png") - dev_shiina_label.grid(column=1, row=0, padx=0, pady=0, sticky="nse") - - dev_shiina_x = createContactButton( - parent_frame=dev_shiina_label, - image_file_name="dev_x_icon.png", - callback_arg="X_SHIINA", - fg_color=settings.ctm.ABOUT_VRCT_DEV_BG - ) - dev_shiina_x.place(x=about_vrct_uism.DEVS_SHIINA_X_X, y=about_vrct_uism.DEVS_CONTACTS_Y1, anchor="nw") - - - section_row+=1 - # Project Links And Logo ---------------------------------- - _project_links_and_logo, project_links_and_logo_contents_wrapper = createSectionContainer( - section_bottom_padding=about_vrct_uism.PROJECT_LINKS_SECTION_BOTTOM_PADDING, - section_row=section_row, - ) - - project_links_and_logo_wrapper = CTkFrame(project_links_and_logo_contents_wrapper, fg_color=ABOUT_VRCT_BG, corner_radius=0, width=0, height=0) - project_links_and_logo_wrapper.grid(column=0, row=0, padx=about_vrct_uism.PROJECT_LINK_CONTENTS_PADX, pady=0, sticky="nsew") - project_links_and_logo_wrapper.grid_columnconfigure(1, weight=1) - - - vrct_logo_label = settings.about_vrct.embedImageCTkLabel(project_links_and_logo_wrapper, "vrct_logo_for_about_vrct.png") - vrct_logo_label.grid(column=0, row=0, padx=0, pady=0, sticky="nsw") - - - project_links_wrapper = CTkFrame(project_links_and_logo_wrapper, fg_color=ABOUT_VRCT_BG, corner_radius=0, width=0, height=0) - project_links_wrapper.grid(column=2, row=0, padx=0, pady=0, sticky="nse") - - project_link_settings = [ - { - "image_file_name": "project_link_booth.png", - "callback": lambda _e: callFunctionIfCallable(view_variable.CALLBACK_OPEN_WEBPAGE_ABOUT_VRCT, "BOOTH") - }, - { - "image_file_name": "project_link_documents.png", - "callback": lambda _e: callFunctionIfCallable(view_variable.CALLBACK_OPEN_WEBPAGE_ABOUT_VRCT, "VRCT_DOCUMENTS") - }, - { - "image_file_name": "project_link_vrct_github.png", - "callback": lambda _e: callFunctionIfCallable(view_variable.CALLBACK_OPEN_WEBPAGE_ABOUT_VRCT, "VRCT_GITHUB") - }, - { - "image_file_name": "project_link_contact_us.png", - "callback": lambda _e: callFunctionIfCallable(view_variable.CALLBACK_OPEN_WEBPAGE_ABOUT_VRCT, "CONTACT_US") - }, - ] - - createImageButtonRows( - parent_frame=project_links_wrapper, - image_buttons_settings=project_link_settings, - bottom_pady=about_vrct_uism.PROJECT_LINK_BOTTOM_PADY, - corner_radius=about_vrct_uism.PROJECT_LINK_CORNER_RADIUS, - ipadx=about_vrct_uism.PROJECT_LINK_ITEM_IPADX, - ipady=about_vrct_uism.PROJECT_LINK_ITEM_IPADY, - ) - - - - - - - section_row+=1 - # Contributors ---------------------------------- - _contributors, contributors_contents_wrapper = createSectionContainer( - section_row=section_row, - section_title_image_file_name="contributors_section_title.png", - section_bottom_padding=about_vrct_uism.SECTION_BOTTOM_PADY, - section_title_bottom_padding=about_vrct_uism.CONTRIBUTORS_SECTION_TITLE_BOTTOM_PADY - ) - - contributors_members = settings.about_vrct.embedImageCTkLabel(contributors_contents_wrapper, "contributors_members.png") - contributors_members.grid(column=0, row=0, padx=0, pady=0, sticky="nsew") - - - - # done_san - contributors_done_san_x = createContactButton( - parent_frame=contributors_members, - image_file_name="contributors_x_icon.png", - callback_arg="X_DONE_SAN", - ) - contributors_done_san_x.place(x=about_vrct_uism.CONTRIBUTORS_DONE_SAN_X_X, y=about_vrct_uism.CONTRIBUTORS_CONTACTS_Y1, anchor="nw") - - # IYA - contributors_iya_x = createContactButton( - parent_frame=contributors_members, - image_file_name="contributors_x_icon.png", - callback_arg="X_IYA", - ) - contributors_iya_x.place(x=about_vrct_uism.CONTRIBUTORS_IYA_X_X, y=about_vrct_uism.CONTRIBUTORS_CONTACTS_Y1, anchor="nw") - - # RERA - contributors_rera_x = createContactButton( - parent_frame=contributors_members, - image_file_name="contributors_x_icon.png", - callback_arg="X_RERA", - ) - contributors_rera_x.place(x=about_vrct_uism.CONTRIBUTORS_RERA_X_X, y=about_vrct_uism.CONTRIBUTORS_CONTACTS_Y1, anchor="nw") - - contributors_rera_github = createContactButton( - parent_frame=contributors_members, - image_file_name="contributors_github_icon.png", - callback_arg="GITHUB_RERA", - ) - contributors_rera_github.place(x=about_vrct_uism.CONTRIBUTORS_RERA_GITHUB_X, y=about_vrct_uism.CONTRIBUTORS_CONTACTS_Y1, anchor="nw") - - - # POPOSUKE - contributors_poposuke_x = createContactButton( - parent_frame=contributors_members, - image_file_name="contributors_x_icon.png", - callback_arg="X_POPOSUKE", - ) - contributors_poposuke_x.place(x=about_vrct_uism.CONTRIBUTORS_POPOSUKE_X_X, y=about_vrct_uism.CONTRIBUTORS_CONTACTS_Y2, anchor="nw") - - # KUMAGUMA - contributors_kumaguma_x = createContactButton( - parent_frame=contributors_members, - image_file_name="contributors_x_icon.png", - callback_arg="X_KUMAGUMA", - ) - contributors_kumaguma_x.place(x=about_vrct_uism.CONTRIBUTORS_KUMAGUMA_X_X, y=about_vrct_uism.CONTRIBUTORS_CONTACTS_Y2, anchor="nw") - - - - - - - section_row+=1 - # Localization ---------------------------------- - _localization, localization_contents_wrapper = createSectionContainer( - section_row=section_row, - section_title_image_file_name="localization_title.png", - section_bottom_padding=about_vrct_uism.SECTION_BOTTOM_PADY, - section_title_bottom_padding=about_vrct_uism.LOCALIZATION_TITLE_BOTTOM_PADY - ) - - localization_members = settings.about_vrct.embedImageCTkLabel(localization_contents_wrapper, "localization_members.png") - localization_members.grid(column=0, row=0, padx=0, pady=0, sticky="nsew") - - - - section_row+=1 - # Special Thanks & Supporters ---------------------------------- - _special_thanks, special_thanks_contents_wrapper = createSectionContainer( - section_row=section_row, - section_title_image_file_name="special_thanks_section_title.png", - section_bottom_padding=about_vrct_uism.SECTION_BOTTOM_PADY, - section_title_bottom_padding=about_vrct_uism.SPECIAL_THANKS_SECTION_TITLE_BOTTOM_PADY - ) - - special_thanks_members = settings.about_vrct.embedImageCTkLabel(special_thanks_contents_wrapper, "special_thanks_members.png") - special_thanks_members.grid(column=0, row=0, padx=0, pady=(0,about_vrct_uism.SPECIAL_THANKS_MEMBERS_BOTTOM_PADY), sticky="nsew") - - special_thanks_message = settings.about_vrct.embedImageCTkLabel(special_thanks_contents_wrapper, settings.about_vrct.image_file.SPECIAL_THANKS_MESSAGE) - special_thanks_message.grid(column=0, row=1, padx=0, pady=(0,about_vrct_uism.SPECIAL_THANKS_MESSAGE_BOTTOM_PADY), sticky="nsew") - - - - section_row+=1 - # Special Thanks & Supporters ---------------------------------- - _poster_showcase, poster_showcase_contents_wrapper = createSectionContainer( - section_row=section_row, - section_title_image_file_name="poster_showcase_section_title.png", - section_bottom_padding=about_vrct_uism.SECTION_BOTTOM_PADY, - section_title_bottom_padding=about_vrct_uism.POSTER_SHOWCASE_SECTION_TITLE_BOTTOM_PADY - ) - - poster_showcase_worlds_wrapper = CTkFrame(poster_showcase_contents_wrapper, fg_color=ABOUT_VRCT_BG, corner_radius=0, width=0, height=0) - poster_showcase_worlds_wrapper.grid(column=0, row=0, padx=0, pady=0, sticky="nsew") - poster_showcase_worlds_wrapper.grid_columnconfigure(0, weight=1) - - - poster_showcase_worlds = CTkFrame(poster_showcase_worlds_wrapper, fg_color=ABOUT_VRCT_BG, corner_radius=0, width=0, height=0) - poster_showcase_worlds.grid(column=0, row=0, padx=0, pady=(0,about_vrct_uism.POSTER_SHOWCASE_WORLD_BOTTOM_PADY), sticky="nsew") - poster_showcase_worlds.grid_columnconfigure(0, weight=1) - - - - compounded_poster_showcase_worlds_list = [] - for each_author_settings in poster_showcase_worlds_settings: - for data in each_author_settings["data"]: - if data["x_post_num"] is None: - append_settings = { - "image_file_name": data["image_file_name"], - "no_bind": True, - } - else: - x_post_num = data["x_post_num"] - callback = lambda _e,arg=x_post_num: view_variable.CALLBACK_OPEN_WEBPAGE_ABOUT_VRCT("X_SHIINA_POSTER_SHOWCASE_POST", arg) - append_settings = { - "image_file_name": data["image_file_name"], - "callback": callback, - } - compounded_poster_showcase_worlds_list.append(append_settings) - - result = splitList(compounded_poster_showcase_worlds_list, 8) - poster_showcase_worlds_frame_list = [] - for split_poster_showcase_worlds_settings in result: - poster_showcase_worlds_frame = CTkFrame(poster_showcase_worlds_wrapper, fg_color=ABOUT_VRCT_BG, corner_radius=0, width=0, height=0) - poster_showcase_worlds_frame.grid_columnconfigure(0, weight=1) - - createImageButtonRows( - parent_frame=poster_showcase_worlds_frame, - image_buttons_settings=split_poster_showcase_worlds_settings, - bottom_pady=about_vrct_uism.POSTER_SHOWCASE_WORLD_ITEM_BOTTOM_PADY, - directly_type="showcased_worlds", - corner_radius=about_vrct_uism.POSTER_SHOWCASE_WORLD_CORNER_RADIUS, - ipadx=about_vrct_uism.POSTER_SHOWCASE_WORLD_ITEM_IPADX, - ipady=about_vrct_uism.POSTER_SHOWCASE_WORLD_ITEM_IPADY, - ) - - poster_showcase_worlds_frame_list.append(poster_showcase_worlds_frame) - - - pagination_button_settings = settings.about_vrct.image_file.POSTER_SHOWCASE_WORLD_PAGINATION_BUTTON - - def defineAngles(index): - start_angle = 0 - goal_angle = 90 - if index == 0: - start_angle = 0 - goal_angle = 90 - elif index == 1: - start_angle = 90 - goal_angle = 180 - elif index == 2: - start_angle = 180 - goal_angle = 270 - elif index == 3: - start_angle = 270 - goal_angle = 360 - return(start_angle, goal_angle) - - def toNextPagePosterShowcase(): - current_function_index = view_variable.CALLBACK_ABOUT_VRCT_POSTER_SHOWCASE_CURRENT_PAGE_NUM - view_variable.CALLBACK_ABOUT_VRCT_CHANGE_POSTER_SHOWCASE_WORLD_LIST=None - poster_showcase_worlds_frame_list[current_function_index].grid_remove() - pre_function_index = current_function_index - current_function_index = (current_function_index + 1) % len(poster_showcase_worlds_frame_list) - poster_showcase_worlds_frame_list[current_function_index].grid(column=0, row=0, padx=0, pady=(0,about_vrct_uism.POSTER_SHOWCASE_WORLD_BOTTOM_PADY), sticky="nsew") - view_variable.CALLBACK_ABOUT_VRCT_POSTER_SHOWCASE_CURRENT_PAGE_NUM = current_function_index - - start_angle, goal_angle = defineAngles(pre_function_index) - - animateRotation( - tk_root=config_window, - img_frame=config_window.poster_showcase_pagination_button.img_label, - img=pagination_button_settings.img, - img_width=pagination_button_settings.width, - img_height=pagination_button_settings.height, - start_angle=start_angle, - goal_angle=goal_angle, - duration=0.5, - ) - - view_variable.CALLBACK_ABOUT_VRCT_CHANGE_POSTER_SHOWCASE_WORLD_LIST=toNextPagePosterShowcase - - # Initialize - view_variable.CALLBACK_ABOUT_VRCT_CHANGE_POSTER_SHOWCASE_WORLD_LIST=toNextPagePosterShowcase - - view_variable.CALLBACK_ABOUT_VRCT_POSTER_SHOWCASE_CURRENT_PAGE_NUM = randint(0, len(poster_showcase_worlds_frame_list)-1) - - start_angle, _goal_angle = defineAngles(view_variable.CALLBACK_ABOUT_VRCT_POSTER_SHOWCASE_CURRENT_PAGE_NUM) - - poster_showcase_worlds_frame_list[view_variable.CALLBACK_ABOUT_VRCT_POSTER_SHOWCASE_CURRENT_PAGE_NUM].grid(column=0, row=0, padx=0, pady=(0,about_vrct_uism.POSTER_SHOWCASE_WORLD_BOTTOM_PADY), sticky="nsew") - - poster_showcase_worlds_wrapper.grid_rowconfigure(1, weight=1) - - poster_showcase_pagination_button_wrapper = CTkFrame(poster_showcase_worlds_wrapper, fg_color=ABOUT_VRCT_BG, corner_radius=0, width=0, height=0) - poster_showcase_pagination_button_wrapper.grid(column=0, row=2, padx=0, pady=(0, about_vrct_uism.POSTER_SHOWCASE_WORLD_PAGINATION_BUTTON_BOTTOM_PADY), sticky="nsew") - - - poster_showcase_pagination_button_wrapper.grid_columnconfigure((0,2), weight=1) - config_window.poster_showcase_pagination_button = settings.about_vrct.embedImageButtonCTkLabel( - parent_frame=poster_showcase_pagination_button_wrapper, - image_file_name="poster_showcase_pagination_button.png", - callback=lambda _e: callFunctionIfCallable(view_variable.CALLBACK_ABOUT_VRCT_CHANGE_POSTER_SHOWCASE_WORLD_LIST), - hovered_color="transparent", - clicked_color="transparent", - rotate_angle=-start_angle # for clockwise angle, put negative "-" - ) - config_window.poster_showcase_pagination_button.grid(column=1, row=0, padx=0, pady=0, sticky="nsew") - - - # poster_showcase_pagination_button_wrapper.grid_columnconfigure((0,2), weight=1) - poster_showcase_pagination_button_chato = settings.about_vrct.embedImageButtonCTkLabel( - parent_frame=poster_showcase_pagination_button_wrapper, - image_file_name="poster_showcase_pagination_button_chato.png", - callback=lambda _e: callFunctionIfCallable(view_variable.CALLBACK_ABOUT_VRCT_CHANGE_POSTER_SHOWCASE_WORLD_LIST), - hovered_color="transparent", - clicked_color="transparent", - ) - poster_showcase_pagination_button_chato.place(relx=0.502, rely=0.51, anchor="center") - - pagination_button_chato_settings = settings.about_vrct.image_file.POSTER_SHOWCASE_WORLD_PAGINATION_BUTTON_CHATO - - def rotateChatoAnimation(): - view_variable.CALLBACK_ABOUT_VRCT_CHANGE_POSTER_SHOWCASE_BUTTON_HOVERED = None - - animateRotation( - tk_root=config_window, - img_frame=poster_showcase_pagination_button_chato.img_label, - img=pagination_button_chato_settings.img, - img_width=pagination_button_chato_settings.width, - img_height=pagination_button_chato_settings.height, - start_angle=0, - goal_angle=360, - duration=0.5, - ) - view_variable.CALLBACK_ABOUT_VRCT_CHANGE_POSTER_SHOWCASE_BUTTON_HOVERED = rotateChatoAnimation - - - view_variable.CALLBACK_ABOUT_VRCT_CHANGE_POSTER_SHOWCASE_BUTTON_HOVERED = rotateChatoAnimation - - bindEnterAndLeaveFunction( - target_widgets=[config_window.poster_showcase_pagination_button.img_label,poster_showcase_pagination_button_chato.img_label], - enterFunction=lambda _e: callFunctionIfCallable(view_variable.CALLBACK_ABOUT_VRCT_CHANGE_POSTER_SHOWCASE_BUTTON_HOVERED), - leaveFunction=None, - ) - - - - - poster_container = CTkFrame(poster_showcase_contents_wrapper, fg_color=ABOUT_VRCT_BG, corner_radius=0, width=0, height=0) - poster_container.grid(column=1, row=0, padx=0, pady=0, sticky="nsew") - poster_container.grid_columnconfigure(1, weight=1) - - - poster_images_wrapper = CTkFrame(poster_container, fg_color=ABOUT_VRCT_BG, corner_radius=0, width=0, height=0) - poster_images_wrapper.grid(column=0, row=0, padx=0, pady=(0,about_vrct_uism.POSTER_SHOWCASE_POSTER_IMAGES_BOTTOM_PADY), sticky="nsew") - poster_images_wrapper.grid_columnconfigure(1, weight=1) - - - - - poster_image_arrow_left = settings.about_vrct.embedImageButtonCTkLabel(poster_images_wrapper, "arrow_left.png", lambda _e: callFunctionIfCallable(view_variable.CALLBACK_ABOUT_VRCT_POSTER_PREV_BUTTON)) - poster_image_arrow_left.grid(column=0, row=0, padx=0, pady=0, sticky="nsew") - poster_image_arrow_left.configure(corner_radius=about_vrct_uism.POSTER_CHANGE_BUTTON_CORNER_RADIUS) - - bindButtonFunctionAndColor( - target_widgets=[poster_image_arrow_left], - enter_color=settings.ctm.ABOUT_VRCT_BUTTON_HOVERED_BG_COLOR, - leave_color=ABOUT_VRCT_BG, - clicked_color=settings.ctm.ABOUT_VRCT_BUTTON_CLICKED_BG_COLOR, - buttonReleasedFunction=None, - ) - - - poster_image_frame_settings_list = [ - { - "file_name": "iya_vrct_poster_ja.png", - "poster_type": "poster", - }, - { - "file_name": "iya_vrct_poster_en.png", - "poster_type": "poster", - }, - { - "file_name": "iya_vrct_poster_cn.png", - "poster_type": "poster", - }, - { - "file_name": "iya_vrct_poster_ko.png", - "poster_type": "poster", - }, - { - "file_name": "iya_vrct_manga_ja.png", - "poster_type": "manga", - }, - { - "file_name": "iya_vrct_manga_en.png", - "poster_type": "manga", - }, - { - "file_name": "iya_vrct_manga_ko.png", - "poster_type": "manga", - }, - ] - - poster_frame_list = [] - for poster_frame_settings in poster_image_frame_settings_list: - poster_frame = settings.about_vrct.embedImageCTkLabel(poster_images_wrapper, poster_frame_settings["file_name"], directly_type="vrct_posters") - poster_frame_list.append(poster_frame) - - - - - poster_images_authors_wrapper = CTkFrame(poster_container, fg_color=ABOUT_VRCT_BG, corner_radius=0, width=0, height=0) - poster_images_authors_wrapper.grid(column=0, row=1, padx=0, pady=0, sticky="nsew") - - config_window.poster_images_authors = settings.about_vrct.embedImageCTkLabel(poster_images_authors_wrapper, settings.about_vrct.image_file.POSTER_IMAGES_AUTHOR) - config_window.poster_images_authors_m = settings.about_vrct.embedImageCTkLabel(poster_images_authors_wrapper, settings.about_vrct.image_file.POSTER_IMAGES_AUTHOR_M) - - - - def toPrevPagePosterImage(): - current_function_index = view_variable.CALLBACK_ABOUT_VRCT_POSTER_IMAGE_CURRENT_PAGE_NUM - view_variable.CALLBACK_ABOUT_VRCT_POSTER_PREV_BUTTON=None - view_variable.CALLBACK_ABOUT_VRCT_POSTER_NEXT_BUTTON=None - poster_frame_list[current_function_index].grid_remove() - current_function_index = (current_function_index - 1) % len(poster_frame_list) - poster_frame_list[current_function_index].grid(column=1, row=0, padx=0, pady=0, sticky="nsew") - view_variable.CALLBACK_ABOUT_VRCT_POSTER_IMAGE_CURRENT_PAGE_NUM = current_function_index - - if poster_image_frame_settings_list[current_function_index]["poster_type"] == "poster": - config_window.poster_images_authors_m.grid_remove() - config_window.poster_images_authors.grid(column=0, row=0, padx=0, pady=0, sticky="nsew") - elif poster_image_frame_settings_list[current_function_index]["poster_type"] == "manga": - config_window.poster_images_authors.grid_remove() - config_window.poster_images_authors_m.grid(column=0, row=0, padx=0, pady=0, sticky="nsew") - - view_variable.CALLBACK_ABOUT_VRCT_POSTER_PREV_BUTTON=toPrevPagePosterImage - view_variable.CALLBACK_ABOUT_VRCT_POSTER_NEXT_BUTTON=toNextPagePosterImage - - - - - def toNextPagePosterImage(): - current_function_index = view_variable.CALLBACK_ABOUT_VRCT_POSTER_IMAGE_CURRENT_PAGE_NUM - view_variable.CALLBACK_ABOUT_VRCT_POSTER_PREV_BUTTON=None - view_variable.CALLBACK_ABOUT_VRCT_POSTER_NEXT_BUTTON=None - poster_frame_list[current_function_index].grid_remove() - current_function_index = (current_function_index + 1) % len(poster_frame_list) - poster_frame_list[current_function_index].grid(column=1, row=0, padx=0, pady=0, sticky="nsew") - view_variable.CALLBACK_ABOUT_VRCT_POSTER_IMAGE_CURRENT_PAGE_NUM = current_function_index - - if poster_image_frame_settings_list[current_function_index]["poster_type"] == "poster": - config_window.poster_images_authors_m.grid_remove() - config_window.poster_images_authors.grid(column=0, row=0, padx=0, pady=0, sticky="nsew") - elif poster_image_frame_settings_list[current_function_index]["poster_type"] == "manga": - config_window.poster_images_authors.grid_remove() - config_window.poster_images_authors_m.grid(column=0, row=0, padx=0, pady=0, sticky="nsew") - - - view_variable.CALLBACK_ABOUT_VRCT_POSTER_PREV_BUTTON=toPrevPagePosterImage - view_variable.CALLBACK_ABOUT_VRCT_POSTER_NEXT_BUTTON=toNextPagePosterImage - - - - # Initialize - view_variable.CALLBACK_ABOUT_VRCT_POSTER_PREV_BUTTON=toPrevPagePosterImage - view_variable.CALLBACK_ABOUT_VRCT_POSTER_NEXT_BUTTON=toNextPagePosterImage - - config_window.poster_images_authors.grid(column=0, row=0, padx=0, pady=0, sticky="nsew") - - poster_frame_list[0].grid(column=1, row=0, padx=0, pady=0, sticky="nsew") - - - - - poster_image_arrow_right = settings.about_vrct.embedImageButtonCTkLabel(poster_images_wrapper, "arrow_right.png", lambda _e: callFunctionIfCallable(view_variable.CALLBACK_ABOUT_VRCT_POSTER_NEXT_BUTTON)) - poster_image_arrow_right.grid(column=2, row=0, padx=0, pady=0, sticky="nsew") - poster_image_arrow_right.configure(corner_radius=about_vrct_uism.POSTER_CHANGE_BUTTON_CORNER_RADIUS) - - - bindButtonFunctionAndColor( - target_widgets=[poster_image_arrow_right], - enter_color=settings.ctm.ABOUT_VRCT_BUTTON_HOVERED_BG_COLOR, - leave_color=ABOUT_VRCT_BG, - clicked_color=settings.ctm.ABOUT_VRCT_BUTTON_CLICKED_BG_COLOR, - buttonReleasedFunction=None, - ) - - - - - - section_row+=1 - # VRChat disclaimer ---------------------------------- - vrchat_disclaimer, vrchat_disclaimer_contents_wrapper = createSectionContainer( - section_row=section_row, - ) - - - vrchat_disclaimer_label = settings.about_vrct.embedImageCTkLabel(vrchat_disclaimer_contents_wrapper, "vrchat_disclaimer.png") - vrchat_disclaimer_label.grid(column=0, row=0, padx=0, pady=about_vrct_uism.VRCHAT_DISCLAIMER_SECTION_PADY, sticky="nsew") \ No newline at end of file diff --git a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_advanced_settings/__init__.py b/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_advanced_settings/__init__.py deleted file mode 100644 index 0ceb6231..00000000 --- a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_advanced_settings/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .createSettingBox_AdvancedSettings import createSettingBox_AdvancedSettings \ No newline at end of file diff --git a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_advanced_settings/createSettingBox_AdvancedSettings.py b/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_advanced_settings/createSettingBox_AdvancedSettings.py deleted file mode 100644 index 330adc6e..00000000 --- a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_advanced_settings/createSettingBox_AdvancedSettings.py +++ /dev/null @@ -1,52 +0,0 @@ -from utils import callFunctionIfCallable - -from .._SettingBoxGenerator import _SettingBoxGenerator - -def createSettingBox_AdvancedSettings(setting_box_wrapper, config_window, settings, view_variable): - sbg = _SettingBoxGenerator(setting_box_wrapper, config_window, settings, view_variable) - createSettingBoxEntry = sbg.createSettingBoxEntry - createSettingBoxButtonWithImage = sbg.createSettingBoxButtonWithImage - - - def entryIpAddressCallback(value): - callFunctionIfCallable(view_variable.CALLBACK_SET_OSC_IP_ADDRESS, value) - - def entryPortCallback(value): - callFunctionIfCallable(view_variable.CALLBACK_SET_OSC_PORT, value) - - def openConfigFilepathCallback(): - callFunctionIfCallable(view_variable.CALLBACK_OPEN_FILEPATH_CONFIG_FILE) - - row=0 - config_window.sb__ip_address = createSettingBoxEntry( - for_var_label_text=view_variable.VAR_LABEL_OSC_IP_ADDRESS, - for_var_desc_text=view_variable.VAR_DESC_OSC_IP_ADDRESS, - entry_attr_name="sb__entry_ip_address", - entry_width=settings.uism.RESPONSIVE_UI_SIZE_INT_150, - entry_bind__Any_KeyRelease=lambda value: entryIpAddressCallback(value), - entry_textvariable=view_variable.VAR_OSC_IP_ADDRESS, - ) - config_window.sb__ip_address.grid(row=row) - row+=1 - - - config_window.sb__port = createSettingBoxEntry( - for_var_label_text=view_variable.VAR_LABEL_OSC_PORT, - for_var_desc_text=view_variable.VAR_DESC_OSC_PORT, - entry_attr_name="sb__entry_port", - entry_width=settings.uism.RESPONSIVE_UI_SIZE_INT_150, - entry_bind__Any_KeyRelease=lambda value: entryPortCallback(value), - entry_textvariable=view_variable.VAR_OSC_PORT, - ) - config_window.sb__port.grid(row=row) - row+=1 - - config_window.sb__open_config_filepath = createSettingBoxButtonWithImage( - for_var_label_text=view_variable.VAR_LABEL_OPEN_CONFIG_FILEPATH, - for_var_desc_text=view_variable.VAR_DESC_OPEN_CONFIG_FILEPATH, - button_attr_name="sb__button_open_config_filepath", - button_command=lambda _e: openConfigFilepathCallback(), - button_image=settings.image_file.FOLDER_OPEN_ICON, - ) - config_window.sb__open_config_filepath.grid(row=row, pady=0) - row+=1 \ No newline at end of file diff --git a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_appearance/__init__.py b/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_appearance/__init__.py deleted file mode 100644 index 7dd435d8..00000000 --- a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_appearance/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .createSettingBox_Appearance import createSettingBox_Appearance \ No newline at end of file diff --git a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_appearance/createSettingBox_Appearance.py b/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_appearance/createSettingBox_Appearance.py deleted file mode 100644 index 8eecc9c5..00000000 --- a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_appearance/createSettingBox_Appearance.py +++ /dev/null @@ -1,135 +0,0 @@ -from utils import callFunctionIfCallable - -from .._SettingBoxGenerator import _SettingBoxGenerator - -def createSettingBox_Appearance(setting_box_wrapper, config_window, settings, view_variable): - sbg = _SettingBoxGenerator(setting_box_wrapper, config_window, settings, view_variable) - createSettingBoxDropdownMenu = sbg.createSettingBoxDropdownMenu - createSettingBoxSlider = sbg.createSettingBoxSlider - createSettingBoxCheckbox = sbg.createSettingBoxCheckbox - - - def sliderTransparencyCallback(value): - callFunctionIfCallable(view_variable.CALLBACK_SET_TRANSPARENCY, value) - - def optionmenuAppearanceThemeCallback(value): - callFunctionIfCallable(view_variable.CALLBACK_SET_APPEARANCE, value) - - def optionmenuUiScalingCallback(value): - callFunctionIfCallable(view_variable.CALLBACK_SET_UI_SCALING, value) - - def sliderTextBoxUiScalingCallback(value): - callFunctionIfCallable(view_variable.CALLBACK_SET_TEXTBOX_UI_SCALING, value) - - def sliderMessageBoxRatioCallback(value): - callFunctionIfCallable(view_variable.CALLBACK_SET_MESSAGE_BOX_RATIO, value) - - def optionmenuFontFamilyCallback(value): - callFunctionIfCallable(view_variable.CALLBACK_SET_FONT_FAMILY, value) - - def optionmenuUiLanguageCallback(value): - callFunctionIfCallable(view_variable.CALLBACK_SET_UI_LANGUAGE, value) - - def checkboxEnableRestoreMainWindowGeometryCallback(checkbox_box_widget): - callFunctionIfCallable(view_variable.CALLBACK_SET_ENABLE_RESTORE_MAIN_WINDOW_GEOMETRY, checkbox_box_widget.get()) - - row=0 - config_window.sb__transparency = createSettingBoxSlider( - for_var_label_text=view_variable.VAR_LABEL_TRANSPARENCY, - for_var_desc_text=view_variable.VAR_DESC_TRANSPARENCY, - slider_attr_name="sb__slider_transparency", - slider_range=view_variable.SLIDER_RANGE_TRANSPARENCY, - command=lambda value: sliderTransparencyCallback(value), - variable=view_variable.VAR_TRANSPARENCY, - slider_bind__ButtonPress=view_variable.CALLBACK_BUTTON_PRESS_TRANSPARENCY, - slider_bind__ButtonRelease=view_variable.CALLBACK_BUTTON_RELEASE_TRANSPARENCY, - sliderTooltipFormatter=view_variable.CALLBACK_SLIDER_TOOLTIP_PERCENTAGE_FORMATTER, - ) - config_window.sb__transparency.grid(row=row) - row+=1 - - - config_window.sb__appearance_theme = createSettingBoxDropdownMenu( - for_var_label_text=view_variable.VAR_LABEL_APPEARANCE_THEME, - for_var_desc_text=view_variable.VAR_DESC_APPEARANCE_THEME, - optionmenu_attr_name="sb__optionmenu_appearance_theme", - dropdown_menu_values=view_variable.LIST_APPEARANCE_THEME, - command=lambda value: optionmenuAppearanceThemeCallback(value), - variable=view_variable.VAR_APPEARANCE_THEME, - ) - config_window.sb__appearance_theme.grid(row=row) - row+=1 - - - - config_window.sb__ui_scaling = createSettingBoxDropdownMenu( - for_var_label_text=view_variable.VAR_LABEL_UI_SCALING, - for_var_desc_text=view_variable.VAR_DESC_UI_SCALING, - optionmenu_attr_name="sb__optionmenu_ui_scaling", - dropdown_menu_values=view_variable.LIST_UI_SCALING, - command=lambda value: optionmenuUiScalingCallback(value), - variable=view_variable.VAR_UI_SCALING, - ) - config_window.sb__ui_scaling.grid(row=row) - row+=1 - - config_window.sb__textbox_uis_scaling = createSettingBoxSlider( - for_var_label_text=view_variable.VAR_LABEL_TEXTBOX_UI_SCALING, - for_var_desc_text=view_variable.VAR_DESC_TEXTBOX_UI_SCALING, - slider_attr_name="sb__slider_transparency", - slider_range=view_variable.SLIDER_RANGE_TEXTBOX_UI_SCALING, - command=lambda value: sliderTextBoxUiScalingCallback(value), - variable=view_variable.VAR_TEXTBOX_UI_SCALING, - slider_bind__ButtonPress=view_variable.CALLBACK_BUTTON_PRESS_TEXTBOX_UI_SCALING, - slider_bind__ButtonRelease=view_variable.CALLBACK_BUTTON_RELEASE_TEXTBOX_UI_SCALING, - sliderTooltipFormatter=view_variable.CALLBACK_SLIDER_TOOLTIP_PERCENTAGE_FORMATTER, - ) - config_window.sb__textbox_uis_scaling.grid(row=row) - row+=1 - - config_window.sb__message_box_ratio = createSettingBoxSlider( - for_var_label_text=view_variable.VAR_LABEL_MESSAGE_BOX_RATIO, - for_var_desc_text=view_variable.VAR_DESC_MESSAGE_BOX_RATIO, - slider_attr_name="sb__slider_message_box_ratio", - slider_range=view_variable.SLIDER_RANGE_MESSAGE_BOX_RATIO, - command=lambda value: sliderMessageBoxRatioCallback(value), - variable=view_variable.VAR_MESSAGE_BOX_RATIO, - slider_bind__ButtonPress=view_variable.CALLBACK_BUTTON_PRESS_MESSAGE_BOX_RATIO, - slider_bind__ButtonRelease=view_variable.CALLBACK_BUTTON_RELEASE_MESSAGE_BOX_RATIO, - sliderTooltipFormatter=view_variable.CALLBACK_SLIDER_TOOLTIP_PERCENTAGE_FORMATTER, - ) - config_window.sb__message_box_ratio.grid(row=row) - row+=1 - - config_window.sb__font_family = createSettingBoxDropdownMenu( - for_var_label_text=view_variable.VAR_LABEL_FONT_FAMILY, - for_var_desc_text=view_variable.VAR_DESC_FONT_FAMILY, - optionmenu_attr_name="sb__optionmenu_font_family", - dropdown_menu_values=view_variable.LIST_FONT_FAMILY, - command=lambda value: optionmenuFontFamilyCallback(value), - variable=view_variable.VAR_FONT_FAMILY, - ) - config_window.sb__font_family.grid(row=row) - row+=1 - - - config_window.sb__ui_language = createSettingBoxDropdownMenu( - for_var_label_text=view_variable.VAR_LABEL_UI_LANGUAGE, - for_var_desc_text=view_variable.VAR_DESC_UI_LANGUAGE, - optionmenu_attr_name="sb__optionmenu_ui_language", - dropdown_menu_values=view_variable.LIST_UI_LANGUAGE, - command=lambda value: optionmenuUiLanguageCallback(value), - variable=view_variable.VAR_UI_LANGUAGE, - ) - config_window.sb__ui_language.grid(row=row) - row+=1 - - config_window.sb__enable_restore_main_window_geometry = createSettingBoxCheckbox( - for_var_label_text=view_variable.VAR_LABEL_ENABLE_RESTORE_MAIN_WINDOW_GEOMETRY, - for_var_desc_text=view_variable.VAR_DESC_ENABLE_RESTORE_MAIN_WINDOW_GEOMETRY, - checkbox_attr_name="sb__checkbox_enable_restore_main_window_geometry", - command=lambda: checkboxEnableRestoreMainWindowGeometryCallback(config_window.sb__checkbox_enable_restore_main_window_geometry), - variable=view_variable.VAR_ENABLE_RESTORE_MAIN_WINDOW_GEOMETRY, - ) - config_window.sb__enable_restore_main_window_geometry.grid(row=row, pady=0) - row+=1 \ No newline at end of file diff --git a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_others/__init__.py b/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_others/__init__.py deleted file mode 100644 index 9b7e583c..00000000 --- a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_others/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from .createSettingBox_Others import createSettingBox_Others -from .createSettingBox_Others_SendMessageFormats import createSettingBox_Others_SendMessageFormats -from .createSettingBox_Others_ReceivedMessageFormats import createSettingBox_Others_ReceivedMessageFormats -from .createSettingBox_Others_Additional import createSettingBox_Others_Additional \ No newline at end of file diff --git a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_others/createSettingBox_Others.py b/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_others/createSettingBox_Others.py deleted file mode 100644 index 72391a8a..00000000 --- a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_others/createSettingBox_Others.py +++ /dev/null @@ -1,99 +0,0 @@ -from utils import callFunctionIfCallable - -from .._SettingBoxGenerator import _SettingBoxGenerator - -def createSettingBox_Others(setting_box_wrapper, config_window, settings, view_variable): - sbg = _SettingBoxGenerator(setting_box_wrapper, config_window, settings, view_variable) - createSettingBoxCheckbox = sbg.createSettingBoxCheckbox - createSettingBoxRadioButtons = sbg.createSettingBoxRadioButtons - createSettingBoxAutoExportMessageLogs = sbg.createSettingBoxAutoExportMessageLogs - - - def checkboxAutoClearMessageBoxCallback(checkbox_box_widget): - callFunctionIfCallable(view_variable.CALLBACK_SET_ENABLE_AUTO_CLEAR_MESSAGE_BOX, checkbox_box_widget.get()) - - def checkboxSendOnlyTranslatedMessagesCallback(checkbox_box_widget): - callFunctionIfCallable(view_variable.CALLBACK_SET_ENABLE_SEND_ONLY_TRANSLATED_MESSAGES, checkbox_box_widget.get()) - - def checkboxSendMessageButtonTypeCallback(): - callFunctionIfCallable(view_variable.CALLBACK_SET_SEND_MESSAGE_BUTTON_TYPE, view_variable.VAR_SEND_MESSAGE_BUTTON_TYPE.get()) - - - def checkboxAutoExportMessageLogsCallback(checkbox_box_widget): - callFunctionIfCallable(view_variable.CALLBACK_SET_ENABLE_AUTO_EXPORT_MESSAGE_LOGS, checkbox_box_widget.get()) - - def buttonAutoExportMessageLogsCallback(): - callFunctionIfCallable(view_variable.CALLBACK_OPEN_FILEPATH_LOGS) - - def checkboxVrcMuteSyncCallback(checkbox_box_widget): - callFunctionIfCallable(view_variable.CALLBACK_SET_ENABLE_VRC_MIC_MUTE_SYNC, checkbox_box_widget.get()) - - def checkboxEnableSendMessageToVrcCallback(checkbox_box_widget): - callFunctionIfCallable(view_variable.CALLBACK_SET_ENABLE_SEND_MESSAGE_TO_VRC, checkbox_box_widget.get()) - - - row=0 - config_window.sb__auto_clear_message_box = createSettingBoxCheckbox( - for_var_label_text=view_variable.VAR_LABEL_ENABLE_AUTO_CLEAR_MESSAGE_BOX, - for_var_desc_text=view_variable.VAR_DESC_ENABLE_AUTO_CLEAR_MESSAGE_BOX, - checkbox_attr_name="sb__checkbox_auto_clear_message_box", - command=lambda: checkboxAutoClearMessageBoxCallback(config_window.sb__checkbox_auto_clear_message_box), - variable=view_variable.VAR_ENABLE_AUTO_CLEAR_MESSAGE_BOX, - ) - config_window.sb__auto_clear_message_box.grid(row=row) - row+=1 - - config_window.sb__send_only_translated_messages = createSettingBoxCheckbox( - for_var_label_text=view_variable.VAR_LABEL_ENABLE_SEND_ONLY_TRANSLATED_MESSAGES, - for_var_desc_text=view_variable.VAR_DESC_ENABLE_SEND_ONLY_TRANSLATED_MESSAGES, - checkbox_attr_name="sb__checkbox_send_only_translated_messages", - command=lambda: checkboxSendOnlyTranslatedMessagesCallback(config_window.sb__checkbox_send_only_translated_messages), - variable=view_variable.VAR_ENABLE_SEND_ONLY_TRANSLATED_MESSAGES, - ) - config_window.sb__send_only_translated_messages.grid(row=row) - row+=1 - - config_window.sb__send_message_button_type = createSettingBoxRadioButtons( - for_var_label_text=view_variable.VAR_LABEL_SEND_MESSAGE_BUTTON_TYPE, - for_var_desc_text=view_variable.VAR_DESC_SEND_MESSAGE_BUTTON_TYPE, - radio_button_attr_name="sb__radiobutton_send_message_button_type", - command=lambda: checkboxSendMessageButtonTypeCallback(), - variable=view_variable.VAR_SEND_MESSAGE_BUTTON_TYPE, - radiobutton_keys_values=view_variable.KEYS_VALUES_SEND_MESSAGE_BUTTON_TYPE, - ) - config_window.sb__send_message_button_type.grid(row=row) - row+=1 - - - config_window.sb__auto_export_message_logs = createSettingBoxAutoExportMessageLogs( - for_var_label_text=view_variable.VAR_LABEL_ENABLE_AUTO_EXPORT_MESSAGE_LOGS, - for_var_desc_text=view_variable.VAR_DESC_ENABLE_AUTO_EXPORT_MESSAGE_LOGS, - checkbox_attr_name="sb__checkbox_auto_export_message_logs", - checkbox_command=lambda: checkboxAutoExportMessageLogsCallback(config_window.sb__checkbox_auto_export_message_logs), - button_command=lambda _e: buttonAutoExportMessageLogsCallback(), - variable=view_variable.VAR_ENABLE_AUTO_EXPORT_MESSAGE_LOGS, - ) - config_window.sb__auto_export_message_logs.grid(row=row) - row+=1 - - - config_window.sb__vrc_mic_mute_sync = createSettingBoxCheckbox( - for_var_label_text=view_variable.VAR_LABEL_ENABLE_VRC_MIC_MUTE_SYNC, - for_var_desc_text=view_variable.VAR_DESC_ENABLE_VRC_MIC_MUTE_SYNC, - checkbox_attr_name="sb__checkbox_vrc_mic_mute_sync", - command=lambda: checkboxVrcMuteSyncCallback(config_window.sb__checkbox_vrc_mic_mute_sync), - variable=view_variable.VAR_ENABLE_VRC_MIC_MUTE_SYNC, - ) - config_window.sb__vrc_mic_mute_sync.grid(row=row) - row+=1 - - - config_window.sb__enable_send_message_to_vrc = createSettingBoxCheckbox( - for_var_label_text=view_variable.VAR_LABEL_ENABLE_SEND_MESSAGE_TO_VRC, - for_var_desc_text=view_variable.VAR_DESC_ENABLE_SEND_MESSAGE_TO_VRC, - checkbox_attr_name="sb__checkbox_enable_send_message_to_vrc", - command=lambda: checkboxEnableSendMessageToVrcCallback(config_window.sb__checkbox_enable_send_message_to_vrc), - variable=view_variable.VAR_ENABLE_SEND_MESSAGE_TO_VRC, - ) - config_window.sb__enable_send_message_to_vrc.grid(row=row, pady=0) - row+=1 \ No newline at end of file diff --git a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_others/createSettingBox_Others_Additional.py b/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_others/createSettingBox_Others_Additional.py deleted file mode 100644 index 577ef373..00000000 --- a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_others/createSettingBox_Others_Additional.py +++ /dev/null @@ -1,22 +0,0 @@ -from utils import callFunctionIfCallable - -from .._SettingBoxGenerator import _SettingBoxGenerator - -def createSettingBox_Others_Additional(setting_box_wrapper, config_window, settings, view_variable): - sbg = _SettingBoxGenerator(setting_box_wrapper, config_window, settings, view_variable) - createSettingBoxCheckbox = sbg.createSettingBoxCheckbox - - def checkboxEnableSendReceivedMessageToVrcCallback(checkbox_box_widget): - callFunctionIfCallable(view_variable.CALLBACK_SET_ENABLE_SEND_RECEIVED_MESSAGE_TO_VRC, checkbox_box_widget.get()) - - - row=0 - config_window.sb__enable_send_received_message_to_vrc = createSettingBoxCheckbox( - for_var_label_text=view_variable.VAR_LABEL_ENABLE_SEND_RECEIVED_MESSAGE_TO_VRC, - for_var_desc_text=view_variable.VAR_DESC_ENABLE_SEND_RECEIVED_MESSAGE_TO_VRC, - checkbox_attr_name="sb__checkbox_enable_send_received_message_to_vrc", - command=lambda: checkboxEnableSendReceivedMessageToVrcCallback(config_window.sb__checkbox_enable_send_received_message_to_vrc), - variable=view_variable.VAR_ENABLE_SEND_RECEIVED_MESSAGE_TO_VRC, - ) - config_window.sb__enable_send_received_message_to_vrc.grid(row=row, pady=0) - row+=1 \ No newline at end of file diff --git a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_others/createSettingBox_Others_ReceivedMessageFormats.py b/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_others/createSettingBox_Others_ReceivedMessageFormats.py deleted file mode 100644 index ac8bffa6..00000000 --- a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_others/createSettingBox_Others_ReceivedMessageFormats.py +++ /dev/null @@ -1,65 +0,0 @@ -from utils import callFunctionIfCallable - -from .._SettingBoxGenerator import _SettingBoxGenerator - -def createSettingBox_Others_ReceivedMessageFormats(setting_box_wrapper, config_window, settings, view_variable): - sbg = _SettingBoxGenerator(setting_box_wrapper, config_window, settings, view_variable) - createSettingBox_Labels = sbg.createSettingBox_Labels - createSettingBoxMessageFormatEntries = sbg.createSettingBoxMessageFormatEntries - createSettingBoxMessageFormatEntries_WithTranslation = sbg.createSettingBoxMessageFormatEntries_WithTranslation - - def entryReceivedMessageFormatCallback(value): - callFunctionIfCallable(view_variable.CALLBACK_SET_RECEIVED_MESSAGE_FORMAT, value) - - - def entryReceivedMessageFormatWithTCallback(value): - callFunctionIfCallable(view_variable.CALLBACK_SET_RECEIVED_MESSAGE_FORMAT_WITH_T, value) - - def entrySwapReceivedMessageFormatWithTCallback(_e): - callFunctionIfCallable(view_variable.CALLBACK_SWAP_RECEIVED_MESSAGE_FORMAT_WITH_T_REQUIRED_TEXT) - - row=0 - config_window.sb__received_message_format_labels = createSettingBox_Labels( - for_var_label_text=view_variable.VAR_LABEL_RECEIVED_MESSAGE_FORMAT, - for_var_desc_text=view_variable.VAR_DESC_RECEIVED_MESSAGE_FORMAT, - labels_attr_name="sb__labels_received_message_format", - ) - config_window.sb__received_message_format_labels.grid(row=row, pady=0) - row+=1 - - config_window.sb__received_message_format = createSettingBoxMessageFormatEntries( - base_entry_attr_name="sb__entry_received_message_format", - entry_textvariable_0=view_variable.VAR_ENTRY_0_RECEIVED_MESSAGE_FORMAT, - entry_textvariable_1=view_variable.VAR_ENTRY_1_RECEIVED_MESSAGE_FORMAT, - textvariable_0=view_variable.VAR_TEXT_REQUIRED_0_RECEIVED_MESSAGE_FORMAT, - example_label_textvariable=view_variable.VAR_LABEL_EXAMPLE_TEXT_RECEIVED_MESSAGE_FORMAT, - entry_bind__Any_KeyRelease=lambda value: entryReceivedMessageFormatCallback(value), - entry_bind__FocusOut=view_variable.CALLBACK_FOCUS_OUT_RECEIVED_MESSAGE_FORMAT, - ) - config_window.sb__received_message_format.grid(row=row) - row+=1 - - - - config_window.sb__received_message_format_with_t_labels = createSettingBox_Labels( - for_var_label_text=view_variable.VAR_LABEL_RECEIVED_MESSAGE_FORMAT_WITH_T, - for_var_desc_text=view_variable.VAR_DESC_RECEIVED_MESSAGE_FORMAT_WITH_T, - labels_attr_name="sb__labels_message_format_with_t", - ) - config_window.sb__received_message_format_with_t_labels.grid(row=row, pady=0) - row+=1 - - config_window.sb__received_message_format_with_t = createSettingBoxMessageFormatEntries_WithTranslation( - base_entry_attr_name="sb__entry_received_message_format_with_t", - entry_textvariable_0=view_variable.VAR_ENTRY_0_RECEIVED_MESSAGE_FORMAT_WITH_T, - entry_textvariable_1=view_variable.VAR_ENTRY_1_RECEIVED_MESSAGE_FORMAT_WITH_T, - entry_textvariable_2=view_variable.VAR_ENTRY_2_RECEIVED_MESSAGE_FORMAT_WITH_T, - textvariable_0=view_variable.VAR_TEXT_REQUIRED_0_RECEIVED_MESSAGE_FORMAT_WITH_T, - textvariable_1=view_variable.VAR_TEXT_REQUIRED_1_RECEIVED_MESSAGE_FORMAT_WITH_T, - example_label_textvariable=view_variable.VAR_LABEL_EXAMPLE_TEXT_RECEIVED_MESSAGE_FORMAT_WITH_T, - entry_bind__Any_KeyRelease=lambda value: entryReceivedMessageFormatWithTCallback(value), - swap_button_command=entrySwapReceivedMessageFormatWithTCallback, - entry_bind__FocusOut=view_variable.CALLBACK_FOCUS_OUT_RECEIVED_MESSAGE_FORMAT_WITH_T, - ) - config_window.sb__received_message_format_with_t.grid(row=row, pady=0) - row+=1 \ No newline at end of file diff --git a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_others/createSettingBox_Others_SendMessageFormats.py b/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_others/createSettingBox_Others_SendMessageFormats.py deleted file mode 100644 index 61c89dd2..00000000 --- a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_others/createSettingBox_Others_SendMessageFormats.py +++ /dev/null @@ -1,66 +0,0 @@ -from utils import callFunctionIfCallable - -from .._SettingBoxGenerator import _SettingBoxGenerator - -def createSettingBox_Others_SendMessageFormats(setting_box_wrapper, config_window, settings, view_variable): - sbg = _SettingBoxGenerator(setting_box_wrapper, config_window, settings, view_variable) - createSettingBox_Labels = sbg.createSettingBox_Labels - createSettingBoxMessageFormatEntries = sbg.createSettingBoxMessageFormatEntries - createSettingBoxMessageFormatEntries_WithTranslation = sbg.createSettingBoxMessageFormatEntries_WithTranslation - - def entrySendMessageFormatCallback(value): - callFunctionIfCallable(view_variable.CALLBACK_SET_SEND_MESSAGE_FORMAT, value) - - - def entrySendMessageFormatWithTCallback(value): - callFunctionIfCallable(view_variable.CALLBACK_SET_SEND_MESSAGE_FORMAT_WITH_T, value) - - def entrySwapMessageFormatWithTCallback(_e): - callFunctionIfCallable(view_variable.CALLBACK_SWAP_SEND_MESSAGE_FORMAT_WITH_T_REQUIRED_TEXT) - - - row=0 - config_window.sb__send_message_format_labels = createSettingBox_Labels( - for_var_label_text=view_variable.VAR_LABEL_SEND_MESSAGE_FORMAT, - for_var_desc_text=view_variable.VAR_DESC_SEND_MESSAGE_FORMAT, - labels_attr_name="sb__labels_send_message_format", - ) - config_window.sb__send_message_format_labels.grid(row=row, pady=0) - row+=1 - - config_window.sb__message_format = createSettingBoxMessageFormatEntries( - base_entry_attr_name="sb__entry_send_message_format", - entry_textvariable_0=view_variable.VAR_ENTRY_0_SEND_MESSAGE_FORMAT, - entry_textvariable_1=view_variable.VAR_ENTRY_1_SEND_MESSAGE_FORMAT, - textvariable_0=view_variable.VAR_TEXT_REQUIRED_0_SEND_MESSAGE_FORMAT, - example_label_textvariable=view_variable.VAR_LABEL_EXAMPLE_TEXT_SEND_MESSAGE_FORMAT, - entry_bind__Any_KeyRelease=lambda value: entrySendMessageFormatCallback(value), - entry_bind__FocusOut=view_variable.CALLBACK_FOCUS_OUT_SEND_MESSAGE_FORMAT, - ) - config_window.sb__message_format.grid(row=row) - row+=1 - - - - config_window.sb__send_message_format_with_t_labels = createSettingBox_Labels( - for_var_label_text=view_variable.VAR_LABEL_SEND_MESSAGE_FORMAT_WITH_T, - for_var_desc_text=view_variable.VAR_DESC_SEND_MESSAGE_FORMAT_WITH_T, - labels_attr_name="sb__labels_send_message_format_with_t", - ) - config_window.sb__send_message_format_with_t_labels.grid(row=row, pady=0) - row+=1 - - config_window.sb__message_format_with_t = createSettingBoxMessageFormatEntries_WithTranslation( - base_entry_attr_name="sb__entry_send_message_format_with_t", - entry_textvariable_0=view_variable.VAR_ENTRY_0_SEND_MESSAGE_FORMAT_WITH_T, - entry_textvariable_1=view_variable.VAR_ENTRY_1_SEND_MESSAGE_FORMAT_WITH_T, - entry_textvariable_2=view_variable.VAR_ENTRY_2_SEND_MESSAGE_FORMAT_WITH_T, - textvariable_0=view_variable.VAR_TEXT_REQUIRED_0_SEND_MESSAGE_FORMAT_WITH_T, - textvariable_1=view_variable.VAR_TEXT_REQUIRED_1_SEND_MESSAGE_FORMAT_WITH_T, - example_label_textvariable=view_variable.VAR_LABEL_EXAMPLE_TEXT_SEND_MESSAGE_FORMAT_WITH_T, - entry_bind__Any_KeyRelease=lambda value: entrySendMessageFormatWithTCallback(value), - swap_button_command=entrySwapMessageFormatWithTCallback, - entry_bind__FocusOut=view_variable.CALLBACK_FOCUS_OUT_SEND_MESSAGE_FORMAT_WITH_T, - ) - config_window.sb__message_format_with_t.grid(row=row, pady=0) - row+=1 \ No newline at end of file diff --git a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_transcription/__init__.py b/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_transcription/__init__.py deleted file mode 100644 index b06ff822..00000000 --- a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_transcription/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from .createSettingBox_Mic import createSettingBox_Mic -from .createSettingBox_Speaker import createSettingBox_Speaker -from .createSettingBox_InternalModel import createSettingBox_InternalModel \ No newline at end of file diff --git a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_transcription/createSettingBox_InternalModel.py b/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_transcription/createSettingBox_InternalModel.py deleted file mode 100644 index 0a6b3e69..00000000 --- a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_transcription/createSettingBox_InternalModel.py +++ /dev/null @@ -1,37 +0,0 @@ -from utils import callFunctionIfCallable - -from .._SettingBoxGenerator import _SettingBoxGenerator - -def createSettingBox_InternalModel(setting_box_wrapper, config_window, settings, view_variable): - sbg = _SettingBoxGenerator(setting_box_wrapper, config_window, settings, view_variable) - createSettingBoxSwitch = sbg.createSettingBoxSwitch - createSettingBoxDropdownMenu = sbg.createSettingBoxDropdownMenu - - def switchUseWhisperFeatureCallback(switch_widget): - callFunctionIfCallable(view_variable.CALLBACK_SET_USE_WHISPER_FEATURE, switch_widget.get()) - - def optionmenuWhisperWeightTypeCallback(value): - callFunctionIfCallable(view_variable.CALLBACK_SET_WHISPER_WEIGHT_TYPE, value) - - - row=0 - config_window.sb__use_whisper_feature = createSettingBoxSwitch( - for_var_label_text=view_variable.VAR_LABEL_USE_WHISPER_FEATURE, - for_var_desc_text=view_variable.VAR_DESC_USE_WHISPER_FEATURE, - switch_attr_name="sb__switch_use_whisper_feature", - command=lambda: switchUseWhisperFeatureCallback(config_window.sb__switch_use_whisper_feature), - variable=view_variable.VAR_USE_WHISPER_FEATURE - ) - config_window.sb__use_whisper_feature.grid(row=row, pady=0) - row+=1 - - config_window.sb__whisper_weight_type = createSettingBoxDropdownMenu( - for_var_label_text=view_variable.VAR_LABEL_WHISPER_WEIGHT_TYPE, - for_var_desc_text=view_variable.VAR_DESC_WHISPER_WEIGHT_TYPE, - optionmenu_attr_name="sb__optionmenu_whisper_weight_type", - dropdown_menu_values=view_variable.DICT_WHISPER_WEIGHT_TYPE, - command=lambda value: optionmenuWhisperWeightTypeCallback(value), - variable=view_variable.VAR_WHISPER_WEIGHT_TYPE, - ) - config_window.sb__whisper_weight_type.grid(row=row, pady=0) - row+=1 \ No newline at end of file diff --git a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_transcription/createSettingBox_Mic.py b/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_transcription/createSettingBox_Mic.py deleted file mode 100644 index 50eb8d2e..00000000 --- a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_transcription/createSettingBox_Mic.py +++ /dev/null @@ -1,171 +0,0 @@ -from utils import callFunctionIfCallable - -from .._SettingBoxGenerator import _SettingBoxGenerator - -def createSettingBox_Mic(setting_box_wrapper, config_window, settings, view_variable): - sbg = _SettingBoxGenerator(setting_box_wrapper, config_window, settings, view_variable) - createSettingBoxDropdownMenu = sbg.createSettingBoxDropdownMenu - createSettingBoxSwitch = sbg.createSettingBoxSwitch - createSettingBoxProgressbarXSlider = sbg.createSettingBoxProgressbarXSlider - createSettingBoxEntry = sbg.createSettingBoxEntry - createSettingBoxArrowSwitch = sbg.createSettingBoxArrowSwitch - createSettingBoxAddAndDeleteAbleList = sbg.createSettingBoxAddAndDeleteAbleList - - - def checkboxInputMicThresholdCheckCallback(is_turned_on): - callFunctionIfCallable(view_variable.CALLBACK_CHECK_MIC_THRESHOLD, is_turned_on) - - - def optionmenuMicHostCallback(value): - callFunctionIfCallable(view_variable.CALLBACK_SET_MIC_HOST, value) - - def optionmenuInputMicDeviceCallback(value): - callFunctionIfCallable(view_variable.CALLBACK_SET_MIC_DEVICE, value) - - def sliderInputMicEnergyThresholdCallback(value): - callFunctionIfCallable(view_variable.CALLBACK_SET_MIC_ENERGY_THRESHOLD, value) - - def checkboxInputMicDynamicEnergyThresholdCallback(checkbox_box_widget): - callFunctionIfCallable(view_variable.CALLBACK_SET_MIC_DYNAMIC_ENERGY_THRESHOLD, checkbox_box_widget.get()) - - - def entryInputMicRecordTimeoutCallback(value): - callFunctionIfCallable(view_variable.CALLBACK_SET_MIC_RECORD_TIMEOUT, value) - - def entryInputMicPhraseTimeoutCallback(value): - callFunctionIfCallable(view_variable.CALLBACK_SET_MIC_PHRASE_TIMEOUT, value) - - def entryInputMicMaxPhrasesCallback(value): - callFunctionIfCallable(view_variable.CALLBACK_SET_MIC_MAX_PHRASES, value) - - def arrowSwitchMicWordFilterListOpenCallback(value): - callFunctionIfCallable(view_variable.CALLBACK_ARROW_SWITCH_MIC_WORD_FILTER_LIST_OPEN) - def arrowSwitchMicWordFilterListCloseCallback(value): - callFunctionIfCallable(view_variable.CALLBACK_ARROW_SWITCH_MIC_WORD_FILTER_LIST_CLOSE) - -# 直接 SettingBoxGenerator.pyでcallFunctionIfCallableから呼んでいます。(word filter 専用関数になっているのでそのままですが、良くはない) - # def entry_input_mic_word_filters_callback(value): - # callFunctionIfCallable(view_variable.CALLBACK_SET_MIC_WORD_FILTER, value) - - - row=0 - # Mic Host と Mic Device は一つの項目として引っ付ける予定 - config_window.sb__mic_host = createSettingBoxDropdownMenu( - for_var_label_text=view_variable.VAR_LABEL_MIC_HOST, - for_var_desc_text=view_variable.VAR_DESC_MIC_HOST, - optionmenu_attr_name="sb__optionmenu_mic_host", - dropdown_menu_values=view_variable.LIST_MIC_HOST, - command=lambda value: optionmenuMicHostCallback(value), - variable=view_variable.VAR_MIC_HOST, - ) - config_window.sb__mic_host.grid(row=row) - row+=1 - - config_window.sb__mic_device = createSettingBoxDropdownMenu( - for_var_label_text=view_variable.VAR_LABEL_MIC_DEVICE, - for_var_desc_text=view_variable.VAR_DESC_MIC_DEVICE, - optionmenu_attr_name="sb__optionmenu_mic_device", - dropdown_menu_values=view_variable.LIST_MIC_DEVICE, - command=lambda value: optionmenuInputMicDeviceCallback(value), - variable=view_variable.VAR_MIC_DEVICE, - ) - config_window.sb__mic_device.grid(row=row) - row+=1 - - config_window.sb__mic_dynamic_energy_threshold = createSettingBoxSwitch( - for_var_label_text=view_variable.VAR_LABEL_MIC_DYNAMIC_ENERGY_THRESHOLD, - for_var_desc_text=view_variable.VAR_DESC_MIC_DYNAMIC_ENERGY_THRESHOLD, - switch_attr_name="sb__checkbox_mic_dynamic_energy_threshold", - command=lambda: checkboxInputMicDynamicEnergyThresholdCallback(config_window.sb__checkbox_mic_dynamic_energy_threshold), - variable=view_variable.VAR_MIC_DYNAMIC_ENERGY_THRESHOLD - ) - config_window.sb__mic_dynamic_energy_threshold.grid(row=row, pady=0) - row+=1 - - config_window.sb__mic_energy_threshold = createSettingBoxProgressbarXSlider( - command=sliderInputMicEnergyThresholdCallback, - progressbar_x_slider_attr_name="sb__mic_energy_threshold", - - entry_attr_name="sb__progressbar_x_slider__entry_mic_energy_threshold", - entry_variable=view_variable.VAR_MIC_ENERGY_THRESHOLD__ENTRY, - entry_bind__FocusOut=view_variable.CALLBACK_FOCUS_OUT_MIC_ENERGY_THRESHOLD, - - - slider_attr_name="progressbar_x_slider__slider_mic_energy_threshold", - slider_range=view_variable.SLIDER_RANGE_MIC_ENERGY_THRESHOLD, - slider_variable=view_variable.VAR_MIC_ENERGY_THRESHOLD__SLIDER, - - progressbar_attr_name="sb__progressbar_x_slider__progressbar_mic_energy_threshold", - - passive_button_attr_name="sb__progressbar_x_slider__passive_button_mic_energy_threshold", - passive_button_command=lambda _e: checkboxInputMicThresholdCheckCallback(True), - active_button_attr_name="sb__progressbar_x_slider__active_button_mic_energy_threshold", - active_button_command=lambda _e: checkboxInputMicThresholdCheckCallback(False), - button_image_file=settings.image_file.MIC_ICON, - disabled_button_attr_name="sb__progressbar_x_slider__disabled_button_mic_energy_threshold", - disabled_button_image_file=settings.image_file.MIC_ICON_DISABLED, - ) - config_window.sb__mic_energy_threshold.grid(row=row) - row+=1 - - - # 以下3つも一つの項目にまとめるかもしれない - config_window.sb__mic_record_timeout = createSettingBoxEntry( - for_var_label_text=view_variable.VAR_LABEL_MIC_RECORD_TIMEOUT, - for_var_desc_text=view_variable.VAR_DESC_MIC_RECORD_TIMEOUT, - entry_attr_name="sb__entry_mic_record_timeout", - entry_width=settings.uism.RESPONSIVE_UI_SIZE_INT_100, - entry_bind__Any_KeyRelease=lambda value: entryInputMicRecordTimeoutCallback(value), - entry_textvariable=view_variable.VAR_MIC_RECORD_TIMEOUT, - entry_bind__FocusOut=view_variable.CALLBACK_FOCUS_OUT_MIC_RECORD_TIMEOUT, - ) - config_window.sb__mic_record_timeout.grid(row=row) - row+=1 - - config_window.sb__mic_phrase_timeout = createSettingBoxEntry( - for_var_label_text=view_variable.VAR_LABEL_MIC_PHRASE_TIMEOUT, - for_var_desc_text=view_variable.VAR_DESC_MIC_PHRASE_TIMEOUT, - entry_attr_name="sb__entry_mic_phrase_timeout", - entry_width=settings.uism.RESPONSIVE_UI_SIZE_INT_100, - entry_bind__Any_KeyRelease=lambda value: entryInputMicPhraseTimeoutCallback(value), - entry_textvariable=view_variable.VAR_MIC_PHRASE_TIMEOUT, - entry_bind__FocusOut=view_variable.CALLBACK_FOCUS_OUT_MIC_PHRASE_TIMEOUT, - ) - config_window.sb__mic_phrase_timeout.grid(row=row) - row+=1 - - config_window.sb__mic_max_phrases = createSettingBoxEntry( - for_var_label_text=view_variable.VAR_LABEL_MIC_MAX_PHRASES, - for_var_desc_text=view_variable.VAR_DESC_MIC_MAX_PHRASES, - entry_attr_name="sb__entry_mic_max_phrases", - entry_width=settings.uism.RESPONSIVE_UI_SIZE_INT_100, - entry_bind__Any_KeyRelease=lambda value: entryInputMicMaxPhrasesCallback(value), - entry_textvariable=view_variable.VAR_MIC_MAX_PHRASES, - entry_bind__FocusOut=view_variable.CALLBACK_FOCUS_OUT_MIC_MAX_PHRASES, - ) - config_window.sb__mic_max_phrases.grid(row=row) - row+=1 - # # __________ - - - config_window.sb__mic_word_filter = createSettingBoxArrowSwitch( - for_var_label_text=view_variable.VAR_LABEL_MIC_WORD_FILTER, - for_var_desc_text=view_variable.VAR_DESC_MIC_WORD_FILTER, - arrow_switch_attr_name="sb__arrow_switch_mic_word_filter", - open_command=lambda value: arrowSwitchMicWordFilterListOpenCallback(value), - close_command=lambda value: arrowSwitchMicWordFilterListCloseCallback(value), - var_switch_desc=view_variable.VAR_SWITCH_DESC_MIC_WORD_FILTER, - ) - config_window.sb__mic_word_filter.grid(row=row, pady=0) - row+=1 - - config_window.sb__mic_word_filter_list = createSettingBoxAddAndDeleteAbleList( - add_and_delete_able_list_attr_name="sb__add_and_delete_able_list_mic_word_filter_list", - entry_attr_name="sb__entry_mic_word_filter_list", - entry_width=settings.uism.RESPONSIVE_UI_SIZE_INT_300, - mic_word_filter_list=view_variable.MIC_WORD_FILTER_LIST, - ) - config_window.sb__mic_word_filter_list.grid(row=row, pady=0) - # Default, close the list. - config_window.sb__mic_word_filter_list.grid_remove() - row+=1 \ No newline at end of file diff --git a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_transcription/createSettingBox_Speaker.py b/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_transcription/createSettingBox_Speaker.py deleted file mode 100644 index 402adaa1..00000000 --- a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_transcription/createSettingBox_Speaker.py +++ /dev/null @@ -1,123 +0,0 @@ -from utils import callFunctionIfCallable - -from .._SettingBoxGenerator import _SettingBoxGenerator - -def createSettingBox_Speaker(setting_box_wrapper, config_window, settings, view_variable): - sbg = _SettingBoxGenerator(setting_box_wrapper, config_window, settings, view_variable) - createSettingBoxDropdownMenu = sbg.createSettingBoxDropdownMenu - createSettingBoxSwitch = sbg.createSettingBoxSwitch - createSettingBoxProgressbarXSlider = sbg.createSettingBoxProgressbarXSlider - createSettingBoxEntry = sbg.createSettingBoxEntry - - - def checkboxInputSpeakerThresholdCheckCallback(is_turned_on): - callFunctionIfCallable(view_variable.CALLBACK_CHECK_SPEAKER_THRESHOLD, is_turned_on) - - - def optionmenuInputSpeakerDeviceCallback(value): - callFunctionIfCallable(view_variable.CALLBACK_SET_SPEAKER_DEVICE, value) - - def sliderInputSpeakerEnergyThresholdCallback(value): - callFunctionIfCallable(view_variable.CALLBACK_SET_SPEAKER_ENERGY_THRESHOLD, value) - - def checkboxInputSpeakerDynamicEnergyThresholdCallback(checkbox_box_widget): - callFunctionIfCallable(view_variable.CALLBACK_SET_SPEAKER_DYNAMIC_ENERGY_THRESHOLD, checkbox_box_widget.get()) - - - def entryInputSpeakerRecordTimeoutCallback(value): - callFunctionIfCallable(view_variable.CALLBACK_SET_SPEAKER_RECORD_TIMEOUT, value) - - def entryInputSpeakerPhraseTimeoutCallback(value): - callFunctionIfCallable(view_variable.CALLBACK_SET_SPEAKER_PHRASE_TIMEOUT, value) - - def entryInputSpeakerMaxPhrasesCallback(value): - callFunctionIfCallable(view_variable.CALLBACK_SET_SPEAKER_MAX_PHRASES, value) - - - - row=0 - config_window.sb__speaker_device = createSettingBoxDropdownMenu( - for_var_label_text=view_variable.VAR_LABEL_SPEAKER_DEVICE, - for_var_desc_text=view_variable.VAR_DESC_SPEAKER_DEVICE, - optionmenu_attr_name="sb__optionmenu_speaker_device", - dropdown_menu_values=view_variable.LIST_SPEAKER_DEVICE, - command=lambda value: optionmenuInputSpeakerDeviceCallback(value), - variable=view_variable.VAR_SPEAKER_DEVICE, - ) - config_window.sb__speaker_device.grid(row=row) - row+=1 - - config_window.sb__speaker_dynamic_energy_threshold = createSettingBoxSwitch( - for_var_label_text=view_variable.VAR_LABEL_SPEAKER_DYNAMIC_ENERGY_THRESHOLD, - for_var_desc_text=view_variable.VAR_DESC_SPEAKER_DYNAMIC_ENERGY_THRESHOLD, - switch_attr_name="sb__checkbox_speaker_dynamic_energy_threshold", - command=lambda: checkboxInputSpeakerDynamicEnergyThresholdCallback(config_window.sb__checkbox_speaker_dynamic_energy_threshold), - variable=view_variable.VAR_SPEAKER_DYNAMIC_ENERGY_THRESHOLD, - ) - config_window.sb__speaker_dynamic_energy_threshold.grid(row=row, pady=0) - row+=1 - - config_window.sb__speaker_energy_threshold = createSettingBoxProgressbarXSlider( - command=sliderInputSpeakerEnergyThresholdCallback, - progressbar_x_slider_attr_name="sb__speaker_energy_threshold", - - entry_variable=view_variable.VAR_SPEAKER_ENERGY_THRESHOLD__ENTRY, - entry_attr_name="sb__progressbar_x_slider__entry_speaker_energy_threshold", - entry_bind__FocusOut=view_variable.CALLBACK_FOCUS_OUT_SPEAKER_ENERGY_THRESHOLD, - - - slider_attr_name="progressbar_x_slider__slider_speaker_energy_threshold", - slider_range=view_variable.SLIDER_RANGE_SPEAKER_ENERGY_THRESHOLD, - slider_variable=view_variable.VAR_SPEAKER_ENERGY_THRESHOLD__SLIDER, - - progressbar_attr_name="sb__progressbar_x_slider__progressbar_speaker_energy_threshold", - - passive_button_attr_name="sb__progressbar_x_slider__passive_button_speaker_energy_threshold", - passive_button_command=lambda _e: checkboxInputSpeakerThresholdCheckCallback(True), - active_button_attr_name="sb__progressbar_x_slider__active_button_speaker_energy_threshold", - active_button_command=lambda _e: checkboxInputSpeakerThresholdCheckCallback(False), - button_image_file=settings.image_file.HEADPHONES_ICON, - disabled_button_attr_name="sb__progressbar_x_slider__disabled_button_speaker_energy_threshold", - disabled_button_image_file=settings.image_file.HEADPHONES_ICON_DISABLED, - ) - config_window.sb__speaker_energy_threshold.grid(row=row) - row+=1 - - - # 以下3つも一つの項目にまとめるかもしれない - config_window.sb__speaker_record_timeout = createSettingBoxEntry( - for_var_label_text=view_variable.VAR_LABEL_SPEAKER_RECORD_TIMEOUT, - for_var_desc_text=view_variable.VAR_DESC_SPEAKER_RECORD_TIMEOUT, - entry_attr_name="sb__entry_speaker_record_timeout", - entry_width=settings.uism.RESPONSIVE_UI_SIZE_INT_100, - entry_bind__Any_KeyRelease=lambda value: entryInputSpeakerRecordTimeoutCallback(value), - entry_textvariable=view_variable.VAR_SPEAKER_RECORD_TIMEOUT, - entry_bind__FocusOut=view_variable.CALLBACK_FOCUS_OUT_SPEAKER_RECORD_TIMEOUT, - ) - config_window.sb__speaker_record_timeout.grid(row=row) - row+=1 - - config_window.sb__speaker_phrase_timeout = createSettingBoxEntry( - for_var_label_text=view_variable.VAR_LABEL_SPEAKER_PHRASE_TIMEOUT, - for_var_desc_text=view_variable.VAR_DESC_SPEAKER_PHRASE_TIMEOUT, - entry_attr_name="sb__entry_speaker_phrase_timeout", - entry_width=settings.uism.RESPONSIVE_UI_SIZE_INT_100, - entry_bind__Any_KeyRelease=lambda value: entryInputSpeakerPhraseTimeoutCallback(value), - entry_textvariable=view_variable.VAR_SPEAKER_PHRASE_TIMEOUT, - entry_bind__FocusOut=view_variable.CALLBACK_FOCUS_OUT_SPEAKER_PHRASE_TIMEOUT, - ) - config_window.sb__speaker_phrase_timeout.grid(row=row) - row+=1 - - config_window.sb__speaker_max_phrases = createSettingBoxEntry( - for_var_label_text=view_variable.VAR_LABEL_SPEAKER_MAX_PHRASES, - for_var_desc_text=view_variable.VAR_DESC_SPEAKER_MAX_PHRASES, - entry_attr_name="sb__entry_speaker_max_phrases", - entry_width=settings.uism.RESPONSIVE_UI_SIZE_INT_100, - entry_bind__Any_KeyRelease=lambda value: entryInputSpeakerMaxPhrasesCallback(value), - entry_textvariable=view_variable.VAR_SPEAKER_MAX_PHRASES, - entry_bind__FocusOut=view_variable.CALLBACK_FOCUS_OUT_SPEAKER_MAX_PHRASES, - ) - config_window.sb__speaker_max_phrases.grid(row=row, pady=0) - row+=1 - # __________ \ No newline at end of file diff --git a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_translation/__init__.py b/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_translation/__init__.py deleted file mode 100644 index d965431e..00000000 --- a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_translation/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .createSettingBox_Translation import createSettingBox_Translation \ No newline at end of file diff --git a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_translation/createSettingBox_Translation.py b/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_translation/createSettingBox_Translation.py deleted file mode 100644 index 3350b4d8..00000000 --- a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_translation/createSettingBox_Translation.py +++ /dev/null @@ -1,57 +0,0 @@ -from utils import callFunctionIfCallable - -from .._SettingBoxGenerator import _SettingBoxGenerator - -def createSettingBox_Translation(setting_box_wrapper, config_window, settings, view_variable): - sbg = _SettingBoxGenerator(setting_box_wrapper, config_window, settings, view_variable) - createSettingBoxSwitch = sbg.createSettingBoxSwitch - createSettingBoxDropdownMenu = sbg.createSettingBoxDropdownMenu - createSettingBoxEntry_AuthKey = sbg.createSettingBoxEntry_AuthKey - - def switchUseTranslationFeatureCallback(switch_widget): - callFunctionIfCallable(view_variable.CALLBACK_SET_USE_TRANSLATION_FEATURE, switch_widget.get()) - - def optionmenuCtranslate2WeightTypeCallback(value): - callFunctionIfCallable(view_variable.CALLBACK_SET_CTRANSLATE2_WEIGHT_TYPE, value) - - def deeplAuthKeyCallback(value): - callFunctionIfCallable(view_variable.CALLBACK_SET_DEEPL_AUTH_KEY, value) - - - row=0 - config_window.sb__use_translation_feature = createSettingBoxSwitch( - for_var_label_text=view_variable.VAR_LABEL_USE_TRANSLATION_FEATURE, - for_var_desc_text=view_variable.VAR_DESC_USE_TRANSLATION_FEATURE, - switch_attr_name="sb__switch_use_translation_feature", - command=lambda: switchUseTranslationFeatureCallback(config_window.sb__switch_use_translation_feature), - variable=view_variable.VAR_USE_TRANSLATION_FEATURE - ) - config_window.sb__use_translation_feature.grid(row=row, pady=0) - row+=1 - - config_window.sb__ctranslate2_weight_type = createSettingBoxDropdownMenu( - for_var_label_text=view_variable.VAR_LABEL_CTRANSLATE2_WEIGHT_TYPE, - for_var_desc_text=view_variable.VAR_DESC_CTRANSLATE2_WEIGHT_TYPE, - optionmenu_attr_name="sb__optionmenu_ctranslate2_weight_type", - dropdown_menu_values=view_variable.DICT_CTRANSLATE2_WEIGHT_TYPE, - command=lambda value: optionmenuCtranslate2WeightTypeCallback(value), - variable=view_variable.VAR_CTRANSLATE2_WEIGHT_TYPE, - ) - config_window.sb__ctranslate2_weight_type.grid(row=row) - row+=1 - - - config_window.sb__deepl_auth_key = createSettingBoxEntry_AuthKey( - for_var_label_text=view_variable.VAR_LABEL_DEEPL_AUTH_KEY, - for_var_desc_text=view_variable.VAR_DESC_DEEPL_AUTH_KEY, - entry_attr_name="sb__entry_deepl_auth_key", - entry_width=settings.uism.RESPONSIVE_UI_SIZE_INT_300, - entry_bind__Any_KeyRelease=lambda value: deeplAuthKeyCallback(value), - entry_bind__FocusOut=view_variable.CALLBACK_FOCUS_OUT_DEEPL_AUTH_KEY, - entry_textvariable=view_variable.VAR_DEEPL_AUTH_KEY, - open_authkey_page_command=lambda _e: callFunctionIfCallable(view_variable.CALLBACK_OPEN_WEBPAGE_DEEPL_AUTH_KEY), - open_authkey_text_variable=view_variable.VAR_OPEN_DEEPL_WEB_PAGE, - image_file=settings.image_file.LINK_ICON - ) - config_window.sb__deepl_auth_key.grid(row=row, pady=0) - row+=1 \ No newline at end of file diff --git a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_vr/__init__.py b/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_vr/__init__.py deleted file mode 100644 index 78090aef..00000000 --- a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_vr/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .createSettingBox_Vr import createSettingBox_Vr \ No newline at end of file diff --git a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_vr/createSettingBox_Vr.py b/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_vr/createSettingBox_Vr.py deleted file mode 100644 index d2902cec..00000000 --- a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/setting_box_vr/createSettingBox_Vr.py +++ /dev/null @@ -1,26 +0,0 @@ -from utils import callFunctionIfCallable - -from .._SettingBoxGenerator import _SettingBoxGenerator - -def createSettingBox_Vr(setting_box_wrapper, config_window, settings, view_variable): - sbg = _SettingBoxGenerator(setting_box_wrapper, config_window, settings, view_variable) - createSettingBox_Overlay = sbg.createSettingBox_Overlay - - def switchEnableOverlayUiCallback(switch_widget): - callFunctionIfCallable(view_variable.CALLBACK_SET_ENABLE_OVERLAY_SMALL_LOG, switch_widget.get()) - - def buttonOpenOverlaySettingsWindow(_e): - callFunctionIfCallable(view_variable.CALLBACK_SET_OPEN_OVERLAY_SETTINGS_WINDOW) - - - row=0 - config_window.sb__enable_overlay_small_log = createSettingBox_Overlay( - for_var_label_text=view_variable.VAR_LABEL_ENABLE_OVERLAY_SMALL_LOG, - for_var_desc_text=view_variable.VAR_DESC_ENABLE_OVERLAY_SMALL_LOG, - switch_attr_name="sb__switch_enable_overlay_small_log", - command=lambda: switchEnableOverlayUiCallback(config_window.sb__switch_enable_overlay_small_log), - variable=view_variable.VAR_ENABLE_OVERLAY_SMALL_LOG, - for_var_button_label=view_variable.VAR_OPEN_OVERLAY_SETTINGS_BUTTON, - label_button_clicked_command=buttonOpenOverlaySettingsWindow, - ) - config_window.sb__enable_overlay_small_log.grid(row=row, pady=0) \ No newline at end of file diff --git a/vrct_gui/main_window/__init__.py b/vrct_gui/main_window/__init__.py deleted file mode 100644 index a34b6566..00000000 --- a/vrct_gui/main_window/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .createMainWindowWidgets import createMainWindowWidgets \ No newline at end of file diff --git a/vrct_gui/main_window/createMainWindowWidgets.py b/vrct_gui/main_window/createMainWindowWidgets.py deleted file mode 100644 index 3fb7d105..00000000 --- a/vrct_gui/main_window/createMainWindowWidgets.py +++ /dev/null @@ -1,232 +0,0 @@ -from .widgets import createSidebar, createMinimizeSidebarButton, createTextbox, createEntryMessageBox - -from customtkinter import CTkFrame, CTkLabel, CTkFont, CTkImage - -from utils import callFunctionIfCallable -from ..ui_utils import createButtonWithImage, getImagePath, bindButtonFunctionAndColor - -def createMainWindowWidgets(vrct_gui, settings, view_variable): - vrct_gui.protocol("WM_DELETE_WINDOW", lambda: callFunctionIfCallable(view_variable.CALLBACK_DELETE_MAIN_WINDOW)) - - - vrct_gui.iconbitmap(getImagePath("vrct_logo_mark_black.ico")) - vrct_gui.title("VRCT") - - - # Main Container - vrct_gui.grid_columnconfigure(0, weight=1) - vrct_gui.grid_rowconfigure(0, weight=1) - - vrct_gui.configure(fg_color=settings.ctm.MAIN_BG_COLOR) - - vrct_gui.toplevel_wrapper = CTkFrame(vrct_gui, corner_radius=0, fg_color=settings.ctm.MAIN_BG_COLOR, width=0, height=0) - vrct_gui.toplevel_wrapper.grid(row=0, column=0, sticky="nsew") - vrct_gui.toplevel_wrapper.grid_columnconfigure(1, weight=1) - - - # Main Container - vrct_gui.main_bg_container = CTkFrame(vrct_gui.toplevel_wrapper, corner_radius=0, fg_color=settings.ctm.MAIN_BG_COLOR, width=0, height=0) - vrct_gui.main_bg_container.grid(row=0, column=1, sticky="nsew") - - - # top bar - vrct_gui.main_bg_container.grid_columnconfigure(0, weight=1) - vrct_gui.main_topbar_container = CTkFrame(vrct_gui.main_bg_container, corner_radius=0, fg_color=settings.ctm.MAIN_BG_COLOR, width=0, height=0) - vrct_gui.main_topbar_container.grid(row=0, column=0, sticky="ew") - - - - - - vrct_gui.main_topbar_container.grid_columnconfigure(1,weight=1) - vrct_gui.main_topbar_center_container = CTkFrame(vrct_gui.main_topbar_container, corner_radius=0, fg_color=settings.ctm.MAIN_BG_COLOR, width=0, height=0) - vrct_gui.main_topbar_center_container.grid(row=0, column=1, sticky="nsew") - - - - # Main Top Bar Container - Right Side - # start from 3 - main_topbar_column=3 - - # VRChat Mic Mute Sync Settings Button - vrct_gui.vrc_mic_mute_sync_settings_container = CTkFrame( - vrct_gui.main_topbar_container, - corner_radius=settings.uism.UPDATE_AVAILABLE_BUTTON_CORNER_RADIUS, - fg_color=settings.ctm.MAIN_BG_COLOR, - cursor="hand2", - ) - vrct_gui.vrc_mic_mute_sync_settings_container.grid(row=0, column=main_topbar_column, padx=settings.uism.UPDATE_AVAILABLE_BUTTON_PADX, pady=settings.uism.TOP_BAR_BUTTON_PADY, sticky="nsw") - vrct_gui.vrc_mic_mute_sync_settings_container.grid_rowconfigure((0,3), weight=1) - - vrct_gui.vrc_mic_mute_sync_settings_label = CTkLabel( - vrct_gui.vrc_mic_mute_sync_settings_container, - textvariable=view_variable.VAR_VRC_MIC_MUTE_SYNC_SETTINGS, - height=0, - corner_radius=0, - font=CTkFont(family=settings.FONT_FAMILY, size=settings.uism.QUICK_SETTINGS_BUTTON_FONT_SIZE, weight="normal"), - anchor="e", - text_color=settings.ctm.TOP_BAR_BUTTON_TEXT_COLOR, - # text_color=settings.ctm.UPDATE_AVAILABLE_BUTTON_TEXT_COLOR, - ) - # This "right padx +1" is for fixing a bug that sticks out from the frame. I don't know why that happens... - vrct_gui.vrc_mic_mute_sync_settings_label.grid(row=1, column=1, padx=(0,settings.uism.UPDATE_AVAILABLE_BUTTON_IPADX+1), pady=0) - - - vrct_gui.vrc_mic_mute_sync_settings_state_label = CTkLabel( - vrct_gui.vrc_mic_mute_sync_settings_container, - textvariable=view_variable.VAR_VRC_MIC_MUTE_SYNC_STATE, - height=0, - corner_radius=0, - font=CTkFont(family=settings.FONT_FAMILY, size=settings.uism.QUICK_SETTINGS_BUTTON_STATE_FONT_SIZE, weight="normal"), - anchor="e", - text_color=settings.ctm.TOP_BAR_BUTTON_TEXT_COLOR, - # text_color=settings.ctm.UPDATE_AVAILABLE_BUTTON_TEXT_COLOR, - ) - # This "right padx +1" is for fixing a bug that sticks out from the frame. I don't know why that happens... - vrct_gui.vrc_mic_mute_sync_settings_state_label.grid(row=2, column=1, padx=(0,settings.uism.UPDATE_AVAILABLE_BUTTON_IPADX+1), pady=0) - - - bindButtonFunctionAndColor( - target_widgets=[ - vrct_gui.vrc_mic_mute_sync_settings_container, - vrct_gui.vrc_mic_mute_sync_settings_label, - vrct_gui.vrc_mic_mute_sync_settings_state_label, - ], - enter_color=settings.ctm.TOP_BAR_BUTTON_HOVERED_BG_COLOR, - leave_color=settings.ctm.TOP_BAR_BUTTON_BG_COLOR, - clicked_color=settings.ctm.TOP_BAR_BUTTON_CLICKED_BG_COLOR, - buttonReleasedFunction=lambda e: callFunctionIfCallable(view_variable.CALLBACK_SET_OPEN_VRC_MIC_MUTE_SYNC_SETTINGS_WINDOW), - ) - - - - - - main_topbar_column+=1 - # Overlay Settings Button - vrct_gui.overlay_settings_container = CTkFrame( - vrct_gui.main_topbar_container, - corner_radius=settings.uism.UPDATE_AVAILABLE_BUTTON_CORNER_RADIUS, - fg_color=settings.ctm.MAIN_BG_COLOR, - cursor="hand2", - ) - vrct_gui.overlay_settings_container.grid(row=0, column=main_topbar_column, padx=settings.uism.UPDATE_AVAILABLE_BUTTON_PADX, pady=settings.uism.TOP_BAR_BUTTON_PADY, sticky="nsw") - vrct_gui.overlay_settings_container.grid_rowconfigure((0,3), weight=1) - - vrct_gui.overlay_settings_label = CTkLabel( - vrct_gui.overlay_settings_container, - textvariable=view_variable.VAR_OVERLAY_SETTINGS, - height=0, - corner_radius=0, - font=CTkFont(family=settings.FONT_FAMILY, size=settings.uism.QUICK_SETTINGS_BUTTON_FONT_SIZE, weight="normal"), - anchor="e", - text_color=settings.ctm.TOP_BAR_BUTTON_TEXT_COLOR, - # text_color=settings.ctm.UPDATE_AVAILABLE_BUTTON_TEXT_COLOR, - ) - # This "right padx +1" is for fixing a bug that sticks out from the frame. I don't know why that happens... - vrct_gui.overlay_settings_label.grid(row=1, column=1, padx=(0,settings.uism.UPDATE_AVAILABLE_BUTTON_IPADX+1), pady=0) - - - vrct_gui.overlay_settings_state_label = CTkLabel( - vrct_gui.overlay_settings_container, - textvariable=view_variable.VAR_OVERLAY_SMALL_LOG_STATE, - height=0, - corner_radius=0, - font=CTkFont(family=settings.FONT_FAMILY, size=settings.uism.QUICK_SETTINGS_BUTTON_STATE_FONT_SIZE, weight="normal"), - anchor="e", - text_color=settings.ctm.TOP_BAR_BUTTON_TEXT_COLOR, - ) - # This "right padx +1" is for fixing a bug that sticks out from the frame. I don't know why that happens... - vrct_gui.overlay_settings_state_label.grid(row=2, column=1, padx=(0,settings.uism.UPDATE_AVAILABLE_BUTTON_IPADX+1), pady=0) - - - bindButtonFunctionAndColor( - target_widgets=[ - vrct_gui.overlay_settings_container, - vrct_gui.overlay_settings_label, - vrct_gui.overlay_settings_state_label, - ], - enter_color=settings.ctm.TOP_BAR_BUTTON_HOVERED_BG_COLOR, - leave_color=settings.ctm.TOP_BAR_BUTTON_BG_COLOR, - clicked_color=settings.ctm.TOP_BAR_BUTTON_CLICKED_BG_COLOR, - buttonReleasedFunction=lambda e: callFunctionIfCallable(view_variable.CALLBACK_SET_OPEN_OVERLAY_SETTINGS_WINDOW), - ) - - - - - main_topbar_column+=1 - # Update Available Button - vrct_gui.update_available_container = CTkFrame( - vrct_gui.main_topbar_container, - corner_radius=settings.uism.UPDATE_AVAILABLE_BUTTON_CORNER_RADIUS, - fg_color=settings.ctm.MAIN_BG_COLOR, - cursor="hand2", - ) - vrct_gui.update_available_container.grid(row=0, column=main_topbar_column, padx=settings.uism.UPDATE_AVAILABLE_BUTTON_PADX, pady=settings.uism.TOP_BAR_BUTTON_PADY, sticky="nse") - vrct_gui.update_available_container.grid_remove() - main_topbar_column+=1 - - - vrct_gui.update_available_container.grid_rowconfigure((0,2), weight=1) - - vrct_gui.update_available_icon = CTkLabel( - vrct_gui.update_available_container, - text=None, - corner_radius=0, - height=0, - image=CTkImage(settings.image_file.REFRESH_UPDATE_ICON.rotate(25), size=settings.uism.UPDATE_AVAILABLE_BUTTON_SIZE) - ) - vrct_gui.update_available_icon.grid(row=1, column=0, padx=(settings.uism.UPDATE_AVAILABLE_BUTTON_IPADX, settings.uism.UPDATE_AVAILABLE_PADX_BETWEEN_LABEL_AND_ICON), pady=0) - - - vrct_gui.update_available_label = CTkLabel( - vrct_gui.update_available_container, - textvariable=view_variable.VAR_UPDATE_AVAILABLE, - height=0, - corner_radius=0, - font=CTkFont(family=settings.FONT_FAMILY, size=settings.uism.UPDATE_AVAILABLE_BUTTON_FONT_SIZE, weight="normal"), - anchor="e", - text_color=settings.ctm.UPDATE_AVAILABLE_BUTTON_TEXT_COLOR, - ) - # This "right padx +1" is for fixing a bug that sticks out from the frame. I don't know why that happens... - vrct_gui.update_available_label.grid(row=1, column=1, padx=(0,settings.uism.UPDATE_AVAILABLE_BUTTON_IPADX+1), pady=0) - - - bindButtonFunctionAndColor( - target_widgets=[ - vrct_gui.update_available_container, - vrct_gui.update_available_label, - vrct_gui.update_available_icon, - ], - enter_color=settings.ctm.TOP_BAR_BUTTON_HOVERED_BG_COLOR, - leave_color=settings.ctm.TOP_BAR_BUTTON_BG_COLOR, - clicked_color=settings.ctm.TOP_BAR_BUTTON_CLICKED_BG_COLOR, - buttonReleasedFunction=lambda e: callFunctionIfCallable(view_variable.CALLBACK_CLICKED_UPDATE_AVAILABLE), - ) - - - - - - # Help and Info button - vrct_gui.help_and_info_button_container = createButtonWithImage( - parent_widget=vrct_gui.main_topbar_container, - button_fg_color=settings.ctm.TOP_BAR_BUTTON_BG_COLOR, - button_enter_color=settings.ctm.TOP_BAR_BUTTON_HOVERED_BG_COLOR, - button_clicked_color=settings.ctm.TOP_BAR_BUTTON_CLICKED_BG_COLOR, - button_image_file=settings.image_file.HELP_ICON, - button_image_size=settings.uism.HELP_AND_INFO_BUTTON_SIZE, - button_ipadxy=settings.uism.HELP_AND_INFO_BUTTON_IPADXY, - button_command=lambda e: callFunctionIfCallable(view_variable.CALLBACK_CLICKED_HELP_AND_INFO), - corner_radius=settings.uism.HELP_AND_INFO_BUTTON_CORNER_RADIUS, - ) - vrct_gui.help_and_info_button_container.grid(row=0, column=main_topbar_column, padx=settings.uism.HELP_AND_INFO_BUTTON_PADX, pady=settings.uism.TOP_BAR_BUTTON_PADY, sticky="e") - main_topbar_column+=1 - createSidebar(settings, vrct_gui, view_variable) - - createMinimizeSidebarButton(settings, vrct_gui, view_variable) - - createTextbox(settings, vrct_gui, view_variable) - - createEntryMessageBox(settings, vrct_gui, view_variable) \ No newline at end of file diff --git a/vrct_gui/main_window/widgets/__init__.py b/vrct_gui/main_window/widgets/__init__.py deleted file mode 100644 index ac037cb8..00000000 --- a/vrct_gui/main_window/widgets/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from .create_sidebar import createSidebar -from .create_minimize_sidebar_button import createMinimizeSidebarButton -from .create_textbox import createTextbox -from .create_entry_message_box import createEntryMessageBox diff --git a/vrct_gui/main_window/widgets/_create_sidebar/__init__.py b/vrct_gui/main_window/widgets/_create_sidebar/__init__.py deleted file mode 100644 index cda02e0d..00000000 --- a/vrct_gui/main_window/widgets/_create_sidebar/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from .createSidebarFeatures import createSidebarFeatures -from .createSidebarLanguagesSettings import createSidebarLanguagesSettings \ No newline at end of file diff --git a/vrct_gui/main_window/widgets/_create_sidebar/createSidebarFeatures.py b/vrct_gui/main_window/widgets/_create_sidebar/createSidebarFeatures.py deleted file mode 100644 index bce4113f..00000000 --- a/vrct_gui/main_window/widgets/_create_sidebar/createSidebarFeatures.py +++ /dev/null @@ -1,287 +0,0 @@ -from functools import partial - -from customtkinter import CTkFont, CTkFrame, CTkLabel, CTkSwitch, CTkImage - -from ....ui_utils import openImageKeepAspectRatio, retag, bindEnterAndLeaveFunction, bindButtonReleaseFunction, bindButtonPressAndReleaseFunction - -from utils import callFunctionIfCallable - -def createSidebarFeatures(settings, main_window, view_variable): - - def toggleSidebarFeatureSelectedMarkIfTurnedOn(is_turned_on, mark_widget): - mark_widget.place(relx=0.85) if is_turned_on else mark_widget.place(relx=-1) - - - def toggleTranslationFeature(): - is_turned_on = main_window.translation_switch_box.get() - callFunctionIfCallable(view_variable.CALLBACK_TOGGLE_TRANSLATION, is_turned_on) - main_window.translation_frame.markToggleManually(is_turned_on=is_turned_on) - - def toggleTranscriptionSendFeature(): - is_turned_on = main_window.transcription_send_switch_box.get() - callFunctionIfCallable(view_variable.CALLBACK_TOGGLE_TRANSCRIPTION_SEND, is_turned_on) - main_window.transcription_send_frame.markToggleManually(is_turned_on=is_turned_on) - - def toggleTranscriptionReceiveFeature(): - is_turned_on = main_window.transcription_receive_switch_box.get() - callFunctionIfCallable(view_variable.CALLBACK_TOGGLE_TRANSCRIPTION_RECEIVE, is_turned_on) - main_window.transcription_receive_frame.markToggleManually(is_turned_on=is_turned_on) - - def toggleForegroundFeature(): - is_turned_on = main_window.foreground_switch_box.get() - callFunctionIfCallable(view_variable.CALLBACK_TOGGLE_FOREGROUND, is_turned_on) - main_window.foreground_frame.markToggleManually(is_turned_on=is_turned_on) - - - - - def changeSidebarFeaturesColorByEvents(ww, event_name): - target_frame_widget = getattr(main_window, ww) - target_compact_mode_frame_widget = getattr(main_window, "compact_mode_"+ww) - if event_name == "enter": - target_frame_widget.configure(fg_color=settings.ctm.SF__HOVERED_BG_COLOR) - target_frame_widget.children["!ctkswitch"].configure(fg_color=settings.ctm.SF__SWITCH_BOX_HOVERED_BG_COLOR, progress_color=settings.ctm.SF__SWITCH_BOX_ACTIVE_HOVERED_BG_COLOR) - target_compact_mode_frame_widget.configure(fg_color=settings.ctm.SF__HOVERED_BG_COLOR) - target_compact_mode_frame_widget.children["!ctkframe"].configure(fg_color=settings.ctm.SF__SELECTED_MARK_ACTIVE_HOVERED_BG_COLOR) - - elif event_name == "leave": - target_frame_widget.configure(fg_color=settings.ctm.SF__BG_COLOR) - target_frame_widget.children["!ctkswitch"].configure(fg_color=settings.ctm.SF__SWITCH_BOX_BG_COLOR, progress_color=settings.ctm.SF__SWITCH_BOX_ACTIVE_BG_COLOR) - target_compact_mode_frame_widget.configure(fg_color=settings.ctm.SF__BG_COLOR) - target_compact_mode_frame_widget.children["!ctkframe"].configure(fg_color=settings.ctm.SF__SELECTED_MARK_ACTIVE_BG_COLOR) - - elif event_name == "button_press": - target_frame_widget.configure(fg_color=settings.ctm.SF__CLICKED_BG_COLOR) - target_frame_widget.children["!ctkswitch"].configure(fg_color=settings.ctm.SF__SWITCH_BOX_CLICKED_BG_COLOR, progress_color=settings.ctm.SF__SWITCH_BOX_ACTIVE_CLICKED_BG_COLOR) - target_compact_mode_frame_widget.configure(fg_color=settings.ctm.SF__CLICKED_BG_COLOR) - target_compact_mode_frame_widget.children["!ctkframe"].configure(fg_color=settings.ctm.SF__SELECTED_MARK_ACTIVE_CLICKED_BG_COLOR) - - elif event_name == "button_release": - target_frame_widget.configure(fg_color=settings.ctm.SF__BG_COLOR) - target_frame_widget.children["!ctkswitch"].configure(fg_color=settings.ctm.SF__SWITCH_BOX_BG_COLOR, progress_color=settings.ctm.SF__SWITCH_BOX_ACTIVE_BG_COLOR) - target_compact_mode_frame_widget.configure(fg_color=settings.ctm.SF__BG_COLOR) - target_compact_mode_frame_widget.children["!ctkframe"].configure(fg_color=settings.ctm.SF__SELECTED_MARK_ACTIVE_BG_COLOR) - - - - - - - - - - (img, width, height) = openImageKeepAspectRatio(settings.image_file.VRCT_LOGO, settings.uism.SF__LOGO_MAX_SIZE) - main_window.sidebar_logo = CTkLabel( - main_window.sidebar_bg_container, - fg_color=settings.ctm.SIDEBAR_BG_COLOR, - text=None, - height=0, - image=CTkImage(img, size=(width,height)) - ) - main_window.sidebar_logo.grid(row=0, column=0, pady=settings.uism.SF__LOGO_PADY) - - # "height-a_s" represents the adjustment in size, and the "pady+a_s/2" indicates a padding increase of 4 pixels to compensate for the reduction. - a_s = settings.uism.SF__LOGO_HEIGHT_FOR_ADJUSTMENT - (img, width, height) = openImageKeepAspectRatio(settings.image_file.VRCT_LOGO_MARK, height-a_s) - main_window.sidebar_compact_mode_logo = CTkLabel( - main_window.sidebar_compact_mode_bg_container, - fg_color=settings.ctm.SIDEBAR_BG_COLOR, - text=None, - height=0, - image=CTkImage(img, size=(width,height)) - ) - main_window.sidebar_compact_mode_logo.grid(row=0, column=0, pady=( - int(settings.uism.SF__LOGO_PADY[0]+a_s/2), - int(settings.uism.SF__LOGO_PADY[1]+a_s/2) - )) - - # Sidebar Features - main_window.sidebar_features_container = CTkFrame(main_window.sidebar_bg_container, corner_radius=0, fg_color="transparent", width=0, height=0) - main_window.sidebar_features_container.grid(row=1, column=0, pady=0, sticky="ew") - main_window.sidebar_features_container.grid_columnconfigure(0, weight=1) - - - - # Sidebar Features Compact Mode - main_window.sidebar_compact_mode_features_container = CTkFrame(main_window.sidebar_compact_mode_bg_container, corner_radius=0, fg_color="transparent", width=0, height=0) - main_window.sidebar_compact_mode_features_container.grid(row=1, column=0, pady=0, sticky="ew") - main_window.sidebar_compact_mode_features_container.grid_columnconfigure(0, weight=1) - - - - sidebar_features_settings = [ - { - "frame_attr_name": "translation_frame", - "command": toggleTranslationFeature, - "switch_box_attr_name": "translation_switch_box", - "toggle_switch_box_command": lambda e: main_window.translation_switch_box.toggle(), - "label_attr_name": "label_translation", - "compact_mode_icon_attr_name": "translation_compact_mode_icon", - "compact_mode_frame_attr_name": "compact_mode_translation_frame", - "selected_mark_attr_name": "translation_selected_mark", - "var_label_text": view_variable.VAR_LABEL_TRANSLATION, - "icon_file": settings.image_file.TRANSLATION_ICON, - }, - { - "frame_attr_name": "transcription_send_frame", - "command": toggleTranscriptionSendFeature, - "switch_box_attr_name": "transcription_send_switch_box", - "toggle_switch_box_command": lambda e: main_window.transcription_send_switch_box.toggle(), - "label_attr_name": "label_transcription_send", - "compact_mode_icon_attr_name": "transcription_send_compact_mode_icon", - "compact_mode_frame_attr_name": "compact_mode_transcription_send_frame", - "selected_mark_attr_name": "transcription_send_selected_mark", - "var_label_text": view_variable.VAR_LABEL_TRANSCRIPTION_SEND, - "icon_file": settings.image_file.MIC_ICON, - }, - { - "frame_attr_name": "transcription_receive_frame", - "command": toggleTranscriptionReceiveFeature, - "switch_box_attr_name": "transcription_receive_switch_box", - "toggle_switch_box_command": lambda e: main_window.transcription_receive_switch_box.toggle(), - "label_attr_name": "label_transcription_receive", - "compact_mode_icon_attr_name": "transcription_receive_compact_mode_icon", - "compact_mode_frame_attr_name": "compact_mode_transcription_receive_frame", - "selected_mark_attr_name": "transcription_receive_selected_mark", - "var_label_text": view_variable.VAR_LABEL_TRANSCRIPTION_RECEIVE, - "icon_file": settings.image_file.HEADPHONES_ICON, - }, - { - "frame_attr_name": "foreground_frame", - "command": toggleForegroundFeature, - "switch_box_attr_name": "foreground_switch_box", - "toggle_switch_box_command": lambda e: main_window.foreground_switch_box.toggle(), - "label_attr_name": "label_foreground", - "compact_mode_icon_attr_name": "foreground_compact_mode_icon", - "compact_mode_frame_attr_name": "compact_mode_foreground_frame", - "selected_mark_attr_name": "foreground_selected_mark", - "var_label_text": view_variable.VAR_LABEL_FOREGROUND, - "icon_file": settings.image_file.FOREGROUND_ICON, - }, - ] - - - - row=0 - for sfs in sidebar_features_settings: - frame_attr_name = sfs["frame_attr_name"] - command = sfs["command"] - switch_box_attr_name = sfs["switch_box_attr_name"] - toggle_switch_box_command = sfs["toggle_switch_box_command"] - label_attr_name = sfs["label_attr_name"] - compact_mode_icon_attr_name = sfs["compact_mode_icon_attr_name"] - compact_mode_frame_attr_name = sfs["compact_mode_frame_attr_name"] - selected_mark_attr_name = sfs["selected_mark_attr_name"] - var_label_text = sfs["var_label_text"] - icon_file = sfs["icon_file"] - - frame_widget = CTkFrame(main_window.sidebar_features_container, corner_radius=0, fg_color=settings.ctm.SF__BG_COLOR, cursor="hand2", width=0, height=0) - setattr(main_window, frame_attr_name, frame_widget) - - frame_widget.grid(row=row, column=0, pady=(0,1), sticky="ew") - frame_widget.grid_columnconfigure(0, weight=1) - - compact_mode_frame_widget = CTkFrame(main_window.sidebar_compact_mode_features_container, corner_radius=0, fg_color=settings.ctm.SF__BG_COLOR, cursor="hand2", width=0, height=0) - setattr(main_window, compact_mode_frame_attr_name, compact_mode_frame_widget) - - compact_mode_frame_widget.grid(row=row, column=0, pady=(0,1), sticky="ew") - compact_mode_frame_widget.grid_columnconfigure(0, weight=1) - - - label_widget = CTkLabel( - frame_widget, - textvariable=var_label_text, - height=0, - corner_radius=0, - font=CTkFont(family=settings.FONT_FAMILY, size=settings.uism.SF__LABEL_FONT_SIZE, weight="normal"), - anchor="w", - text_color=settings.ctm.LABELS_TEXT_COLOR, - ) - setattr(main_window, label_attr_name, label_widget) - - - switch_box_widget = CTkSwitch( - frame_widget, - text=None, - height=0, - width=0, - corner_radius=int(settings.uism.SF__SWITCH_BOX_HEIGHT/2), - border_width=0, - switch_height=settings.uism.SF__SWITCH_BOX_HEIGHT, - switch_width=settings.uism.SF__SWITCH_BOX_WIDTH, - onvalue=True, - offvalue=False, - command=command, - fg_color=settings.ctm.SF__SWITCH_BOX_BG_COLOR, - bg_color=settings.ctm.SF__BG_COLOR, - progress_color=settings.ctm.SF__SWITCH_BOX_ACTIVE_BG_COLOR, - button_color=settings.ctm.SF__SWITCH_BOX_BUTTON_COLOR, - # button_hover_color=settings.ctm.SF__SWITCH_BOX_BUTTON_HOVERED_COLOR, - ) - setattr(main_window, switch_box_attr_name, switch_box_widget) - - - - # for compact mode - compact_mode_icon_widget = CTkLabel( - compact_mode_frame_widget, - text=None, - height=0, - corner_radius=0, - image=CTkImage(icon_file, size=settings.uism.SF__COMPACT_MODE_IMAGE_SIZE), - ) - setattr(main_window, compact_mode_icon_attr_name, compact_mode_icon_widget) - - selected_mark_widget = CTkFrame( - compact_mode_frame_widget, - corner_radius=0, - fg_color=settings.ctm.SF__SELECTED_MARK_ACTIVE_BG_COLOR, - width=settings.uism.SF__SELECTED_MARK_WIDTH, - height=0 - ) - setattr(main_window, selected_mark_attr_name, selected_mark_widget) - - - # Arrange - compact_mode_icon_widget.grid(row=row, column=0, padx=settings.uism.SF__COMPACT_MODE_ICON_PADX, pady=settings.uism.SF__COMPACT_MODE_ICON_PADY) - selected_mark_widget.place(relx=-1, rely=0.5, relheight=0.75, anchor="center") - - label_widget.grid(row=row, column=0, pady=settings.uism.SF__LABELS_IPADY, padx=(settings.uism.SF__LABEL_LEFT_PAD,0), sticky="ew") - switch_box_widget.grid(row=row, column=1, padx=settings.uism.SF__SWITCH_BOX_PADX, sticky="e") - - - # Unbind the event "" originally set up by the widget to manually control it. - switch_box_widget._canvas.unbind("") - switch_box_widget._text_label.unbind("") - - bindButtonReleaseFunction([compact_mode_icon_widget, frame_widget, compact_mode_frame_widget, label_widget, selected_mark_widget, switch_box_widget._canvas, switch_box_widget._bg_canvas], toggle_switch_box_command) - - retag("vrct_"+frame_attr_name, compact_mode_icon_widget, frame_widget, compact_mode_frame_widget, label_widget, selected_mark_widget, switch_box_widget) - - def commonEventFunction(e, event_type): - for ww in e.widget.master.bindtags(): - if ww.startswith("vrct_"): - ww = ww.replace("vrct_", "") - changeSidebarFeaturesColorByEvents(ww, event_type) - break - - def enterFunction(e): - commonEventFunction(e, "enter") - - def leaveFunction(e): - commonEventFunction(e, "leave") - - def buttonPressFunction(e): - commonEventFunction(e, "button_press") - - def buttonReleasedFunction(e): - commonEventFunction(e, "button_release") - - bindEnterAndLeaveFunction([compact_mode_icon_widget, frame_widget, compact_mode_frame_widget, label_widget, selected_mark_widget, switch_box_widget._canvas, switch_box_widget._bg_canvas], enterFunction, leaveFunction) - - bindButtonPressAndReleaseFunction([compact_mode_icon_widget, frame_widget, compact_mode_frame_widget, label_widget, selected_mark_widget, switch_box_widget._canvas, switch_box_widget._bg_canvas], buttonPressFunction, buttonReleasedFunction) - - callback = partial(toggleSidebarFeatureSelectedMarkIfTurnedOn, mark_widget=selected_mark_widget) - frame_widget.markToggleManually = callback - - row+=1 \ No newline at end of file diff --git a/vrct_gui/main_window/widgets/_create_sidebar/createSidebarLanguagesSettings.py b/vrct_gui/main_window/widgets/_create_sidebar/createSidebarLanguagesSettings.py deleted file mode 100644 index d8f37965..00000000 --- a/vrct_gui/main_window/widgets/_create_sidebar/createSidebarLanguagesSettings.py +++ /dev/null @@ -1,379 +0,0 @@ -from customtkinter import CTkFont, CTkFrame, CTkLabel, CTkImage - -from ...._CreateDropdownMenuWindow import _CreateDropdownMenuWindow - -from ....ui_utils import bindEnterAndLeaveColor, bindButtonPressColor, bindButtonReleaseFunction, switchActiveTabAndPassiveTab, switchTabsColor, createOptionMenuBox, bindButtonFunctionAndColor, bindEnterAndLeaveFunction, createLabelButton - -from utils import callFunctionIfCallable - - -def createSidebarLanguagesSettings(settings, main_window, view_variable): - - - def switchActiveAndPassivePresetsTabsColor(target_active_widget): - quick_setting_tabs = [ - getattr(main_window, "sls__presets_button_1"), - getattr(main_window, "sls__presets_button_2"), - getattr(main_window, "sls__presets_button_3") - ] - - switchTabsColor( - target_widget=target_active_widget, - tab_buttons=quick_setting_tabs, - active_bg_color=settings.ctm.SLS__PRESETS_TAB_BG_ACTIVE_COLOR, - active_text_color=settings.ctm.SLS__PRESETS_TAB_ACTIVE_TEXT_COLOR, - passive_bg_color=settings.ctm.SLS__PRESETS_TAB_BG_PASSIVE_COLOR, - passive_text_color=settings.ctm.SLS__PRESETS_TAB_ACTIVE_TEXT_COLOR_PASSIVE - ) - - def switchPresetTabFunction(target_active_widget): - switchActiveAndPassivePresetsTabsColor(target_active_widget) - switchActiveTabAndPassiveTab(target_active_widget, main_window.current_active_preset_tab, main_window.current_active_preset_tab.passive_function, settings.ctm.SLS__PRESETS_TAB_BG_HOVERED_COLOR, settings.ctm.SLS__PRESETS_TAB_BG_CLICKED_COLOR, settings.ctm.SLS__PRESETS_TAB_BG_PASSIVE_COLOR) - main_window.current_active_preset_tab = target_active_widget - - - - def switchToPreset1(e): - callFunctionIfCallable(view_variable.CALLBACK_SELECTED_LANGUAGE_PRESET_TAB, "1") - target_active_widget = getattr(main_window, "sls__presets_button_1") - switchPresetTabFunction(target_active_widget) - - def switchToPreset2(e): - callFunctionIfCallable(view_variable.CALLBACK_SELECTED_LANGUAGE_PRESET_TAB, "2") - target_active_widget = getattr(main_window, "sls__presets_button_2") - switchPresetTabFunction(target_active_widget) - - def switchToPreset3(e): - callFunctionIfCallable(view_variable.CALLBACK_SELECTED_LANGUAGE_PRESET_TAB, "3") - target_active_widget = getattr(main_window, "sls__presets_button_3") - switchPresetTabFunction(target_active_widget) - - - - def createLanguageSettingBox(parent_widget, var_title_text, title_text_attr_name, arrow_img_attr_name, open_selectable_language_window_command, variable): - sls__box = CTkFrame(parent_widget, corner_radius=0, fg_color=settings.ctm.SLS__BOX_BG_COLOR, width=0, height=0) - - sls__box.grid_columnconfigure(1, weight=1) - - sls__box_wrapper = CTkFrame(sls__box, corner_radius=0, fg_color=settings.ctm.SLS__BOX_BG_COLOR, width=0, height=0) - sls__box_wrapper.grid(row=2, column=1, padx=settings.uism.SLS__BOX_IPADX, pady=settings.uism.SLS__BOX_IPADY, sticky="ew") - - sls__box_wrapper.grid_columnconfigure(0, weight=1) - - - sls__box_label_wrapper = CTkFrame(sls__box_wrapper, corner_radius=0, fg_color=settings.ctm.SLS__BOX_BG_COLOR, width=0, height=0) - sls__box_label_wrapper.grid(row=0, column=0) - - sls__box_label_wrapper.grid_columnconfigure((0,2), weight=1) - sls__label = CTkLabel( - sls__box_label_wrapper, - textvariable=var_title_text, - height=0, - font=CTkFont(family=settings.FONT_FAMILY, size=settings.uism.SLS__BOX_SECTION_TITLE_FONT_SIZE, weight="normal"), - text_color=settings.ctm.SLS__BOX_SECTION_TITLE_TEXT_COLOR - ) - sls__label.grid(row=0, column=1, pady=(0,settings.uism.SLS__BOX_SECTION_TITLE_BOTTOM_PADY)) - setattr(main_window, title_text_attr_name, sls__label) - - - - - sls__box_optionmenu_wrapper = CTkFrame(sls__box_wrapper, corner_radius=0, fg_color=settings.ctm.SLS__BOX_BG_COLOR, width=0, height=0) - sls__box_optionmenu_wrapper.grid(row=1, column=0, sticky="ew") - - sls__box_optionmenu_wrapper.grid_columnconfigure(0, weight=1) - (sls__selected_language_box, optionmenu_label_widget, optionmenu_img_widget) = createOptionMenuBox( - parent_widget=sls__box_optionmenu_wrapper, - optionmenu_bg_color=settings.ctm.SLS__OPTIONMENU_BG_COLOR, - optionmenu_hovered_bg_color=settings.ctm.SLS__OPTIONMENU_HOVERED_BG_COLOR, - optionmenu_clicked_bg_color=settings.ctm.SLS__OPTIONMENU_CLICKED_BG_COLOR, - optionmenu_ipadx=(0,0), - optionmenu_ipady=settings.uism.SLS__BOX_OPTION_MENU_IPADY, - variable=variable, - font_family=settings.FONT_FAMILY, - font_size=settings.uism.SLS__BOX_OPTION_MENU_FONT_SIZE, - text_color=settings.ctm.LABELS_TEXT_COLOR, - image_file=settings.image_file.ARROW_LEFT.rotate(180), - image_size=settings.uism.SLS__BOX_OPTION_MENU_ARROW_IMAGE_SIZE, - optionmenu_clicked_command=open_selectable_language_window_command, - - optionmenu_position="center", - setattr_widget=main_window, - image_widget_attr_name=arrow_img_attr_name, - ) - sls__selected_language_box.grid(row=0, column=0, sticky="ew") - - sls__box_optionmenu_wrapper_fix_1px_bug = CTkFrame(optionmenu_label_widget, corner_radius=0, width=0, height=0) - sls__box_optionmenu_wrapper_fix_1px_bug.grid(row=0, column=1, sticky="ns") - - return sls__box - - - - - - # Sidebar Languages Settings, SLS - main_window.sls__container = CTkFrame(main_window.sidebar_bg_container, corner_radius=0, fg_color=settings.ctm.SIDEBAR_BG_COLOR, width=0, height=0) - - main_window.sls__container.grid(row=2, column=0, sticky="new") - - main_window.sls__container.grid_columnconfigure(0, weight=1) - - - main_window.sls__container_title = CTkLabel(main_window.sls__container, - textvariable=view_variable.VAR_LABEL_LANGUAGE_SETTINGS, - height=0, - font=CTkFont(family=settings.FONT_FAMILY, size=settings.uism.SLS__TITLE_FONT_SIZE, weight="normal"), - text_color=settings.ctm.SLS__TITLE_TEXT_COLOR - ) - main_window.sls__container_title.grid(row=0, column=0, pady=settings.uism.SLS__TITLE_PADY, sticky="nsew") - - - - # Presets buttons - main_window.sidebar_bg_container.grid_rowconfigure(2, weight=1) - main_window.sls__presets_buttons_container = CTkFrame(main_window.sls__container, corner_radius=0, fg_color=settings.ctm.SIDEBAR_BG_COLOR, width=0, height=settings.uism.SLS__PRESET_TAB_NUMBER_HEIGHT) - main_window.sls__presets_buttons_container.grid(row=1, column=0, sticky="nsew") - - main_window.sls__presets_buttons_box = CTkFrame(main_window.sls__presets_buttons_container, corner_radius=0, fg_color=settings.ctm.SIDEBAR_BG_COLOR, width=0, height=0) - main_window.sls__presets_buttons_box.place(relwidth=1, relx=0, rely=1.15, anchor="sw") - - main_window.sls__presets_buttons_box.grid_columnconfigure((0,1,2), weight=1) - - - preset_tabs_settings = [ - { - "preset_tab_attr_name": "sls__presets_button_1", - "command": switchToPreset1, - "text": "1", - }, - { - "preset_tab_attr_name": "sls__presets_button_2", - "command": switchToPreset2, - "text": "2", - }, - { - "preset_tab_attr_name": "sls__presets_button_3", - "command": switchToPreset3, - "text": "3", - }, - ] - - column=0 - for preset_tab_settings in preset_tabs_settings: - preset_tab_attr_name = preset_tab_settings["preset_tab_attr_name"] - command = preset_tab_settings["command"] - text = preset_tab_settings["text"] - - setattr( - main_window, - preset_tab_attr_name, - CTkFrame( - main_window.sls__presets_buttons_box, - corner_radius=settings.uism.SLS__PRESET_TAB_NUMBER_CORNER_RADIUS, - fg_color=settings.ctm.SLS__PRESETS_TAB_BG_PASSIVE_COLOR, - width=0, - height=settings.uism.SLS__PRESET_TAB_NUMBER_ADJUSTED_HEIGHT, - cursor="hand2", - ) - ) - parent_widget = getattr(main_window, preset_tab_attr_name) - parent_widget.grid(row=0, column=column, sticky="ew") - - label_widget = CTkLabel( - parent_widget, - text=text, - height=0, - fg_color=settings.ctm.SLS__PRESETS_TAB_BG_PASSIVE_COLOR, - font=CTkFont(family=settings.FONT_FAMILY, size=settings.uism.SLS__PRESET_TAB_NUMBER_FONT_SIZE, weight="bold"), - anchor="center", - text_color=settings.ctm.SLS__PRESETS_TAB_ACTIVE_TEXT_COLOR_PASSIVE - ) - label_widget.place(relx=0.5, rely=0.44, anchor="center") - - - - bindEnterAndLeaveColor([parent_widget, label_widget], settings.ctm.SLS__PRESETS_TAB_BG_HOVERED_COLOR, settings.ctm.SLS__PRESETS_TAB_BG_PASSIVE_COLOR) - bindButtonPressColor([parent_widget, label_widget], settings.ctm.SLS__PRESETS_TAB_BG_CLICKED_COLOR, settings.ctm.SLS__PRESETS_TAB_BG_PASSIVE_COLOR) - - parent_widget.passive_function = command - bindButtonReleaseFunction([parent_widget, label_widget], command) - - column+=1 - - - def callbackOpenSelectableYourLanguageWindow(value): - callFunctionIfCallable(view_variable.CALLBACK_OPEN_SELECTABLE_YOUR_LANGUAGE_WINDOW, value) - - - def callbackOpenSelectableTargetLanguageWindow(value): - callFunctionIfCallable(view_variable.CALLBACK_OPEN_SELECTABLE_TARGET_LANGUAGE_WINDOW, value) - - # Language Settings BOX - main_window.sls__box_frame = CTkFrame(main_window.sls__container, corner_radius=0, fg_color=settings.ctm.SLS__BG_COLOR, width=0, height=0) - main_window.sls__box_frame.grid(row=2, column=0, sticky="ew") - main_window.sls__box_frame.grid_columnconfigure(0, weight=1) - - # Your language - main_window.sls__box_your_language = createLanguageSettingBox( - parent_widget=main_window.sls__box_frame, - var_title_text=view_variable.VAR_LABEL_YOUR_LANGUAGE, - title_text_attr_name="sls__title_text_your_language", - arrow_img_attr_name="sls__arrow_img_your_language", - open_selectable_language_window_command=callbackOpenSelectableYourLanguageWindow, - variable=view_variable.VAR_YOUR_LANGUAGE - ) - main_window.sls__box_your_language.grid(row=2, column=0, pady=(settings.uism.SLS__BOX_TOP_PADY,0),sticky="ew") - - - # Both direction arrow icon - main_window.sls__arrow_direction_box = CTkFrame(main_window.sls__box_frame, corner_radius=0, fg_color=settings.ctm.SLS__BG_COLOR, width=0, height=0) - main_window.sls__arrow_direction_box.grid(row=3, column=0, pady=settings.uism.SLS__BOX_ARROWS_PADY, sticky="ew") - - main_window.sls__arrow_direction_box.grid_columnconfigure((0,2), weight=0, minsize=settings.uism.SLS__BOX_ARROWS_SWAP_BUTTON_PADX) - main_window.sls__arrow_direction_box.grid_columnconfigure(1, weight=1) - - main_window.sls__arrow_direction_swap_box = CTkFrame(main_window.sls__arrow_direction_box, corner_radius=settings.uism.SLS__BOX_ARROWS_SWAP_BUTTON_CORNER_RADIUS, fg_color=settings.ctm.SLS__BG_COLOR, width=0, height=0, cursor="hand2") - main_window.sls__arrow_direction_swap_box.grid(row=0, column=1, ipady=settings.uism.SLS__BOX_ARROWS_SWAP_BUTTON_IPADY, sticky="ew") - - main_window.sls__arrow_direction_swap_box.grid_rowconfigure((0,2), weight=1) - main_window.sls__arrow_direction_swap_box.grid_columnconfigure(1, weight=1) - - main_window.sls__both_direction_up = CTkLabel( - main_window.sls__arrow_direction_swap_box, - text=None, - height=0, - image=CTkImage((settings.image_file.NARROW_ARROW_DOWN).rotate(180),size=settings.uism.SLS__BOX_ARROWS_IMAGE_SIZE) - - ) - main_window.sls__both_direction_up.grid(row=1, column=0, padx=(settings.uism.SLS__BOX_ARROWS_SWAP_BUTTON_IPADX, 0), pady=0) - - main_window.sls__both_direction_desc = CTkLabel( - main_window.sls__arrow_direction_swap_box, - textvariable=view_variable.VAR_LABEL_BOTH_DIRECTION_SWAP_BUTTON, - height=0, - font=CTkFont(family=settings.FONT_FAMILY, size=settings.uism.SLS__BOX_ARROWS_DESC_FONT_SIZE, weight="normal"), - text_color=settings.ctm.SLS__BOX_ARROWS_TEXT_COLOR, - ) - main_window.sls__both_direction_desc.grid(row=1, column=1, padx=settings.uism.SLS__BOX_ARROWS_DESC_PADX) - - main_window.sls__both_direction_down = CTkLabel( - main_window.sls__arrow_direction_swap_box, - text=None, - height=0, - image=CTkImage((settings.image_file.NARROW_ARROW_DOWN).rotate(0),size=settings.uism.SLS__BOX_ARROWS_IMAGE_SIZE) - - ) - main_window.sls__both_direction_down.grid(row=1, column=2, padx=(0, settings.uism.SLS__BOX_ARROWS_SWAP_BUTTON_IPADX)) - - - - def adjustedCommand_ButtonReleased(): - callFunctionIfCallable(view_variable.CALLBACK_SWAP_LANGUAGES) - - bindButtonFunctionAndColor( - target_widgets=[ - main_window.sls__arrow_direction_swap_box, - main_window.sls__both_direction_up, - main_window.sls__both_direction_desc, - main_window.sls__both_direction_down - ], - enter_color=settings.ctm.SLS__BOX_ARROWS_SWAP_BUTTON_HOVERED_COLOR, - leave_color=settings.ctm.SLS__BG_COLOR, - clicked_color=settings.ctm.SLS__BOX_ARROWS_SWAP_BUTTON_CLICKED_COLOR, - buttonReleasedFunction=lambda _e: adjustedCommand_ButtonReleased(), - ) - - - def adjustedCommand_Entered(): - callFunctionIfCallable(view_variable.CALLBACK_ENTERED_SWAP_LANGUAGES_BUTTON) - - def adjustedCommand_Leaved(): - callFunctionIfCallable(view_variable.CALLBACK_LEAVED_SWAP_LANGUAGES_BUTTON) - - bindEnterAndLeaveFunction( - target_widgets=[ - main_window.sls__arrow_direction_swap_box, - main_window.sls__both_direction_up, - main_window.sls__both_direction_desc, - main_window.sls__both_direction_down - ], - enterFunction=lambda _e: adjustedCommand_Entered(), - leaveFunction=lambda _e: adjustedCommand_Leaved(), - ) - - - - # Target language - main_window.sls__box_target_language = createLanguageSettingBox( - parent_widget=main_window.sls__box_frame, - var_title_text=view_variable.VAR_LABEL_TARGET_LANGUAGE, - title_text_attr_name="sls__title_text_target_language", - arrow_img_attr_name="sls__arrow_img_target_language", - open_selectable_language_window_command=callbackOpenSelectableTargetLanguageWindow, - variable=view_variable.VAR_TARGET_LANGUAGE - ) - main_window.sls__box_target_language.grid(row=4, column=0, sticky="ew") - - - - # Set Transcription ON/OFF Indicator Widgets - main_window.sls__box_your_language_mic_status__enabled = CTkLabel( - main_window.sls__box_your_language, - text=None, - height=0, - corner_radius=0, - image=CTkImage(settings.image_file.MIC_ICON_DISABLED, size=settings.uism.SLS__BOX_TRANSCRIPTION_STATUS_IMAGE_SIZE), - ) - - main_window.sls__box_target_language_speaker_status__enabled = CTkLabel( - main_window.sls__box_target_language, - text=None, - height=0, - corner_radius=0, - image=CTkImage(settings.image_file.HEADPHONES_ICON_DISABLED, size=settings.uism.SLS__BOX_TRANSCRIPTION_STATUS_IMAGE_SIZE), - ) - - - - - - main_window.sls__box_translation_optionmenu_wrapper = CTkFrame(main_window.sls__box_frame, corner_radius=0, fg_color=settings.ctm.SLS__BG_COLOR, width=0, height=0) - main_window.sls__box_translation_optionmenu_wrapper.grid(row=5, column=0, pady=settings.uism.SLS__SELECTABLE_TRANSLATION_PADY, sticky="ew") - - main_window.sls__box_translation_optionmenu_wrapper.grid_columnconfigure((0,2), weight=0, minsize=settings.uism.SLS__SELECTABLE_TRANSLATION_MIN_PADX) - main_window.sls__box_translation_optionmenu_wrapper.grid_columnconfigure(1, weight=1) - - - - - def adjustedCommand(value): - callFunctionIfCallable(view_variable.CALLBACK_SELECTED_TRANSLATION_ENGINE, value) - - main_window.translation_engine_dropdown_menu_window.createDropdownMenuBox( - dropdown_menu_widget_id="translation_engine_dropdown_menu", - dropdown_menu_values=[], - command=adjustedCommand, - wrapper_widget=main_window, - attach_widget=main_window.sls__box_translation_optionmenu_wrapper, - ) - - (sls__selected_translation_engine_box, label_button_label_widget) = createLabelButton( - parent_widget=main_window.sls__box_translation_optionmenu_wrapper, - label_button_bg_color=settings.ctm.SLS__BG_COLOR, - label_button_hovered_bg_color=settings.ctm.SLS__OPTIONMENU_HOVERED_BG_COLOR, - label_button_clicked_bg_color=settings.ctm.SLS__OPTIONMENU_CLICKED_BG_COLOR, - label_button_ipadx=settings.uism.SLS__SELECTABLE_TRANSLATION_IPADX, - label_button_ipady=settings.uism.SLS__SELECTABLE_TRANSLATION_IPADY, - variable=view_variable.VAR_SELECTED_TRANSLATION_ENGINE, - font_family=settings.FONT_FAMILY, - font_size=settings.uism.SLS__SELECTABLE_TRANSLATION_FONT_SIZE, - text_color=settings.ctm.LABELS_TEXT_COLOR, - label_button_clicked_command=lambda _e: main_window.translation_engine_dropdown_menu_window.show( - dropdown_menu_widget_id="translation_engine_dropdown_menu" - ), - - label_button_position="center", - ) - sls__selected_translation_engine_box.grid(row=0, column=1, sticky="ew") - diff --git a/vrct_gui/main_window/widgets/create_entry_message_box.py b/vrct_gui/main_window/widgets/create_entry_message_box.py deleted file mode 100644 index d153749e..00000000 --- a/vrct_gui/main_window/widgets/create_entry_message_box.py +++ /dev/null @@ -1,112 +0,0 @@ -from customtkinter import CTkFont, CTkFrame, CTkTextbox, CTkLabel, CTkImage - -from ...ui_utils import bindButtonFunctionAndColor -from utils import callFunctionIfCallable - -def createEntryMessageBox(settings, main_window, view_variable): - main_window.main_entry_message_container = CTkFrame(main_window.main_bg_container, corner_radius=settings.uism.TEXTBOX_ENTRY_CORNER_RADIUS, fg_color=settings.ctm.MAIN_BG_COLOR, width=0, height=0) - main_window.main_entry_message_container.grid(row=2, column=0, sticky="nsew") - - - main_window.main_entry_message_container.grid_columnconfigure(0, weight=1) - main_window.main_entry_message_container.grid_rowconfigure(0, weight=1) - main_window.entry_message_box = CTkTextbox( - main_window.main_entry_message_container, - corner_radius=settings.uism.TEXTBOX_ENTRY_CORNER_RADIUS, - border_color=settings.ctm.TEXTBOX_ENTRY_BORDER_COLOR, - fg_color=settings.ctm.TEXTBOX_ENTRY_BG_COLOR, - text_color=settings.ctm.TEXTBOX_ENTRY_TEXT_COLOR, - border_width=settings.uism.TEXTBOX_ENTRY_BORDER_SIZE, - height=0, - font=CTkFont(family=settings.FONT_FAMILY, size=settings.uism.TEXTBOX_ENTRY_FONT_SIZE, weight="normal"), - undo=True, - autoseparators=True, - maxundo=64, - ) - main_window.entry_message_box.grid(row=0, column=0, padx=settings.uism.TEXTBOX_ENTRY_PADX, pady=settings.uism.TEXTBOX_ENTRY_PADY, sticky="nsew") - - - def messageBoxAnyKeyPress(e): - BREAK_KEYSYM_LIST = [ - "Delete", "Select", "Up", "Down", "Next", "End", "Print", - "Prior","Insert","Home", "Left", "Clear", "Right", "Linefeed" - ] - if e.keysym == "Up": - callFunctionIfCallable(view_variable.CALLBACK_MESSAGE_BOX_BIND_KEYSYM__UP) - return "break" - - if e.keysym == "Down": - callFunctionIfCallable(view_variable.CALLBACK_MESSAGE_BOX_BIND_KEYSYM__DOWN) - return "break" - - if e.keysym != "??": - if len(e.char) != 0 and e.keysym in BREAK_KEYSYM_LIST: - main_window.entry_message_box.insert("end", e.char) - return "break" - - main_window.entry_message_box.bind("", messageBoxAnyKeyPress) - - def messageBoxRedoFunction(_e): - try: - main_window.entry_message_box.edit_redo() - except: - pass - - main_window.entry_message_box.bind("", messageBoxRedoFunction, "+") - main_window.entry_message_box.bind("", messageBoxRedoFunction, "+") - - - main_window.main_send_message_button_container = CTkFrame(main_window.main_entry_message_container, corner_radius=settings.uism.SEND_MESSAGE_BUTTON_CORNER_RADIUS, fg_color=settings.ctm.SEND_MESSAGE_BUTTON_BG_COLOR, width=0, height=0) - main_window.main_send_message_button_container.grid(row=0, column=1, padx=(0, settings.uism.TEXTBOX_ENTRY_PADX), pady=settings.uism.TEXTBOX_ENTRY_PADY, sticky="nsew") - - main_window.main_send_message_button_container.grid_columnconfigure(0, weight=0, minsize=settings.uism.SEND_MESSAGE_BUTTON_MIN_WIDTH) - main_window.main_send_message_button_container.grid_rowconfigure(0, weight=1) - - - - - main_window.main_send_message_button = CTkFrame(main_window.main_send_message_button_container, corner_radius=0, fg_color=settings.ctm.SEND_MESSAGE_BUTTON_BG_COLOR, height=0, width=0) - main_window.main_send_message_button.grid(row=0, column=0, sticky="nsew") - main_window.main_send_message_button.configure(cursor="hand2") - - main_window.main_send_message_button.grid_columnconfigure((0,2), weight=1) - main_window.main_send_message_button.grid_rowconfigure((0,2), weight=1) - - main_window.main_send_message_button_image = CTkLabel( - main_window.main_send_message_button, - text=None, - height=0, - image=CTkImage((settings.image_file.SEND_MESSAGE_ICON),size=(settings.uism.SEND_MESSAGE_BUTTON_IMAGE_SIZE,settings.uism.SEND_MESSAGE_BUTTON_IMAGE_SIZE)), - ) - main_window.main_send_message_button_image.grid(row=1, column=1) - - - - bindButtonFunctionAndColor( - target_widgets=[main_window.main_send_message_button, main_window.main_send_message_button_image], - enter_color=settings.ctm.SEND_MESSAGE_BUTTON_BG_HOVERED_COLOR, - leave_color=settings.ctm.SEND_MESSAGE_BUTTON_BG_COLOR, - clicked_color=settings.ctm.SEND_MESSAGE_BUTTON_BG_CLICKED_COLOR, - buttonReleasedFunction=lambda _e: callFunctionIfCallable(view_variable.CALLBACK_CLICKED_SEND_MESSAGE_BUTTON, _e), - ) - - - - - - - main_window.main_send_message_button__disabled = CTkFrame(main_window.main_send_message_button_container, corner_radius=0, fg_color=settings.ctm.SEND_MESSAGE_BUTTON_BG_COLOR, height=0, width=0) - main_window.main_send_message_button__disabled.grid(row=0, column=0, sticky="nsew") - - main_window.main_send_message_button__disabled.grid_columnconfigure((0,2), weight=1) - main_window.main_send_message_button__disabled.grid_rowconfigure((0,2), weight=1) - - main_window.main_send_message_button_image__disabled = CTkLabel( - main_window.main_send_message_button__disabled, - text=None, - height=0, - image=CTkImage((settings.image_file.SEND_MESSAGE_ICON_DISABLED),size=(settings.uism.SEND_MESSAGE_BUTTON_IMAGE_SIZE,settings.uism.SEND_MESSAGE_BUTTON_IMAGE_SIZE)), - ) - main_window.main_send_message_button_image__disabled.grid(row=1, column=1) - - main_window.main_send_message_button__disabled.grid_remove() \ No newline at end of file diff --git a/vrct_gui/main_window/widgets/create_minimize_sidebar_button.py b/vrct_gui/main_window/widgets/create_minimize_sidebar_button.py deleted file mode 100644 index 83585e98..00000000 --- a/vrct_gui/main_window/widgets/create_minimize_sidebar_button.py +++ /dev/null @@ -1,70 +0,0 @@ - -from customtkinter import CTkFrame, CTkLabel, CTkImage - -from ...ui_utils import bindEnterAndLeaveColor, bindButtonPressColor, bindButtonReleaseFunction - -from utils import callFunctionIfCallable - -def createMinimizeSidebarButton(settings, main_window, view_variable): - - def enableCompactMode(e): - callFunctionIfCallable(view_variable.CALLBACK_ENABLE_MAIN_WINDOW_SIDEBAR_COMPACT_MODE) - - def disableCompactMode(e): - callFunctionIfCallable(view_variable.CALLBACK_DISABLE_MAIN_WINDOW_SIDEBAR_COMPACT_MODE) - - - - main_window.minimize_sidebar_button_container__for_closing = CTkFrame(main_window.main_topbar_container, corner_radius=0, fg_color=settings.ctm.MINIMIZE_SIDEBAR_BUTTON_BG_COLOR, cursor="hand2", width=0, height=0) - main_window.minimize_sidebar_button_container__for_opening = CTkFrame(main_window.main_topbar_container, corner_radius=0, fg_color=settings.ctm.MINIMIZE_SIDEBAR_BUTTON_BG_COLOR, cursor="hand2", width=0, height=0) - - - - - # For Closing [<] - main_window.minimize_sidebar_button__for_closing = CTkLabel( - main_window.minimize_sidebar_button_container__for_closing, - text=None, - corner_radius=0, - height=0, - image=CTkImage((settings.image_file.ARROW_LEFT),size=(settings.uism.MINIMIZE_SIDEBAR_BUTTON_ICON_SIZE_X,settings.uism.MINIMIZE_SIDEBAR_BUTTON_ICON_SIZE_Y)) - ) - - main_window.minimize_sidebar_button_container__for_closing.grid_rowconfigure((0,2), weight=1) - main_window.minimize_sidebar_button__for_closing.grid(row=1, column=0, padx=0, pady=0) - - - bindEnterAndLeaveColor([main_window.minimize_sidebar_button__for_closing, main_window.minimize_sidebar_button_container__for_closing], settings.ctm.MINIMIZE_SIDEBAR_BUTTON_HOVERED_BG_COLOR, settings.ctm.MINIMIZE_SIDEBAR_BUTTON_BG_COLOR) - bindButtonPressColor([main_window.minimize_sidebar_button__for_closing, main_window.minimize_sidebar_button_container__for_closing], settings.ctm.MINIMIZE_SIDEBAR_BUTTON_CLICKED_BG_COLOR, settings.ctm.MINIMIZE_SIDEBAR_BUTTON_BG_COLOR) - bindButtonReleaseFunction([main_window.minimize_sidebar_button_container__for_closing, main_window.minimize_sidebar_button__for_closing], enableCompactMode) - - - - -# For Opening [>] - main_window.minimize_sidebar_button__for_opening = CTkLabel( - main_window.minimize_sidebar_button_container__for_opening, - text=None, - corner_radius=0, - height=0, - image=CTkImage((settings.image_file.ARROW_LEFT).rotate(180),size=(settings.uism.MINIMIZE_SIDEBAR_BUTTON_ICON_SIZE_X,settings.uism.MINIMIZE_SIDEBAR_BUTTON_ICON_SIZE_Y)) - ) - - - - - main_window.minimize_sidebar_button_container__for_opening.grid_rowconfigure((0,2), weight=1) - main_window.minimize_sidebar_button__for_opening.grid(row=1, column=0, padx=0, pady=0) - - - bindEnterAndLeaveColor([main_window.minimize_sidebar_button__for_opening, main_window.minimize_sidebar_button_container__for_opening], settings.ctm.MINIMIZE_SIDEBAR_BUTTON_HOVERED_BG_COLOR, settings.ctm.MINIMIZE_SIDEBAR_BUTTON_BG_COLOR) - bindButtonPressColor([main_window.minimize_sidebar_button__for_opening, main_window.minimize_sidebar_button_container__for_opening], settings.ctm.MINIMIZE_SIDEBAR_BUTTON_CLICKED_BG_COLOR, settings.ctm.MINIMIZE_SIDEBAR_BUTTON_BG_COLOR) - bindButtonReleaseFunction([main_window.minimize_sidebar_button_container__for_opening, main_window.minimize_sidebar_button__for_opening], disableCompactMode) - - - - - - main_window.minimize_sidebar_button_container__for_opening.grid(row=0, column=0, sticky="nsw") - main_window.minimize_sidebar_button_container__for_closing.grid(row=0, column=0, sticky="nsw") - main_window.minimize_sidebar_button_container__for_opening.grid_remove() \ No newline at end of file diff --git a/vrct_gui/main_window/widgets/create_sidebar.py b/vrct_gui/main_window/widgets/create_sidebar.py deleted file mode 100644 index 9f30d269..00000000 --- a/vrct_gui/main_window/widgets/create_sidebar.py +++ /dev/null @@ -1,64 +0,0 @@ -from customtkinter import CTkFrame, CTkLabel, CTkImage - -from ...ui_utils import bindButtonFunctionAndColor -from utils import callFunctionIfCallable - -from ._create_sidebar import createSidebarFeatures, createSidebarLanguagesSettings - -def createSidebar(settings, main_window, view_variable): - # Side Bar Container - main_window.toplevel_wrapper.grid_rowconfigure(0, weight=1) - - main_window.sidebar_bg_container_wrapper = CTkFrame(main_window.toplevel_wrapper, corner_radius=0, fg_color=settings.ctm.SIDEBAR_BG_COLOR, width=0, height=0) - main_window.sidebar_bg_container_wrapper.grid(row=0, column=0, sticky="nsew") - - - main_window.sidebar_bg_container = CTkFrame(main_window.sidebar_bg_container_wrapper, corner_radius=0, fg_color=settings.ctm.SIDEBAR_BG_COLOR, width=0, height=0) - main_window.sidebar_compact_mode_bg_container = CTkFrame(main_window.sidebar_bg_container_wrapper, corner_radius=0, fg_color=settings.ctm.SIDEBAR_BG_COLOR, width=0, height=0) - - - main_window.sidebar_bg_container.grid_columnconfigure(0, weight=1, minsize=settings.uism.SIDEBAR_MIN_WIDTH) - main_window.sidebar_compact_mode_bg_container.grid_columnconfigure(0, weight=1) - - - createSidebarFeatures(settings, main_window, view_variable) - createSidebarLanguagesSettings(settings, main_window, view_variable) - - - main_window.sidebar_bg_container.grid(row=0, column=0, sticky="nsew") - main_window.sidebar_compact_mode_bg_container.grid(row=0, column=0, sticky="nsew") - main_window.sidebar_compact_mode_bg_container.grid_remove() - - - # Config Button - main_window.sidebar_bg_container_wrapper.grid_rowconfigure(3, weight=1) - - main_window.sidebar_config_button_container = CTkFrame(main_window.sidebar_bg_container_wrapper, corner_radius=0, fg_color=settings.ctm.CONFIG_BUTTON_BG_COLOR, width=0, height=0) - main_window.sidebar_config_button_container.grid(row=4, column=0, sticky="sew") - - - main_window.sidebar_config_button_container.grid_columnconfigure(0, weight=1) - main_window.sidebar_config_button_wrapper = CTkFrame(main_window.sidebar_config_button_container, corner_radius=settings.uism.SIDEBAR_CONFIG_BUTTON_CORNER_RADIUS, fg_color=settings.ctm.CONFIG_BUTTON_BG_COLOR, height=0, width=0, cursor="hand2") - main_window.sidebar_config_button_wrapper.grid(row=0, column=0, padx=settings.uism.SIDEBAR_CONFIG_BUTTON_PADX, pady=settings.uism.SIDEBAR_CONFIG_BUTTON_PADY, sticky="ew") - - - - - main_window.sidebar_config_button_wrapper.grid_columnconfigure(0, weight=1) - - main_window.sidebar_config_button = CTkLabel( - main_window.sidebar_config_button_wrapper, - text=None, - height=0, - image=CTkImage(settings.image_file.CONFIGURATION_ICON, size=settings.uism.SIDEBAR_CONFIG_BUTTON_IMAGE_SIZE) - ) - main_window.sidebar_config_button.grid(row=0, column=0, padx=0, pady=settings.uism.SIDEBAR_CONFIG_BUTTON_IPADY) - - - bindButtonFunctionAndColor( - target_widgets=[main_window.sidebar_config_button_wrapper, main_window.sidebar_config_button], - enter_color=settings.ctm.CONFIG_BUTTON_HOVERED_BG_COLOR, - leave_color=settings.ctm.CONFIG_BUTTON_BG_COLOR, - clicked_color=settings.ctm.CONFIG_BUTTON_CLICKED_BG_COLOR, - buttonReleasedFunction=lambda _e: callFunctionIfCallable(view_variable.CALLBACK_CLICKED_OPEN_CONFIG_WINDOW_BUTTON), - ) \ No newline at end of file diff --git a/vrct_gui/main_window/widgets/create_textbox.py b/vrct_gui/main_window/widgets/create_textbox.py deleted file mode 100644 index ba048f26..00000000 --- a/vrct_gui/main_window/widgets/create_textbox.py +++ /dev/null @@ -1,164 +0,0 @@ -from customtkinter import CTkFont, CTkFrame, CTkLabel, CTkTextbox - -from ...ui_utils import bindEnterAndLeaveColor, bindButtonPressColor, bindButtonReleaseFunction, setDefaultActiveTab, switchActiveTabAndPassiveTab, switchTabsColor - - -def createTextbox(settings, main_window, view_variable): - - # def switchTextbox(target_textbox_attr_name): - # main_window.current_active_textbox.grid_remove() - # main_window.current_active_textbox = getattr(main_window, target_textbox_attr_name) - # main_window.current_active_textbox.grid() - - # def switchToTextboxAll(e): - # target_active_widget = getattr(main_window, "textbox_tab_all") - # switchTextboxTabFunction(target_active_widget) - # switchTextbox("textbox_all") - - # def switchToTextboxSent(e): - # target_active_widget = getattr(main_window, "textbox_tab_sent") - # switchTextboxTabFunction(target_active_widget) - # switchTextbox("textbox_sent") - - # def switchToTextboxReceived(e): - # target_active_widget = getattr(main_window, "textbox_tab_received") - # switchTextboxTabFunction(target_active_widget) - # switchTextbox("textbox_received") - - # def switchToTextboxSystem(e): - # target_active_widget = getattr(main_window, "textbox_tab_system") - # switchTextboxTabFunction(target_active_widget) - # switchTextbox("textbox_system") - - - # def switchTextboxTabFunction(target_active_widget): - # switchActiveAndPassiveTextboxTabsColor(target_active_widget) - # switchActiveTabAndPassiveTab(target_active_widget, main_window.current_active_textbox_tab, main_window.current_active_textbox_tab.passive_function, settings.ctm.TEXTBOX_TAB_BG_HOVERED_COLOR, settings.ctm.TEXTBOX_TAB_BG_CLICKED_COLOR, settings.ctm.TEXTBOX_TAB_BG_PASSIVE_COLOR) - # main_window.current_active_textbox_tab = target_active_widget - - # def switchActiveAndPassiveTextboxTabsColor(target_active_widget): - # textbox_tabs = [ - # getattr(main_window, "textbox_tab_all"), - # getattr(main_window, "textbox_tab_sent"), - # getattr(main_window, "textbox_tab_received"), - # getattr(main_window, "textbox_tab_system") - # ] - - # switchTabsColor( - # target_widget=target_active_widget, - # tab_buttons=textbox_tabs, - # active_bg_color=settings.ctm.TEXTBOX_BG_COLOR, - # active_text_color=settings.ctm.SLS__PRESETS_TAB_ACTIVE_TEXT_COLOR, - # passive_bg_color=settings.ctm.TEXTBOX_TAB_BG_PASSIVE_COLOR, - # passive_text_color=settings.ctm.TEXTBOX_TAB_TEXT_PASSIVE_COLOR - # ) - - - - - # Text box - main_window.main_bg_container.grid_rowconfigure(1, weight=1) - main_window.main_textbox_container = CTkFrame(main_window.main_bg_container, corner_radius=0, fg_color=settings.ctm.MAIN_BG_COLOR, width=0, height=0) - main_window.main_textbox_container.grid(row=1, column=0, columnspan=2, sticky="nsew") - - main_window.main_textbox_container.grid_columnconfigure(0,weight=1) - main_window.main_textbox_container.grid_rowconfigure(0,weight=1) - - # main_window.textbox_switch_tabs_container = CTkFrame(main_window.main_topbar_center_container, corner_radius=0, fg_color=settings.ctm.MAIN_BG_COLOR, width=0, height=0) - # main_window.textbox_switch_tabs_container.place(relx=0.07, rely=1.15, anchor="sw") - - # main_window.textbox_switch_tabs_container.grid_columnconfigure((0,1,2,3), weight=1, uniform="textbox_tabs") - - # textbox_settings = [ - # { - # "textbox_tab_attr_name": "textbox_tab_all", - # "command": switchToTextboxAll, - # "textbox_attr_name": "textbox_all", - # "textvariable": view_variable.VAR_LABEL_TEXTBOX_ALL - # }, - # { - # "textbox_tab_attr_name": "textbox_tab_sent", - # "command": switchToTextboxSent, - # "textbox_attr_name": "textbox_sent", - # "textvariable": view_variable.VAR_LABEL_TEXTBOX_SENT - # }, - # { - # "textbox_tab_attr_name": "textbox_tab_received", - # "command": switchToTextboxReceived, - # "textbox_attr_name": "textbox_received", - # "textvariable": view_variable.VAR_LABEL_TEXTBOX_RECEIVED - # }, - # { - # "textbox_tab_attr_name": "textbox_tab_system", - # "command": switchToTextboxSystem, - # "textbox_attr_name": "textbox_system", - # "textvariable": view_variable.VAR_LABEL_TEXTBOX_SYSTEM - # }, - # ] - - - # column=0 - # for textbox_setting in textbox_settings: - # setattr(main_window, textbox_setting["textbox_tab_attr_name"], - # CTkFrame( - # main_window.textbox_switch_tabs_container, - # corner_radius=settings.uism.TEXTBOX_TAB_CORNER_RADIUS, - # fg_color=settings.ctm.TEXTBOX_TAB_BG_PASSIVE_COLOR, - # cursor="hand2", - # width=0, - # height=0 - # ) - # ) - # target_widget = getattr(main_window, textbox_setting["textbox_tab_attr_name"]) - # target_widget.grid(row=0, column=column, pady=0, padx=(0,2), sticky="ew") - - - - # target_widget.grid_columnconfigure((0,2), weight=1) - # setattr(main_window, "label_widget", CTkLabel( - # target_widget, - # textvariable=textbox_setting["textvariable"], - # corner_radius=0, - # font=CTkFont(family=settings.FONT_FAMILY, size=settings.uism.TEXTBOX_TAB_FONT_SIZE, weight="normal"), - # height=0, - # width=0, - # anchor="center", - # text_color=settings.ctm.TEXTBOX_TAB_TEXT_PASSIVE_COLOR, - # )) - # label_widget = getattr(main_window, "label_widget") - # label_widget.grid(row=0, column=1, pady=settings.uism.TEXTBOX_TAB_PADY, padx=settings.uism.TEXTBOX_TAB_PADX) - - # bindEnterAndLeaveColor([target_widget, label_widget], settings.ctm.TEXTBOX_TAB_BG_HOVERED_COLOR, settings.ctm.TEXTBOX_TAB_BG_PASSIVE_COLOR) - # bindButtonPressColor([target_widget, label_widget], settings.ctm.TEXTBOX_TAB_BG_CLICKED_COLOR, settings.ctm.TEXTBOX_TAB_BG_PASSIVE_COLOR) - - # target_widget.passive_function = textbox_setting["command"] - # bindButtonReleaseFunction([target_widget, label_widget], textbox_setting["command"]) - - - - main_window.textbox_all = CTkTextbox( - main_window.main_textbox_container, - corner_radius=settings.uism.TEXTBOX_CORNER_RADIUS, - fg_color=settings.ctm.TEXTBOX_BG_COLOR, - text_color="lime", # Textbox's text_color is set when printing. so this is for prevent from non-setting text_color like the gloves used in food factories are blue. - wrap="word", - height=0, - ) - # main_window.textbox_all = getattr(main_window, textbox_setting["textbox_attr_name"]) - main_window.textbox_all.grid(row=0, column=0, padx=settings.uism.TEXTBOX_PADX, pady=0, sticky="nsew") - main_window.textbox_all.grid_remove() - main_window.textbox_all.configure(state="disabled") - - # column+=1 - - # Set default active textbox tab - # main_window.current_active_textbox_tab = getattr(main_window, "textbox_tab_all") - # setDefaultActiveTab( - # active_tab_widget=main_window.current_active_textbox_tab, - # active_bg_color=settings.ctm.TEXTBOX_TAB_BG_ACTIVE_COLOR, - # active_text_color=settings.ctm.TEXTBOX_TAB_TEXT_ACTIVE_COLOR - # ) - - # main_window.current_active_textbox = getattr(main_window, "textbox_all") - # main_window.current_active_textbox.grid() - main_window.textbox_all.grid() diff --git a/vrct_gui/quick_settings_window/QuickSettingsWindow.py b/vrct_gui/quick_settings_window/QuickSettingsWindow.py deleted file mode 100644 index 993243a9..00000000 --- a/vrct_gui/quick_settings_window/QuickSettingsWindow.py +++ /dev/null @@ -1,364 +0,0 @@ -from utils import callFunctionIfCallable, floatToPctStr - -from customtkinter import CTkToplevel, CTkFrame -from ..ui_utils import getImagePath, setGeometryToCenterOfScreen, fadeInAnimation, createLabelButton - -from ._CreateQuickSettingBox import _CreateQuickSettingBox - -class QuickSettingsWindow(CTkToplevel): - def __init__(self, vrct_gui, settings, view_variable): - super().__init__() - self.withdraw() - self.title("Overlay Settings") - self.protocol("WM_DELETE_WINDOW", self.withdraw) - self.after(200, lambda: self.iconbitmap(getImagePath("vrct_logo_mark_black.ico"))) - - - self.settings = settings - - self.configure(fg_color=self.settings.ctm.SB__BG_COLOR) - - BG_HEX_COLOR = "#292a2d" - self.grid_columnconfigure(0, weight=1) - - self.qsw_background = CTkFrame(self, corner_radius=0, fg_color=self.settings.ctm.SB__BG_COLOR) - self.qsw_background.grid(row=0, column=0, pady=0, sticky="ew") - self.qsw_background.grid_columnconfigure(0, weight=1, minsize=self.settings.uism.QSB__MIN_WIDTH) - - - self.qsw_background__overlay = CTkFrame(self.qsw_background, corner_radius=0, fg_color=self.settings.ctm.SB__BG_COLOR) - self.qsw_background__overlay.grid(row=0, column=0, pady=self.settings.uism.QSB__BOX_PADY, sticky="ew") - self.qsw_background__overlay.grid_columnconfigure(0, weight=1) - - - self.qsw_setting_box__overlay = CTkFrame(self.qsw_background__overlay, corner_radius=0, fg_color=BG_HEX_COLOR) - self.qsw_setting_box__overlay.grid(row=0, column=0, sticky="ew") - self.qsw_setting_box__overlay.grid_columnconfigure(0, weight=1) - - cqsb = _CreateQuickSettingBox(self.qsw_setting_box__overlay, vrct_gui, settings, view_variable) - createSettingBoxSlider = cqsb.createSettingBoxSlider - createSettingBoxSwitch = cqsb.createSettingBoxSwitch - - - - - - # Overlay General Settings - row=0 - def overlaySmallLogSwitchCallback(switch_widget): - callFunctionIfCallable(view_variable.CALLBACK_SET_ENABLE_OVERLAY_SMALL_LOG, switch_widget.get()) - - self.qsb__enable_overlay_small_log = createSettingBoxSwitch( - for_var_label_text=view_variable.VAR_LABEL_ENABLE_OVERLAY_SMALL_LOG, - switch_attr_name="qsb__enable_overlay_small_log_switch", - command=lambda: overlaySmallLogSwitchCallback(vrct_gui.qsb__enable_overlay_small_log_switch), - variable=view_variable.VAR_ENABLE_OVERLAY_SMALL_LOG, - ) - self.qsb__enable_overlay_small_log.grid(row=row) - - - row+=1 - def overlayOpacitySliderCallback(e): - value = round(e,2) - callFunctionIfCallable(view_variable.CALLBACK_SET_OVERLAY_SETTINGS, value, "opacity") - view_variable.VAR_CURRENT_VALUE_OVERLAY_OPACITY.set(floatToPctStr(value)) - - self.qsb__overlay_opacity = createSettingBoxSlider( - for_var_label_text=view_variable.VAR_LABEL_OVERLAY_OPACITY, - for_var_current_value=view_variable.VAR_CURRENT_VALUE_OVERLAY_OPACITY, - slider_attr_name="qsb__overlay_opacity_slider", - slider_range=view_variable.SLIDER_RANGE_OVERLAY_OPACITY, - slider_number_of_steps=view_variable.NUMBER_OF_STEPS_OVERLAY_OPACITY, - command=overlayOpacitySliderCallback, - variable=view_variable.VAR_OVERLAY_OPACITY, - ) - self.qsb__overlay_opacity.grid(row=row) - - - row+=1 - def overlayUiScalingSliderCallback(e): - value = round(e,2) - callFunctionIfCallable(view_variable.CALLBACK_SET_OVERLAY_SETTINGS, value, "ui_scaling") - view_variable.VAR_CURRENT_VALUE_OVERLAY_UI_SCALING.set(floatToPctStr(value)) - - self.qsb__overlay_ui_scaling = createSettingBoxSlider( - for_var_label_text=view_variable.VAR_LABEL_OVERLAY_UI_SCALING, - for_var_current_value=view_variable.VAR_CURRENT_VALUE_OVERLAY_UI_SCALING, - slider_attr_name="qsb__overlay_ui_scaling_slider", - slider_range=view_variable.SLIDER_RANGE_OVERLAY_UI_SCALING, - slider_number_of_steps=view_variable.NUMBER_OF_STEPS_OVERLAY_UI_SCALING, - command=overlayUiScalingSliderCallback, - variable=view_variable.VAR_OVERLAY_UI_SCALING, - ) - self.qsb__overlay_ui_scaling.grid(row=row) - - - - # Overlay Small Log Settings - - # row+=1 - # def switchCallback(switch_widget): - # callFunctionIfCallable(view_variable.CALLBACK_SET_ENABLE_OVERLAY_SMALL_LOG, switch_widget.get()) - - # self.qsb__enable_overlay_small_log = createSettingBoxSwitch( - # for_var_label_text=view_variable.VAR_LABEL_ENABLE_OVERLAY_SMALL_LOG, - # switch_attr_name="qsb__enable_overlay_small_log_switch", - # command=lambda: switchCallback(vrct_gui.qsb__enable_overlay_small_log_switch), - # variable=view_variable.VAR_ENABLE_OVERLAY_SMALL_LOG, - # ) - # self.qsb__enable_overlay_small_log.grid(row=row) - - - - row+=1 - def overlaySmallLogSettingsXPosSliderCallback(e): - value = round(e,2) - callFunctionIfCallable(view_variable.CALLBACK_SET_OVERLAY_SMALL_LOG_SETTINGS, value, "x_pos") - view_variable.VAR_CURRENT_VALUE_OVERLAY_SMALL_LOG_X_POS.set(str(value)) - - self.qsb__overlay_small_log_settings_x_pos = createSettingBoxSlider( - for_var_label_text=view_variable.VAR_LABEL_OVERLAY_SMALL_LOG_X_POS, - for_var_current_value=view_variable.VAR_CURRENT_VALUE_OVERLAY_SMALL_LOG_X_POS, - slider_attr_name="qsb__overlay_small_log_settings_x_pos_slider", - slider_range=view_variable.SLIDER_RANGE_OVERLAY_SMALL_LOG_X_POS, - slider_number_of_steps=view_variable.NUMBER_OF_STEPS_OVERLAY_SMALL_LOG_X_POS, - command=overlaySmallLogSettingsXPosSliderCallback, - variable=view_variable.VAR_OVERLAY_SMALL_LOG_X_POS, - ) - self.qsb__overlay_small_log_settings_x_pos.grid(row=row) - - - row+=1 - def overlaySmallLogSettingsYPosSliderCallback(e): - value = round(e,2) - callFunctionIfCallable(view_variable.CALLBACK_SET_OVERLAY_SMALL_LOG_SETTINGS, value, "y_pos") - view_variable.VAR_CURRENT_VALUE_OVERLAY_SMALL_LOG_Y_POS.set(str(value)) - - self.qsb__overlay_small_log_settings_y_pos = createSettingBoxSlider( - for_var_label_text=view_variable.VAR_LABEL_OVERLAY_SMALL_LOG_Y_POS, - for_var_current_value=view_variable.VAR_CURRENT_VALUE_OVERLAY_SMALL_LOG_Y_POS, - slider_attr_name="qsb__overlay_small_log_settings_y_pos_slider", - slider_range=view_variable.SLIDER_RANGE_OVERLAY_SMALL_LOG_Y_POS, - slider_number_of_steps=view_variable.NUMBER_OF_STEPS_OVERLAY_SMALL_LOG_Y_POS, - command=overlaySmallLogSettingsYPosSliderCallback, - variable=view_variable.VAR_OVERLAY_SMALL_LOG_Y_POS, - ) - self.qsb__overlay_small_log_settings_y_pos.grid(row=row) - - - row+=1 - def overlaySmallLogSettingsZPosSliderCallback(e): - value = round(e,2) - callFunctionIfCallable(view_variable.CALLBACK_SET_OVERLAY_SMALL_LOG_SETTINGS, value, "z_pos") - view_variable.VAR_CURRENT_VALUE_OVERLAY_SMALL_LOG_Z_POS.set(str(value)) - - self.qsb__overlay_small_log_settings_z_pos = createSettingBoxSlider( - for_var_label_text=view_variable.VAR_LABEL_OVERLAY_SMALL_LOG_Z_POS, - for_var_current_value=view_variable.VAR_CURRENT_VALUE_OVERLAY_SMALL_LOG_Z_POS, - slider_attr_name="qsb__overlay_small_log_settings_z_pos_slider", - slider_range=view_variable.SLIDER_RANGE_OVERLAY_SMALL_LOG_Z_POS, - slider_number_of_steps=view_variable.NUMBER_OF_STEPS_OVERLAY_SMALL_LOG_Z_POS, - command=overlaySmallLogSettingsZPosSliderCallback, - variable=view_variable.VAR_OVERLAY_SMALL_LOG_Z_POS, - ) - self.qsb__overlay_small_log_settings_z_pos.grid(row=row) - - - - row+=1 - def overlaySmallLogSettingsXRotationSliderCallback(e): - value = round(e,2) - callFunctionIfCallable(view_variable.CALLBACK_SET_OVERLAY_SMALL_LOG_SETTINGS, value, "x_rotation") - view_variable.VAR_CURRENT_VALUE_OVERLAY_SMALL_LOG_X_ROTATION.set(str(value)) - - self.qsb__overlay_small_log_settings_x_rotation = createSettingBoxSlider( - for_var_label_text=view_variable.VAR_LABEL_OVERLAY_SMALL_LOG_X_ROTATION, - for_var_current_value=view_variable.VAR_CURRENT_VALUE_OVERLAY_SMALL_LOG_X_ROTATION, - slider_attr_name="qsb__overlay_small_log_settings_x_rotation_slider", - slider_range=view_variable.SLIDER_RANGE_OVERLAY_SMALL_LOG_X_ROTATION, - slider_number_of_steps=view_variable.NUMBER_OF_STEPS_OVERLAY_SMALL_LOG_X_ROTATION, - command=overlaySmallLogSettingsXRotationSliderCallback, - variable=view_variable.VAR_OVERLAY_SMALL_LOG_X_ROTATION, - ) - self.qsb__overlay_small_log_settings_x_rotation.grid(row=row) - - - - row+=1 - def overlaySmallLogSettingsYRotationSliderCallback(e): - value = round(e,2) - callFunctionIfCallable(view_variable.CALLBACK_SET_OVERLAY_SMALL_LOG_SETTINGS, value, "y_rotation") - view_variable.VAR_CURRENT_VALUE_OVERLAY_SMALL_LOG_Y_ROTATION.set(str(value)) - - self.qsb__overlay_small_log_settings_y_rotation = createSettingBoxSlider( - for_var_label_text=view_variable.VAR_LABEL_OVERLAY_SMALL_LOG_Y_ROTATION, - for_var_current_value=view_variable.VAR_CURRENT_VALUE_OVERLAY_SMALL_LOG_Y_ROTATION, - slider_attr_name="qsb__overlay_small_log_settings_y_rotation_slider", - slider_range=view_variable.SLIDER_RANGE_OVERLAY_SMALL_LOG_Y_ROTATION, - slider_number_of_steps=view_variable.NUMBER_OF_STEPS_OVERLAY_SMALL_LOG_Y_ROTATION, - command=overlaySmallLogSettingsYRotationSliderCallback, - variable=view_variable.VAR_OVERLAY_SMALL_LOG_Y_ROTATION, - ) - self.qsb__overlay_small_log_settings_y_rotation.grid(row=row) - - - - row+=1 - def overlaySmallLogSettingsZRotationSliderCallback(e): - value = round(e,2) - callFunctionIfCallable(view_variable.CALLBACK_SET_OVERLAY_SMALL_LOG_SETTINGS, value, "z_rotation") - view_variable.VAR_CURRENT_VALUE_OVERLAY_SMALL_LOG_Z_ROTATION.set(str(value)) - - self.qsb__overlay_small_log_settings_z_rotation = createSettingBoxSlider( - for_var_label_text=view_variable.VAR_LABEL_OVERLAY_SMALL_LOG_Z_ROTATION, - for_var_current_value=view_variable.VAR_CURRENT_VALUE_OVERLAY_SMALL_LOG_Z_ROTATION, - slider_attr_name="qsb__overlay_small_log_settings_z_rotation_slider", - slider_range=view_variable.SLIDER_RANGE_OVERLAY_SMALL_LOG_Z_ROTATION, - slider_number_of_steps=view_variable.NUMBER_OF_STEPS_OVERLAY_SMALL_LOG_Z_ROTATION, - command=overlaySmallLogSettingsZRotationSliderCallback, - variable=view_variable.VAR_OVERLAY_SMALL_LOG_Z_ROTATION, - ) - self.qsb__overlay_small_log_settings_z_rotation.grid(row=row) - - - - row+=1 - def overlaySmallLogSettingsDisplayDurationSliderCallback(e): - value = int(e) - callFunctionIfCallable(view_variable.CALLBACK_SET_OVERLAY_SMALL_LOG_SETTINGS, value, "display_duration") - view_variable.VAR_CURRENT_VALUE_OVERLAY_SMALL_LOG_DISPLAY_DURATION.set(f"{value} second(s)") - - self.qsb__overlay_small_log_settings_display_duration = createSettingBoxSlider( - for_var_label_text=view_variable.VAR_LABEL_OVERLAY_SMALL_LOG_DISPLAY_DURATION, - for_var_current_value=view_variable.VAR_CURRENT_VALUE_OVERLAY_SMALL_LOG_DISPLAY_DURATION, - slider_attr_name="qsb__overlay_small_log_settings_display_duration_slider", - slider_range=view_variable.SLIDER_RANGE_OVERLAY_SMALL_LOG_DISPLAY_DURATION, - slider_number_of_steps=view_variable.NUMBER_OF_STEPS_OVERLAY_SMALL_LOG_DISPLAY_DURATION, - command=overlaySmallLogSettingsDisplayDurationSliderCallback, - variable=view_variable.VAR_OVERLAY_SMALL_LOG_DISPLAY_DURATION, - ) - self.qsb__overlay_small_log_settings_display_duration.grid(row=row) - - - - row+=1 - def overlaySmallLogSettingsFadeoutDurationSliderCallback(e): - value = int(e) - callFunctionIfCallable(view_variable.CALLBACK_SET_OVERLAY_SMALL_LOG_SETTINGS, value, "fadeout_duration") - view_variable.VAR_CURRENT_VALUE_OVERLAY_SMALL_LOG_FADEOUT_DURATION.set(f"{value} second(s)") - - self.qsb__overlay_small_log_settings_fadeout_duration = createSettingBoxSlider( - for_var_label_text=view_variable.VAR_LABEL_OVERLAY_SMALL_LOG_FADEOUT_DURATION, - for_var_current_value=view_variable.VAR_CURRENT_VALUE_OVERLAY_SMALL_LOG_FADEOUT_DURATION, - slider_attr_name="qsb__overlay_small_log_settings_fadeout_duration_slider", - slider_range=view_variable.SLIDER_RANGE_OVERLAY_SMALL_LOG_FADEOUT_DURATION, - slider_number_of_steps=view_variable.NUMBER_OF_STEPS_OVERLAY_SMALL_LOG_FADEOUT_DURATION, - command=overlaySmallLogSettingsFadeoutDurationSliderCallback, - variable=view_variable.VAR_OVERLAY_SMALL_LOG_FADEOUT_DURATION, - ) - self.qsb__overlay_small_log_settings_fadeout_duration.grid(row=row) - - - - - - - - - - self.qsw_setting_box_bottom = CTkFrame(self.qsw_background__overlay, corner_radius=0, fg_color=self.settings.ctm.SB__BG_COLOR) - self.qsw_setting_box_bottom.grid(row=1, column=0, sticky="nsew") - - self.qsw_setting_box_bottom.grid_columnconfigure((0,2), weight=1) - self.qsw_setting_box_bottom.grid_rowconfigure((0,2), weight=1) - - self.qsw_setting_box_bottom_restore_default_button = CTkFrame(self.qsw_setting_box_bottom, corner_radius=0, fg_color=self.settings.ctm.SB__BG_COLOR) - self.qsw_setting_box_bottom_restore_default_button.grid(row=1, column=1, sticky="nsew") - - - def toDefaultOverlaySettingsCallback(_e): - callFunctionIfCallable(view_variable.CALLBACK_SET_TO_DEFAULT_OVERLAY_SETTINGS) - - - - (restore_default_settings_button, label_button_label_widget) = createLabelButton( - parent_widget=self.qsw_setting_box_bottom_restore_default_button, - label_button_bg_color=self.settings.ctm.SB__BUTTON_COLOR, - label_button_hovered_bg_color=self.settings.ctm.SB__BUTTON_HOVERED_COLOR, - label_button_clicked_bg_color=self.settings.ctm.SB__BUTTON_CLICKED_COLOR, - label_button_ipadx=self.settings.uism.SB__AUTHKEY_WEBPAGE_BUTTON_IPADX, - label_button_ipady=self.settings.uism.SB__AUTHKEY_WEBPAGE_BUTTON_IPADY, - variable=view_variable.VAR_TO_DEFAULT_OVERLAY_SETTINGS, - font_family=self.settings.FONT_FAMILY, - font_size=self.settings.uism.SB__AUTHKEY_WEBPAGE_BUTTON_LABEL_FONT_SIZE, - text_color=self.settings.ctm.LABELS_TEXT_COLOR, - label_button_clicked_command=toDefaultOverlaySettingsCallback, - - label_button_position="center", - ) - restore_default_settings_button.grid(row=0, column=0, pady=self.settings.uism.QSB__RESTORE_DEFAULT_SETTINGS_BUTTON_PADY) - - self.qsw_background__overlay.grid_remove() - - - - - - - # VRChat mic mute sync - self.qsw_background__vrc_mic_mute_sync = CTkFrame(self.qsw_background, corner_radius=0, fg_color=self.settings.ctm.SB__BG_COLOR) - self.qsw_background__vrc_mic_mute_sync.grid(row=0, column=0, pady=self.settings.uism.QSB__BOX_PADY, sticky="ew") - self.qsw_background__vrc_mic_mute_sync.grid_columnconfigure(0, weight=1) - - - self.qsw_setting_box__vrc_mic_mute_sync = CTkFrame(self.qsw_background__vrc_mic_mute_sync, corner_radius=0, fg_color=BG_HEX_COLOR) - self.qsw_setting_box__vrc_mic_mute_sync.grid(row=0, column=0, sticky="ew") - self.qsw_setting_box__vrc_mic_mute_sync.grid_columnconfigure(0, weight=1) - - - - - - - cqsb = _CreateQuickSettingBox(self.qsw_setting_box__vrc_mic_mute_sync, vrct_gui, settings, view_variable) - createSettingBoxSlider = cqsb.createSettingBoxSlider - createSettingBoxSwitch = cqsb.createSettingBoxSwitch - - - row=0 - def enableVrcMicMuteSyncSwitchCallback(switch_widget): - callFunctionIfCallable(view_variable.CALLBACK_SET_ENABLE_VRC_MIC_MUTE_SYNC, switch_widget.get()) - - self.qsb__enable_vrc_mic_mute_sync = createSettingBoxSwitch( - for_var_label_text=view_variable.VAR_LABEL_ENABLE_VRC_MIC_MUTE_SYNC, - switch_attr_name="qsb__enable_vrc_mic_mute_sync_switch", - command=lambda: enableVrcMicMuteSyncSwitchCallback(vrct_gui.qsb__enable_vrc_mic_mute_sync_switch), - variable=view_variable.VAR_ENABLE_VRC_MIC_MUTE_SYNC, - ) - self.qsb__enable_vrc_mic_mute_sync.grid(row=row) - - - self.qsw_background__vrc_mic_mute_sync.grid_remove() - - - - - - - - def show(self, target:str): - if target == "overlay": - self.qsw_background__vrc_mic_mute_sync.grid_remove() - self.qsw_background__overlay.grid() - elif target == "vrc_mic_mute_sync": - self.qsw_background__overlay.grid_remove() - self.qsw_background__vrc_mic_mute_sync.grid() - - self.attributes("-alpha", 0) - self.deiconify() - - self.qsw_background.update() - self.geometry("{}x{}".format(self.qsw_background.winfo_width(), self.qsw_background.winfo_height())) - - setGeometryToCenterOfScreen(root_widget=self) - fadeInAnimation(self, steps=5, interval=0.02) \ No newline at end of file diff --git a/vrct_gui/quick_settings_window/_CreateQuickSettingBox.py b/vrct_gui/quick_settings_window/_CreateQuickSettingBox.py deleted file mode 100644 index 3bb10ebc..00000000 --- a/vrct_gui/quick_settings_window/_CreateQuickSettingBox.py +++ /dev/null @@ -1,160 +0,0 @@ -from typing import Union -from customtkinter import CTkLabel, CTkFrame, CTkSlider, CTkFont, CTkSwitch - -class _CreateQuickSettingBox(): - def __init__(self, parent_frame, vrct_gui, settings, view_variable): - self.view_variable = view_variable - self.vrct_gui = vrct_gui - self.settings = settings - self.parent_frame = parent_frame - - - def _createSettingBoxFrame(self, for_var_label_text=None, for_var_current_value=None): - setting_box_frame = CTkFrame(self.parent_frame, corner_radius=0, fg_color=self.settings.ctm.SB__BG_COLOR, width=0, height=0) - - setting_box_frame.grid(row=0, column=0, pady=(0,1), sticky="ew") - setting_box_frame.grid_columnconfigure(0, weight=1) - - - setting_box_frame_wrapper = CTkFrame(setting_box_frame, corner_radius=0, fg_color=self.settings.ctm.SB__BG_COLOR, width=0, height=0) - setting_box_frame_wrapper.grid(row=0, column=0, padx=self.settings.uism.QSB__IPADX, pady=self.settings.uism.QSB__IPADY, sticky="nsew") - setting_box_frame_wrapper.grid_columnconfigure(0, weight=1) - - - # Labels - setting_box_labels_frame = CTkFrame(setting_box_frame_wrapper, corner_radius=0, fg_color=self.settings.ctm.SB__BG_COLOR, width=0, height=0) - setting_box_labels_frame.grid(row=0, column=0, padx=0, pady=(0,self.settings.uism.QSB__LABEL_BOTTOM_PADY), sticky="nsew") - - setting_box_labels_frame.grid_rowconfigure((0,2), weight=1) - setting_box_labels_frame.grid_columnconfigure(1, weight=1) - setting_box_label = CTkLabel( - setting_box_labels_frame, - textvariable=for_var_label_text, - anchor="w", - height=0, - font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.SB__LABEL_FONT_SIZE, weight="normal"), - text_color=self.settings.ctm.LABELS_TEXT_COLOR - ) - setting_box_label.grid(row=1, column=0, padx=0, pady=0, sticky="nse") - - - if for_var_current_value is not None: - setting_box_label = CTkLabel( - setting_box_labels_frame, - textvariable=for_var_current_value, - anchor="w", - height=0, - font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.SB__LABEL_FONT_SIZE, weight="normal"), - text_color=self.settings.ctm.LABELS_TEXT_COLOR - ) - setting_box_label.grid(row=1, column=2, padx=0, pady=0, sticky="nsw") - - - - - # Items - setting_box_item_frame = CTkFrame(setting_box_frame_wrapper, corner_radius=0, width=0, height=0, fg_color=self.settings.ctm.SB__BG_COLOR) - setting_box_item_frame.grid(row=1, column=0, padx=0, sticky="nsew") - - setting_box_item_frame.grid_rowconfigure((0,2), weight=1) - setting_box_item_frame.grid_columnconfigure(1, weight=1) - - return (setting_box_frame, setting_box_item_frame) - - - - - - - def createSettingBoxSlider( - self, - for_var_label_text, - for_var_current_value, - slider_attr_name, - slider_range, - command, - variable, - slider_number_of_steps: Union[int, - None] = None, - slider_bind__ButtonPress=None, - slider_bind__ButtonRelease=None, - sliderTooltipFormatter=None, - ): - - (setting_box_frame, setting_box_item_frame) = self._createSettingBoxFrame(for_var_label_text, for_var_current_value) - - - - slider_widget = CTkSlider( - setting_box_item_frame, - width=self.settings.uism.SB__SLIDER_WIDTH, - height=self.settings.uism.SB__SLIDER_HEIGHT, - from_=slider_range[0], - to=slider_range[1], - number_of_steps=slider_number_of_steps, - fg_color=self.settings.ctm.SB__SLIDER_BG_COLOR, - progress_color=self.settings.ctm.SB__SLIDER_PROGRESS_BG_COLOR, - button_color=self.settings.ctm.SB__SLIDER_BUTTON_COLOR, - button_hover_color=self.settings.ctm.SB__SLIDER_BUTTON_HOVERED_COLOR, - command=command, - variable=variable, - ) - setattr(self.vrct_gui, slider_attr_name, slider_widget) - - - slider_widget.grid(row=1, column=1, sticky="ew") - - if slider_bind__ButtonPress is not None: - def adjusted_slider_bind__ButtonPress(e): - command(e) - slider_bind__ButtonPress() - slider_widget.configure(command=adjusted_slider_bind__ButtonPress) - - if slider_bind__ButtonRelease is not None: - def adjusted_slider_bind__ButtonRelease(_e): - slider_bind__ButtonRelease() - slider_widget.bind("", adjusted_slider_bind__ButtonRelease, "+") - - return setting_box_frame - - - - - - - - def createSettingBoxSwitch( - self, - for_var_label_text, - switch_attr_name, - variable, - command, - for_var_current_value=None, - ): - - (setting_box_frame, setting_box_item_frame) = self._createSettingBoxFrame(for_var_label_text, for_var_current_value) - - switch_widget = CTkSwitch( - setting_box_item_frame, - text=None, - height=0, - width=0, - corner_radius=int(self.settings.uism.SB__SWITCH_BOX_HEIGHT/2), - border_width=0, - switch_height=self.settings.uism.SB__SWITCH_BOX_HEIGHT, - switch_width=self.settings.uism.SB__SWITCH_BOX_WIDTH, - onvalue=True, - offvalue=False, - variable=variable, - command=command, - fg_color=self.settings.ctm.SB__SWITCH_BOX_BG_COLOR, - progress_color=self.settings.ctm.SB__SWITCH_BOX_ACTIVE_BG_COLOR, - button_color=self.settings.ctm.SB__SWITCH_BOX_BUTTON_COLOR, - button_hover_color=self.settings.ctm.SB__SWITCH_BOX_BUTTON_HOVERED_COLOR, - ) - setattr(self.vrct_gui, switch_attr_name, switch_widget) - - - switch_widget.grid(row=1, column=1, sticky="w") - - return setting_box_frame \ No newline at end of file diff --git a/vrct_gui/quick_settings_window/__init__.py b/vrct_gui/quick_settings_window/__init__.py deleted file mode 100644 index 4ee26014..00000000 --- a/vrct_gui/quick_settings_window/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .QuickSettingsWindow import * \ No newline at end of file diff --git a/vrct_gui/splash_window/SplashWindow.py b/vrct_gui/splash_window/SplashWindow.py deleted file mode 100644 index 9d313931..00000000 --- a/vrct_gui/splash_window/SplashWindow.py +++ /dev/null @@ -1,235 +0,0 @@ -import math -import time - -from customtkinter import CTkImage, CTkLabel, CTkToplevel, CTkProgressBar, CTkFrame -from ..ui_utils import openImageKeepAspectRatio, getImageFileFromUiUtils, getImagePath, setGeometryToCenterOfScreen, fadeInAnimation, generateGradientColor - -class SplashWindow(CTkToplevel): - def __init__(self): - super().__init__() - self.withdraw() - self.overrideredirect(True) - self.configure(fg_color="#292a2d") - self.title("Starting Up...") - self.after(200, lambda: self.iconbitmap(getImagePath("vrct_logo_mark_black.ico"))) - # self.wm_attributes("-toolwindow", True) - - self.is_showed_weight_download_progressbar = False - - BG_HEIGHT= 220 - BG_WIDTH= 450 - BG_HEX_COLOR = "#292a2d" - - self.grid_columnconfigure(0, weight=1) - self.grid_rowconfigure(0, weight=1) - self.splash_background = CTkFrame(self, corner_radius=0, fg_color=BG_HEX_COLOR, width=BG_WIDTH, height=BG_HEIGHT) - self.splash_background.grid() - - - self.progressbar_wrapper = CTkFrame(self, corner_radius=0, fg_color=BG_HEX_COLOR, width=0, height=0) - self.progressbar_wrapper.place(relx=0.5, rely=0.5, anchor="center") - self.progressbar_wrapper.rowconfigure(0, minsize=BG_HEIGHT) - - PROGRESSBAR_HEIGHT = 3 - PROGRESSBAR_WIDTH = 60 - PROGRESSBAR_RIGHT_PADX = 38 - ALL_PROGRESSBAR_WIDTH = (PROGRESSBAR_WIDTH + PROGRESSBAR_RIGHT_PADX)*3 + PROGRESSBAR_WIDTH - WHITE_HEX_COLOR = "#f2f2f2" - VRCT_HEX_COLOR = "#48a495" - column = 0 - - for i in range(3): - progressbar = CTkProgressBar( - self.progressbar_wrapper, - height=PROGRESSBAR_HEIGHT, - width=PROGRESSBAR_WIDTH, - corner_radius=0, - fg_color=BG_HEX_COLOR, - progress_color=WHITE_HEX_COLOR, - ) - progressbar.set(0) - progressbar.grid(row=0, column=column, padx=(0,PROGRESSBAR_RIGHT_PADX)) - - setattr(self, "progressbar_" + str(i), progressbar) - column+=1 - - - self.progressbar_3 = CTkProgressBar( - self.progressbar_wrapper, - height=PROGRESSBAR_HEIGHT, - width=PROGRESSBAR_WIDTH, - corner_radius=0, - fg_color=BG_HEX_COLOR, - progress_color=VRCT_HEX_COLOR, - ) - self.progressbar_3.set(0) - self.progressbar_3.grid(row=0, column=column, padx=0) - - - - self.chato_img_mask_frame = CTkFrame(self.progressbar_wrapper, corner_radius=0, fg_color=BG_HEX_COLOR, width=ALL_PROGRESSBAR_WIDTH, height=0) - self.chato_img_mask_frame.place(relx=1, rely=0.49, relheight=0.5, anchor="se") - - - CHATO_POSITION = int( (ALL_PROGRESSBAR_WIDTH-(PROGRESSBAR_WIDTH/2)) + 2) - (self.chato_img, self.CHATO_IMG_WIDTH, self.CHATO_IMG_HEIGHT) = openImageKeepAspectRatio(getImageFileFromUiUtils("vrct_logo_mark_white_square.png"), int(PROGRESSBAR_WIDTH - (PROGRESSBAR_WIDTH/5))) - - self.chato_img_label = CTkLabel( - self.chato_img_mask_frame, - text=None, - height=0, - fg_color=BG_HEX_COLOR, - image=CTkImage(self.chato_img, size=(self.CHATO_IMG_WIDTH, self.CHATO_IMG_HEIGHT)) - ) - self.chato_img_label.place(x=CHATO_POSITION, rely=1, relwidth=1, anchor="n") - - - - (img, desired_width, height) = openImageKeepAspectRatio(getImageFileFromUiUtils("VRCT_starting_up.png"), 100) - self.starting_up_text_label = CTkLabel( - self, - text=None, - height=0, - fg_color=BG_HEX_COLOR, - image=CTkImage(img, size=(desired_width, height)) - ) - self.starting_up_text_label.place(relx=0.5, rely=0.7, anchor="center") - - - - (self.vrct_second_text_img, desired_width, height) = openImageKeepAspectRatio(getImageFileFromUiUtils("vrchat_chatbox_trasnlator_transcription.png"), 280) - self.vrct_second_text_img_label = CTkLabel( - self, - text=None, - height=0, - fg_color=BG_HEX_COLOR, - image=CTkImage(self.vrct_second_text_img, size=(desired_width, height)) - ) - self.vrct_second_text_img_label.place(relx=0.98, rely=0.98, anchor="se") - - - - - (self.vrct_logo_img, desired_width, height) = openImageKeepAspectRatio(getImageFileFromUiUtils("vrct_logo_for_dark_mode.png"), 280) - self.vrct_logo_img_label = CTkLabel( - self, - text=None, - height=0, - fg_color=BG_HEX_COLOR, - image=CTkImage(self.vrct_logo_img, size=(desired_width, height)) - ) - - - - - self.weight_download_progressbar_widget = CTkProgressBar( - self, - height=8, - corner_radius=0, - fg_color="#4b4c4f", - progress_color=VRCT_HEX_COLOR, - ) - self.weight_download_progressbar_widget.set(0) - - - (img, desired_width, height) = openImageKeepAspectRatio(getImageFileFromUiUtils("VRCT_now_downloading.png"), 320) - self.weight_download_text_label = CTkLabel( - self, - text=None, - height=0, - fg_color=BG_HEX_COLOR, - image=CTkImage(img, size=(desired_width, height)) - ) - - - def toProgress(self, num:int): - if self.is_showed_weight_download_progressbar is True: - self.vrct_logo_img_label.place_forget() - self.weight_download_progressbar_widget.place_forget() - self.weight_download_text_label.place_forget() - - self.progressbar_wrapper.place(relx=0.5, rely=0.5, anchor="center") - self.starting_up_text_label.place(relx=0.5, rely=0.7, anchor="center") - self.vrct_second_text_img_label.place(relx=0.98, rely=0.98, anchor="se") - self.update() - - target_progressbar_widget = getattr(self, "progressbar_" + str(num)) - - # This animation process' base code was made by ChatGPT. - start_time = time.time() - DURATION = 0.2 - while True: - elapsed_time = time.time() - start_time - progress = min(elapsed_time / DURATION, 1.0) - eased_progress = 1 - math.pow(1 - progress, 6) - - - target_progressbar_widget.set(eased_progress) - self.update_idletasks() - - if elapsed_time >= DURATION: - break - - time.sleep(0.01) - - DURATION = 0.2 - if num == 3: - start_time = time.time() - while True: - elapsed_time = time.time() - start_time - progress = min(elapsed_time / DURATION, 1.0) - eased_progress = 1 - math.pow(1 - progress, 6) - - # angleが45度未満の場合は0から45度に進むようにし、45度以上の場合は45度に固定 - angle = min(45, 45 * eased_progress) - angle = -angle - - rotated_img = self.rotateImage(self.chato_img, angle) - self.chato_img_label.configure(image=CTkImage(rotated_img, size=(self.CHATO_IMG_WIDTH, self.CHATO_IMG_HEIGHT))) - - rely = 1.0 - eased_progress * 0.6 - self.chato_img_label.place_configure(rely=rely) - self.update() - - if elapsed_time >= DURATION: - break - - time.sleep(0.01) - - def rotateImage(self, image, angle): - # 画像を回転させる - rotated_image = image.rotate(angle, expand=True) - return rotated_image - - - def updateDownloadProgress(self, progress:float): - if self.is_showed_weight_download_progressbar is False: - self.vrct_second_text_img_label.place_forget() - self.progressbar_wrapper.place_forget() - self.starting_up_text_label.place_forget() - - self.vrct_logo_img_label.place(relx=0.5, rely=0.4, anchor="center") - self.weight_download_progressbar_widget.place(relwidth=0.9, relx=0.5, rely=0.84, anchor="s") - self.weight_download_text_label.place(relx=0.98, rely=0.96, anchor="se") - self.is_showed_weight_download_progressbar = True - self.update() - - progress_color = generateGradientColor( - value=progress, - color_start=[242, 242, 242], # RGB values for #f2f2f2 - color_end=[72, 164, 149], # RGB values for #48a495 - ) - self.weight_download_progressbar_widget.configure(progress_color=progress_color) - self.weight_download_progressbar_widget.set(progress) - self.update() - - - def showSplash(self): - self.attributes("-alpha", 0) - self.deiconify() - setGeometryToCenterOfScreen(root_widget=self) - fadeInAnimation(self, steps=5, interval=0.02) - - - def destroySplash(self): - self.destroy() \ No newline at end of file diff --git a/vrct_gui/splash_window/__init__.py b/vrct_gui/splash_window/__init__.py deleted file mode 100644 index 3ce5e580..00000000 --- a/vrct_gui/splash_window/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .SplashWindow import * \ No newline at end of file diff --git a/vrct_gui/ui_managers/AboutVrctManager.py b/vrct_gui/ui_managers/AboutVrctManager.py deleted file mode 100644 index f81abf99..00000000 --- a/vrct_gui/ui_managers/AboutVrctManager.py +++ /dev/null @@ -1,185 +0,0 @@ -from types import SimpleNamespace - -from ..ui_utils import calculateUiSize, getImageFileFromUiUtils_AboutVrct, bindButtonFunctionAndColor -from customtkinter import CTkFrame, CTkLabel, CTkImage - -IMAGE_STANDARD_SCALING = 2 -class AboutVrctManager(): - def __init__(self, scaling_percentage, ui_language, ctm): - self.ctm = ctm - scaling_float = int(scaling_percentage.replace("%", "")) / 100 - self.SCALING_FLOAT = max(scaling_float, 0.4) - - self.uism = SimpleNamespace() - - self.uism.ABOUT_VRCT_CONTAINER_LEFT_PADX = self.dupTuple(self._calculateUiSize(32)) - - self.uism.SECTION_BOTTOM_PADY = self._calculateUiSize(22) - self.uism.PROJECT_LINKS_SECTION_BOTTOM_PADDING = self._calculateUiSize(18) # Exception pady - - self.uism.VRCHAT_DISCLAIMER_SECTION_PADY = (self._calculateUiSize(80), self._calculateUiSize(20)) # Exception pady - - self.uism.THE_DEVELOPERS_SECTION_TITLE_BOTTOM_PADY = self._calculateUiSize(8) - self.uism.DEVS_CONTACTS_Y1 = self._calculateUiSize(118) - self.uism.DEVS_MISYA_X_X = self._calculateUiSize(269) - self.uism.DEVS_MISYA_GITHUB_X = self._calculateUiSize(297) - self.uism.DEVS_SHIINA_X_X = self._calculateUiSize(298) - - self.uism.PROJECT_LINK_BOTTOM_PADY = self._calculateUiSize(2) - self.uism.PROJECT_LINK_CORNER_RADIUS = self._calculateUiSize(4) - self.uism.PROJECT_LINK_CONTENTS_PADX = self._calculateUiSize(55) - self.uism.PROJECT_LINK_ITEM_IPADX = self._calculateUiSize(10) - self.uism.PROJECT_LINK_ITEM_IPADY = self._calculateUiSize(4) - - self.uism.CONTRIBUTORS_SECTION_TITLE_BOTTOM_PADY = self._calculateUiSize(10) - - self.uism.CONTRIBUTORS_CONTACTS_Y1 = self._calculateUiSize(66) - self.uism.CONTRIBUTORS_DONE_SAN_X_X = self._calculateUiSize(25) - self.uism.CONTRIBUTORS_IYA_X_X = self._calculateUiSize(281) - self.uism.CONTRIBUTORS_RERA_X_X = self._calculateUiSize(530) - self.uism.CONTRIBUTORS_RERA_GITHUB_X = self._calculateUiSize(554) - - self.uism.CONTRIBUTORS_CONTACTS_Y2 = self._calculateUiSize(170) - self.uism.CONTRIBUTORS_POPOSUKE_X_X = self._calculateUiSize(154) - self.uism.CONTRIBUTORS_KUMAGUMA_X_X = self._calculateUiSize(413) - - - self.uism.TELL_US_BUTTON_CORNER_RADIUS = self._calculateUiSize(6) - self.uism.TELL_US_BUTTON_PADX = self._calculateUiSize(8) - self.uism.TELL_US_BUTTON_PADY = self._calculateUiSize(8) - self.uism.TELL_US_BUTTON_BORDER_WIDTH = self._calculateUiSize(1) - - - self.uism.LOCALIZATION_TITLE_BOTTOM_PADY = self._calculateUiSize(4) - - - self.uism.SPECIAL_THANKS_SECTION_TITLE_BOTTOM_PADY = self._calculateUiSize(6) - self.uism.SPECIAL_THANKS_MEMBERS_BOTTOM_PADY = self._calculateUiSize(4) - self.uism.SPECIAL_THANKS_MESSAGE_BOTTOM_PADY = self._calculateUiSize(0) - self.uism.SPECIAL_THANKS_MESSAGE_AND_YOU_BOTTOM_PADY = self._calculateUiSize(8) - - self.uism.POSTER_SHOWCASE_SECTION_TITLE_BOTTOM_PADY = self._calculateUiSize(6) - self.uism.POSTER_SHOWCASE_POSTER_IMAGES_BOTTOM_PADY = self._calculateUiSize(6) - self.uism.POSTER_SHOWCASE_WORLD_ITEM_BOTTOM_PADY = self._calculateUiSize(4) - self.uism.POSTER_SHOWCASE_WORLD_ITEM_IPADX = self._calculateUiSize(12) - self.uism.POSTER_SHOWCASE_WORLD_ITEM_IPADY = self._calculateUiSize(4) - self.uism.POSTER_SHOWCASE_WORLD_BOTTOM_PADY = self._calculateUiSize(4) - self.uism.POSTER_SHOWCASE_WORLD_CORNER_RADIUS = self._calculateUiSize(4) - self.uism.POSTER_SHOWCASE_WORLD_PAGINATION_BUTTON_BOTTOM_PADY = self._calculateUiSize(18) - self.uism.POSTER_TELL_US_MESSAGE_TOP_PADY = self._calculateUiSize(20) - self.uism.POSTER_CHANGE_BUTTON_CORNER_RADIUS = self._calculateUiSize(6) - - - self.image_file = SimpleNamespace() - - - if ui_language == "ja": - self.image_file.SPECIAL_THANKS_MESSAGE = "special_thanks_message_ja.png" - self.image_file.POSTER_IMAGES_AUTHOR = "poster_images_authors_ja.png" - self.image_file.POSTER_IMAGES_AUTHOR_M = "poster_images_authors_m_ja.png" - else: - self.image_file.SPECIAL_THANKS_MESSAGE = "special_thanks_message_en.png" - self.image_file.POSTER_IMAGES_AUTHOR = "poster_images_authors_en.png" - self.image_file.POSTER_IMAGES_AUTHOR_M = "poster_images_authors_m_en.png" - - - poster_showcase_pagination_button_image = getImageFileFromUiUtils_AboutVrct("poster_showcase_pagination_button.png") - self.image_file.POSTER_SHOWCASE_WORLD_PAGINATION_BUTTON = SimpleNamespace( - img = poster_showcase_pagination_button_image, - width = calculateUiSize( - default_size = int(poster_showcase_pagination_button_image.width / IMAGE_STANDARD_SCALING), - scaling_float=self.SCALING_FLOAT, - is_allowed_odd=True, - ), - height = calculateUiSize( - default_size = int(poster_showcase_pagination_button_image.height / IMAGE_STANDARD_SCALING), - scaling_float=self.SCALING_FLOAT, - is_allowed_odd=True, - ), - ) - - - poster_showcase_pagination_button_chato_image = getImageFileFromUiUtils_AboutVrct("poster_showcase_pagination_button_chato.png") - self.image_file.POSTER_SHOWCASE_WORLD_PAGINATION_BUTTON_CHATO = SimpleNamespace( - img = poster_showcase_pagination_button_chato_image, - width = calculateUiSize( - default_size = int(poster_showcase_pagination_button_chato_image.width / IMAGE_STANDARD_SCALING), - scaling_float=self.SCALING_FLOAT, - is_allowed_odd=True, - ), - height = calculateUiSize( - default_size = int(poster_showcase_pagination_button_chato_image.height / IMAGE_STANDARD_SCALING), - scaling_float=self.SCALING_FLOAT, - is_allowed_odd=True, - ), - ) - - - - - def _calculateUiSize(self, default_size, is_allowed_odd:bool=True, is_zero_allowed:bool=False): - size = calculateUiSize(default_size, self.SCALING_FLOAT, is_allowed_odd, is_zero_allowed) - return size - - - def embedImageCTkLabel(self, parent_frame, image_file_name, image_scaling=IMAGE_STANDARD_SCALING, directly_type:str=None, fg_color:str="transparent", anchor:str="w", rotate_angle:int=0): - - img = getImageFileFromUiUtils_AboutVrct(image_file_name, directly_type) - - image_width = calculateUiSize( - default_size = int(img.width / image_scaling), - scaling_float=self.SCALING_FLOAT, - is_allowed_odd=True, - ) - image_height = calculateUiSize( - default_size = int(img.height / image_scaling), - scaling_float=self.SCALING_FLOAT, - is_allowed_odd=True, - ) - - img_label = CTkLabel( - parent_frame, - text=None, - corner_radius=0, - height=image_height, - fg_color=fg_color, - anchor=anchor, - image=CTkImage((img).rotate(rotate_angle), size=(image_width, image_height)) - ) - - return img_label - - def embedImageButtonCTkLabel(self, parent_frame, image_file_name, callback, image_scaling=IMAGE_STANDARD_SCALING, directly_type:str=None, fg_color:str=None, hovered_color:str=None, clicked_color:str=None, anchor:str="w", corner_radius:int=0, no_bind:bool=False, rotate_angle:int=0): - - fg_color = self.ctm.ABOUT_VRCT_BG if fg_color is None else fg_color - - if hovered_color is None: - hovered_color = self.ctm.ABOUT_VRCT_BUTTON_HOVERED_BG_COLOR - if clicked_color is None: - clicked_color = self.ctm.ABOUT_VRCT_BUTTON_CLICKED_BG_COLOR - - img_label_frame = CTkFrame(parent_frame, fg_color=fg_color, corner_radius=corner_radius, width=0, height=0) - - img_label = self.embedImageCTkLabel(img_label_frame, image_file_name, image_scaling, directly_type, fg_color, anchor, rotate_angle) - - if no_bind is False: - img_label_frame.configure(cursor="hand2") - img_label.configure(cursor="hand2") - img_label._canvas.configure(cursor="hand2") - bindButtonFunctionAndColor( - target_widgets=[img_label_frame, img_label], - enter_color=hovered_color, - leave_color=fg_color, - clicked_color=clicked_color, - buttonReleasedFunction=callback, - ) - - img_label.grid() - img_label_frame.img_label = img_label - - return img_label_frame - - - @staticmethod - def dupTuple(value): - return (value, value) \ No newline at end of file diff --git a/vrct_gui/ui_managers/ColorThemeManager.py b/vrct_gui/ui_managers/ColorThemeManager.py deleted file mode 100644 index c9793403..00000000 --- a/vrct_gui/ui_managers/ColorThemeManager.py +++ /dev/null @@ -1,120 +0,0 @@ -from types import SimpleNamespace - -from .Themes import _darkTheme, _lightTheme - -class ColorThemeManager(): - def __init__(self, theme): - # base_color 100, 200, 300...900 is generated by https://m2.material.io/design/color/the-color-system.html#tools-for-picking-colors . I put the comment "Source". I used it as a source color and generated. - # and like 750, 888... is made by https://meyerweb.com/eric/tools/color-blend/#:::hex - - self.base_color = SimpleNamespace( - - PRIMARY_100_COLOR = "#b7ded8", - PRIMARY_150_COLOR = "#A1D4CC", - PRIMARY_200_COLOR = "#8acac0", - PRIMARY_250_COLOR = "#76BFB4", - PRIMARY_300_COLOR = "#61b4a7", - PRIMARY_350_COLOR = "#55AC9E", - PRIMARY_400_COLOR = "#48a495", # Source - PRIMARY_450_COLOR = "#429c8c", - PRIMARY_500_COLOR = "#3b9483", - PRIMARY_600_COLOR = "#368777", - PRIMARY_650_COLOR = "#347f6f", - PRIMARY_700_COLOR = "#317767", - PRIMARY_750_COLOR = "#2F6F60", - PRIMARY_800_COLOR = "#2c6759", - PRIMARY_900_COLOR = "#214b3f", - - SENT_400_COLOR = "#6197b4", # Source PRIMARY_300_COLOR #61b4a7. ANALOGOUS' Second one. - RECEIVED_300_COLOR = "#a861b4", # Source PRIMARY_300_COLOR #61b4a7. TRIADIC' Second one. - - DARK_BASIC_TEXT_COLOR = "#f2f2f2", # Icon normal color too - DARK_100_COLOR = "#f5f7fb", # THE LIGHTEST BG COLOR - DARK_200_COLOR = "#f1f2f6", - DARK_300_COLOR = "#e9eaee", - DARK_350_COLOR = "#d8d9dd", - DARK_400_COLOR = "#c7c8cc", # Icon second color - DARK_450_COLOR = "#b8b9bd", - DARK_500_COLOR = "#a9aaae", - DARK_600_COLOR = "#7f8084", - DARK_650_COLOR = "#75767a", - DARK_700_COLOR = "#6a6c6f", - DARK_725_COLOR = "#636467", - DARK_750_COLOR = "#5b5c5f", - DARK_775_COLOR = "#535457", - DARK_800_COLOR = "#4b4c4f", - DARK_825_COLOR = "#434447", - DARK_850_COLOR = "#3a3b3e", - DARK_863_COLOR = "#36373a", - DARK_875_COLOR = "#323336", - DARK_888_COLOR = "#2e2f32", - DARK_900_COLOR = "#292a2d", # Source - DARK_925_COLOR = "#242528", - DARK_950_COLOR = "#1f2022", - DARK_975_COLOR = "#1a1b1d", - DARK_1000_COLOR = "#151517", # THE DARKEST BG COLOR - - - LIGHT_BASIC_TEXT_COLOR = "#050505", - LIGHT_100_COLOR = "#f5f7fb", # THE LIGHTEST BG COLOR - LIGHT_125_COLOR = "#F4F6FA", - LIGHT_150_COLOR = "#F2F4F8", - LIGHT_175_COLOR = "#F1F3F7", - LIGHT_200_COLOR = "#eff1f5", - LIGHT_225_COLOR = "#ECEEF2", - LIGHT_250_COLOR = "#E9EBEF", - LIGHT_275_COLOR = "#E6E8EC", - LIGHT_300_COLOR = "#e2e4e8", - LIGHT_313_COLOR = "#DEE0E4", - LIGHT_325_COLOR = "#DADCE0", - LIGHT_333_COLOR = "#D6D8DC", - LIGHT_350_COLOR = "#D1D3D7", - LIGHT_375_COLOR = "#C9CBCF", - LIGHT_400_COLOR = "#c0c2c6", - LIGHT_450_COLOR = "#B1B3B7", - LIGHT_500_COLOR = "#a2a3a7", - LIGHT_550_COLOR = "#8D8F93", - LIGHT_600_COLOR = "#787a7e", - LIGHT_700_COLOR = "#646669", # Icon second color - LIGHT_800_COLOR = "#45464a", - LIGHT_900_COLOR = "#242528", # Icon normal color - LIGHT_1000_COLOR = "#1b1b1b", # THE DARKEST BG COLOR - ) - - - # It's actually meaningless to separate it from __init__. but it's just set to use the dark theme by default, so I did it just in case to change the default theme. - selected_color_theme = _darkTheme(self.base_color) - for each_key in selected_color_theme.__dict__.keys(): - setattr(self, each_key, getattr(selected_color_theme, each_key)) - - - if theme == "Dark": - pass - - elif theme == "Light": - selected_color_theme = _lightTheme(self.base_color) - self._colorThemeDictsMerger(selected_color_theme) - - - - - - def _colorThemeDictsMerger(self, selected_color_theme): - # Each section(main, selectable_language_window, config_window...) marge to default theme. - for selected_theme_section_key in selected_color_theme.__dict__.keys(): - # Get same section data by section key from default theme. - default_theme_target_section_data = getattr(self, selected_theme_section_key) - - selected_theme_section_data = getattr(selected_color_theme, selected_theme_section_key) - self._mergeNestedDicts(default_theme_target_section_data.__dict__, selected_theme_section_data.__dict__) - - - - def _mergeNestedDicts(self, d1, d2): - for key, value in d2.items(): - if key in d1 and isinstance(d1[key], dict) and isinstance(value, dict): - self._mergeNestedDicts(d1[key], value) - else: - d1[key] = value - - return d1 diff --git a/vrct_gui/ui_managers/Themes/__init__.py b/vrct_gui/ui_managers/Themes/__init__.py deleted file mode 100644 index fb61579d..00000000 --- a/vrct_gui/ui_managers/Themes/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from ._darkTheme import _darkTheme -from ._lightTheme import _lightTheme \ No newline at end of file diff --git a/vrct_gui/ui_managers/Themes/_darkTheme.py b/vrct_gui/ui_managers/Themes/_darkTheme.py deleted file mode 100644 index ed46a557..00000000 --- a/vrct_gui/ui_managers/Themes/_darkTheme.py +++ /dev/null @@ -1,351 +0,0 @@ -from types import SimpleNamespace -from ...ui_utils import getImageFileFromUiUtils - -def _darkTheme(base_color): - theme_settings = SimpleNamespace( - main = SimpleNamespace( - # Common - BASIC_TEXT_COLOR = base_color.DARK_BASIC_TEXT_COLOR, - LABELS_TEXT_COLOR = base_color.DARK_BASIC_TEXT_COLOR, - - # Main - MAIN_BG_COLOR = base_color.DARK_888_COLOR, - - - TEXTBOX_BG_COLOR = base_color.DARK_900_COLOR, - TEXTBOX_TEXT_COLOR = base_color.DARK_BASIC_TEXT_COLOR, - TEXTBOX_TEXT_SUB_COLOR = base_color.DARK_450_COLOR, - TEXTBOX_SYSTEM_TAG_TEXT_COLOR = base_color.PRIMARY_300_COLOR, - TEXTBOX_SENT_TAG_TEXT_COLOR = base_color.SENT_400_COLOR, - TEXTBOX_RECEIVED_TAG_TEXT_COLOR = base_color.RECEIVED_300_COLOR, - # TEXTBOX_ERROR_TAG_TEXT_COLOR = "#c27583", - TEXTBOX_TIMESTAMP_TEXT_COLOR = base_color.DARK_600_COLOR, - - TEXTBOX_TAB_BG_PASSIVE_COLOR = base_color.DARK_850_COLOR, - TEXTBOX_TAB_BG_ACTIVE_COLOR = base_color.DARK_900_COLOR, - TEXTBOX_TAB_BG_HOVERED_COLOR = base_color.DARK_800_COLOR, - TEXTBOX_TAB_BG_CLICKED_COLOR = base_color.DARK_925_COLOR, - TEXTBOX_TAB_TEXT_ACTIVE_COLOR = base_color.DARK_BASIC_TEXT_COLOR, - TEXTBOX_TAB_TEXT_PASSIVE_COLOR = base_color.DARK_500_COLOR, - - TEXTBOX_ENTRY_TEXT_COLOR = base_color.DARK_300_COLOR, - TEXTBOX_ENTRY_TEXT_DISABLED_COLOR = base_color.DARK_500_COLOR, - TEXTBOX_ENTRY_BG_COLOR = base_color.DARK_875_COLOR, - TEXTBOX_ENTRY_BORDER_COLOR = base_color.DARK_750_COLOR, - TEXTBOX_ENTRY_PLACEHOLDER_COLOR = base_color.DARK_500_COLOR, - TEXTBOX_ENTRY_PLACEHOLDER_DISABLED_COLOR = base_color.DARK_700_COLOR, - - SEND_MESSAGE_BUTTON_BG_COLOR = base_color.DARK_850_COLOR, - SEND_MESSAGE_BUTTON_BG_HOVERED_COLOR = base_color.DARK_825_COLOR, - SEND_MESSAGE_BUTTON_BG_CLICKED_COLOR = base_color.DARK_900_COLOR, - - - # Sidebar - SIDEBAR_BG_COLOR = base_color.DARK_850_COLOR, - - # Sidebar Features - SF__BG_COLOR = base_color.DARK_825_COLOR, - SF__HOVERED_BG_COLOR = base_color.DARK_800_COLOR, - SF__CLICKED_BG_COLOR = base_color.DARK_875_COLOR, - SF__TEXT_DISABLED_COLOR = base_color.DARK_500_COLOR, - - SF__SWITCH_BOX_BG_COLOR = base_color.DARK_775_COLOR, - SF__SWITCH_BOX_HOVERED_BG_COLOR = base_color.DARK_725_COLOR, - SF__SWITCH_BOX_CLICKED_BG_COLOR = base_color.DARK_825_COLOR, - SF__SWITCH_BOX_ACTIVE_BG_COLOR = base_color.PRIMARY_500_COLOR, - SF__SWITCH_BOX_ACTIVE_HOVERED_BG_COLOR = base_color.PRIMARY_400_COLOR, - SF__SWITCH_BOX_ACTIVE_CLICKED_BG_COLOR = base_color.PRIMARY_700_COLOR, - SF__SWITCH_BOX_DISABLE_BG_COLOR = base_color.PRIMARY_800_COLOR, - - SF__SWITCH_BOX_BUTTON_COLOR = base_color.DARK_400_COLOR, - SF__SWITCH_BOX_BUTTON_DISABLED_COLOR = base_color.DARK_600_COLOR, - # It's not working because It overrode internally. - SF__SWITCH_BOX_BUTTON_HOVERED_COLOR = base_color.DARK_350_COLOR, - - SF__SELECTED_MARK_ACTIVE_BG_COLOR = base_color.PRIMARY_500_COLOR, - SF__SELECTED_MARK_ACTIVE_HOVERED_BG_COLOR = base_color.PRIMARY_400_COLOR, - SF__SELECTED_MARK_ACTIVE_CLICKED_BG_COLOR = base_color.PRIMARY_700_COLOR, - SF__SELECTED_MARK_DISABLE_BG_COLOR = base_color.PRIMARY_800_COLOR, - - - # Sidebar Languages Settings - SLS__TITLE_TEXT_COLOR = base_color.DARK_400_COLOR, - - SLS__BG_COLOR = base_color.DARK_800_COLOR, - - SLS__PRESETS_TAB_BG_HOVERED_COLOR = base_color.DARK_825_COLOR, - SLS__PRESETS_TAB_BG_CLICKED_COLOR = base_color.DARK_875_COLOR, - SLS__PRESETS_TAB_BG_PASSIVE_COLOR = base_color.DARK_850_COLOR, - SLS__PRESETS_TAB_BG_ACTIVE_COLOR = base_color.DARK_800_COLOR, - SLS__PRESETS_TAB_ACTIVE_TEXT_COLOR_PASSIVE = base_color.DARK_600_COLOR, - SLS__PRESETS_TAB_ACTIVE_TEXT_COLOR = base_color.DARK_BASIC_TEXT_COLOR, - - SLS__BOX_BG_COLOR = base_color.DARK_825_COLOR, - SLS__BOX_SECTION_TITLE_TEXT_COLOR = base_color.DARK_400_COLOR, - SLS__BOX_ARROWS_TEXT_COLOR = base_color.DARK_500_COLOR, - SLS__BOX_ARROWS_SWAP_BUTTON_TEXT_COLOR = base_color.DARK_BASIC_TEXT_COLOR, - SLS__BOX_ARROWS_SWAP_BUTTON_HOVERED_COLOR = base_color.DARK_750_COLOR, - SLS__BOX_ARROWS_SWAP_BUTTON_CLICKED_COLOR = base_color.DARK_850_COLOR, - - SLS__OPTIONMENU_BG_COLOR = base_color.DARK_888_COLOR, - SLS__OPTIONMENU_HOVERED_BG_COLOR = base_color.DARK_875_COLOR, - SLS__OPTIONMENU_CLICKED_BG_COLOR = base_color.DARK_900_COLOR, - - SLS__DROPDOWN_MENU_WINDOW_BG_COLOR = base_color.DARK_888_COLOR, - SLS__DROPDOWN_MENU_WINDOW_BORDER_COLOR = base_color.DARK_650_COLOR, - SLS__DROPDOWN_MENU_BG_COLOR = base_color.DARK_888_COLOR, - SLS__DROPDOWN_MENU_HOVERED_BG_COLOR = base_color.DARK_825_COLOR, - SLS__DROPDOWN_MENU_CLICKED_BG_COLOR = base_color.DARK_900_COLOR, - - CONFIG_BUTTON_BG_COLOR = base_color.DARK_850_COLOR, - CONFIG_BUTTON_HOVERED_BG_COLOR = base_color.DARK_800_COLOR, - CONFIG_BUTTON_CLICKED_BG_COLOR = base_color.DARK_875_COLOR, - - MINIMIZE_SIDEBAR_BUTTON_BG_COLOR = base_color.DARK_850_COLOR, - MINIMIZE_SIDEBAR_BUTTON_HOVERED_BG_COLOR = base_color.DARK_800_COLOR, - MINIMIZE_SIDEBAR_BUTTON_CLICKED_BG_COLOR = base_color.DARK_900_COLOR, - - - - TOP_BAR_BUTTON_BG_COLOR = base_color.DARK_888_COLOR, - TOP_BAR_BUTTON_HOVERED_BG_COLOR = base_color.DARK_850_COLOR, - TOP_BAR_BUTTON_CLICKED_BG_COLOR = base_color.DARK_900_COLOR, - TOP_BAR_BUTTON_TEXT_COLOR = base_color.DARK_BASIC_TEXT_COLOR, - TOP_BAR_BUTTON_STATE_TEXT_ENABLED_COLOR = base_color.PRIMARY_300_COLOR, - TOP_BAR_BUTTON_STATE_TEXT_DISABLED_COLOR = base_color.DARK_600_COLOR, - - UPDATE_AVAILABLE_BUTTON_BG_COLOR = base_color.DARK_888_COLOR, - UPDATE_AVAILABLE_BUTTON_HOVERED_BG_COLOR = base_color.DARK_850_COLOR, - UPDATE_AVAILABLE_BUTTON_CLICKED_BG_COLOR = base_color.DARK_900_COLOR, - UPDATE_AVAILABLE_BUTTON_TEXT_COLOR = base_color.PRIMARY_300_COLOR, - - HELP_AND_INFO_BUTTON_BG_COLOR = base_color.DARK_888_COLOR, - HELP_AND_INFO_BUTTON_HOVERED_BG_COLOR = base_color.DARK_850_COLOR, - HELP_AND_INFO_BUTTON_CLICKED_BG_COLOR = base_color.DARK_900_COLOR, - ), - - - selectable_language_window = SimpleNamespace( - # Selectable Language Window - BASIC_TEXT_COLOR = base_color.DARK_BASIC_TEXT_COLOR, - - MAIN_BG_COLOR = base_color.DARK_875_COLOR, - - GO_BACK_BUTTON_BG_COLOR = base_color.DARK_800_COLOR, - GO_BACK_BUTTON_BG_HOVERED_COLOR = base_color.DARK_750_COLOR, - GO_BACK_BUTTON_BG_CLICKED_COLOR = base_color.DARK_875_COLOR, - - TOP_BG_COLOR = base_color.DARK_850_COLOR, - TITLE_TEXT_COLOR = base_color.DARK_400_COLOR, - LANGUAGE_BUTTON_BG_COLOR = base_color.DARK_875_COLOR, - LANGUAGE_BUTTON_BG_HOVERED_COLOR = base_color.DARK_825_COLOR, - LANGUAGE_BUTTON_BG_CLICKED_COLOR = base_color.DARK_888_COLOR, - ), - - - - # Modal Window (Main Window) - main_window_cover = SimpleNamespace( - TEXT_COLOR = base_color.DARK_BASIC_TEXT_COLOR, - BG_COLOR = "#000", - ), - - - confirmation_modal = SimpleNamespace( - MESSAGE_TEXT_COLOR = base_color.DARK_BASIC_TEXT_COLOR, - FAKE_BORDER_COLOR = base_color.DARK_600_COLOR, - BG_COLOR = base_color.DARK_800_COLOR, - CONFIRMATION_BUTTONS_TEXT_COLOR = base_color.DARK_BASIC_TEXT_COLOR, - - ACCEPT_BUTTON_BG_COLOR = base_color.PRIMARY_600_COLOR, - ACCEPT_BUTTON_HOVERED_BG_COLOR = base_color.PRIMARY_450_COLOR, - ACCEPT_BUTTON_CLICKED_BG_COLOR = base_color.PRIMARY_750_COLOR, - DENY_BUTTON_BG_COLOR = base_color.DARK_750_COLOR, - DENY_BUTTON_HOVERED_BG_COLOR = base_color.DARK_700_COLOR, - DENY_BUTTON_CLICKED_BG_COLOR = base_color.DARK_825_COLOR, - ), - - - config_window = SimpleNamespace( - # Common - BASIC_TEXT_COLOR = base_color.DARK_BASIC_TEXT_COLOR, - LABELS_TEXT_COLOR = base_color.DARK_BASIC_TEXT_COLOR, - LABELS_DESC_TEXT_COLOR = base_color.DARK_500_COLOR, - - LABELS_TEXT_DISABLED_COLOR = base_color.DARK_600_COLOR, - - SB__BUTTON_COLOR = base_color.DARK_888_COLOR, - SB__BUTTON_HOVERED_COLOR = base_color.DARK_800_COLOR, - SB__BUTTON_CLICKED_COLOR = base_color.DARK_900_COLOR, - - - # Top bar - TOP_BAR_BG_COLOR = base_color.DARK_850_COLOR, - - # Restart Button - RESTART_BUTTON_BG_COLOR = base_color.PRIMARY_600_COLOR, - RESTART_BUTTON_HOVERED_BG_COLOR = base_color.PRIMARY_500_COLOR, - RESTART_BUTTON_CLICKED_BG_COLOR = base_color.PRIMARY_700_COLOR, - - - # Compact Mode - COMPACT_MODE_SWITCH_BOX_BG_COLOR = base_color.DARK_775_COLOR, - COMPACT_MODE_SWITCH_BOX_ACTIVE_BG_COLOR = base_color.PRIMARY_500_COLOR, - COMPACT_MODE_SWITCH_BOX_BUTTON_COLOR = base_color.DARK_350_COLOR, - COMPACT_MODE_SWITCH_BOX_BUTTON_HOVERED_COLOR = base_color.DARK_300_COLOR, - - # Main - MAIN_BG_COLOR = base_color.DARK_950_COLOR, - - # This is for fake border color - SB__WRAPPER_BG_COLOR = base_color.DARK_750_COLOR, - - SB__BG_COLOR = base_color.DARK_888_COLOR, - - SB__OPTIONMENU_BG_COLOR = base_color.DARK_925_COLOR, - SB__OPTIONMENU_HOVERED_BG_COLOR = base_color.DARK_850_COLOR, - SB__OPTIONMENU_CLICKED_BG_COLOR = base_color.DARK_950_COLOR, - SB__DROPDOWN_MENU_WINDOW_BG_COLOR = base_color.DARK_950_COLOR, - SB__DROPDOWN_MENU_WINDOW_BORDER_COLOR = base_color.DARK_600_COLOR, - SB__DROPDOWN_MENU_BG_COLOR = base_color.DARK_875_COLOR, - SB__DROPDOWN_MENU_HOVERED_BG_COLOR = base_color.DARK_800_COLOR, - SB__DROPDOWN_MENU_CLICKED_BG_COLOR = base_color.DARK_900_COLOR, - - SB__SLIDER_BG_COLOR = base_color.DARK_700_COLOR, - SB__SLIDER_PROGRESS_BG_COLOR = base_color.DARK_500_COLOR, - SB__SLIDER_BUTTON_COLOR = base_color.DARK_700_COLOR, - SB__SLIDER_BUTTON_HOVERED_COLOR = base_color.DARK_600_COLOR, - SB__SLIDER_TOOLTIP_BG_COLOR = base_color.DARK_850_COLOR, - SB__SLIDER_TOOLTIP_TEXT_COLOR = base_color.DARK_200_COLOR, - - SB__SWITCH_BOX_BG_COLOR = base_color.DARK_800_COLOR, - SB__SWITCH_BOX_BG_DISABLED_COLOR = base_color.DARK_900_COLOR, - SB__SWITCH_BOX_ACTIVE_BG_COLOR = base_color.PRIMARY_500_COLOR, - SB__SWITCH_BOX_ACTIVE_BG_DISABLED_COLOR = base_color.PRIMARY_700_COLOR, - SB__SWITCH_BOX_BUTTON_COLOR = base_color.DARK_400_COLOR, - SB__SWITCH_BOX_BUTTON_DISABLED_COLOR = base_color.DARK_700_COLOR, - SB__SWITCH_BOX_BUTTON_HOVERED_COLOR = base_color.DARK_350_COLOR, - - SB__CHECKBOX_BORDER_COLOR = base_color.DARK_600_COLOR, - SB__CHECKBOX_BORDER_DISABLED_COLOR = base_color.DARK_800_COLOR, - SB__CHECKBOX_HOVER_COLOR = base_color.DARK_800_COLOR, - SB__CHECKBOX_CHECKED_COLOR = base_color.PRIMARY_700_COLOR, - SB__CHECKBOX_CHECKMARK_COLOR = base_color.DARK_BASIC_TEXT_COLOR, - - SB__RADIOBUTTON_TEXT_COLOR = base_color.DARK_300_COLOR, - SB__RADIOBUTTON_BORDER_COLOR = base_color.DARK_600_COLOR, - SB__RADIOBUTTON_SELECTED_COLOR = base_color.PRIMARY_400_COLOR, - SB__RADIOBUTTON_BG_HOVERED_COLOR = base_color.DARK_825_COLOR, - SB__RADIOBUTTON_BG_CLICKED_COLOR = base_color.DARK_900_COLOR, - - SB__ENTRY_TEXT_COLOR = base_color.DARK_300_COLOR, - SB__ENTRY_BG_COLOR = base_color.DARK_863_COLOR, - SB__ENTRY_BORDER_COLOR = base_color.DARK_775_COLOR, - - - SB__PROGRESSBAR_X_SLIDER__PROGRESSBAR_BG_COLOR = base_color.DARK_800_COLOR, - SB__PROGRESSBAR_X_SLIDER__PROGRESSBAR_PROGRESS_BG_COLOR = base_color.PRIMARY_750_COLOR, - SB__PROGRESSBAR_X_SLIDER__PROGRESSBAR_PROGRESS_EXCEED_THRESHOLD_BG_COLOR = base_color.PRIMARY_400_COLOR, - - SB__PROGRESSBAR_X_SLIDER__SLIDER_BUTTON_COLOR = base_color.PRIMARY_600_COLOR, - SB__PROGRESSBAR_X_SLIDER__SLIDER_BUTTON_HOVERED_COLOR = base_color.PRIMARY_400_COLOR, - - SB__PROGRESSBAR_X_SLIDER__PASSIVE_BUTTON_COLOR = base_color.DARK_800_COLOR, - SB__PROGRESSBAR_X_SLIDER__PASSIVE_BUTTON_HOVERED_COLOR = base_color.DARK_700_COLOR, - SB__PROGRESSBAR_X_SLIDER__PASSIVE_BUTTON_CLICKED_COLOR = base_color.DARK_900_COLOR, - SB__PROGRESSBAR_X_SLIDER__PASSIVE_BUTTON_DISABLED_COLOR = base_color.DARK_850_COLOR, - - SB__PROGRESSBAR_X_SLIDER__ACTIVE_BUTTON_COLOR = base_color.PRIMARY_600_COLOR, - SB__PROGRESSBAR_X_SLIDER__ACTIVE_BUTTON_HOVERED_COLOR = base_color.PRIMARY_500_COLOR, - SB__PROGRESSBAR_X_SLIDER__ACTIVE_BUTTON_CLICKED_COLOR = base_color.PRIMARY_800_COLOR, - - SB__ADD_AND_DELETE_ABLE_LIST__ADD_BUTTON_COLOR = base_color.PRIMARY_600_COLOR, - SB__ADD_AND_DELETE_ABLE_LIST__ADD_BUTTON_HOVERED_COLOR = base_color.PRIMARY_500_COLOR, - SB__ADD_AND_DELETE_ABLE_LIST__ADD_BUTTON_CLICKED_COLOR = base_color.PRIMARY_700_COLOR, - SB__ADD_AND_DELETE_ABLE_LIST_BG_COLOR = base_color.DARK_800_COLOR, - - SB__ADD_AND_DELETE_ABLE_LIST__VALUES_ACTION_BUTTON_HOVERED_BG_COLOR = base_color.DARK_750_COLOR, - SB__ADD_AND_DELETE_ABLE_LIST__VALUES_ACTION_BUTTON_CLICKED_BG_COLOR = base_color.DARK_850_COLOR, - - SB__ADD_AND_DELETE_ABLE_LIST_DELETED_BG_COLOR = base_color.DARK_850_COLOR, - SB__ADD_AND_DELETE_ABLE_LIST__VALUES_DELETED_BUTTON_HOVERED_BG_COLOR = base_color.DARK_800_COLOR, - SB__ADD_AND_DELETE_ABLE_LIST__VALUES_DELETED_BUTTON_CLICKED_BG_COLOR = base_color.DARK_900_COLOR, - - - SB__MESSAGE_FORMAT__EXAMPLE_BG_COLOR = "#3a4554", # from VRChat' chat display color - SB__MESSAGE_FORMAT__EXAMPLE_TEXT_COLOR = base_color.DARK_100_COLOR, - SB__MESSAGE_FORMAT__SWAP_BUTTON_COLOR = base_color.DARK_875_COLOR, - SB__MESSAGE_FORMAT__SWAP_BUTTON_HOVERED_COLOR = base_color.DARK_800_COLOR, - SB__MESSAGE_FORMAT__SWAP_BUTTON_CLICKED_COLOR = base_color.DARK_888_COLOR, - - - - - # Side menu - SIDE_MENU_BG_COLOR = base_color.DARK_950_COLOR, - - SIDE_MENU_LABELS_BG_COLOR = base_color.DARK_950_COLOR, - SIDE_MENU_LABELS_BG_FOR_FAKE_BORDER_COLOR = base_color.DARK_950_COLOR, - SIDE_MENU_LABELS_HOVERED_BG_COLOR = base_color.DARK_850_COLOR, - SIDE_MENU_LABELS_CLICKED_BG_COLOR = base_color.PRIMARY_750_COLOR, - SIDE_MENU_LABELS_SELECTED_TEXT_COLOR = base_color.PRIMARY_200_COLOR, - - SIDE_MENU_SELECTED_MARK_ACTIVE_BG_COLOR = base_color.PRIMARY_500_COLOR, - - NOW_VERSION_TEXT_COLOR = base_color.DARK_300_COLOR, - - # Error Message Window for Config Window - # The color code [#bb4448] is a mixture of [#a9555c] and [#cc3333] (for a redder shade). - SB__ERROR_MESSAGE_BG_COLOR = "#bb4448", - SB__SUCCESS_MESSAGE_BG_COLOR = "#368777", - SB__ERROR_MESSAGE_TEXT_COLOR = "#fff", - - - - # About VRCT - ABOUT_VRCT_BG = base_color.DARK_950_COLOR, - ABOUT_VRCT_DEV_BG = base_color.DARK_888_COLOR, - ABOUT_VRCT_BUTTON_HOVERED_BG_COLOR = base_color.DARK_900_COLOR, - ABOUT_VRCT_BUTTON_CLICKED_BG_COLOR = base_color.DARK_925_COLOR, - - ABOUT_VRCT_TELL_US_BUTTON_BORDER_COLOR = base_color.DARK_888_COLOR, - ), - - - - image_file = SimpleNamespace( - VRCT_LOGO = getImageFileFromUiUtils("vrct_logo_for_dark_mode.png"), - VRCT_LOGO_MARK = getImageFileFromUiUtils("vrct_logo_mark_white.png"), - - TRANSLATION_ICON = getImageFileFromUiUtils("translation_icon_white.png"), - TRANSLATION_ICON_DISABLED = getImageFileFromUiUtils("translation_icon_disabled.png"), - MIC_ICON = getImageFileFromUiUtils("mic_icon_white.png"), - MIC_ICON_DISABLED = getImageFileFromUiUtils("mic_icon_disabled.png"), - HEADPHONES_ICON = getImageFileFromUiUtils("headphones_icon_white.png"), - HEADPHONES_ICON_DISABLED = getImageFileFromUiUtils("headphones_icon_disabled.png"), - FOREGROUND_ICON = getImageFileFromUiUtils("foreground_icon_white.png"), - FOREGROUND_ICON_DISABLED = getImageFileFromUiUtils("foreground_icon_disabled.png"), - - NARROW_ARROW_DOWN = getImageFileFromUiUtils("narrow_arrow_down_white.png"), - - CONFIGURATION_ICON = getImageFileFromUiUtils("configuration_icon_white.png"), - CONFIGURATION_ICON_DISABLED = getImageFileFromUiUtils("configuration_icon_disabled.png"), - - ARROW_LEFT = getImageFileFromUiUtils("arrow_left_white.png"), - ARROW_LEFT_DISABLED = getImageFileFromUiUtils("arrow_left_disabled.png"), - - SEND_MESSAGE_ICON = getImageFileFromUiUtils("send_message_icon_white.png"), - SEND_MESSAGE_ICON_DISABLED = getImageFileFromUiUtils("send_message_icon_black.png"), - REFRESH_UPDATE_ICON = getImageFileFromUiUtils("refresh_update_icon.png"), - REFRESH_ICON = getImageFileFromUiUtils("refresh_icon.png"), - HELP_ICON = getImageFileFromUiUtils("help_icon_white.png"), - - CANCEL_ICON = getImageFileFromUiUtils("cancel_icon.png"), - REDO_ICON = getImageFileFromUiUtils("redo_icon_white.png"), - SWAP_ICON = getImageFileFromUiUtils("swap_icon_white.png"), - FOLDER_OPEN_ICON = getImageFileFromUiUtils("folder_open_icon_white.png"), - LINK_ICON = getImageFileFromUiUtils("link_icon_white.png"), - ), - ) - - return theme_settings \ No newline at end of file diff --git a/vrct_gui/ui_managers/Themes/_lightTheme.py b/vrct_gui/ui_managers/Themes/_lightTheme.py deleted file mode 100644 index b4e2d96d..00000000 --- a/vrct_gui/ui_managers/Themes/_lightTheme.py +++ /dev/null @@ -1,335 +0,0 @@ -from types import SimpleNamespace -from ...ui_utils import getImageFileFromUiUtils - -def _lightTheme(base_color): - theme_settings = SimpleNamespace( - main = SimpleNamespace( - # Common - BASIC_TEXT_COLOR = base_color.LIGHT_BASIC_TEXT_COLOR, - LABELS_TEXT_COLOR = base_color.LIGHT_BASIC_TEXT_COLOR, - - # Main - MAIN_BG_COLOR = base_color.LIGHT_175_COLOR, - - - TEXTBOX_BG_COLOR = base_color.LIGHT_100_COLOR, - TEXTBOX_TEXT_COLOR = base_color.LIGHT_BASIC_TEXT_COLOR, - TEXTBOX_TEXT_SUB_COLOR = base_color.LIGHT_600_COLOR, - TEXTBOX_SYSTEM_TAG_TEXT_COLOR = base_color.PRIMARY_300_COLOR, - TEXTBOX_SENT_TAG_TEXT_COLOR = base_color.SENT_400_COLOR, - TEXTBOX_RECEIVED_TAG_TEXT_COLOR = base_color.RECEIVED_300_COLOR, - # TEXTBOX_ERROR_TAG_TEXT_COLOR = "#c27583", - TEXTBOX_TIMESTAMP_TEXT_COLOR = base_color.LIGHT_500_COLOR, - - TEXTBOX_TAB_BG_PASSIVE_COLOR = base_color.LIGHT_300_COLOR, - TEXTBOX_TAB_BG_ACTIVE_COLOR = base_color.LIGHT_125_COLOR, - TEXTBOX_TAB_BG_HOVERED_COLOR = base_color.LIGHT_250_COLOR, - TEXTBOX_TAB_BG_CLICKED_COLOR = base_color.LIGHT_100_COLOR, - TEXTBOX_TAB_TEXT_ACTIVE_COLOR = base_color.LIGHT_BASIC_TEXT_COLOR, - TEXTBOX_TAB_TEXT_PASSIVE_COLOR = base_color.LIGHT_600_COLOR, - - TEXTBOX_ENTRY_TEXT_COLOR = base_color.LIGHT_800_COLOR, - TEXTBOX_ENTRY_TEXT_DISABLED_COLOR = base_color.LIGHT_500_COLOR, - TEXTBOX_ENTRY_BG_COLOR = base_color.LIGHT_250_COLOR, - TEXTBOX_ENTRY_BORDER_COLOR = base_color.LIGHT_400_COLOR, - TEXTBOX_ENTRY_PLACEHOLDER_COLOR = base_color.LIGHT_600_COLOR, - TEXTBOX_ENTRY_PLACEHOLDER_DISABLED_COLOR = base_color.LIGHT_400_COLOR, - - SEND_MESSAGE_BUTTON_BG_COLOR = base_color.LIGHT_300_COLOR, - SEND_MESSAGE_BUTTON_BG_HOVERED_COLOR = base_color.LIGHT_325_COLOR, - SEND_MESSAGE_BUTTON_BG_CLICKED_COLOR = base_color.LIGHT_350_COLOR, - - - # Sidebar - SIDEBAR_BG_COLOR = base_color.LIGHT_250_COLOR, - - # Sidebar Features - SF__BG_COLOR = base_color.LIGHT_313_COLOR, - SF__HOVERED_BG_COLOR = base_color.LIGHT_333_COLOR, - SF__CLICKED_BG_COLOR = base_color.LIGHT_400_COLOR, - SF__TEXT_DISABLED_COLOR = base_color.LIGHT_600_COLOR, - - SF__SWITCH_BOX_BG_COLOR = base_color.LIGHT_375_COLOR, - SF__SWITCH_BOX_HOVERED_BG_COLOR = base_color.LIGHT_400_COLOR, - SF__SWITCH_BOX_CLICKED_BG_COLOR = base_color.LIGHT_450_COLOR, - SF__SWITCH_BOX_ACTIVE_BG_COLOR = base_color.PRIMARY_350_COLOR, - SF__SWITCH_BOX_ACTIVE_HOVERED_BG_COLOR = base_color.PRIMARY_400_COLOR, - SF__SWITCH_BOX_ACTIVE_CLICKED_BG_COLOR = base_color.PRIMARY_500_COLOR, - SF__SWITCH_BOX_DISABLE_BG_COLOR = base_color.PRIMARY_200_COLOR, - - SF__SWITCH_BOX_BUTTON_COLOR = base_color.LIGHT_150_COLOR, - SF__SWITCH_BOX_BUTTON_DISABLED_COLOR = base_color.LIGHT_300_COLOR, - # It's not working because It overrode internally. - SF__SWITCH_BOX_BUTTON_HOVERED_COLOR = base_color.LIGHT_300_COLOR, - - SF__SELECTED_MARK_ACTIVE_BG_COLOR = base_color.PRIMARY_350_COLOR, - SF__SELECTED_MARK_ACTIVE_HOVERED_BG_COLOR = base_color.PRIMARY_400_COLOR, - SF__SELECTED_MARK_ACTIVE_CLICKED_BG_COLOR = base_color.PRIMARY_500_COLOR, - SF__SELECTED_MARK_DISABLE_BG_COLOR = base_color.PRIMARY_200_COLOR, - - - # Sidebar Languages Settings - SLS__TITLE_TEXT_COLOR = base_color.LIGHT_800_COLOR, - - SLS__BG_COLOR = base_color.LIGHT_313_COLOR, - - SLS__PRESETS_TAB_BG_HOVERED_COLOR = base_color.LIGHT_300_COLOR, - SLS__PRESETS_TAB_BG_CLICKED_COLOR = base_color.LIGHT_350_COLOR, - SLS__PRESETS_TAB_BG_PASSIVE_COLOR = base_color.LIGHT_250_COLOR, - SLS__PRESETS_TAB_BG_ACTIVE_COLOR = base_color.LIGHT_313_COLOR, - SLS__PRESETS_TAB_ACTIVE_TEXT_COLOR_PASSIVE = base_color.LIGHT_400_COLOR, - SLS__PRESETS_TAB_ACTIVE_TEXT_COLOR = base_color.LIGHT_BASIC_TEXT_COLOR, - - SLS__BOX_BG_COLOR = base_color.LIGHT_333_COLOR, - SLS__BOX_SECTION_TITLE_TEXT_COLOR = base_color.LIGHT_800_COLOR, - SLS__BOX_ARROWS_TEXT_COLOR = base_color.LIGHT_700_COLOR, - SLS__BOX_ARROWS_SWAP_BUTTON_TEXT_COLOR = base_color.LIGHT_BASIC_TEXT_COLOR, - SLS__BOX_ARROWS_SWAP_BUTTON_HOVERED_COLOR = base_color.LIGHT_200_COLOR, - SLS__BOX_ARROWS_SWAP_BUTTON_CLICKED_COLOR = base_color.LIGHT_350_COLOR, - - SLS__OPTIONMENU_BG_COLOR = base_color.LIGHT_200_COLOR, - SLS__OPTIONMENU_HOVERED_BG_COLOR = base_color.LIGHT_250_COLOR, - SLS__OPTIONMENU_CLICKED_BG_COLOR = base_color.LIGHT_400_COLOR, - - SLS__DROPDOWN_MENU_WINDOW_BG_COLOR = base_color.LIGHT_300_COLOR, - SLS__DROPDOWN_MENU_WINDOW_BORDER_COLOR = base_color.LIGHT_700_COLOR, - SLS__DROPDOWN_MENU_BG_COLOR = base_color.LIGHT_300_COLOR, - SLS__DROPDOWN_MENU_HOVERED_BG_COLOR = base_color.LIGHT_200_COLOR, - SLS__DROPDOWN_MENU_CLICKED_BG_COLOR = base_color.LIGHT_400_COLOR, - - CONFIG_BUTTON_BG_COLOR = base_color.LIGHT_250_COLOR, - CONFIG_BUTTON_HOVERED_BG_COLOR = base_color.LIGHT_350_COLOR, - CONFIG_BUTTON_CLICKED_BG_COLOR = base_color.LIGHT_400_COLOR, - - MINIMIZE_SIDEBAR_BUTTON_BG_COLOR = base_color.LIGHT_250_COLOR, - MINIMIZE_SIDEBAR_BUTTON_HOVERED_BG_COLOR = base_color.LIGHT_350_COLOR, - MINIMIZE_SIDEBAR_BUTTON_CLICKED_BG_COLOR = base_color.LIGHT_400_COLOR, - - - - TOP_BAR_BUTTON_BG_COLOR = base_color.LIGHT_175_COLOR, - TOP_BAR_BUTTON_HOVERED_BG_COLOR = base_color.LIGHT_300_COLOR, - TOP_BAR_BUTTON_CLICKED_BG_COLOR = base_color.LIGHT_350_COLOR, - TOP_BAR_BUTTON_TEXT_COLOR = base_color.LIGHT_BASIC_TEXT_COLOR, - TOP_BAR_BUTTON_STATE_TEXT_ENABLED_COLOR = base_color.PRIMARY_400_COLOR, - TOP_BAR_BUTTON_STATE_TEXT_DISABLED_COLOR = base_color.LIGHT_600_COLOR, - - UPDATE_AVAILABLE_BUTTON_TEXT_COLOR = base_color.PRIMARY_400_COLOR, - ), - - - selectable_language_window = SimpleNamespace( - # Selectable Language Window - BASIC_TEXT_COLOR = base_color.LIGHT_BASIC_TEXT_COLOR, - - MAIN_BG_COLOR = base_color.LIGHT_175_COLOR, - - GO_BACK_BUTTON_BG_COLOR = base_color.LIGHT_325_COLOR, - GO_BACK_BUTTON_BG_HOVERED_COLOR = base_color.LIGHT_400_COLOR, - GO_BACK_BUTTON_BG_CLICKED_COLOR = base_color.LIGHT_500_COLOR, - - TOP_BG_COLOR = base_color.LIGHT_250_COLOR, - TITLE_TEXT_COLOR = base_color.LIGHT_700_COLOR, - LANGUAGE_BUTTON_BG_COLOR = base_color.LIGHT_175_COLOR, - LANGUAGE_BUTTON_BG_HOVERED_COLOR = base_color.LIGHT_275_COLOR, - LANGUAGE_BUTTON_BG_CLICKED_COLOR = base_color.LIGHT_325_COLOR, - ), - - - - # Modal Window (Main Window) - main_window_cover = SimpleNamespace( - TEXT_COLOR = base_color.LIGHT_BASIC_TEXT_COLOR, - BG_COLOR = "#fff", - ), - - - confirmation_modal = SimpleNamespace( - MESSAGE_TEXT_COLOR = base_color.LIGHT_BASIC_TEXT_COLOR, - FAKE_BORDER_COLOR = base_color.LIGHT_500_COLOR, - BG_COLOR = base_color.LIGHT_350_COLOR, - CONFIRMATION_BUTTONS_TEXT_COLOR = base_color.LIGHT_BASIC_TEXT_COLOR, - - ACCEPT_BUTTON_BG_COLOR = base_color.PRIMARY_250_COLOR, - ACCEPT_BUTTON_HOVERED_BG_COLOR = base_color.PRIMARY_200_COLOR, - ACCEPT_BUTTON_CLICKED_BG_COLOR = base_color.PRIMARY_300_COLOR, - DENY_BUTTON_BG_COLOR = base_color.LIGHT_200_COLOR, - DENY_BUTTON_HOVERED_BG_COLOR = base_color.LIGHT_100_COLOR, - DENY_BUTTON_CLICKED_BG_COLOR = base_color.LIGHT_300_COLOR, - ), - - - config_window = SimpleNamespace( - # Common - BASIC_TEXT_COLOR = base_color.LIGHT_BASIC_TEXT_COLOR, - LABELS_TEXT_COLOR = base_color.LIGHT_BASIC_TEXT_COLOR, - LABELS_DESC_TEXT_COLOR = base_color.LIGHT_600_COLOR, - - LABELS_TEXT_DISABLED_COLOR = base_color.LIGHT_500_COLOR, - - SB__BUTTON_COLOR = base_color.LIGHT_100_COLOR, - SB__BUTTON_HOVERED_COLOR = base_color.LIGHT_200_COLOR, - SB__BUTTON_CLICKED_COLOR = base_color.LIGHT_300_COLOR, - - - # Top bar - TOP_BAR_BG_COLOR = base_color.LIGHT_150_COLOR, - - # Restart Button - RESTART_BUTTON_BG_COLOR = base_color.PRIMARY_300_COLOR, - RESTART_BUTTON_HOVERED_BG_COLOR = base_color.PRIMARY_250_COLOR, - RESTART_BUTTON_CLICKED_BG_COLOR = base_color.PRIMARY_400_COLOR, - - - # Compact Mode - COMPACT_MODE_SWITCH_BOX_BG_COLOR = base_color.LIGHT_500_COLOR, - COMPACT_MODE_SWITCH_BOX_ACTIVE_BG_COLOR = base_color.PRIMARY_300_COLOR, - COMPACT_MODE_SWITCH_BOX_BUTTON_COLOR = base_color.LIGHT_300_COLOR, - COMPACT_MODE_SWITCH_BOX_BUTTON_HOVERED_COLOR = base_color.LIGHT_250_COLOR, - - # Main - MAIN_BG_COLOR = base_color.LIGHT_300_COLOR, - - # This is for fake border color - SB__WRAPPER_BG_COLOR = base_color.LIGHT_400_COLOR, - - SB__BG_COLOR = base_color.LIGHT_100_COLOR, - - SB__OPTIONMENU_BG_COLOR = base_color.LIGHT_300_COLOR, - SB__OPTIONMENU_HOVERED_BG_COLOR = base_color.LIGHT_250_COLOR, - SB__OPTIONMENU_CLICKED_BG_COLOR = base_color.LIGHT_350_COLOR, - SB__DROPDOWN_MENU_WINDOW_BG_COLOR = base_color.LIGHT_300_COLOR, - SB__DROPDOWN_MENU_WINDOW_BORDER_COLOR = base_color.LIGHT_800_COLOR, - SB__DROPDOWN_MENU_BG_COLOR = base_color.LIGHT_200_COLOR, - SB__DROPDOWN_MENU_HOVERED_BG_COLOR = base_color.LIGHT_100_COLOR, - SB__DROPDOWN_MENU_CLICKED_BG_COLOR = base_color.LIGHT_300_COLOR, - - SB__SLIDER_BG_COLOR = base_color.LIGHT_400_COLOR, - SB__SLIDER_PROGRESS_BG_COLOR = base_color.LIGHT_550_COLOR, - SB__SLIDER_BUTTON_COLOR = base_color.LIGHT_500_COLOR, - SB__SLIDER_BUTTON_HOVERED_COLOR = base_color.LIGHT_600_COLOR, - SB__SLIDER_TOOLTIP_BG_COLOR = base_color.LIGHT_200_COLOR, - SB__SLIDER_TOOLTIP_TEXT_COLOR = base_color.LIGHT_800_COLOR, - - SB__SWITCH_BOX_BG_COLOR = base_color.LIGHT_400_COLOR, - SB__SWITCH_BOX_BG_DISABLED_COLOR = base_color.LIGHT_200_COLOR, - SB__SWITCH_BOX_ACTIVE_BG_COLOR = base_color.PRIMARY_300_COLOR, - SB__SWITCH_BOX_ACTIVE_BG_DISABLED_COLOR = base_color.PRIMARY_150_COLOR, - SB__SWITCH_BOX_BUTTON_COLOR = base_color.LIGHT_300_COLOR, - SB__SWITCH_BOX_BUTTON_DISABLED_COLOR = base_color.LIGHT_150_COLOR, - SB__SWITCH_BOX_BUTTON_HOVERED_COLOR = base_color.LIGHT_200_COLOR, - - SB__CHECKBOX_BORDER_COLOR = base_color.LIGHT_600_COLOR, - SB__CHECKBOX_BORDER_DISABLED_COLOR = base_color.LIGHT_300_COLOR, - SB__CHECKBOX_HOVER_COLOR = base_color.LIGHT_350_COLOR, - SB__CHECKBOX_CHECKED_COLOR = base_color.PRIMARY_250_COLOR, - SB__CHECKBOX_CHECKMARK_COLOR = base_color.LIGHT_BASIC_TEXT_COLOR, - - SB__RADIOBUTTON_TEXT_COLOR = base_color.LIGHT_900_COLOR, - SB__RADIOBUTTON_BORDER_COLOR = base_color.LIGHT_600_COLOR, - SB__RADIOBUTTON_SELECTED_COLOR = base_color.PRIMARY_400_COLOR, - SB__RADIOBUTTON_BG_HOVERED_COLOR = base_color.LIGHT_300_COLOR, - SB__RADIOBUTTON_BG_CLICKED_COLOR = base_color.LIGHT_325_COLOR, - - SB__ENTRY_TEXT_COLOR = base_color.LIGHT_900_COLOR, - SB__ENTRY_BG_COLOR = base_color.LIGHT_300_COLOR, - SB__ENTRY_BORDER_COLOR = base_color.LIGHT_400_COLOR, - - - SB__PROGRESSBAR_X_SLIDER__PROGRESSBAR_BG_COLOR = base_color.LIGHT_350_COLOR, - SB__PROGRESSBAR_X_SLIDER__PROGRESSBAR_PROGRESS_BG_COLOR = base_color.PRIMARY_500_COLOR, - SB__PROGRESSBAR_X_SLIDER__PROGRESSBAR_PROGRESS_EXCEED_THRESHOLD_BG_COLOR = base_color.PRIMARY_300_COLOR, - - SB__PROGRESSBAR_X_SLIDER__SLIDER_BUTTON_COLOR = base_color.PRIMARY_300_COLOR, - SB__PROGRESSBAR_X_SLIDER__SLIDER_BUTTON_HOVERED_COLOR = base_color.PRIMARY_450_COLOR, - - SB__PROGRESSBAR_X_SLIDER__PASSIVE_BUTTON_COLOR = base_color.LIGHT_300_COLOR, - SB__PROGRESSBAR_X_SLIDER__PASSIVE_BUTTON_HOVERED_COLOR = base_color.LIGHT_250_COLOR, - SB__PROGRESSBAR_X_SLIDER__PASSIVE_BUTTON_CLICKED_COLOR = base_color.LIGHT_350_COLOR, - SB__PROGRESSBAR_X_SLIDER__PASSIVE_BUTTON_DISABLED_COLOR = base_color.LIGHT_150_COLOR, - - SB__PROGRESSBAR_X_SLIDER__ACTIVE_BUTTON_COLOR = base_color.PRIMARY_250_COLOR, - SB__PROGRESSBAR_X_SLIDER__ACTIVE_BUTTON_HOVERED_COLOR = base_color.PRIMARY_300_COLOR, - SB__PROGRESSBAR_X_SLIDER__ACTIVE_BUTTON_CLICKED_COLOR = base_color.PRIMARY_400_COLOR, - - SB__ADD_AND_DELETE_ABLE_LIST__ADD_BUTTON_COLOR = base_color.PRIMARY_250_COLOR, - SB__ADD_AND_DELETE_ABLE_LIST__ADD_BUTTON_HOVERED_COLOR = base_color.PRIMARY_300_COLOR, - SB__ADD_AND_DELETE_ABLE_LIST__ADD_BUTTON_CLICKED_COLOR = base_color.PRIMARY_400_COLOR, - SB__ADD_AND_DELETE_ABLE_LIST_BG_COLOR = base_color.LIGHT_300_COLOR, - - SB__ADD_AND_DELETE_ABLE_LIST__VALUES_ACTION_BUTTON_HOVERED_BG_COLOR = base_color.LIGHT_375_COLOR, - SB__ADD_AND_DELETE_ABLE_LIST__VALUES_ACTION_BUTTON_CLICKED_BG_COLOR = base_color.LIGHT_450_COLOR, - - SB__ADD_AND_DELETE_ABLE_LIST_DELETED_BG_COLOR = base_color.LIGHT_200_COLOR, - SB__ADD_AND_DELETE_ABLE_LIST__VALUES_DELETED_BUTTON_HOVERED_BG_COLOR = base_color.LIGHT_300_COLOR, - SB__ADD_AND_DELETE_ABLE_LIST__VALUES_DELETED_BUTTON_CLICKED_BG_COLOR = base_color.LIGHT_400_COLOR, - - - SB__MESSAGE_FORMAT__EXAMPLE_BG_COLOR = "#5a6b81", # from VRChat' chat display color - # source #3a4554 (800). and this one is 600 (https://m2.material.io/design/color/the-color-system.html#tools-for-picking-colors) - SB__MESSAGE_FORMAT__EXAMPLE_TEXT_COLOR = base_color.LIGHT_100_COLOR, - SB__MESSAGE_FORMAT__SWAP_BUTTON_COLOR = base_color.LIGHT_200_COLOR, - SB__MESSAGE_FORMAT__SWAP_BUTTON_HOVERED_COLOR = base_color.LIGHT_250_COLOR, - SB__MESSAGE_FORMAT__SWAP_BUTTON_CLICKED_COLOR = base_color.LIGHT_300_COLOR, - - - - - # Side menu - SIDE_MENU_BG_COLOR = base_color.LIGHT_300_COLOR, - - SIDE_MENU_LABELS_BG_COLOR = base_color.LIGHT_300_COLOR, - SIDE_MENU_LABELS_BG_FOR_FAKE_BORDER_COLOR = base_color.LIGHT_300_COLOR, - SIDE_MENU_LABELS_HOVERED_BG_COLOR = base_color.LIGHT_350_COLOR, - SIDE_MENU_LABELS_CLICKED_BG_COLOR = base_color.PRIMARY_200_COLOR, - SIDE_MENU_LABELS_SELECTED_TEXT_COLOR = base_color.PRIMARY_350_COLOR, - - SIDE_MENU_SELECTED_MARK_ACTIVE_BG_COLOR = base_color.PRIMARY_350_COLOR, - - NOW_VERSION_TEXT_COLOR = base_color.LIGHT_800_COLOR, - - # Error Message Window for Config Window - # Check DarkTheme's this part. Based on the color bb4448, used to source, and pick up the number 600 by the generator (https://m2.material.io/design/color/the-color-system.html#tools-for-picking-colors) - SB__ERROR_MESSAGE_BG_COLOR = "#cd4c4f", - SB__SUCCESS_MESSAGE_BG_COLOR = "#cd4c4f", - SB__ERROR_MESSAGE_TEXT_COLOR = "#fff", - ), - - - - image_file = SimpleNamespace( - VRCT_LOGO = getImageFileFromUiUtils("vrct_logo_for_light_mode.png"), - VRCT_LOGO_MARK = getImageFileFromUiUtils("vrct_logo_mark_black.png"), - - TRANSLATION_ICON = getImageFileFromUiUtils("translation_icon_black.png"), - TRANSLATION_ICON_DISABLED = getImageFileFromUiUtils("translation_icon_disabled.png"), - MIC_ICON = getImageFileFromUiUtils("mic_icon_black.png"), - MIC_ICON_DISABLED = getImageFileFromUiUtils("mic_icon_disabled.png"), - HEADPHONES_ICON = getImageFileFromUiUtils("headphones_icon_black.png"), - HEADPHONES_ICON_DISABLED = getImageFileFromUiUtils("headphones_icon_disabled.png"), - FOREGROUND_ICON = getImageFileFromUiUtils("foreground_icon_black.png"), - FOREGROUND_ICON_DISABLED = getImageFileFromUiUtils("foreground_icon_disabled.png"), - - NARROW_ARROW_DOWN = getImageFileFromUiUtils("narrow_arrow_down_black.png"), - - CONFIGURATION_ICON = getImageFileFromUiUtils("configuration_icon_black.png"), - CONFIGURATION_ICON_DISABLED = getImageFileFromUiUtils("configuration_icon_disabled.png"), - - ARROW_LEFT = getImageFileFromUiUtils("arrow_left_black.png"), - ARROW_LEFT_DISABLED = getImageFileFromUiUtils("arrow_left_disabled.png"), - - SEND_MESSAGE_ICON = getImageFileFromUiUtils("send_message_icon_black.png"), - SEND_MESSAGE_ICON_DISABLED = getImageFileFromUiUtils("send_message_icon_white.png"), - REFRESH_UPDATE_ICON = getImageFileFromUiUtils("refresh_update_icon.png"), - REFRESH_ICON = getImageFileFromUiUtils("refresh_icon.png"), - HELP_ICON = getImageFileFromUiUtils("help_icon_black.png"), - - CANCEL_ICON = getImageFileFromUiUtils("cancel_icon.png"), - REDO_ICON = getImageFileFromUiUtils("redo_icon_black.png"), - SWAP_ICON = getImageFileFromUiUtils("swap_icon_black.png"), - FOLDER_OPEN_ICON = getImageFileFromUiUtils("folder_open_icon_black.png"), - LINK_ICON = getImageFileFromUiUtils("link_icon_black.png"), - ), - ) - - return theme_settings \ No newline at end of file diff --git a/vrct_gui/ui_managers/UiScalingManager.py b/vrct_gui/ui_managers/UiScalingManager.py deleted file mode 100644 index 3d4e2c30..00000000 --- a/vrct_gui/ui_managers/UiScalingManager.py +++ /dev/null @@ -1,399 +0,0 @@ -from types import SimpleNamespace - -from ..ui_utils import calculateUiSize - -class UiScalingManager(): - def __init__(self, scaling_percentage): - scaling_float = int(scaling_percentage.replace("%", "")) / 100 - self.SCALING_FLOAT = max(scaling_float, 0.4) - - self.common = SimpleNamespace() - self.main = SimpleNamespace() - self.config_window = SimpleNamespace() - self.selectable_language_window = SimpleNamespace() - self.main_window_cover = SimpleNamespace() - self.notification_message_window = SimpleNamespace() - self.confirmation_modal = SimpleNamespace() - self.dropdown_menu_window = SimpleNamespace() - - self._calculatedUiSizes() - - - - - def _calculatedUiSizes(self): - # Common - # RESPONSIVE_UI_SIZE_INT_10 ... RESPONSIVE_UI_SIZE_INT_300 - self.common.SCROLLBAR_IPADX = (self._calculateUiSize(2), self._calculateUiSize(2)) - self.common.SCROLLBAR_WIDTH = self._calculateUiSize(16) - - for i in range(10, 501, 10): - setattr(self.main, f"RESPONSIVE_UI_SIZE_INT_{i}", self._calculateUiSize(i)) - setattr(self.config_window, f"RESPONSIVE_UI_SIZE_INT_{i}", self._calculateUiSize(i)) - - - # Main - self.main.MAIN_AREA_MIN_WIDTH = self._calculateUiSize(640) - self.main.SIDEBAR_MIN_WIDTH = self._calculateUiSize(230) - - self.main.TEXTBOX_PADX = self._calculateUiSize(16) - self.main.TEXTBOX_CORNER_RADIUS = self._calculateUiSize(6) - - self.main.TEXTBOX_TAB_CORNER_RADIUS = self._calculateUiSize(8) - self.main.TEXTBOX_TAB_FONT_SIZE = self._calculateUiSize(12) - self.main.TEXTBOX_TAB_PADX = self._calculateUiSize(10) - self.main.TEXTBOX_TAB_PADY = (self._calculateUiSize(4), self._calculateUiSize(10)) - - self.main.TEXTBOX_FIRST_INSERT_SPACING = self._calculateUiSize(16) - self.main.TEXTBOX_FONT_SIZE__LABEL = self._calculateUiSize(12) - self.main.TEXTBOX_FONT_SIZE__TIMESTAMP = self._calculateUiSize(12) - self.main.TEXTBOX_FONT_SIZE__SYSTEM_TEXT_FONT = self._calculateUiSize(12) - self.main.TEXTBOX_FONT_SIZE__SECONDARY_TEXT_FONT = self._calculateUiSize(12) - self.main.TEXTBOX_FONT_SIZE__MAIN_TEXT_FONT = self._calculateUiSize(16) - - self.main.TEXTBOX_ENTRY_FONT_SIZE = self._calculateUiSize(16) - self.main.TEXTBOX_ENTRY_CORNER_RADIUS = self._calculateUiSize(4) - self.main.TEXTBOX_ENTRY_BORDER_SIZE = self._calculateUiSize(2, is_allowed_odd=True) - self.main.TEXTBOX_ENTRY_HEIGHT = self._calculateUiSize(40) - self.main.TEXTBOX_ENTRY_PADX = self.main.TEXTBOX_PADX - self.main.TEXTBOX_ENTRY_PADY = self._calculateUiSize(10) - - self.main.SEND_MESSAGE_BUTTON_CORNER_RADIUS = self.main.TEXTBOX_ENTRY_CORNER_RADIUS - self.main.SEND_MESSAGE_BUTTON_IMAGE_SIZE = self._calculateUiSize(20) - self.main.SEND_MESSAGE_BUTTON_MIN_WIDTH = self._calculateUiSize(40) - self.main.SEND_MESSAGE_BUTTON_RATE_WIDTH = self._calculateUiSize(6) - self.main.SEND_MESSAGE_BUTTON_MAX_WIDTH = self._calculateUiSize(100) - - - # Sidebar - # Sidebar Features - self.main.SF__LOGO_MAX_SIZE = self._calculateUiSize(120) - self.main.SF__LOGO_PADY = (self._calculateUiSize(10),self._calculateUiSize(6)) - self.main.SF__LOGO_HEIGHT_FOR_ADJUSTMENT = (self._calculateUiSize(6)) - - self.main.SF__LABELS_IPADY = self._calculateUiSize(16) - self.main.SF__COMPACT_MODE_ICON_PADY = self.main.SF__LABELS_IPADY - self.main.SF__COMPACT_MODE_ICON_PADX = self.main.SF__COMPACT_MODE_ICON_PADY - self.main.SF__LABEL_LEFT_PAD = self._calculateUiSize(20) - self.main.SF__LABEL_FONT_SIZE = self._calculateUiSize(16) - self.main.SF__COMPACT_MODE_IMAGE_SIZE = (self._calculateUiSize(20), self._calculateUiSize(20)) - - self.main.SF__SWITCH_BOX_PADX = (self.main.SF__LABEL_LEFT_PAD, self._calculateUiSize(10)) - self.main.SF__SWITCH_BOX_WIDTH = self._calculateUiSize(40) - self.main.SF__SWITCH_BOX_HEIGHT = self._calculateUiSize(16) - - self.main.SF__SELECTED_MARK_WIDTH = self._calculateUiSize(3, True) - - - # Sidebar Quick Language Settings, SQLS - self.main.SLS__TITLE_FONT_SIZE = self._calculateUiSize(14) - self.main.SLS__TITLE_PADY = (self._calculateUiSize(10), self._calculateUiSize(4)) - - self.main.SLS__PRESET_TAB_NUMBER_FONT_SIZE = self._calculateUiSize(16) - self.main.SLS__PRESET_TAB_NUMBER_HEIGHT = self._calculateUiSize(30) - self.main.SLS__PRESET_TAB_NUMBER_CORNER_RADIUS = self._calculateUiSize(6) - self.main.SLS__PRESET_TAB_NUMBER_ADJUSTED_HEIGHT = self._calculateUiSize(36) - - self.main.SLS__BOX_TOP_PADY = self._calculateUiSize(12) - - self.main.SLS__BOX_TRANSCRIPTION_STATUS_IMAGE_SIZE = self.dupTuple(self._calculateUiSize(14)) - - self.main.SLS__BOX_SECTION_TITLE_FONT_SIZE = self._calculateUiSize(16) - self.main.SLS__BOX_SECTION_TITLE_BOTTOM_PADY = self._calculateUiSize(10) - self.main.SLS__BOX_IPADX = self._calculateUiSize(10) - self.main.SLS__BOX_IPADY = (self._calculateUiSize(8),self._calculateUiSize(14)) - self.main.SLS__BOX_OPTION_MENU_FONT_SIZE = self._calculateUiSize(14) - self.main.SLS__BOX_OPTION_MENU_IPADY = self._calculateUiSize(2) - self.main.SLS__BOX_OPTION_MENU_ARROW_IMAGE_SIZE = self.dupTuple(self._calculateUiSize(20)) - # self.main.SLS__BOX_OPTION_MENU_WIDTH = self._calculateUiSize(200) - self.main.SLS__BOX_ARROWS_PADY = self._calculateUiSize(6) - self.main.SLS__BOX_ARROWS_SWAP_BUTTON_CORNER_RADIUS = self._calculateUiSize(6) - self.main.SLS__BOX_ARROWS_SWAP_BUTTON_PADX = self._calculateUiSize(20) - self.main.SLS__BOX_ARROWS_SWAP_BUTTON_IPADX = self._calculateUiSize(8) - self.main.SLS__BOX_ARROWS_SWAP_BUTTON_IPADY = self._calculateUiSize(4) - self.main.SLS__BOX_ARROWS_IMAGE_SIZE = self.dupTuple(self._calculateUiSize(16)) - self.main.SLS__BOX_ARROWS_DESC_FONT_SIZE = self._calculateUiSize(12) - self.main.SLS__BOX_ARROWS_DESC_PADX = self._calculateUiSize(6) - - self.main.SIDEBAR_CONFIG_BUTTON_CORNER_RADIUS = self._calculateUiSize(6) - self.main.SIDEBAR_CONFIG_BUTTON_IMAGE_SIZE = self.main.SF__COMPACT_MODE_IMAGE_SIZE - self.main.SIDEBAR_CONFIG_BUTTON_PADX = self._calculateUiSize(10) - self.main.SIDEBAR_CONFIG_BUTTON_PADY = self._calculateUiSize(10) - self.main.SIDEBAR_CONFIG_BUTTON_IPADY = self._calculateUiSize(8) - - self.main.TOP_BAR_BUTTON_PADY = (self._calculateUiSize(6),0) - - - - - self.main.QUICK_SETTINGS_BUTTON_FONT_SIZE = self._calculateUiSize(12) - self.main.QUICK_SETTINGS_BUTTON_STATE_FONT_SIZE = self._calculateUiSize(10) - - - self.main.UPDATE_AVAILABLE_BUTTON_CORNER_RADIUS = self._calculateUiSize(6) - self.main.UPDATE_AVAILABLE_BUTTON_SIZE = (self._calculateUiSize(18), self._calculateUiSize(18)) - self.main.UPDATE_AVAILABLE_BUTTON_FONT_SIZE = self._calculateUiSize(12) - self.main.UPDATE_AVAILABLE_BUTTON_PADX = (0, self._calculateUiSize(4)) - self.main.UPDATE_AVAILABLE_BUTTON_IPADX = self._calculateUiSize(6) - self.main.UPDATE_AVAILABLE_ICON_PADX = (self._calculateUiSize(6), self._calculateUiSize(4)) - self.main.UPDATE_AVAILABLE_PADX_BETWEEN_LABEL_AND_ICON = self._calculateUiSize(4) - - - - self.main.HELP_AND_INFO_BUTTON_CORNER_RADIUS = self._calculateUiSize(6) - self.main.HELP_AND_INFO_BUTTON_SIZE = self._calculateUiSize(24) - self.main.HELP_AND_INFO_BUTTON_PADX = (0, self._calculateUiSize(6)) - self.main.HELP_AND_INFO_BUTTON_IPADXY = self._calculateUiSize(6) - - self.main.MINIMIZE_SIDEBAR_BUTTON_ICON_SIZE_X = int(self.main.TEXTBOX_PADX/2+self.main.TEXTBOX_CORNER_RADIUS*2) - self.main.MINIMIZE_SIDEBAR_BUTTON_ICON_SIZE_Y = self._calculateUiSize(26) - - - self.main.SLS__SELECTABLE_TRANSLATION_IPADX = self.dupTuple(self._calculateUiSize(10)) - self.main.SLS__SELECTABLE_TRANSLATION_IPADY = self._calculateUiSize(6) - self.main.SLS__SELECTABLE_TRANSLATION_FONT_SIZE = self._calculateUiSize(12) - self.main.SLS__SELECTABLE_TRANSLATION_IMAGE_SIZE = self.dupTuple(self._calculateUiSize(10)) - self.main.SLS__SELECTABLE_TRANSLATION_PADY = self._calculateUiSize(4) - self.main.SLS__SELECTABLE_TRANSLATION_MIN_PADX = self._calculateUiSize(8) - - - self.main.SLS__DROPDOWN_MENU_WINDOW_ADDITIONAL_Y_POS = self._calculateUiSize(4) - self.main.SLS__DROPDOWN_MENU_WINDOW_BORDER_WIDTH = self._calculateUiSize(0, is_allowed_odd=True) - self.main.SLS__DROPDOWN_MENU_SCROLLBAR_IPADX = self.common.SCROLLBAR_IPADX - self.main.SLS__DROPDOWN_MENU_SCROLLBAR_WIDTH = self.common.SCROLLBAR_WIDTH - self.main.SLS__DROPDOWN_MENU_VALUE_IPADX = (self._calculateUiSize(8), 0) - self.main.SLS__DROPDOWN_MENU_VALUE_IPADY = self.dupTuple(self._calculateUiSize(8)) - self.main.SLS__DROPDOWN_MENU_VALUE_PADY = 0 - self.main.SLS__DROPDOWN_MENU_VALUE_FONT_SIZE = self._calculateUiSize(14) - self.main.SLS__DROPDOWN_MENU_VALUE_DEFAULT_MIN_WIDTH = self._calculateUiSize(200) - - - # Selectable Language Window - self.selectable_language_window.TOP_BAR_MIN_HEIGHT = self._calculateUiSize(50) - self.selectable_language_window.SCROLLBAR_IPADX = self.common.SCROLLBAR_IPADX - self.selectable_language_window.SCROLLBAR_WIDTH = self.common.SCROLLBAR_WIDTH - - self.selectable_language_window.GO_BACK_BUTTON_LABEL_FONT_SIZE = self._calculateUiSize(14) - self.selectable_language_window.GO_BACK_BUTTON_IPADX = self._calculateUiSize(10) - self.selectable_language_window.GO_BACK_BUTTON_IPADY = self._calculateUiSize(8) - self.selectable_language_window.TITLE_FONT_SIZE = self._calculateUiSize(18) - - self.selectable_language_window.VALUES_TEXT_FONT_SIZE = self._calculateUiSize(14) - self.selectable_language_window.VALUES_TEXT_IPADX = (self._calculateUiSize(8), 0) - self.selectable_language_window.VALUES_TEXT_IPADY = self._calculateUiSize(8) - - - self.main_window_cover.TEXT_FONT_SIZE = self._calculateUiSize(20) - - - self.confirmation_modal.FAKE_BORDER_SIZE = self._calculateUiSize(1, is_allowed_odd=True) - self.confirmation_modal.CONTENTS_WRAPPER = self._calculateUiSize(20) - self.confirmation_modal.MARGIN_BETWEEN_MESSAGE_AND_BUTTONS = self._calculateUiSize(40) - self.confirmation_modal.MESSAGE_FONT_SIZE = self._calculateUiSize(20) - self.confirmation_modal.CONFIRMATION_BUTTONS_TEXT_FONT_SIZE = self._calculateUiSize(18) - self.confirmation_modal.BUTTONS_BETWEEN_PADDING = self._calculateUiSize(100) - self.confirmation_modal.BUTTONS_CORNER_RADIUS = self._calculateUiSize(6) - self.confirmation_modal.BUTTONS_IPADX = self._calculateUiSize(10) - self.confirmation_modal.BUTTONS_IPADY = self._calculateUiSize(6) - - # Dropdown Menu Window - self.dropdown_menu_window.MARGIN_WIDTH = self._calculateUiSize(16) - - - - # Quick Settings Box - self.config_window.QSB__MIN_WIDTH = self._calculateUiSize(400) - self.config_window.QSB__BOX_PADY = (0, self._calculateUiSize(18)) - self.config_window.QSB__IPADX = self._calculateUiSize(20) - self.config_window.QSB__IPADY = (self._calculateUiSize(14), self._calculateUiSize(8)) - self.config_window.QSB__LABEL_BOTTOM_PADY = self._calculateUiSize(6) - self.config_window.QSB__RESTORE_DEFAULT_SETTINGS_BUTTON_PADY = (self._calculateUiSize(40),0) - - - - # Config Window - self.config_window.DEFAULT_WIDTH = self._calculateUiSize(1080) - self.config_window.DEFAULT_HEIGHT = self._calculateUiSize(680) - - # Top bar common - self.config_window.TOP_BAR__MIN_HEIGHT = self._calculateUiSize(40) - self.config_window.TOP_BAR__IPADY = self._calculateUiSize(12) - - # Top bar Side - self.config_window.TOP_BAR_SIDE_AREA_MIN_WIDTH = self._calculateUiSize(220) - self.config_window.TOP_BAR_SIDE__CONFIG_LOGO_MARK_SIZE = self.dupTuple(self._calculateUiSize(28)) - self.config_window.TOP_BAR_SIDE__CONFIG_TITLE_FONT_SIZE = self._calculateUiSize(22) - self.config_window.TOP_BAR_SIDE__CONFIG_TITLE_LEFT_PADX = int(self.config_window.TOP_BAR_SIDE__CONFIG_TITLE_FONT_SIZE + self._calculateUiSize(16)) - self.config_window.TOP_BAR_SIDE__TITLE_PADX= self._calculateUiSize(30) - - # Restart Button - self.config_window.RESTART_BUTTON_LABEL_FONT_SIZE = self._calculateUiSize(12) - self.config_window.RESTART_BUTTON_PADX = (0, self._calculateUiSize(20)) - self.config_window.RESTART_BUTTON_CORNER_RADIUS = self._calculateUiSize(20) - self.config_window.RESTART_BUTTON_IPADX = self._calculateUiSize(20) - self.config_window.RESTART_BUTTON_IPADY = self._calculateUiSize(10) - - # Compact Mode - self.config_window.COMPACT_MODE_PADX = (0, self._calculateUiSize(20)) - self.config_window.COMPACT_MODE_LABEL_FONT_SIZE = self._calculateUiSize(12) - self.config_window.COMPACT_MODE_LABEL_PADX = (0, self._calculateUiSize(10)) - self.config_window.COMPACT_MODE_SWITCH_WIDTH = self._calculateUiSize(40) - self.config_window.COMPACT_MODE_SWITCH_HEIGHT = self._calculateUiSize(16) - - - # Side menu - self.config_window.SIDE_MENU_PADY = (self._calculateUiSize(54), self._calculateUiSize(72)) - self.config_window.SIDE_MENU_LABELS_SEPARATE_MIN_HEIGHT = self._calculateUiSize(40) - self.config_window.SIDE_MENU_LABELS_IPADX = self._calculateUiSize(20) - self.config_window.SIDE_MENU_LABELS_IPADY = self._calculateUiSize(8) - self.config_window.SIDE_MENU_LABELS_FONT_SIZE = self._calculateUiSize(18) - - self.config_window.NOW_VERSION_FONT_SIZE = self._calculateUiSize(12) - - # Top bar Main - self.config_window.TOP_BAR_MAIN__TITLE_FONT_SIZE = self._calculateUiSize(22) - self.config_window.SCROLLBAR_IPADX = self.common.SCROLLBAR_IPADX - self.config_window.SCROLLBAR_WIDTH = self.common.SCROLLBAR_WIDTH - - - # Setting Box - self.config_window.MAIN_AREA_MIN_WIDTH = self._calculateUiSize(720) - - self.config_window.ABOUT_VRCT_SB__TOP_PADY = self._calculateUiSize(42) # Exception - self.config_window.SB__TOP_PADY = self._calculateUiSize(60) - - self.config_window.SB__IPADX = self._calculateUiSize(20) - self.config_window.SB__IPADY = self._calculateUiSize(12) - self.config_window.SB__BOTTOM_MARGIN = (0, self._calculateUiSize(120)) - self.config_window.SB__FAKE_BOTTOM_BORDER_SIZE = (0, self._calculateUiSize(1, is_allowed_odd=True)) - - self.config_window.SB__SECTION_TITLE_FONT_SIZE = self._calculateUiSize(20) - self.config_window.SB__SECTION_TITLE_BOTTOM_PADY = (0, self._calculateUiSize(10)) - - self.config_window.SB__LABEL_FONT_SIZE = self._calculateUiSize(16) - self.config_window.SB__DESC_FONT_SIZE = self._calculateUiSize(14) - self.config_window.SB__DESC_TOP_PADY = self._calculateUiSize(2) - - - self.config_window.BUTTONS_CORNER_RADIUS = self._calculateUiSize(6) - # self.config_window.BUTTONS_IPADX = self._calculateUiSize(10) - # self.config_window.BUTTONS_IPADY = self._calculateUiSize(6) - - self.config_window.SB__ERROR_MESSAGE_IPADX = (self._calculateUiSize(10), self._calculateUiSize(10)) - self.config_window.SB__ERROR_MESSAGE_IPADY = (self._calculateUiSize(6), self._calculateUiSize(6)) - self.config_window.SB__ERROR_MESSAGE_FONT_SIZE = self._calculateUiSize(14) - - - self.config_window.SB__SELECTOR_FONT_SIZE = self._calculateUiSize(14) - self.config_window.SB__RADIO_BUTTON_FONT_SIZE = self.config_window.SB__SELECTOR_FONT_SIZE - self.config_window.SB__BUTTON_FONT_SIZE = self.config_window.SB__SELECTOR_FONT_SIZE - - - - self.config_window.SB__OPTION_MENU_FONT_SIZE = self.config_window.SB__SELECTOR_FONT_SIZE - self.config_window.SB__OPTIONMENU_MIN_HEIGHT = self._calculateUiSize(30) - self.config_window.SB__OPTIONMENU_MIN_WIDTH = self._calculateUiSize(200) - self.config_window.SB__OPTIONMENU_IPADX = (self._calculateUiSize(8), self._calculateUiSize(8)) - self.config_window.SB__OPTIONMENU_IPADY = self._calculateUiSize(2) - self.config_window.SB__OPTIONMENU_IPADX_BETWEEN_IMG = self._calculateUiSize(8) - self.config_window.SB__OPTIONMENU_IMG_SIZE = (self._calculateUiSize(14), self._calculateUiSize(14)) - - self.config_window.SB__DROPDOWN_MENU_WINDOW_ADDITIONAL_Y_POS = self._calculateUiSize(4) - self.config_window.SB__DROPDOWN_MENU_WINDOW_BORDER_WIDTH = self._calculateUiSize(1, is_allowed_odd=True) - self.config_window.SB__DROPDOWN_MENU_SCROLLBAR_IPADX = self.common.SCROLLBAR_IPADX - self.config_window.SB__DROPDOWN_MENU_SCROLLBAR_WIDTH = self.common.SCROLLBAR_WIDTH - self.config_window.SB__DROPDOWN_MENU_VALUE_IPADX = (self._calculateUiSize(8), 0) - self.config_window.SB__DROPDOWN_MENU_VALUE_IPADY = (self._calculateUiSize(6), self._calculateUiSize(6)) - self.config_window.SB__DROPDOWN_MENU_VALUE_PADY = (0, self._calculateUiSize(1, is_allowed_odd=True)) - self.config_window.SB__DROPDOWN_MENU_VALUE_FONT_SIZE = self._calculateUiSize(14) - self.config_window.SB__DROPDOWN_MENU_VALUE_DEFAULT_MIN_WIDTH = self._calculateUiSize(200) - - - self.config_window.SB__SWITCH_WIDTH = self._calculateUiSize(50) - - self.config_window.SB__SWITCH_BOX_WIDTH = self._calculateUiSize(40) - self.config_window.SB__SWITCH_BOX_HEIGHT = self._calculateUiSize(16) - - self.config_window.SB__CHECKBOX_SIZE = self._calculateUiSize(24) - self.config_window.SB__CHECKBOX_BORDER_WIDTH = self._calculateUiSize(2) - self.config_window.SB__CHECKBOX_CORNER_RADIUS = self._calculateUiSize(4) - - self.config_window.SB__ENTRY_FONT_SIZE = self.config_window.SB__SELECTOR_FONT_SIZE - self.config_window.SB__ENTRY_HEIGHT = self._calculateUiSize(30) - - self.config_window.SB__SLIDER_WIDTH = self._calculateUiSize(200) - self.config_window.SB__SLIDER_HEIGHT = self._calculateUiSize(16) - self.config_window.SB__SLIDER_TOOLTIP_FONT_SIZE = self._calculateUiSize(16) - - self.config_window.SB__PROGRESSBAR_X_SLIDER__ENTRY_WIDTH = self.config_window.RESPONSIVE_UI_SIZE_INT_50 - self.config_window.SB__PROGRESSBAR_X_SLIDER__ENTRY_HEIGHT = self.config_window.SB__ENTRY_HEIGHT - self.config_window.SB__PROGRESSBAR_X_SLIDER__SLIDER_HEIGHT = self._calculateUiSize(40) - self.config_window.SB__PROGRESSBAR_X_SLIDER__PROGRESSBAR_HEIGHT = self._calculateUiSize(8) - self.config_window.SB__PROGRESSBAR_X_SLIDER__SLIDER_BUTTON_LENGTH = self._calculateUiSize(2) - self.config_window.SB__PROGRESSBAR_X_SLIDER__BAR_PADX = (self._calculateUiSize(30), self._calculateUiSize(30)) - - self.config_window.SB__PROGRESSBAR_X_SLIDER__BUTTON_IPADXY = self._calculateUiSize(10) - self.config_window.SB__PROGRESSBAR_X_SLIDER__BUTTON_ICON_SIZE = self._calculateUiSize(20) - - self.config_window.SB__ARROW_SWITCH_DESC_FONT_SIZE = self._calculateUiSize(16) - self.config_window.SB__ARROW_SWITCH_LEFT_PADX = (self._calculateUiSize(20), 0) - - self.config_window.ADD_AND_DELETE_ABLE_LIST__ADD_BUTTON_IPADX = self._calculateUiSize(16) - self.config_window.ADD_AND_DELETE_ABLE_LIST__ADD_BUTTON_IPADY = self._calculateUiSize(6) - - self.config_window.ADD_AND_DELETE_ABLE_LIST__VALUES_CORNER_RADIUS = self._calculateUiSize(2) - self.config_window.ADD_AND_DELETE_ABLE_LIST__VALUES_LEFT_PADX = (0, self._calculateUiSize(4)) - self.config_window.ADD_AND_DELETE_ABLE_LIST__VALUES_BOTTOM_PADY = (0, self._calculateUiSize(4)) - - self.config_window.ADD_AND_DELETE_ABLE_LIST__VALUES_TEXT_FONT_SIZE = self._calculateUiSize(14) - self.config_window.ADD_AND_DELETE_ABLE_LIST__VALUES_TEXT_IPADX = (self._calculateUiSize(8), 0) - self.config_window.ADD_AND_DELETE_ABLE_LIST__VALUES_TEXT_IPADY = self._calculateUiSize(6) - self.config_window.ADD_AND_DELETE_ABLE_LIST__VALUES_ACTION_BUTTON_IMG_SIZE = self._calculateUiSize(14) - self.config_window.ADD_AND_DELETE_ABLE_LIST__VALUES_ACTION_BUTTON_CORNER_RADIUS = self._calculateUiSize(4) - self.config_window.ADD_AND_DELETE_ABLE_LIST__VALUES_ACTION_BUTTON_IPADXY = self._calculateUiSize(6) - self.config_window.ADD_AND_DELETE_ABLE_LIST__VALUES_ACTION_BUTTON_PADX = (self._calculateUiSize(6), self._calculateUiSize(8)) - - self.config_window.ADD_AND_DELETE_ABLE_LIST__ADD_BUTTON_LEFT_PADX = (self._calculateUiSize(20), 0) - self.config_window.ADD_AND_DELETE_ABLE_LIST__ADD_BUTTON_FONT_SIZE = self._calculateUiSize(14) - - - self.config_window.SB__MESSAGE_FORMAT__EXAMPLE_CORNER_RADIUS = self._calculateUiSize(16) - self.config_window.SB__MESSAGE_FORMAT__EXAMPLE_IPADXY = self._calculateUiSize(10) - self.config_window.SB__MESSAGE_FORMAT__EXAMPLE_WRAP_LENGTH = self._calculateUiSize(300) - - self.config_window.SB__MESSAGE_FORMAT__ENTRY_HEIGHT = self.config_window.SB__ENTRY_HEIGHT - self.config_window.SB__MESSAGE_FORMAT__REQUIRED_TEXT_PADX = self._calculateUiSize(10) - self.config_window.SB__MESSAGE_FORMAT__REQUIRED_TEXT_FONT_SIZE = self._calculateUiSize(16) - - self.config_window.SB__MESSAGE_FORMAT__SWAP_BUTTON_ARROWS_IMG_SIZE = self.dupTuple(self._calculateUiSize(20)) - self.config_window.SB__MESSAGE_FORMAT__SWAP_BUTTON_IPADX = self._calculateUiSize(16) - self.config_window.SB__MESSAGE_FORMAT__SWAP_BUTTON_IPADY = self._calculateUiSize(6) - self.config_window.SB__MESSAGE_FORMAT__SWAP_BUTTON_FONT_SIZE = self._calculateUiSize(14) - self.config_window.SB__MESSAGE_FORMAT__SWAP_TEXT_PADX = self._calculateUiSize(10) - - self.config_window.SB__MESSAGE_FORMAT__ENTRIES_BOTTOM_PADY = (0, self._calculateUiSize(14)) - - self.config_window.SB__AUTHKEY_WEBPAGE_BUTTON_IPADX = self._calculateUiSize(12) - self.config_window.SB__AUTHKEY_WEBPAGE_BUTTON_IPADY = self._calculateUiSize(6) - self.config_window.SB__AUTHKEY_WEBPAGE_BUTTON_LABEL_FONT_SIZE = self._calculateUiSize(12) - self.config_window.SB__AUTHKEY_WEBPAGE_BUTTON_IMG_SIZE = self.dupTuple(self._calculateUiSize(12)) - self.config_window.SB__AUTHKEY_WEBPAGE_PADX_BETWEEN_LABEL_AND_ICON = self._calculateUiSize(10) - self.config_window.SB__AUTHKEY_WEBPAGE_BUTTON_TOP_PADY = self._calculateUiSize(10) - - self.config_window.SB__OPEN_OVERLAY_SETTINGS_WINDOW = self._calculateUiSize(28) - - - self.config_window.SB__BUTTON_IPADXY = self._calculateUiSize(16) - self.config_window.SB__BUTTON_ICON_SIZE = self._calculateUiSize(24) - self.config_window.SB__BUTTON_CORNER_RADIUS = self.config_window.BUTTONS_CORNER_RADIUS - - self.config_window.SB__OPEN_CONFIG_FILE_BUTTON_IPADXY = self._calculateUiSize(10) - - - def _calculateUiSize(self, default_size, is_allowed_odd:bool=False, is_zero_allowed:bool=False): - size = calculateUiSize(default_size, self.SCALING_FLOAT, is_allowed_odd, is_zero_allowed) - return size - - @staticmethod - def dupTuple(value): - return (value, value) \ No newline at end of file diff --git a/vrct_gui/ui_managers/__init__.py b/vrct_gui/ui_managers/__init__.py deleted file mode 100644 index 06adde02..00000000 --- a/vrct_gui/ui_managers/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from .ColorThemeManager import ColorThemeManager -from .UiScalingManager import UiScalingManager - -from .AboutVrctManager import AboutVrctManager \ No newline at end of file diff --git a/vrct_gui/ui_utils/CustomizedCTkScrollableFrame.py b/vrct_gui/ui_utils/CustomizedCTkScrollableFrame.py deleted file mode 100644 index 16b5460f..00000000 --- a/vrct_gui/ui_utils/CustomizedCTkScrollableFrame.py +++ /dev/null @@ -1,79 +0,0 @@ -# Override customtkinter's CTkScrollableFrame for scrolling speed up -from customtkinter import CTkScrollableFrame, CTkFont -from typing import Union, Tuple, Optional -import sys -try: - from typing import Literal -except ImportError: - from typing_extensions import Literal - -class CustomizedCTkScrollableFrame(CTkScrollableFrame): - def __init__( - self, - master: any, - width: int = 200, - height: int = 200, - corner_radius: Optional[Union[int, str]] = None, - border_width: Optional[Union[int, str]] = None, - - bg_color: Union[str, Tuple[str, str]] = "transparent", - fg_color: Optional[Union[str, Tuple[str, str]]] = None, - border_color: Optional[Union[str, Tuple[str, str]]] = None, - scrollbar_fg_color: Optional[Union[str, Tuple[str, str]]] = None, - scrollbar_button_color: Optional[Union[str, Tuple[str, str]]] = None, - scrollbar_button_hover_color: Optional[Union[str, Tuple[str, str]]] = None, - label_fg_color: Optional[Union[str, Tuple[str, str]]] = None, - label_text_color: Optional[Union[str, Tuple[str, str]]] = None, - - label_text: str = "", - label_font: Optional[Union[tuple, CTkFont]] = None, - label_anchor: str = "center", - orientation: Literal["vertical", "horizontal"] = "vertical" - ): - - super().__init__( - master, - width, - height, - corner_radius, - border_width, - - bg_color, - fg_color, - border_color, - scrollbar_fg_color, - scrollbar_button_color, - scrollbar_button_hover_color, - label_fg_color, - label_text_color, - - label_text, - label_font, - label_anchor, - orientation, - ) - - def _mouse_wheel_all(self, event): - if self.check_if_master_is_canvas(event.widget): - if sys.platform.startswith("win"): - if self._shift_pressed: - if self._parent_canvas.xview() != (0.0, 1.0): - self._parent_canvas.xview("scroll", -int(event.delta / 6), "units") - else: - if self._parent_canvas.yview() != (0.0, 1.0): - self._parent_canvas.yview("scroll", -int(event.delta / 2), "units") - - elif sys.platform == "darwin": - if self._shift_pressed: - if self._parent_canvas.xview() != (0.0, 1.0): - self._parent_canvas.xview("scroll", -event.delta, "units") - else: - if self._parent_canvas.yview() != (0.0, 1.0): - self._parent_canvas.yview("scroll", -event.delta, "units") - else: - if self._shift_pressed: - if self._parent_canvas.xview() != (0.0, 1.0): - self._parent_canvas.xview("scroll", -event.delta, "units") - else: - if self._parent_canvas.yview() != (0.0, 1.0): - self._parent_canvas.yview("scroll", -event.delta, "units") \ No newline at end of file diff --git a/vrct_gui/ui_utils/__init__.py b/vrct_gui/ui_utils/__init__.py deleted file mode 100644 index 49ee911d..00000000 --- a/vrct_gui/ui_utils/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from .ui_utils import * -from .CustomizedCTkScrollableFrame import CustomizedCTkScrollableFrame \ No newline at end of file diff --git a/vrct_gui/ui_utils/ui_utils.py b/vrct_gui/ui_utils/ui_utils.py deleted file mode 100644 index 7af40855..00000000 --- a/vrct_gui/ui_utils/ui_utils.py +++ /dev/null @@ -1,426 +0,0 @@ -from os import path as os_path -from PIL.Image import open as Image_open, LANCZOS -from time import sleep, time -import math - -from customtkinter import CTkFrame, CTkLabel, CTkImage, CTkFont - -def getImagePath(file_name): - # root\img\file_name - return os_path.join(os_path.dirname(os_path.dirname(os_path.dirname(__file__))), "img", file_name) - -def getImageFileFromUiUtils(file_name): - # root\img\file_name - return Image_open(os_path.join(os_path.dirname(os_path.dirname(os_path.dirname(__file__))), "img", file_name)) - -def getImageFileFromUiUtils_AboutVrct(file_name, directly_type:str=None): - # root\img\about_vrct\file_name or directly_name... - directly_path = ["img", "about_vrct"] - if directly_type == "showcased_worlds": - directly_path.append("showcased_worlds") - elif directly_type == "vrct_posters": - directly_path.append("vrct_posters") - - return Image_open(os_path.join(os_path.dirname(os_path.dirname(os_path.dirname(__file__))), *directly_path, file_name)) - -def openImageKeepAspectRatio(image_file, desired_width): - wpercent = (desired_width/float(image_file.size[0])) - hsize = int((float(image_file.size[1])*float(wpercent))) - img = image_file.resize((desired_width,hsize), LANCZOS) - return (img, desired_width, hsize) - -def retag(tag, *args): - for widget in args: - widget.bindtags((tag,) + widget.bindtags()) - - -def getLatestWidth(target_widget): - target_widget.update_idletasks() - return target_widget.winfo_width() - -def getLatestHeight(target_widget): - target_widget.update_idletasks() - return target_widget.winfo_height() - -def getLongestText(text_list:list): - max_length = 0 - longest_text = "" - - for text in text_list: - if len(text) > max_length: - max_length = len(text) - longest_text = text - return longest_text - -def getLongestText_Dict(text_dict:dict): - max_length = 0 - longest_text = "" - - for key, text in text_dict.items(): - if len(text) > max_length: - max_length = len(text) - longest_text = text - - return longest_text - -def calculateUiSize(default_size, scaling_float, is_allowed_odd:bool=False, is_zero_allowed:bool=False): - size = int(default_size * scaling_float) - size += 1 if not is_allowed_odd and size % 2 != 0 else 0 - if size <= 0: - size = 0 if is_zero_allowed else 1 - - return size - -# This making gradient color process was made by ChatGPT. -def generateGradientColor(value, color_start, color_end): - # 補完色を計算 - interpolated_color = [ - int(start + (end - start) * value) for start, end in zip(color_start, color_end) - ] - - # RGB値を0から255の範囲にクリップ - interpolated_color = [max(0, min(255, val)) for val in interpolated_color] - - # RGBを16進数に変換 - hex_color = "#{:02x}{:02x}{:02x}".format(*interpolated_color) - - return hex_color - - -def bindEnterAndLeaveColor(target_widgets, enter_color, leave_color): - for target_widget in target_widgets: - target_widget.bind("", lambda e, widgets=target_widgets: [w.configure(fg_color=enter_color) for w in widgets], "+") - target_widget.bind("", lambda e, widgets=target_widgets: [w.configure(fg_color=leave_color) for w in widgets], "+") - - -def bindButtonPressColor(target_widgets, clicked_color, released_color): - for target_widget in target_widgets: - target_widget.bind("", lambda e, widgets=target_widgets: [w.configure(fg_color=clicked_color) for w in widgets], "+") - target_widget.bind("", lambda e, widgets=target_widgets: [w.configure(fg_color=released_color) for w in widgets], "+") - -def bindEnterAndLeaveFunction(target_widgets, enterFunction, leaveFunction): - for target_widget in target_widgets: - target_widget.bind("", enterFunction, "+") - target_widget.bind("", leaveFunction, "+") - -def bindButtonPressFunction(target_widgets, buttonPressedFunction): - for target_widget in target_widgets: - target_widget.bind("", buttonPressedFunction, "+") - -def bindButtonReleaseFunction(target_widgets, buttonReleasedFunction): - for target_widget in target_widgets: - target_widget.bind("", buttonReleasedFunction, "+") - -def bindButtonPressAndReleaseFunction(target_widgets, buttonPressedFunction, buttonReleasedFunction): - for target_widget in target_widgets: - target_widget.bind("", buttonPressedFunction, "+") - target_widget.bind("", buttonReleasedFunction, "+") - - -def bindButtonFunctionAndColor(target_widgets, enter_color, leave_color, clicked_color, buttonReleasedFunction): - bindEnterAndLeaveColor(target_widgets, enter_color, leave_color) - bindButtonPressColor(target_widgets, clicked_color, enter_color) - bindButtonReleaseFunction(target_widgets, buttonReleasedFunction) - -def unbindEnterLEaveButtonPressButtonReleaseFunction(target_widgets): - for target_widget in target_widgets: - for event_name in ["", "", "", ""]: - target_widget.unbind(event_name) - -def unbindEventFromActiveTabWidget(active_tab_widget): - for event_name in ["", "", "", ""]: - active_tab_widget.unbind(event_name) - active_tab_widget.children["!ctklabel"].unbind(event_name) - -def setDefaultActiveTab(active_tab_widget, active_bg_color, active_text_color): - active_tab_widget.configure(fg_color=active_bg_color, cursor="") - active_tab_widget.children["!ctklabel"].configure(fg_color=active_bg_color, text_color=active_text_color) - unbindEventFromActiveTabWidget(active_tab_widget) - - -def switchActiveTabAndPassiveTab(active_tab_widget, current_active_tab_widget, current_active_tab_passive_function, hovered_color, clicked_color, passive_color): - - - active_tab_widget.configure(cursor="") - unbindEventFromActiveTabWidget(active_tab_widget) - - - rebindFunctionToTab(current_active_tab_widget, current_active_tab_passive_function, hovered_color, clicked_color, passive_color) - -def rebindFunctionToTab(passive_tab_widget, passive_tab_function, hovered_color, clicked_color, passive_color): - - passive_tab_widget.configure(cursor="hand2") - bindEnterAndLeaveColor([passive_tab_widget, passive_tab_widget.children["!ctklabel"]], hovered_color, passive_color) - bindButtonPressColor([passive_tab_widget, passive_tab_widget.children["!ctklabel"]], clicked_color, passive_color) - - bindButtonReleaseFunction([passive_tab_widget, passive_tab_widget.children["!ctklabel"]], passive_tab_function) - -def switchTabsColor(target_widget, tab_buttons, active_bg_color, active_text_color, passive_bg_color, passive_text_color): - # Change all tabs' color to passive color at first - for tab_button in tab_buttons: - tab_button.configure(fg_color=passive_bg_color) - tab_button.children["!ctklabel"].configure(fg_color=passive_bg_color, text_color=passive_text_color) - - # Then, set active color to the active tab - target_widget.configure(fg_color=active_bg_color) - target_widget.children["!ctklabel"].configure(fg_color=active_bg_color, text_color=active_text_color) - - - - - - -def createButtonWithImage(parent_widget, button_image_size, button_ipadxy, button_fg_color, button_enter_color=None, button_clicked_color=None, button_image_file=None, button_command=None, corner_radius:int=0, no_bind:bool=False): - button_wrapper = CTkFrame(parent_widget, corner_radius=corner_radius, fg_color=button_fg_color, height=0, width=0) - - button_widget = CTkLabel( - button_wrapper, - text=None, - height=0, - image=CTkImage((button_image_file),size=(button_image_size,button_image_size)), - ) - button_widget.grid(row=0, column=0, padx=button_ipadxy, pady=button_ipadxy) - - if no_bind is False: - button_wrapper.configure(cursor="hand2") - bindButtonFunctionAndColor( - target_widgets=[button_wrapper, button_widget], - enter_color=button_enter_color, - leave_color=button_fg_color, - clicked_color=button_clicked_color, - buttonReleasedFunction=button_command, - ) - - return button_wrapper - - -def createLabelButton( - parent_widget, - label_button_bg_color, - label_button_hovered_bg_color, - label_button_clicked_bg_color, - label_button_ipadx, - label_button_ipady, - variable, - font_family, - font_size, - text_color, - label_button_clicked_command, - label_button_position=None, - label_button_padx_between_img=0, - image_file=None, - image_size=None, - image_widget_attr_name=None, - label_button_min_height=None, - label_button_min_width=None, - setattr_widget=None, - ): - - label_button_box = CTkFrame(parent_widget, corner_radius=6, fg_color=label_button_bg_color, cursor="hand2") - - label_button_box.grid_rowconfigure(0, weight=1) - if label_button_min_height is not None: - label_button_box.grid_rowconfigure(0, minsize=label_button_min_height) - - label_button_box.grid_columnconfigure(0, weight=1) - if label_button_min_width is not None: - label_button_box.grid_columnconfigure(0, minsize=label_button_min_width) - - label_button_label_wrapper = CTkFrame(label_button_box, corner_radius=0, fg_color=label_button_bg_color) - label_button_label_wrapper.grid(row=0, column=0, padx=label_button_ipadx, pady=label_button_ipady) - - LABEL_COLUMN=0 - if label_button_position == "center": - label_button_label_wrapper.grid_columnconfigure((0,2), weight=1) - LABEL_COLUMN=1 - - label_button_label_widget = CTkLabel( - label_button_label_wrapper, - textvariable=variable, - height=0, - font=CTkFont(family=font_family, size=font_size, weight="normal"), - text_color=text_color - ) - label_button_label_widget.grid(row=0, column=LABEL_COLUMN, padx=(0, label_button_padx_between_img)) - - - register_widgets = [label_button_label_wrapper, label_button_box, label_button_label_widget] - if image_file is not None: - label_button_label_wrapper.grid_columnconfigure((0,3), weight=1) - label_button_img_widget = CTkLabel( - label_button_label_wrapper, - text=None, - corner_radius=0, - height=0, - image=CTkImage(image_file, size=image_size) - ) - - if image_widget_attr_name is not None: - setattr(setattr_widget, image_widget_attr_name, label_button_img_widget) - - label_button_img_widget.grid(row=0, column=LABEL_COLUMN+1) - register_widgets.append(label_button_img_widget) - - - bindEnterAndLeaveColor(register_widgets, label_button_hovered_bg_color, label_button_bg_color) - bindButtonPressColor(register_widgets, label_button_clicked_bg_color, label_button_hovered_bg_color) - - - - def bindEventFromWidgets(): - bindButtonReleaseFunction(register_widgets, label_button_clicked_command) - - def unbindEventFromWidgets(): - unbindEnterLEaveButtonPressButtonReleaseFunction(register_widgets) - - bindEventFromWidgets() - - label_button_box.unbindFunction = unbindEventFromWidgets - label_button_box.bindFunction = bindEventFromWidgets - - if image_file is not None: - return (label_button_box, label_button_label_widget, label_button_img_widget) - else: - return (label_button_box, label_button_label_widget) - - - - - - - -def createOptionMenuBox(parent_widget, optionmenu_bg_color, optionmenu_hovered_bg_color, optionmenu_clicked_bg_color, optionmenu_ipadx, optionmenu_ipady, variable, font_family, font_size, text_color, image_file, image_size, optionmenu_clicked_command, optionmenu_position=None, optionmenu_padx_between_img=0, optionmenu_min_height=None, optionmenu_min_width=None, setattr_widget=None, image_widget_attr_name=None): - - option_menu_box = CTkFrame(parent_widget, corner_radius=6, fg_color=optionmenu_bg_color, cursor="hand2") - - option_menu_box.grid_rowconfigure(0, weight=1) - if optionmenu_min_height is not None: - option_menu_box.grid_rowconfigure(0, minsize=optionmenu_min_height) - - option_menu_box.grid_columnconfigure(0, weight=1) - if optionmenu_min_width is not None: - option_menu_box.grid_columnconfigure(0, minsize=optionmenu_min_width) - - optionmenu_label_wrapper = CTkFrame(option_menu_box, corner_radius=0, fg_color=optionmenu_bg_color) - optionmenu_label_wrapper.grid(row=0, column=0, padx=(optionmenu_ipadx[0],0), pady=optionmenu_ipady, sticky="ew") - - LABEL_COLUMN=0 - if optionmenu_position == "center": - optionmenu_label_wrapper.grid_columnconfigure((0,2), weight=1) - LABEL_COLUMN=1 - - optionmenu_label_widget = CTkLabel( - optionmenu_label_wrapper, - textvariable=variable, - height=0, - font=CTkFont(family=font_family, size=font_size, weight="normal"), - text_color=text_color - ) - optionmenu_label_widget.grid(row=0, column=LABEL_COLUMN, padx=(0, optionmenu_padx_between_img)) - - - optionmenu_img_widget = CTkLabel( - option_menu_box, - text=None, - corner_radius=0, - height=0, - image=CTkImage(image_file, size=image_size) - ) - - if image_widget_attr_name is not None: - setattr(setattr_widget, image_widget_attr_name, optionmenu_img_widget) - - optionmenu_img_widget.grid(row=0, column=1, padx=(0, optionmenu_ipadx[1]), pady=optionmenu_ipady) - - - bindEnterAndLeaveColor([optionmenu_label_wrapper, option_menu_box, optionmenu_label_widget, optionmenu_img_widget], optionmenu_hovered_bg_color, optionmenu_bg_color) - bindButtonPressColor([optionmenu_label_wrapper, option_menu_box, optionmenu_label_widget, optionmenu_img_widget], optionmenu_clicked_bg_color, optionmenu_hovered_bg_color) - - - def bindEventFromWidgets(): - bindButtonReleaseFunction([optionmenu_label_wrapper, option_menu_box, optionmenu_label_widget, optionmenu_img_widget], optionmenu_clicked_command) - bindEventFromWidgets() - - def unbindEventFromWidgets(): - unbindEnterLEaveButtonPressButtonReleaseFunction([optionmenu_label_wrapper, option_menu_box, optionmenu_label_widget, optionmenu_img_widget]) - - option_menu_box.unbindFunction = unbindEventFromWidgets - option_menu_box.bindFunction = bindEventFromWidgets - - - return (option_menu_box, optionmenu_label_widget, optionmenu_img_widget) - - -def applyUiScalingAndFixTheBugScrollBar(scrollbar_widget, padx, width): - scrollbar_widget._scrollbar.grid_configure(padx=padx) - - # This is for CustomTkinter's spec change or bug fix. - scrollbar_widget._scrollbar.configure(height=0) - scrollbar_widget._scrollbar.configure(width=width) - - -def setGeometryToCenterOfScreen(root_widget): - root_widget.update() - sw=root_widget.winfo_screenwidth() - sh=root_widget.winfo_screenheight() - geometry_width = root_widget.winfo_width() - geometry_height = root_widget.winfo_height() - - root_widget.geometry(str(geometry_width)+"x"+str(geometry_height)+"+"+str((sw-geometry_width)//2)+"+"+str((sh-geometry_height)//2)) - - -def setGeometryToCenterOfTheWidget(attach_widget, target_widget): - attach_widget.update() - target_widget.update() - current_window_x = attach_widget.winfo_rootx() - current_window_y = attach_widget.winfo_rooty() - current_window_width = attach_widget.winfo_width() - current_window_height = attach_widget.winfo_height() - desired_window_width = target_widget.winfo_width() - desired_window_height = target_widget.winfo_height() - - desired_window_x = int((current_window_x + current_window_width / 2) - (desired_window_width / 2)) - desired_window_y = int((current_window_y + current_window_height / 2) - (desired_window_height / 2)) - - target_widget.geometry(str(desired_window_width) + "x" + str(desired_window_height) + "+" + str(desired_window_x) + "+" + str(desired_window_y)) - - -def fadeInAnimation(root_widget, steps:int=10, interval:float=0.1, max_alpha:float=1): - alpha_steps = 100 - alpha_steps*=max_alpha - step_size = alpha_steps/steps - root_widget.attributes("-alpha", 0) - num = 0 - while num < alpha_steps: - if not root_widget.winfo_exists(): - break - root_widget.attributes("-alpha", num / 100) - root_widget.update() - sleep(interval) - num += step_size - root_widget.attributes("-alpha", max_alpha) - - -def rotateImage(image, angle, to_expand=False): - rotated_image = image.rotate(angle, expand=to_expand) - return rotated_image - -def animateRotation(tk_root, img_frame, img, img_width, img_height, start_angle:int, goal_angle:int, duration=0.5, to_expand:bool=False): - start_time = time() - while True: - elapsed_time = time() - start_time - progress = min(elapsed_time / duration, 1.0) - eased_progress = 1 - math.pow(1 - progress, 4) - - angle = start_angle + (goal_angle - start_angle) * eased_progress - angle = -angle - - rotated_img = rotateImage(img, angle, to_expand) - img_frame.configure(image=CTkImage(rotated_img, size=(img_width, img_height))) - - tk_root.update() - - if elapsed_time >= duration: - break - - sleep(0.01) diff --git a/vrct_gui/updating_window/UpdatingWindow.py b/vrct_gui/updating_window/UpdatingWindow.py deleted file mode 100644 index d84fd7dd..00000000 --- a/vrct_gui/updating_window/UpdatingWindow.py +++ /dev/null @@ -1,177 +0,0 @@ -import math -import time - -from customtkinter import CTkImage, CTkLabel, CTkToplevel, CTkProgressBar, CTkFrame -from ..ui_utils import openImageKeepAspectRatio, getImageFileFromUiUtils, setGeometryToCenterOfScreen, fadeInAnimation, generateGradientColor, getImagePath - -class UpdatingWindow(CTkToplevel): - def __init__(self, vrct_gui): - super().__init__() - self.withdraw() - self.overrideredirect(True) - self.configure(fg_color="#292a2d") - self.title("Updating...") - self.after(200, lambda: self.iconbitmap(getImagePath("vrct_logo_mark_black.ico"))) - self.protocol("WM_DELETE_WINDOW", vrct_gui._quitVRCT) - # self.wm_attributes("-toolwindow", True) - self.is_showed_downloading_process = False - self.is_showed_unpackaging_process = False - BG_WIDTH= 300 - BG_HEIGHT= 350 - self.BG_HEX_COLOR = "#292a2d" - - self.grid_columnconfigure(0, weight=1) - self.grid_rowconfigure(0, weight=1) - self.updating_background = CTkFrame(self, corner_radius=0, fg_color=self.BG_HEX_COLOR, width=BG_WIDTH, height=BG_HEIGHT) - self.updating_background.grid() - - - self.PROGRESSBAR_HEIGHT = 2 - self.PROGRESSBAR_WIDTH = 240 - self.PROGRESSBAR_Y = 240 - self.PROGRESSBAR_X = 30 - - - - - self.downloading_unpackaging_d = getImageFileFromUiUtils("downloading_unpackaging_d.png") - self.downloading_unpackaging_d_label = CTkLabel( - self.updating_background, - text=None, - height=0, - fg_color=self.BG_HEX_COLOR, - image=CTkImage(self.downloading_unpackaging_d, size=(self.downloading_unpackaging_d.width, self.downloading_unpackaging_d.height)) - ) - - - self.downloading_unpackaging_u = getImageFileFromUiUtils("downloading_unpackaging_u.png") - self.downloading_unpackaging_u_label = CTkLabel( - self.updating_background, - text=None, - height=0, - fg_color=self.BG_HEX_COLOR, - image=CTkImage(self.downloading_unpackaging_u, size=(self.downloading_unpackaging_u.width, self.downloading_unpackaging_u.height)) - ) - - - - - - - - - self.unpackage_img = getImageFileFromUiUtils("unpackage_icon.png") - - self.unpackage_img_label = CTkLabel( - self.updating_background, - text=None, - height=0, - fg_color=self.BG_HEX_COLOR, - image=CTkImage(self.unpackage_img, size=(self.unpackage_img.width, self.unpackage_img.height)) - ) - - - - - - - - self.progressbar = CTkProgressBar( - self.updating_background, - height=self.PROGRESSBAR_HEIGHT, - width=self.PROGRESSBAR_WIDTH, - corner_radius=0, - fg_color=self.BG_HEX_COLOR, - progress_color=self.BG_HEX_COLOR, - ) - self.progressbar.set(0) - self.progressbar.place(x=self.PROGRESSBAR_X, y=self.PROGRESSBAR_Y, anchor="nw") - - - self.chato_delivering_img = getImageFileFromUiUtils("chato_delivering.png") - - self.chato_delivering_img_label = CTkLabel( - self.updating_background, - text=None, - height=0, - fg_color=self.BG_HEX_COLOR, - image=CTkImage(self.chato_delivering_img, size=(self.chato_delivering_img.width, self.chato_delivering_img.height)) - ) - self.chato_delivering_img_label.place(x=-30, y=self.PROGRESSBAR_Y - 1, anchor="s") - - - - self.chato_unpackaging_img = getImageFileFromUiUtils("chato_unpackaging.png") - - self.chato_unpackaging_img_label = CTkLabel( - self.updating_background, - text=None, - height=0, - fg_color=self.BG_HEX_COLOR, - image=CTkImage(self.chato_unpackaging_img, size=(self.chato_unpackaging_img.width, self.chato_unpackaging_img.height)) - ) - self.chato_unpackaging_img_label.place(x=-30, y=self.PROGRESSBAR_Y + self.PROGRESSBAR_HEIGHT + 1, anchor="n") - - - - - - - - self.vrct_update_process_img = getImageFileFromUiUtils("vrct_update_process.png") - - self.vrct_update_process_img_label = CTkLabel( - self.updating_background, - text=None, - height=0, - fg_color=self.BG_HEX_COLOR, - image=CTkImage(self.vrct_update_process_img, size=(self.vrct_update_process_img.width, self.vrct_update_process_img.height)) - ) - self.vrct_update_process_img_label.place(x=87, y=300, anchor="nw") - - - - - - - def updateDownloadProgress(self, progress:float, progress_type:str): - if progress_type == "downloading": - if self.is_showed_downloading_process is False: - self.downloading_unpackaging_d_label.place(x=50, y=56, anchor="nw") - self.is_showed_downloading_process = True - - fg_color = generateGradientColor( - value=progress, - color_start=[242, 242, 242], # RGB values for #f2f2f2 - color_end=[72, 164, 149], # RGB values for #48a495 - ) - self.progressbar.configure(fg_color=fg_color) - - chato_x = self.PROGRESSBAR_X + (progress * self.PROGRESSBAR_WIDTH) - self.chato_delivering_img_label.place(x=chato_x) - self.progressbar.set(progress) - self.update_idletasks() - - elif progress_type == "extracting": - if self.is_showed_unpackaging_process is False: - self.chato_delivering_img_label.place_forget() - self.downloading_unpackaging_u_label.place(x=50, y=56, anchor="nw") - self.unpackage_img_label.place(x=130, y=174, anchor="nw") - self.progressbar.configure(fg_color=self.BG_HEX_COLOR, progress_color="#4B4C4F") - self.is_showed_unpackaging_process = True - - chato_x = (self.PROGRESSBAR_X - 3) + (self.PROGRESSBAR_WIDTH - (progress * self.PROGRESSBAR_WIDTH)) - self.chato_unpackaging_img_label.place(x=chato_x) - self.progressbar.set(1 - progress) - self.update_idletasks() - - - def showUpdatingWindow(self): - self.attributes("-alpha", 0) - self.deiconify() - setGeometryToCenterOfScreen(root_widget=self) - fadeInAnimation(self, steps=5, interval=0.02) - - - def destroyUpdatingWindow(self): - self.destroy() \ No newline at end of file diff --git a/vrct_gui/updating_window/__init__.py b/vrct_gui/updating_window/__init__.py deleted file mode 100644 index feed896e..00000000 --- a/vrct_gui/updating_window/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .UpdatingWindow import UpdatingWindow \ No newline at end of file diff --git a/vrct_gui/vrct_gui.py b/vrct_gui/vrct_gui.py deleted file mode 100644 index cc0d2d97..00000000 --- a/vrct_gui/vrct_gui.py +++ /dev/null @@ -1,334 +0,0 @@ -from customtkinter import CTk, CTkImage - -from ._CreateSelectableLanguagesWindow import _CreateSelectableLanguagesWindow - -from .updating_window import UpdatingWindow - -from ._CreateWindowCover import _CreateWindowCover -from ._CreateNotificationWindow import _CreateNotificationWindow -from ._CreateDropdownMenuWindow import _CreateDropdownMenuWindow -from ._changeMainWindowWidgetsStatus import _changeMainWindowWidgetsStatus -from ._changeConfigWindowWidgetsStatus import _changeConfigWindowWidgetsStatus -from ._CreateConfirmationModal import _CreateConfirmationModal -from ._PrintToTextbox import _PrintToTextbox - -from .main_window import createMainWindowWidgets -from .config_window import ConfigWindow -from .quick_settings_window import QuickSettingsWindow -from .ui_utils import setDefaultActiveTab, setGeometryToCenterOfScreen, fadeInAnimation - -from utils import callFunctionIfCallable - -class VRCT_GUI(CTk): - def __init__(self): - super().__init__() - self.withdraw() - self.is_config_window_already_opened_once=False - self.BIND_UNMAP_DETECT_MAIN_WINDOW_STATE_FUNC_ID = None - self.BIND_MAP_DETECT_MAIN_WINDOW_STATE_FUNC_ID = None - - self.window_state = None - - def detectMainWindowState(self, _e=None): - self.new_window_state = self.wm_state() - if self.window_state == self.new_window_state: - return - else: - self.window_state = self.new_window_state - - if self.window_state == "iconic": - self.main_window_cover.withdraw() - elif self.window_state == "normal": - self.main_window_cover.show() - - - - def _showGUI(self): - self.attributes("-alpha", 0) - self.deiconify() - if self.settings.main.to_restore_main_window_geometry is True: - self.geometry("{}x{}+{}+{}".format( - self.settings.main.geometry.width, - self.settings.main.geometry.height, - self.settings.main.geometry.x_pos, - self.settings.main.geometry.y_pos, - )) - else: - self.geometry("{}x{}".format( - self.settings.main.uism.MAIN_AREA_MIN_WIDTH + self.settings.main.uism.SIDEBAR_MIN_WIDTH, - self.winfo_height() - )) - setGeometryToCenterOfScreen(root_widget=self) - - - if self._view_variable.IS_MAIN_WINDOW_SIDEBAR_COMPACT_MODE is True: - self._enableMainWindowSidebarCompactMode() - fadeInAnimation(self, steps=5, interval=0.008) - - - if self._isOverWindowSizeCheck() is True: - callFunctionIfCallable(self._view_variable.CALLBACK_WHEN_DETECT_WINDOW_OVERED_SIZE) - - - def _createGUI(self, settings, view_variable): - self.settings = settings - self._view_variable = view_variable - - self.translation_engine_dropdown_menu_window = _CreateDropdownMenuWindow( - settings=settings.dropdown_menu_window, - view_variable=self._view_variable, - - window_additional_y_pos=self.settings.main.uism.SLS__DROPDOWN_MENU_WINDOW_ADDITIONAL_Y_POS, - window_border_width=self.settings.main.uism.SLS__DROPDOWN_MENU_WINDOW_BORDER_WIDTH, - scrollbar_ipadx=self.settings.main.uism.SLS__DROPDOWN_MENU_SCROLLBAR_IPADX, - scrollbar_width=self.settings.main.uism.SLS__DROPDOWN_MENU_SCROLLBAR_WIDTH, - value_ipadx=self.settings.main.uism.SLS__DROPDOWN_MENU_VALUE_IPADX, - value_ipady=self.settings.main.uism.SLS__DROPDOWN_MENU_VALUE_IPADY, - value_pady=self.settings.main.uism.SLS__DROPDOWN_MENU_VALUE_PADY, - value_font_size=self.settings.main.uism.SLS__DROPDOWN_MENU_VALUE_FONT_SIZE, - dropdown_menu_default_min_width=self.settings.main.uism.SLS__DROPDOWN_MENU_VALUE_DEFAULT_MIN_WIDTH, - - window_bg_color=self.settings.main.ctm.SLS__DROPDOWN_MENU_WINDOW_BG_COLOR, - window_border_color=self.settings.main.ctm.SLS__DROPDOWN_MENU_WINDOW_BORDER_COLOR, - values_bg_color=self.settings.main.ctm.SLS__DROPDOWN_MENU_BG_COLOR, - values_hovered_bg_color=self.settings.main.ctm.SLS__DROPDOWN_MENU_HOVERED_BG_COLOR, - values_clicked_bg_color=self.settings.main.ctm.SLS__DROPDOWN_MENU_CLICKED_BG_COLOR, - values_text_color=self.settings.main.ctm.BASIC_TEXT_COLOR, - ) - - createMainWindowWidgets( - vrct_gui=self, - settings=self.settings.main, - view_variable=self._view_variable - ) - - # For Config Window - self.dropdown_menu_window = _CreateDropdownMenuWindow( - settings=self.settings.dropdown_menu_window, - view_variable=self._view_variable, - - window_additional_y_pos=self.settings.config_window.uism.SB__DROPDOWN_MENU_WINDOW_ADDITIONAL_Y_POS, - window_border_width=self.settings.config_window.uism.SB__DROPDOWN_MENU_WINDOW_BORDER_WIDTH, - scrollbar_ipadx=self.settings.config_window.uism.SB__DROPDOWN_MENU_SCROLLBAR_IPADX, - scrollbar_width=self.settings.config_window.uism.SB__DROPDOWN_MENU_SCROLLBAR_WIDTH, - value_ipadx=self.settings.config_window.uism.SB__DROPDOWN_MENU_VALUE_IPADX, - value_ipady=self.settings.config_window.uism.SB__DROPDOWN_MENU_VALUE_IPADY, - value_pady=self.settings.config_window.uism.SB__DROPDOWN_MENU_VALUE_PADY, - value_font_size=self.settings.config_window.uism.SB__DROPDOWN_MENU_VALUE_FONT_SIZE, - dropdown_menu_default_min_width=self.settings.config_window.uism.SB__DROPDOWN_MENU_VALUE_DEFAULT_MIN_WIDTH, - - window_bg_color=self.settings.config_window.ctm.SB__DROPDOWN_MENU_WINDOW_BG_COLOR, - window_border_color=self.settings.config_window.ctm.SB__DROPDOWN_MENU_WINDOW_BORDER_COLOR, - values_bg_color=self.settings.config_window.ctm.SB__DROPDOWN_MENU_BG_COLOR, - values_hovered_bg_color=self.settings.config_window.ctm.SB__DROPDOWN_MENU_HOVERED_BG_COLOR, - values_clicked_bg_color=self.settings.config_window.ctm.SB__DROPDOWN_MENU_CLICKED_BG_COLOR, - values_text_color=self.settings.config_window.ctm.BASIC_TEXT_COLOR, - ) - - self.config_window = ConfigWindow( - vrct_gui=self, - settings=self.settings.config_window, - view_variable=self._view_variable - ) - - self.quick_settings_window = QuickSettingsWindow( - vrct_gui=self, - settings=self.settings.config_window, - view_variable=self._view_variable - ) - - self.selectable_languages_window = _CreateSelectableLanguagesWindow( - vrct_gui=self, - settings=self.settings.selectable_language_window, - view_variable=self._view_variable - ) - - self.main_window_cover = _CreateWindowCover( - attach_window=self, - settings=self.settings.main_window_cover, - view_variable=self._view_variable - ) - - self.notification_message_window = _CreateNotificationWindow( - settings=self.settings.notification_message_window, - view_variable=self._view_variable, - wrapper_widget=self.config_window.main_bg_container, - - message_ipadx=self.settings.config_window.uism.SB__ERROR_MESSAGE_IPADX, - message_ipady=self.settings.config_window.uism.SB__ERROR_MESSAGE_IPADY, - message_font_size=self.settings.config_window.uism.SB__ERROR_MESSAGE_FONT_SIZE, - - error_message_bg_color=self.settings.config_window.ctm.SB__ERROR_MESSAGE_BG_COLOR, - success_message_bg_color=self.settings.config_window.ctm.SB__SUCCESS_MESSAGE_BG_COLOR, - message_text_color=self.settings.config_window.ctm.SB__ERROR_MESSAGE_TEXT_COLOR, - ) - - self.confirmation_modal = _CreateConfirmationModal( - attach_window=self.toplevel_wrapper, - settings=self.settings.confirmation_modal, - view_variable=self._view_variable - ) - - self.information_modal = _CreateConfirmationModal( - attach_window=self.toplevel_wrapper, - settings=self.settings.confirmation_modal, - view_variable=self._view_variable, - modal_type="information" - ) - - self.print_to_textbox = _PrintToTextbox( - vrct_gui=self, - settings=self.settings.main, - init_scaling=(self._view_variable.VAR_TEXTBOX_UI_SCALING.get()/100) - ) - - self.updating_window = UpdatingWindow(vrct_gui=self) - - - - - def _startMainLoop(self): - self.mainloop() - - - def _quitVRCT(self): - self.quit() - self.destroy() - - - def _openConfigWindow(self): - self.main_window_cover.show(bind_focusin=self.config_window.lift) - - self.BIND_UNMAP_DETECT_MAIN_WINDOW_STATE_FUNC_ID = self.bind("", self.detectMainWindowState, "+") - self.BIND_MAP_DETECT_MAIN_WINDOW_STATE_FUNC_ID = self.bind("", self.detectMainWindowState, "+") - - - self.config_window.attributes("-alpha", 0) - self.config_window.deiconify() - if self.is_config_window_already_opened_once is False: - setGeometryToCenterOfScreen(self.config_window) - self.is_config_window_already_opened_once = True - fadeInAnimation(self.config_window, steps=5, interval=0.005) - self.config_window.attributes("-alpha", 1) - self.config_window.focus_set() - - def _closeConfigWindow(self): - self.config_window.withdraw() - - self.main_window_cover.hide() - self.unbind("", self.BIND_UNMAP_DETECT_MAIN_WINDOW_STATE_FUNC_ID) - self.unbind("", self.BIND_MAP_DETECT_MAIN_WINDOW_STATE_FUNC_ID) - self.adjusted_event=None - - - - def _openSelectableLanguagesWindow(self, selectable_language_window_type): - if selectable_language_window_type == "your_language": - if self._view_variable.IS_OPENED_SELECTABLE_YOUR_LANGUAGE_WINDOW is False: - self.sls__arrow_img_your_language.configure(image=CTkImage(self.settings.main.image_file.ARROW_LEFT, size=self.settings.main.uism.SLS__BOX_OPTION_MENU_ARROW_IMAGE_SIZE)) - self._view_variable.IS_OPENED_SELECTABLE_YOUR_LANGUAGE_WINDOW = True - self._view_variable.IS_OPENED_SELECTABLE_TARGET_LANGUAGE_WINDOW = False - else: - self._view_variable.IS_OPENED_SELECTABLE_YOUR_LANGUAGE_WINDOW = False - return - - elif selectable_language_window_type == "target_language": - if self._view_variable.IS_OPENED_SELECTABLE_TARGET_LANGUAGE_WINDOW is False: - self.sls__arrow_img_target_language.configure(image=CTkImage(self.settings.main.image_file.ARROW_LEFT, size=self.settings.main.uism.SLS__BOX_OPTION_MENU_ARROW_IMAGE_SIZE)) - self._view_variable.IS_OPENED_SELECTABLE_TARGET_LANGUAGE_WINDOW = True - self._view_variable.IS_OPENED_SELECTABLE_YOUR_LANGUAGE_WINDOW = False - else: - self._view_variable.IS_OPENED_SELECTABLE_TARGET_LANGUAGE_WINDOW = False - return - - - self.selectable_languages_window.createContainer(selectable_language_window_type) - self.selectable_languages_window.deiconify() - self.selectable_languages_window.focus_set() - self.selectable_languages_window.attributes("-topmost", True) - - - def _closeSelectableLanguagesWindow(self): - self.sls__arrow_img_your_language.configure(image=CTkImage(self.settings.main.image_file.ARROW_LEFT.rotate(180), size=self.settings.main.uism.SLS__BOX_OPTION_MENU_ARROW_IMAGE_SIZE)) - self.sls__arrow_img_target_language.configure(image=CTkImage(self.settings.main.image_file.ARROW_LEFT.rotate(180), size=self.settings.main.uism.SLS__BOX_OPTION_MENU_ARROW_IMAGE_SIZE)) - self.selectable_languages_window.withdraw() - - - if self._view_variable.IS_OPENED_SELECTABLE_TARGET_LANGUAGE_WINDOW is not False or self._view_variable.IS_OPENED_SELECTABLE_YOUR_LANGUAGE_WINDOW is not False: - def callback(): - self._view_variable.IS_OPENED_SELECTABLE_TARGET_LANGUAGE_WINDOW = False - self._view_variable.IS_OPENED_SELECTABLE_YOUR_LANGUAGE_WINDOW = False - self.after(500,callback) - - - - def _changeMainWindowWidgetsStatus(self, status, target_names, to_lock_state:bool=False, release_locked_state:bool=False): - _changeMainWindowWidgetsStatus( - vrct_gui=self, - settings=self.settings.main, - view_variable=self._view_variable, - status=status, - target_names=target_names, - to_lock_state=to_lock_state, - release_locked_state=release_locked_state, - ) - - def _changeConfigWindowWidgetsStatus(self, status, target_names): - _changeConfigWindowWidgetsStatus( - config_window=self.config_window, - settings=self.settings.config_window, - view_variable=self._view_variable, - status=status, - target_names=target_names, - ) - - def _printToTextbox(self, target_type, **kwargs): - self.print_to_textbox.printToTextbox( - target_type=target_type, - **kwargs - ) - - def _setDefaultActiveLanguagePresetTab(self, tab_no:str): - self.current_active_preset_tab = getattr(self, f"sls__presets_button_{tab_no}") - setDefaultActiveTab( - active_tab_widget=self.current_active_preset_tab, - active_bg_color=self.settings.main.ctm.SLS__PRESETS_TAB_BG_ACTIVE_COLOR, - active_text_color=self.settings.main.ctm.SLS__PRESETS_TAB_ACTIVE_TEXT_COLOR - ) - - def _enableMainWindowSidebarCompactMode(self): - self.sidebar_bg_container.grid_remove() - self.sidebar_compact_mode_bg_container.grid() - self.minimize_sidebar_button_container__for_closing.grid_remove() - self.minimize_sidebar_button_container__for_opening.grid() - - def _disableMainWindowSidebarCompactMode(self): - self.sidebar_compact_mode_bg_container.grid_remove() - self.sidebar_bg_container.grid() - self.minimize_sidebar_button_container__for_opening.grid_remove() - self.minimize_sidebar_button_container__for_closing.grid() - - - def _showErrorMessage(self, target_widget): - self.notification_message_window.show(target_widget=target_widget, message_type="Error") - - def _showSuccessMessage(self, target_widget): - self.notification_message_window.show(target_widget=target_widget, message_type="Success") - - def _clearNotificationMessage(self): - try: - self.notification_message_window._withdraw() - except Exception: - pass - - - def _isOverWindowSizeCheck(self): - self.update() - screen_height = self.winfo_screenheight() - window_height = self.winfo_height() - if screen_height < window_height: - return True - else: - return False - -vrct_gui = VRCT_GUI() \ No newline at end of file