+
+# 다운로드 및 설치
+원하는 곳에서 다운로드 할 수 있어요.
+- [Github.com](https://github.com/misyaguziya/VRCT/releases/)
+- [BOOTH.pm](https://misyaguziya.booth.pm/items/5155325)
+
+다운로드 후 exe를 실행하기만 하면 됩니다.
+
+# VRCT가 뭔가요?
+VRCT는 서로 다른 언어를 사용하는 사람들끼리 대화를 할 수 있도록 채팅이나 음성 번역을 통해 대화를 지원하는 소프트웨어에요.
+이 기능들은 VRChat 내에서 사용하도록 설계되었어요.
+※ 지원 대상에서 제외되지만, 영화 감상 등 다른 용도로도 사용되고 있습니다.
+
+VRCT는 다음과 같이 당신의 대화를 도와드려요.
+- 💬 **VRChat으로의 채팅 전송 기능**
+- 🌐 **번역 기능**
+- 🎙 **마이크 음성인식 기능**
+- 🔈 **스피커 음성인식 기능**
+
+# 문서 (일본어)
+초기 설정과 기본 기능 및 기타 기능에 대해 설명되어 있어요.
+- [Documents Link](https://mzsoftware.notion.site/VRCT-Documents-be79b7a165f64442ad8f326d86c22246?pvs=4)
+
+# 사용법 (Youtube)
+
+
+[](https://www.youtube.com/watch?v=rUTad037n8Q)
+
+
+
+# python으로 실행하고 싶은 경우
+1. 다음 버전의 python을 설치합니다.
+ `python version 3.11.5`
+2. 패키지를 설치하고 main.py를 실행합니다.
+ ```bash
+ ./install.bat
+ python main.py
+ ```
+
+## Author
+- [みしゃ(misyaguzi)](https://github.com/misyaguziya) (주요 개발)
+- [しいな(Shiina_12siy)](https://twitter.com/Shiina_12siy) (UI/UX, UI 다국어 지원)
+- [レラ](https://github.com/soumt-r) (번역: 한국어)
+- [どね](https://twitter.com/done_vrc) (로고 디자인)
+
+---
+
+VRCT는 VRChat의 어떠한 승인도 받지 않았으며, VRChat 또는 VRChat의 개발 또는 관리에 공식적으로 관여하는 사람의 견해나 의견을 반영하지 않습니다. VRChat 및 모든 관련 재산은 미국 VRChat, Inc의 상표 또는 등록상표입니다.
\ No newline at end of file
diff --git a/README.md b/README.md
index 5892ce75..e9d55391 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@
[](https://github.com/misyaguziya/VRCT/blob/master/LICENSE)
[](https://misyaguziya.booth.pm/items/5155325)
-| **English** | [日本語](./README.jp.md) |
+| **English** | [日本語](./README.jp.md) | [한국어](./README.kr.md) |
VRCT is software that supports VRChat conversations with translation and transcription.
diff --git a/build.bat b/build.bat
index 5ad8f73a..10cb4c05 100644
--- a/build.bat
+++ b/build.bat
@@ -1,2 +1,2 @@
-pyinstaller --windowed --clean --noconfirm --icon="./img/vrct_logo_mark_black.ico" --add-data "./img;img/" --add-data "./locales;locales/" --add-data "./batch;batch/" --name VRCT --exclude-module numpy --exclude-module pandas --exclude-module matplotlib --exclude-module PyQt5 main.py
+pyinstaller --windowed --clean --noconfirm --icon="./img/vrct_logo_mark_black.ico" --add-data "./img;img/" --add-data "./locales;locales/" --add-data "./batch;batch/" --name VRCT --add-data ".venv\Lib\site-packages\customtkinter;customtkinter/" --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
index 4a5e355d..dc882684 100644
--- a/config.py
+++ b/config.py
@@ -5,7 +5,7 @@ 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 translatorEngine
+from models.translation.translation_languages import translation_lang
from models.transcription.transcription_utils import getInputDevices, getDefaultInputDevice
from utils import generatePercentageStringsList, isUniqueStrings
@@ -43,8 +43,12 @@ class Config:
return self._ENABLE_SPEAKER2CHATBOX
@property
- def LOCAL_PATH(self):
- return self._LOCAL_PATH
+ def ENABLE_SPEAKER2CHATBOX(self):
+ return self._ENABLE_SPEAKER2CHATBOX
+
+ @property
+ def PATH_LOCAL(self):
+ return self._PATH_LOCAL
@property
def PATH_CONFIG(self):
@@ -90,6 +94,10 @@ class Config:
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 MAX_MIC_ENERGY_THRESHOLD(self):
return self._MAX_MIC_ENERGY_THRESHOLD
@@ -172,13 +180,31 @@ class Config:
self._TARGET_LANGUAGE = value
@property
- def CHOICE_TRANSLATOR(self):
- return self._CHOICE_TRANSLATOR
+ def CHOICE_INPUT_TRANSLATOR(self):
+ return self._CHOICE_INPUT_TRANSLATOR
- @CHOICE_TRANSLATOR.setter
- def CHOICE_TRANSLATOR(self, value):
- if value in translatorEngine:
- self._CHOICE_TRANSLATOR = value
+ @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 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
# Save Json Data
## Main Window
@@ -193,6 +219,28 @@ class Config:
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):
@@ -509,6 +557,29 @@ class Config:
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('WEIGHT_TYPE')
+ def WEIGHT_TYPE(self):
+ return self._WEIGHT_TYPE
+
+ @WEIGHT_TYPE.setter
+ def WEIGHT_TYPE(self, value):
+ # if isinstance(value, str) and value in self.SELECTABLE_CTRANSLATE2_WEIGHT_TYPE_DICT:
+ if isinstance(value, str):
+ self._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):
@@ -660,11 +731,11 @@ class Config:
def init_config(self):
# Read Only
- self._VERSION = "2.0.2"
+ self._VERSION = "2.1.0"
self._ENABLE_SPEAKER2CHATBOX = False # Speaker2Chatbox
- self._LOCAL_PATH = os_path.dirname(sys.argv[0])
- self._PATH_CONFIG = os_path.join(self._LOCAL_PATH, "config.json")
- self._PATH_LOGS = os_path.join(self._LOCAL_PATH, "logs")
+ 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._BOOTH_URL = "https://misyaguziya.booth.pm/"
@@ -680,6 +751,11 @@ class Config:
"ko": "한국어"
# 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._MAX_MIC_ENERGY_THRESHOLD = 2000
self._MAX_SPEAKER_ENERGY_THRESHOLD = 4000
@@ -688,15 +764,27 @@ class Config:
self._ENABLE_TRANSCRIPTION_SEND = False
self._ENABLE_TRANSCRIPTION_RECEIVE = False
self._ENABLE_FOREGROUND = False
- self._CHOICE_TRANSLATOR = translatorEngine[0]
+ 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._IS_RESET_BUTTON_DISPLAYED_FOR_TRANSLATION = 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":"Japanese\n(Japan)",
"2":"Japanese\n(Japan)",
@@ -741,10 +829,9 @@ class Config:
self._OSC_PORT = 9000
self._AUTH_KEYS = {
"DeepL_API": None,
- "DeepL": None,
- "Bing": None,
- "Google": None,
}
+ self._USE_TRANSLATION_FEATURE = True
+ self._WEIGHT_TYPE = "Small"
self._SEND_MESSAGE_FORMAT = "[message]"
self._SEND_MESSAGE_FORMAT_WITH_T = "[message]([translation])"
self._RECEIVED_MESSAGE_FORMAT = "[message]"
diff --git a/controller.py b/controller.py
index 42f17be6..f9e9a5b3 100644
--- a/controller.py
+++ b/controller.py
@@ -21,8 +21,8 @@ def callbackFilepathLogs():
Popen(['explorer', config.PATH_LOGS.replace('/', '\\')], shell=True)
def callbackFilepathConfigFile():
- print("callbackFilepathConfigFile", config.LOCAL_PATH.replace('/', '\\'))
- Popen(['explorer', config.LOCAL_PATH.replace('/', '\\')], shell=True)
+ print("callbackFilepathConfigFile", config.PATH_LOCAL.replace('/', '\\'))
+ Popen(['explorer', config.PATH_LOCAL.replace('/', '\\')], shell=True)
def callbackQuitVrct():
setMainWindowGeometry()
@@ -55,6 +55,12 @@ def messageFormatter(format_type:str, translation, message):
osc_message = FORMAT.replace("[message]", message)
return osc_message
+def changeToCTranslate2Process():
+ 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:
@@ -65,11 +71,9 @@ def sendMicMessage(message):
elif config.ENABLE_TRANSLATION is False:
pass
else:
- translation = model.getInputTranslate(message)
- if translation is False:
- config.ENABLE_TRANSLATION = False
- translation = ""
- view.translationEngineLimitErrorProcess()
+ 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:
@@ -132,11 +136,9 @@ def receiveSpeakerMessage(message):
if config.ENABLE_TRANSLATION is False:
pass
else:
- translation = model.getOutputTranslate(message)
- if translation is False:
- config.ENABLE_TRANSLATION = False
- translation = ""
- view.translationEngineLimitErrorProcess()
+ translation, success = model.getOutputTranslate(message)
+ if success is False:
+ changeToCTranslate2Process()
if config.ENABLE_TRANSCRIPTION_RECEIVE is True:
if config.ENABLE_NOTICE_XSOVERLAY is True:
@@ -202,11 +204,9 @@ def sendChatMessage(message):
if config.ENABLE_TRANSLATION is False:
pass
else:
- translation = model.getInputTranslate(message)
- if translation is False:
- config.ENABLE_TRANSLATION = False
- translation = ""
- view.translationEngineLimitErrorProcess()
+ translation, success = model.getInputTranslate(message)
+ if success is False:
+ changeToCTranslate2Process()
# send OSC message
if config.ENABLE_SEND_MESSAGE_TO_VRC is True:
@@ -249,7 +249,22 @@ def messageBoxFocusOut(e):
if config.ENABLE_SEND_MESSAGE_TO_VRC is True:
model.oscStopSendTyping()
-# func select languages
+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]
language, country = model.getLanguageAndCountry(select)
@@ -259,7 +274,18 @@ def initSetLanguageAndCountry():
language, country = model.getLanguageAndCountry(select)
config.TARGET_LANGUAGE = language
config.TARGET_COUNTRY = country
- config.CHOICE_TRANSLATOR = model.findTranslationEngine(config.SOURCE_LANGUAGE, config.TARGET_LANGUAGE)
+
+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
@@ -268,7 +294,7 @@ def setYourLanguageAndCountry(select):
language, country = model.getLanguageAndCountry(select)
config.SOURCE_LANGUAGE = language
config.SOURCE_COUNTRY = country
- config.CHOICE_TRANSLATOR = model.findTranslationEngine(config.SOURCE_LANGUAGE, config.TARGET_LANGUAGE)
+ updateTranslationEngineAndEngineList()
view.printToTextbox_selectedYourLanguages(select)
def setTargetLanguageAndCountry(select):
@@ -278,7 +304,7 @@ def setTargetLanguageAndCountry(select):
language, country = model.getLanguageAndCountry(select)
config.TARGET_LANGUAGE = language
config.TARGET_COUNTRY = country
- config.CHOICE_TRANSLATOR = model.findTranslationEngine(config.SOURCE_LANGUAGE, config.TARGET_LANGUAGE)
+ updateTranslationEngineAndEngineList()
view.printToTextbox_selectedTargetLanguages(select)
def swapYourLanguageAndTargetLanguage():
@@ -293,18 +319,34 @@ def swapYourLanguageAndTargetLanguage():
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]
language, country = model.getLanguageAndCountry(select)
config.SOURCE_LANGUAGE = language
config.SOURCE_COUNTRY = country
+
languages = config.SELECTED_TAB_TARGET_LANGUAGES
select = languages[config.SELECTED_TAB_NO]
language, country = model.getLanguageAndCountry(select)
config.TARGET_LANGUAGE = language
config.TARGET_COUNTRY = country
- config.CHOICE_TRANSLATOR = model.findTranslationEngine(config.SOURCE_LANGUAGE, config.TARGET_LANGUAGE)
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):
@@ -437,14 +479,54 @@ def callbackSetUiLanguage(value):
view.showRestartButtonIfRequired(locale=config.UI_LANGUAGE)
def callbackSetEnableRestoreMainWindowGeometry(value):
- print("callbackSetEnableAutoClearMessageBox", value)
+ print("callbackSetEnableRestoreMainWindowGeometry", value)
config.ENABLE_RESTORE_MAIN_WINDOW_GEOMETRY = value
# Translation Tab
-def callbackSetDeeplAuthkey(value):
- print("callbackSetDeeplAuthkey", str(value))
+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.WEIGHT_TYPE = str(value)
+ view.updateSelectedCtranslate2WeightType(config.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))
if len(value) == 39:
- result = model.authenticationTranslator(choice_translator="DeepL_API", auth_key=value)
+ result = model.authenticationTranslatorDeepLAuthKey(auth_key=value)
if result is True:
key = value
view.printToTextbox_AuthenticationSuccess()
@@ -454,12 +536,11 @@ def callbackSetDeeplAuthkey(value):
auth_keys = config.AUTH_KEYS
auth_keys["DeepL_API"] = key
config.AUTH_KEYS = auth_keys
- config.CHOICE_TRANSLATOR = model.findTranslationEngine(config.SOURCE_LANGUAGE, config.TARGET_LANGUAGE)
elif len(value) == 0:
auth_keys = config.AUTH_KEYS
auth_keys["DeepL_API"] = None
config.AUTH_KEYS = auth_keys
- config.CHOICE_TRANSLATOR = model.findTranslationEngine(config.SOURCE_LANGUAGE, config.TARGET_LANGUAGE)
+ updateTranslationEngineAndEngineList()
# Transcription Tab
# Transcription (Mic)
@@ -795,21 +876,27 @@ def initSetConfigByExeArguments():
config.OSC_PORT = int(args.port)
view.setGuiVariable_OscPort(config.OSC_PORT)
-def createMainWindow():
+def createMainWindow(splash):
+ splash.toProgress(1)
# create GUI
view.createGUI()
+ splash.toProgress(2)
# init config
initSetConfigByExeArguments()
+ initSetTranslateEngine()
initSetLanguageAndCountry()
- if model.authenticationTranslator(config.CHOICE_TRANSLATOR, config.AUTH_KEYS[config.CHOICE_TRANSLATOR]) is False:
- # error update Auth key
- auth_keys = config.AUTH_KEYS
- auth_keys[config.CHOICE_TRANSLATOR] = None
- config.AUTH_KEYS = auth_keys
- view.printToTextbox_AuthenticationError()
- config.CHOICE_TRANSLATOR = model.findTranslationEngine(config.SOURCE_LANGUAGE, config.TARGET_LANGUAGE)
+ 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 word filter
model.addKeywords()
@@ -823,6 +910,8 @@ def createMainWindow():
if config.ENABLE_LOGGER is True:
model.startLogger()
+ splash.toProgress(3) # Last one.
+
# set UI and callback
view.register(
common_registers={
@@ -853,6 +942,9 @@ def createMainWindow():
"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,
@@ -875,7 +967,9 @@ def createMainWindow():
"callback_set_enable_restore_main_window_geometry": callbackSetEnableRestoreMainWindowGeometry,
# Translation Tab
- "callback_set_deepl_authkey": callbackSetDeeplAuthkey,
+ "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,
diff --git a/img/VRCT_now_downloading.png b/img/VRCT_now_downloading.png
new file mode 100644
index 00000000..5e5b9daa
Binary files /dev/null and b/img/VRCT_now_downloading.png differ
diff --git a/img/VRCT_starting_up.png b/img/VRCT_starting_up.png
new file mode 100644
index 00000000..9feac583
Binary files /dev/null and b/img/VRCT_starting_up.png differ
diff --git a/img/narrow_arrow_down_black.png b/img/narrow_arrow_down_black.png
index 21e2ea0b..e53829e5 100644
Binary files a/img/narrow_arrow_down_black.png and b/img/narrow_arrow_down_black.png differ
diff --git a/img/vrchat_chatbox_trasnlator_transcription.png b/img/vrchat_chatbox_trasnlator_transcription.png
new file mode 100644
index 00000000..9f2e401e
Binary files /dev/null and b/img/vrchat_chatbox_trasnlator_transcription.png differ
diff --git a/img/vrct_logo_mark_white_square.png b/img/vrct_logo_mark_white_square.png
new file mode 100644
index 00000000..bfb6f60d
Binary files /dev/null and b/img/vrct_logo_mark_white_square.png differ
diff --git a/install.bat b/install.bat
index d54ef800..036f6a51 100644
--- a/install.bat
+++ b/install.bat
@@ -1,4 +1,4 @@
+python.exe -m pip install --upgrade pip
pip install -r requirements.txt
pip install git+https://github.com/misyaguziya/translators
-pip install git+https://github.com/misyaguziya/deepl-translate
pip install git+https://github.com/misyaguziya/custom_speech_recognition
\ No newline at end of file
diff --git a/installer/installer.nsi b/installer/installer.nsi
index f02335ee..7d3b9a94 100644
--- a/installer/installer.nsi
+++ b/installer/installer.nsi
@@ -22,7 +22,7 @@ VIAddVersionKey "FileDescription" "Communication tool with translation & transcr
Unicode true
; アプリケーション名
-Name "VRCT Setup"
+Name "VRCT"
; 作成されるインストーラ
OutFile "VRCT_Setup.exe"
@@ -38,8 +38,8 @@ XPStyle on
; ページ
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE "..\LICENSE"
-;!insertmacro MUI_PAGE_DIRECTORY
-Page custom OptionPage OptionPageLeave
+Page custom OptionPage1 OptionPageLeave1
+Page custom OptionPage2 OptionPageLeave2
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
; アンインストーラ ページ
@@ -60,17 +60,27 @@ Var Checkbox_InstallShortcut
Var Dialog_Options
Var InstallDocs
Var InstallShortcut
-Var Label_DescriptionOptions
+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 $InstallDocs ${BST_CHECKED}
StrCpy $InstallShortcut ${BST_CHECKED}
+ StrCpy $DropList_Language "English"
+ StrCpy $DownloadWeight ${BST_CHECKED}
FunctionEnd
-; オプション ページ
-Function OptionPage
+; オプション ページ 1
+Function OptionPage1
+ !insertmacro MUI_HEADER_TEXT "オプション (Options)" "オプションを設定してください。 (Please set the options.)"
; nsDialogsを作成します。
nsDialogs::Create 1018
; 作成されたnsDialogsを変数に代入します。
@@ -81,15 +91,10 @@ Function OptionPage
Abort
${EndIf}
- ; ラベルを作成します。
- ${NSD_CreateLabel} 0 0 100% 12u "オプションを選択してください。"
- ; ラベルを変数に代入します。
- Pop $Label_DescriptionOptions
-
- ${NSD_CreateCheckbox} 0 13u 100% 12u "ドキュメントをインストールする(&D)"
+ ${NSD_CreateCheckbox} 0 0u 100% 12u "ドキュメントをインストールする (Install documents)"
Pop $Checkbox_InstallDocs
- ${NSD_CreateCheckbox} 0 26u 100% 12u "デスクトップにショートカットを作成(&D)"
+ ${NSD_CreateCheckbox} 0 13u 100% 12u "デスクトップにショートカットを作成 (Install shortcut on desktop)"
Pop $Checkbox_InstallShortcut
${If} $InstallDocs == ${BST_CHECKED}
@@ -103,12 +108,68 @@ Function OptionPage
nsDialogs::Show
FunctionEnd
-; オプション ページ退出コールバック
-Function OptionPageLeave
+; オプション ページ 1 退出コールバック
+Function OptionPageLeave1
${NSD_GetState} $Checkbox_InstallDocs $InstallDocs
${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
@@ -150,6 +211,26 @@ Section
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"
diff --git a/locales.yml b/locales.yml
index f4b80300..3261f636 100644
--- a/locales.yml
+++ b/locales.yml
@@ -55,7 +55,7 @@ en:
# tab Parameter
label_ip_address: "OSC IP address"
label_port: "OSC Port"
- label_authkey: "DeepL Auth Key"
+ label_auth_key: "DeepL Auth Key"
label_message_format: "Message Format"
# tab Others
@@ -121,7 +121,7 @@ ja:
# tab Parameter
# label_ip_address: ""
# label_port: ""
- # label_authkey: ""
+ # label_auth_key: ""
label_message_format: "送信するメッセージのフォーマット"
# tab Others
@@ -186,7 +186,7 @@ ko:
# tab Parameter
label_ip_address: "OSC IP 주소"
label_port: "OSC 포트"
- label_authkey: "DeepL 인증키"
+ label_auth_key: "DeepL 인증키"
label_message_format: "전송 형식"
# tab Others
diff --git a/locales/en.yml b/locales/en.yml
index 2cad19ef..2806ea91 100644
--- a/locales/en.yml
+++ b/locales/en.yml
@@ -6,9 +6,11 @@ main_window:
language_settings: Language Settings
your_language: Your Language
- both_direction_desc: Translate Each Other
+ 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
@@ -30,7 +32,7 @@ main_window:
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 disabled the translation feature. Access has been temporarily restricted due to an excessive number of requests to the translation engine. Please wait for a while, restart VRCT, and try again.
+ 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.
@@ -57,10 +59,6 @@ main_window:
accept_adjust_ui_size: "Set it smaller and restart"
- translation_engine_limit_error: "It has automatically disabled the translation feature.\nAccess has been temporarily restricted\ndue to an excessive number of requests to the translation engine.\nPlease wait for a while, restart VRCT, and try again."
- accept_translation_engine_limit_error: Accept and close
-
-
selectable_language_window:
title_your_language: Select Your Language
title_target_language: Select Target Language
@@ -82,8 +80,8 @@ config_window:
transcription_mic: Mic
transcription_speaker: Speaker
others: Others
- others_send_message_formats: Message Formats(Send)
- others_received_message_formats: Message Formats(Received)
+ others_send_message_formats: Message Formats (Send)
+ others_received_message_formats: Message Formats (Received)
others_speaker2chatbox: Speaker2Chatbox
advanced_settings: Advanced Settings
@@ -117,8 +115,19 @@ config_window:
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.
mic_host:
label: Mic Host/Driver
@@ -211,7 +220,7 @@ config_window:
error_message: "The characters '[message]' cannot be used."
send_message_format_with_t:
- label: Message Format(With translation)
+ 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: "The characters '[message]' and '[translation]' cannot be used."
@@ -223,7 +232,7 @@ config_window:
error_message: "The characters '[message]' cannot be used."
received_message_format_with_t:
- label: Message Format(With translation)
+ label: Message Format (With translation)
desc: It will be used in Notification XSOverlay too.
example_text: This is an example sentence. Fonts, line breaks, etc. may differ from the actual display.
error_message: "The characters '[message]' and '[translation]' cannot be used."
diff --git a/locales/ja.yml b/locales/ja.yml
index eb937747..6bedafbd 100644
--- a/locales/ja.yml
+++ b/locales/ja.yml
@@ -6,9 +6,11 @@ main_window:
language_settings: 言語設定
your_language: あなたの言語
- both_direction_desc: 双方向に翻訳
+ translate_each_other_label: 双方向に翻訳
swap_button_label: 言語を入れ替え
target_language: 相手の言語
+ translator: 翻訳エンジン
+ translator_ctranslate2: オフライン翻訳 (Default)
textbox_tab_all: 全て
textbox_tab_sent: 送信
@@ -30,7 +32,7 @@ main_window:
no_mic_device_detected_error: マイクデバイスが検出されませんでした。
no_speaker_device_detected_error: スピーカーデバイスが検出されませんでした。
- translation_engine_limit_error: 翻訳機能を自動的に停止しました。翻訳エンジンへのリクエストが多すぎるため、一時的にアクセスが制限されています。しばらく待ってから、VRCTの再起動をしてもう一度試してみてください。
+ translation_engine_limit_error: 翻訳エンジンを自動的に変更しました。対象翻訳エンジンへのリクエストが多すぎるため、一時的にアクセスが制限されています。同じ翻訳エンジンを使用したい場合はしばらく待ってから、VRCTの再起動をしてもう一度試してみてください。
detected_by_word_filter: ワードフィルターに登録されている単語 %{detected_message} が検出されたため送信しませんでした。
@@ -40,7 +42,7 @@ main_window:
latest_language_setting: 現在「あなたの言語」は %{your_language}、「相手の言語」は %{target_language} に設定されています。
opened_web_page_booth: お使いのブラウザで、Boothのページを開きました。
- opened_web_page_vrct_documents: "お使いのブラウザで、VRCTのドキュメントを開きました。使用方法などはそちらに記載されています。\n不具合、ご要望、その他お問い合わせはドキュメント最下部にあるLinks、「お問合せフォーム」もしくはX(元Twitter)にて気軽にご連絡ください!"
+ opened_web_page_vrct_documents: "お使いのブラウザで、VRCTのドキュメントを開きました。使用方法などはそちらに記載されています。\n不具合、ご要望、その他お問い合わせはドキュメント最下部にあるLinks、「お問合せフォーム」もしくはX (元Twitter) にて気軽にご連絡ください!"
update_available: 新しいバージョンが出ました!
@@ -57,10 +59,6 @@ main_window:
accept_adjust_ui_size: 小さく設定して再起動
- translation_engine_limit_error: "翻訳機能を自動的に停止しました。\n翻訳エンジンへのリクエストが多すぎるため\n一時的にアクセスが制限されています。\nしばらく待ってから、VRCTの再起動をしてもう一度試してみてください。"
- accept_translation_engine_limit_error: 了承して閉じる
-
-
selectable_language_window:
title_your_language: あなたの言語
title_target_language: 相手の言語
@@ -114,8 +112,19 @@ config_window:
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※対応していない言語もあります。"
mic_host:
label: マイク(ホスト/ドライバー)
@@ -190,7 +199,7 @@ config_window:
notice_xsoverlay:
label: XSOverlayでの通知受け取り機能を有効 (VR限定)
- desc: 文字起こし(受信)されたメッセージをXSOverlayの機能を使って通知として受け取れます。
+ desc: 文字起こし (受信) されたメッセージをXSOverlayの機能を使って通知として受け取れます。
auto_export_message_logs:
label: 会話ログを自動的に保存する
diff --git a/locales/ko.yml b/locales/ko.yml
index 692abd2c..d27438b1 100644
--- a/locales/ko.yml
+++ b/locales/ko.yml
@@ -6,9 +6,11 @@ main_window:
language_settings: 언어 설정
your_language: 당신의 언어
- both_direction_desc: 양방향으로 번역
+ translate_each_other_label: 양방향으로 번역
swap_button_label: 언어 교체
target_language: 상대방의 언어
+ translator: 번역 엔진
+ translator_ctranslate2: 오프라인 번역 (기본값)
textbox_tab_all: 전체
textbox_tab_sent: 전송
@@ -30,7 +32,7 @@ main_window:
no_mic_device_detected_error: 마이크 디바이스를 찾지 못했습니다.
no_speaker_device_detected_error: 스피커 디바이스를 찾지 못했습니다.
- translation_engine_limit_error: 번역 기능이 자동으로 중지되었습니다. 번역 엔진에 대한 요청이 너무 많아 일시적으로 사용이 제한되고 있습니다. 잠시 기다렸다가 VRCT를 재부팅하고 다시 시도해 보세요.
+ translation_engine_limit_error: 번역 엔진을 자동으로 변경했습니다. 대상 번역 엔진에 대한 요청이 너무 많아 일시적으로 접근이 제한되었습니다. 해당 번역 엔진을 사용하려면 잠시 기다린 후 VRCT를 재부팅하여 다시 시도해 보시기 바랍니다
detected_by_word_filter: 단어 필터에 등록된 단어 %{detected_message}(이)가 감지되어 전송하지 않았습니다.
@@ -57,10 +59,6 @@ main_window:
accept_adjust_ui_size: "작게 줄이고 재부팅"
- translation_engine_limit_error: "번역 기능이 자동으로 중지되었습니다. \n번역 엔진에 대한 요청이 너무 많아 \n일시적으로 사용이 제한되었습니다. \n잠시 기다렸다가 VRCT를 재부팅한 후 다시 시도해 보십시오."
- accept_translation_engine_limit_error: 확인하고 닫기
-
-
selectable_language_window:
title_your_language: 당신의 언어
title_target_language: 상대방의 언어
@@ -117,11 +115,22 @@ config_window:
label: 메인 화면 위치 기억
desc: 시작 시 이전 화면의 위치와 크기를 복원합니다.
+ use_translation_feature:
+ label: 번역 기능 사용
+ desc: "번역 기능이 꺼져 있는 동안에는 번역을 하지 않는 대신 VRCT가 조금 더 빠르게 실행됩니다. \n 번역 기능이 필요하지 않고 VRCT를 채팅 전송 및 음성 인식 도구로만 사용하는 사용자를 위한 기능입니다."
+
+ ctranslate2_weight_type:
+ label: 번역 모델
+ desc: "오프라인 번역 시의 번역 모델을 변경합니다."
+ small: "일반 모델 (%{capacity})"
+ large: "정밀 모델 (%{capacity})"
+
deepl_auth_key:
label: DeepL 인증키
mic_host:
label: 마이크 호스트/드라이버
+ # desc:
mic_device:
label: 마이크 장치
diff --git a/main.py b/main.py
index def1cb0b..4810cbe5 100644
--- a/main.py
+++ b/main.py
@@ -7,8 +7,14 @@ if __name__ == "__main__":
splash = SplashWindow()
splash.showSplash()
+ from config import config
+ from models.translation.utils import downloadCTranslate2Weight
+ if config.USE_TRANSLATION_FEATURE is True:
+ downloadCTranslate2Weight(config.PATH_LOCAL, config.WEIGHT_TYPE, splash.updateDownloadProgress)
+
+ splash.toProgress(0)
import controller
- controller.createMainWindow()
+ controller.createMainWindow(splash)
splash.destroySplash()
controller.showMainWindow()
diff --git a/model.py b/model.py
index 5fbb5825..8580e85d 100644
--- a/model.py
+++ b/model.py
@@ -22,8 +22,9 @@ from models.transcription.transcription_recorder import SelectedMicRecorder, Sel
from models.transcription.transcription_recorder import SelectedMicEnergyRecorder, SelectedSpeakeEnergyRecorder
from models.transcription.transcription_transcriber import AudioTranscriber
from models.xsoverlay.notification import xsoverlayForVRCT
-from models.translation.translation_languages import translatorEngine, translation_lang
+from models.translation.translation_languages import translation_lang
from models.transcription.transcription_languages import transcription_lang
+from models.translation.utils import checkCTranslate2Weight
from config import config
class threadFnc(Thread):
@@ -45,15 +46,6 @@ class threadFnc(Thread):
self.fnc(*self._args, **self._kwargs)
class Model:
- # Languages available for both transcription and translation
- SUPPORTED_LANGUAGES = [
- 'Afrikaans', 'Arabic', 'Basque', 'Bulgarian', 'Catalan', 'Chinese', 'Croatian',
- 'Czech', 'Danish', 'Dutch', 'English', 'Filipino', 'Finnish', 'French', 'German',
- 'Greek', 'Hebrew', 'Hindi', 'Hungarian', 'Indonesian', 'Italian', 'Japanese',
- 'Korean', 'Lithuanian', 'Malay', 'Norwegian', 'Polish', 'Portuguese', 'Romanian',
- 'Russian', 'Serbian', 'Slovak', 'Slovenian', 'Spanish', 'Swedish', 'Thai', 'Turkish',
- 'Ukrainian', 'Vietnamese'
- ]
_instance = None
def __new__(cls):
@@ -73,23 +65,22 @@ class Model:
self.speaker_energy_recorder = None
self.speaker_energy_plot_progressbar = None
self.translator = Translator()
+ if config.USE_TRANSLATION_FEATURE is True:
+ self.translator.changeCTranslate2Model(config.PATH_LOCAL, config.WEIGHT_TYPE)
self.keyword_processor = KeywordProcessor()
- def resetTranslator(self):
- del self.translator
- self.translator = Translator()
+ def checkCTranslatorCTranslate2ModelWeight(self):
+ return checkCTranslate2Weight(config.PATH_LOCAL, config.WEIGHT_TYPE)
+
+ def changeTranslatorCTranslate2Model(self):
+ self.translator.changeCTranslate2Model(config.PATH_LOCAL, config.WEIGHT_TYPE)
def resetKeywordProcessor(self):
del self.keyword_processor
self.keyword_processor = KeywordProcessor()
- def authenticationTranslator(self, choice_translator=None, auth_key=None):
- if choice_translator is None:
- choice_translator = config.CHOICE_TRANSLATOR
- if auth_key is None:
- auth_key = config.AUTH_KEYS[choice_translator]
-
- result = self.translator.authentication(choice_translator, auth_key)
+ def authenticationTranslatorDeepLAuthKey(self, auth_key):
+ result = self.translator.authenticationDeepLAuthKey(auth_key)
return result
def startLogger(self):
@@ -108,13 +99,21 @@ class Model:
self.logger.disabled = True
self.logger = None
- @staticmethod
- def getListLanguageAndCountry():
+ def getListLanguageAndCountry(self):
+ transcription_langs = list(transcription_lang.keys())
+ tl_keys = translation_lang.keys()
+ translation_langs = []
+ for tl_key in tl_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))
+
langs = []
- for lang in model.SUPPORTED_LANGUAGES:
+ for lang in supported_langs:
for country in transcription_lang[lang]:
langs.append(f"{lang}\n({country})")
- return langs
+ return sorted(langs)
@staticmethod
def getLanguageAndCountry(select):
@@ -123,84 +122,70 @@ class Model:
country = parts[1][1:-1]
return language, country
- def findTranslationEngine(self, source_lang, target_lang):
+ def findTranslationEngines(self, source_lang, target_lang):
compatible_engines = []
- for engine in translatorEngine:
- source_languages = translation_lang.get(engine, {}).get("source", {})
- target_languages = translation_lang.get(engine, {}).get("target", {})
- if source_lang in source_languages and target_lang in target_languages:
+ 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)
- engine_name = compatible_engines[0]
-
- if engine_name == "DeepL" and config.AUTH_KEYS["DeepL_API"] is not None:
- if self.authenticationTranslator(engine_name, config.AUTH_KEYS["DeepL_API"]) is True:
- engine_name = "DeepL_API"
- elif engine_name == "DeepL_API" and config.AUTH_KEYS["DeepL_API"] is None:
- engine_name = "DeepL"
-
- return engine_name
+ if "DeepL_API" in compatible_engines:
+ if config.AUTH_KEYS["DeepL_API"] is None:
+ compatible_engines.remove('DeepL_API')
+ return compatible_engines
def getInputTranslate(self, message):
- translator_name=config.CHOICE_TRANSLATOR
+ translation_success_flag = True
+ translator_name=config.CHOICE_INPUT_TRANSLATOR
source_language=config.SOURCE_LANGUAGE
target_language=config.TARGET_LANGUAGE
target_country = config.TARGET_COUNTRY
- if translator_name == "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"
- elif translator_name == "DeepL":
- if target_language in ["English American", "English British"]:
- target_language = "English"
- elif target_language in ["Portuguese European", "Portuguese Brazilian"]:
- target_language = "Portuguese"
-
translation = self.translator.translate(
translator_name=translator_name,
source_language=source_language,
target_language=target_language,
+ target_country=target_country,
message=message
)
- return translation
+
+ # 翻訳失敗時のフェールセーフ処理
+ if translation is False:
+ translation_success_flag = False
+ translation = self.translator.translate(
+ translator_name="CTranslate2",
+ source_language=source_language,
+ target_language=target_language,
+ target_country=target_country,
+ message=message
+ )
+ return translation, translation_success_flag
def getOutputTranslate(self, message):
- translator_name=config.CHOICE_TRANSLATOR
+ translation_success_flag = True
+ translator_name=config.CHOICE_OUTPUT_TRANSLATOR
source_language=config.TARGET_LANGUAGE
target_language=config.SOURCE_LANGUAGE
- target_country = config.SOURCE_COUNTRY
-
- if translator_name == "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"
- elif translator_name == "DeepL":
- if target_language in ["English American", "English British"]:
- target_language = "English"
- elif target_language in ["Portuguese European", "Portuguese Brazilian"]:
- target_language = "Portuguese"
+ target_country=config.SOURCE_COUNTRY
translation = self.translator.translate(
translator_name=translator_name,
source_language=source_language,
target_language=target_language,
+ target_country=target_country,
message=message
)
- return translation
+
+ # 翻訳失敗時のフェールセーフ処理
+ if translation is False:
+ translation_success_flag = False
+ translation = self.translator.translate(
+ translator_name="CTranslate2",
+ source_language=source_language,
+ target_language=target_language,
+ target_country=target_country,
+ message=message
+ )
+ return translation, translation_success_flag
def addKeywords(self):
for f in config.INPUT_MIC_WORD_FILTER:
@@ -273,7 +258,7 @@ class Model:
folder_name = '_internal'
tmp_directory_name = 'tmp'
batch_name = 'update.bat'
- current_directory = config.LOCAL_PATH
+ current_directory = config.PATH_LOCAL
try:
res = requests_get(config.GITHUB_URL)
@@ -306,7 +291,7 @@ class Model:
program_name = 'VRCT.exe'
folder_name = '_internal'
batch_name = 'restart.bat'
- current_directory = config.LOCAL_PATH
+ 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)
@@ -492,4 +477,4 @@ class Model:
def notificationXSOverlay(self, message):
xsoverlayForVRCT(content=f"{message}")
-model = Model()
+model = Model()
\ No newline at end of file
diff --git a/models/translation/translation_languages.py b/models/translation/translation_languages.py
index ae57d4cc..44051f8a 100644
--- a/models/translation/translation_languages.py
+++ b/models/translation/translation_languages.py
@@ -1,35 +1,40 @@
-translatorEngine = ["DeepL", "DeepL_API", "Google", "Bing"]
translation_lang = {}
dict_deepl_languages = {
- "Japanese":"JA",
- "English":"EN",
- "Korean":"KO",
- "Bulgarian":"BG",
- "Chinese":"ZH",
- "Czech":"CS",
- "Danish":"DA",
- "Dutch":"NL",
- "Estonian":"ET",
- "Finnish":"FI",
- "French":"FR",
- "German":"DE",
- "Greek":"EL",
- "Hungarian":"HU",
- "Italian":"IT",
- "Latvian":"LV",
- "Lithuanian":"LT",
- "Polish":"PL",
- "Portuguese":"PT",
- "Romanian":"RO",
- "Russian":"RU",
- "Slovak":"SK",
- "Slovenian":"SL",
- "Spanish":"ES",
- "Swedish":"SV",
- "Indonesian":"ID",
- "Ukrainian":"UK",
- "Turkish":"TR",
- "Norwegian":"NB",
+ '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':'zh',
}
translation_lang["DeepL"] = {
"source":dict_deepl_languages,
@@ -240,4 +245,133 @@ dict_bing_languages = {
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':'zh-CN',
+}
+
+translation_lang["Papago"] = {
+ "source":dict_papago_languages,
+ "target":dict_papago_languages,
+}
+
+dict_ctranslate2_languages = {
+ 'English': 'en',
+ 'Chinese': '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
index c3a5682b..fbe6cf3f 100644
--- a/models/translation/translation_translator.py
+++ b/models/translation/translation_translator.py
@@ -1,43 +1,75 @@
+import os
from deepl import Translator as deepl_Translator
-from deepl_translate import translate as deepl_web_Translator
from translators import translate_text as other_web_Translator
from .translation_languages import translation_lang
+from .utils import ctranslate2_weights
+
+import ctranslate2
+import transformers
# Translator
class Translator():
def __init__(self):
- pass
- self.translator_status = {}
+ self.deepl_client = None
+ self.ctranslate2_translator = None
+ self.ctranslate2_tokenizer = None
- def authentication(self, translator_name, authkey=None):
+ def authenticationDeepLAuthKey(self, authkey):
result = True
- match translator_name:
- case "DeepL_API":
- try:
- self.deepl_client = deepl_Translator(authkey)
- self.deepl_client.translate_text(" ", target_lang="EN-US")
- except Exception:
- result = False
+ 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 translate(self, translator_name, source_language, target_language, message):
+ def changeCTranslate2Model(self, path, model_type):
+ directory_name = ctranslate2_weights[model_type]["directory_name"]
+ tokenizer = ctranslate2_weights[model_type]["tokenizer"]
+ weight_path = os.path.join(path, "weight", directory_name)
+ self.ctranslate2_translator = ctranslate2.Translator(
+ weight_path,
+ device="cpu",
+ device_index=0,
+ compute_type="int8",
+ inter_threads=1,
+ intra_threads=4
+ )
+ self.ctranslate2_tokenizer = transformers.AutoTokenizer.from_pretrained(tokenizer)
+
+ def translate(self, translator_name, source_language, target_language, target_country, message):
try:
result = ""
source_language=translation_lang[translator_name]["source"][source_language]
target_language=translation_lang[translator_name]["target"][target_language]
match translator_name:
case "DeepL":
- result = deepl_web_Translator(
- source_language=source_language,
- target_language=target_language,
- text=message
+ result = other_web_Translator(
+ query_text=message,
+ translator="deepl",
+ from_language=source_language,
+ to_language=target_language,
)
case "DeepL_API":
- result = self.deepl_client.translate_text(
- message,
- source_lang=source_language,
- target_lang=target_language,
- ).text
+ if self.deepl_client is None:
+ result = False
+ else:
+ 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"
+ 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,
@@ -52,6 +84,20 @@ class Translator():
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":
+ 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:
import traceback
with open('error.log', 'a') as f:
diff --git a/models/translation/utils.py b/models/translation/utils.py
new file mode 100644
index 00000000..d47401cf
--- /dev/null
+++ b/models/translation/utils.py
@@ -0,0 +1,86 @@
+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://bit.ly/33fM1AO",
+ "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://bit.ly/3GYiaed",
+ "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"):
+ directory_name = 'weight'
+ current_directory = path
+ 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(current_directory, directory_name, 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(current_directory, directory_name, weight_directory_name, file))
+ if original_hash != current_hash:
+ break
+ already_downloaded = True
+ return already_downloaded
+
+def downloadCTranslate2Weight(path, weight_type="Small", func=None):
+ url = ctranslate2_weights[weight_type]["url"]
+ filename = 'weight.zip'
+ directory_name = 'weight'
+ current_directory = path
+
+ if checkCTranslate2Weight(path, weight_type):
+ return
+
+ try:
+ os_makedirs(os_path.join(current_directory, directory_name), exist_ok=True)
+ print(os_path.join(current_directory, directory_name))
+ 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(os_path.join(current_directory, directory_name))
+ except Exception as e:
+ print("error:downloadCTranslate2Weight()", e)
\ No newline at end of file
diff --git a/requirements.txt b/requirements.txt
index bff366c5..b6e14d85 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -7,4 +7,7 @@ flashtext == 2.7
pyyaml == 6.0.1
python-i18n == 0.3.9
CTkToolTip == 0.8
-pyinstaller==6.2.0
\ No newline at end of file
+pyinstaller==6.2.0
+transformers[torch]
+sentencepiece==0.1.99
+ctranslate2==3.21.0
\ No newline at end of file
diff --git a/view.py b/view.py
index 546ab972..34711688 100644
--- a/view.py
+++ b/view.py
@@ -28,6 +28,7 @@ class View():
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,
)
if config.ENABLE_SPEAKER2CHATBOX is False:
@@ -35,6 +36,8 @@ class View():
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)
@@ -87,6 +90,12 @@ class View():
**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_RESTART_SOFTWARE=None,
@@ -153,9 +162,10 @@ class View():
IS_OPENED_SELECTABLE_YOUR_LANGUAGE_WINDOW=False,
CALLBACK_SELECTED_YOUR_LANGUAGE=None,
- VAR_LABEL_BOTH_DIRECTION_DESC=StringVar(value=i18n.t("main_window.both_direction_desc")),
- VAR_LABEL_BOTH_DIRECTION_SWAP_BUTTON=StringVar(value=i18n.t("main_window.swap_button_label")),
+ 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})"),
@@ -163,6 +173,8 @@ class View():
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")),
@@ -259,8 +271,24 @@ class View():
VAR_ENABLE_RESTORE_MAIN_WINDOW_GEOMETRY=BooleanVar(value=config.ENABLE_RESTORE_MAIN_WINDOW_GEOMETRY),
# Translation Tab
- VAR_LABEL_DEEPL_AUTH_KEY=StringVar(value=i18n.t("config_window.deepl_auth_key.label")),
- VAR_DESC_DEEPL_AUTH_KEY=None,
+ 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.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"]),
@@ -515,6 +543,7 @@ class View():
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:
@@ -567,7 +596,9 @@ class View():
# Translation Tab
- self.view_variable.CALLBACK_SET_DEEPL_AUTHKEY = config_window_registers.get("callback_set_deepl_authkey", None)
+ 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)
@@ -624,6 +655,13 @@ class View():
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.CHOICE_MIC_HOST == "NoHost":
self.view_variable.VAR_MIC_HOST.set("No Mic Host Detected")
@@ -841,6 +879,47 @@ class View():
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()
+
+
# Open Webpage Functions
def openWebPage_Booth(self):
self.openWebPage(config.BOOTH_URL)
@@ -879,6 +958,9 @@ class View():
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
@@ -899,6 +981,15 @@ class View():
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,
+ )
+
# Config Window
def enableConfigWindowCompactMode(self):
@@ -911,13 +1002,19 @@ class View():
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
+ 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
)
if locale is None:
@@ -946,6 +1043,44 @@ class View():
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.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 openMicEnergyThresholdWidget(self):
self.view_variable.VAR_LABEL_MIC_DYNAMIC_ENERGY_THRESHOLD.set(i18n.t("config_window.mic_dynamic_energy_threshold.label_for_manual"))
@@ -1123,7 +1258,7 @@ class View():
self._clearEntryBox(vrct_gui.config_window.sb__entry_mic_word_filter_list)
-# Widget Control (Whole)
+# Widget Control
def foregroundOnIfForegroundEnabled(self):
if config.ENABLE_FOREGROUND:
self.foregroundOn()
@@ -1181,6 +1316,19 @@ class View():
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("%",""))
@@ -1195,21 +1343,6 @@ class View():
- def translationEngineLimitErrorProcess(self):
- # turn off translation switch.
- vrct_gui.translation_switch_box.deselect()
- vrct_gui.translation_frame.markToggleManually(False)
-
- # disable translation feature.
- vrct_gui._changeMainWindowWidgetsStatus("disabled", ["translation_switch"], to_hold_state=True)
-
- # print system message that mention to stopped translation feature.
- view.printToTextbox_TranslationEngineLimitError()
- view.showTheLimitOfTranslationEngineConfirmationModal()
-
-
-
-
# Show Modal
def _showDisplayOverUiSizeConfirmationModal(self):
self.foregroundOffIfForegroundEnabled()
@@ -1247,23 +1380,6 @@ class View():
-
- def showTheLimitOfTranslationEngineConfirmationModal(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._hideInformationModal
- self.view_variable.CALLBACK_ACCEPTED_CONFIRMATION_MODAL=self._hideInformationModal
-
- self.view_variable.VAR_MESSAGE_CONFIRMATION_MODAL.set(i18n.t("main_window.confirmation_message.translation_engine_limit_error"))
- self.view_variable.VAR_LABEL_CONFIRMATION_MODAL_ACCEPT_BUTTON.set(i18n.t("main_window.confirmation_message.accept_translation_engine_limit_error"))
- vrct_gui.information_modal.show(hide_title_bar=False, close_when_focusout=False)
-
-
-
-
# Hide Modal
def _hideInformationModal(self):
vrct_gui.information_modal.hide()
@@ -1332,6 +1448,13 @@ class View():
# 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))
@@ -1449,9 +1572,6 @@ class View():
self._printToTextbox_Info(i18n.t("main_window.textbox_system_message.translation_engine_limit_error"))
- # def printToTextbox_OSCError(self): [Deprecated]
- # self._printToTextbox_Info("OSC is not enabled, please enable OSC and rejoin. or turn off the \"Send Message To VRChat\" setting")
-
def printToTextbox_DetectedByWordFilter(self, detected_message):
self._printToTextbox_Info(i18n.t("main_window.textbox_system_message.detected_by_word_filter", detected_message=detected_message))
diff --git a/vrct_gui/_CreateDropdownMenuWindow.py b/vrct_gui/_CreateDropdownMenuWindow.py
index 0eade683..d6853b35 100644
--- a/vrct_gui/_CreateDropdownMenuWindow.py
+++ b/vrct_gui/_CreateDropdownMenuWindow.py
@@ -1,9 +1,10 @@
+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, CustomizedCTkScrollableFrame
+from .ui_utils import bindButtonReleaseFunction, bindEnterAndLeaveColor, bindButtonPressColor, getLatestHeight, applyUiScalingAndFixTheBugScrollBar, getLatestWidth, getLongestText, getLongestText_Dict, CustomizedCTkScrollableFrame
from functools import partial
from utils import isEven, makeEven
@@ -90,7 +91,7 @@ class _CreateDropdownMenuWindow(CTkToplevel):
- def updateDropdownMenuValues(self, dropdown_menu_widget_id, dropdown_menu_values):
+ 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,
@@ -105,7 +106,7 @@ class _CreateDropdownMenuWindow(CTkToplevel):
)
- def createDropdownMenuBox(self, dropdown_menu_widget_id, dropdown_menu_values, command, wrapper_widget, attach_widget, dropdown_menu_min_width=None, dropdown_menu_height=None, max_display_length=None):
+ 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
@@ -166,9 +167,12 @@ class _CreateDropdownMenuWindow(CTkToplevel):
self.dropdown_menu_container.grid_remove()
- def _createDropdownMenuValues(self, dropdown_menu_widget_id, dropdown_menu_values, command):
+ 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)
- longest_text = getLongestText(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)
@@ -220,19 +224,31 @@ class _CreateDropdownMenuWindow(CTkToplevel):
- row=0
- for dropdown_menu_value in dropdown_menu_values:
+ 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=dropdown_menu_value_text,
height=0,
corner_radius=0,
font=CTkFont(family=self.settings.FONT_FAMILY, size=self.value_font_size, weight="normal"),
@@ -252,7 +268,11 @@ class _CreateDropdownMenuWindow(CTkToplevel):
command(value)
self._withdraw()
- callback = partial(optimizedCommand, dropdown_menu_value)
+ 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
@@ -267,7 +287,10 @@ class _CreateDropdownMenuWindow(CTkToplevel):
if self.active_dropdown_menu_widget is not None:
- self.active_dropdown_menu_widget.grid_remove()
+ 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
@@ -303,9 +326,18 @@ class _CreateDropdownMenuWindow(CTkToplevel):
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.attach_widget.winfo_toplevel().unbind("", self.BIND_BUTTON_1_FUNC_ID)
+ 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
diff --git a/vrct_gui/_changeConfigWindowWidgetsStatus.py b/vrct_gui/_changeConfigWindowWidgetsStatus.py
index b9b0f9d8..02dddd42 100644
--- a/vrct_gui/_changeConfigWindowWidgetsStatus.py
+++ b/vrct_gui/_changeConfigWindowWidgetsStatus.py
@@ -10,37 +10,75 @@ def _changeConfigWindowWidgetsStatus(config_window, settings, view_variable, sta
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):
- disableLabelsWidgets(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_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)
- config_window.sb__checkbox_enable_send_received_message_to_vrc.configure(
+ target_widget.checkbox.configure(
state="disabled",
border_color=settings.ctm.SB__CHECKBOX_BORDER_DISABLED_COLOR
)
diff --git a/vrct_gui/_changeMainWindowWidgetsStatus.py b/vrct_gui/_changeMainWindowWidgetsStatus.py
index 95fc38dc..3b6eaf74 100644
--- a/vrct_gui/_changeMainWindowWidgetsStatus.py
+++ b/vrct_gui/_changeMainWindowWidgetsStatus.py
@@ -1,12 +1,16 @@
from customtkinter import CTkImage
-hold_state_list=[]
-def _changeMainWindowWidgetsStatus(vrct_gui, settings, view_variable, status, target_names:list, to_hold_state:bool=False):
- global hold_state_list
+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 hold_state_list:
+ for item in lock_state_list:
if item in target_names:
target_names.remove(item)
@@ -24,13 +28,13 @@ def _changeMainWindowWidgetsStatus(vrct_gui, settings, view_variable, status, ta
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)
+ 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)
+ 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
@@ -158,9 +162,9 @@ def _changeMainWindowWidgetsStatus(vrct_gui, settings, view_variable, status, ta
raise ValueError(f"No matching case for target_name: {target_name}")
- if to_hold_state is True:
+ if to_lock_state is True:
for item in target_names:
- if item not in hold_state_list:
- hold_state_list.append(item)
+ 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/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/_SettingBoxGenerator.py b/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/_SettingBoxGenerator.py
index 7d44a2bb..ade6913a 100644
--- a/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/_SettingBoxGenerator.py
+++ b/vrct_gui/config_window/widgets/createSideMenuAndSettingsBoxContainers/setting_box_containers/_SettingBoxGenerator.py
@@ -210,6 +210,8 @@ class _SettingBoxGenerator():
)
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
@@ -245,6 +247,8 @@ class _SettingBoxGenerator():
)
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
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
index bb305ecf..330adc6e 100644
--- 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
@@ -8,13 +8,13 @@ def createSettingBox_AdvancedSettings(setting_box_wrapper, config_window, settin
createSettingBoxButtonWithImage = sbg.createSettingBoxButtonWithImage
- def entry_ip_address_callback(value):
+ def entryIpAddressCallback(value):
callFunctionIfCallable(view_variable.CALLBACK_SET_OSC_IP_ADDRESS, value)
- def entry_port_callback(value):
+ def entryPortCallback(value):
callFunctionIfCallable(view_variable.CALLBACK_SET_OSC_PORT, value)
- def open_config_filepath_callback():
+ def openConfigFilepathCallback():
callFunctionIfCallable(view_variable.CALLBACK_OPEN_FILEPATH_CONFIG_FILE)
row=0
@@ -23,7 +23,7 @@ def createSettingBox_AdvancedSettings(setting_box_wrapper, config_window, settin
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: entry_ip_address_callback(value),
+ entry_bind__Any_KeyRelease=lambda value: entryIpAddressCallback(value),
entry_textvariable=view_variable.VAR_OSC_IP_ADDRESS,
)
config_window.sb__ip_address.grid(row=row)
@@ -35,7 +35,7 @@ def createSettingBox_AdvancedSettings(setting_box_wrapper, config_window, settin
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: entry_port_callback(value),
+ entry_bind__Any_KeyRelease=lambda value: entryPortCallback(value),
entry_textvariable=view_variable.VAR_OSC_PORT,
)
config_window.sb__port.grid(row=row)
@@ -45,7 +45,7 @@ def createSettingBox_AdvancedSettings(setting_box_wrapper, config_window, settin
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: open_config_filepath_callback(),
+ button_command=lambda _e: openConfigFilepathCallback(),
button_image=settings.image_file.FOLDER_OPEN_ICON,
)
config_window.sb__open_config_filepath.grid(row=row, pady=0)
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
index 615c0e4e..8eecc9c5 100644
--- 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
@@ -8,30 +8,29 @@ def createSettingBox_Appearance(setting_box_wrapper, config_window, settings, vi
createSettingBoxSlider = sbg.createSettingBoxSlider
createSettingBoxCheckbox = sbg.createSettingBoxCheckbox
- # 関数名は変えるかもしれない。
- # テーマ変更、フォント変更時、 Widget再生成か再起動かは検討中
- def slider_transparency_callback(value):
+
+ def sliderTransparencyCallback(value):
callFunctionIfCallable(view_variable.CALLBACK_SET_TRANSPARENCY, value)
- def optionmenu_appearance_theme_callback(value):
+ def optionmenuAppearanceThemeCallback(value):
callFunctionIfCallable(view_variable.CALLBACK_SET_APPEARANCE, value)
- def optionmenu_ui_scaling_callback(value):
+ def optionmenuUiScalingCallback(value):
callFunctionIfCallable(view_variable.CALLBACK_SET_UI_SCALING, value)
- def slider_text_box_ui_scaling_callback(value):
+ def sliderTextBoxUiScalingCallback(value):
callFunctionIfCallable(view_variable.CALLBACK_SET_TEXTBOX_UI_SCALING, value)
- def slider_message_box_ratio_callback(value):
+ def sliderMessageBoxRatioCallback(value):
callFunctionIfCallable(view_variable.CALLBACK_SET_MESSAGE_BOX_RATIO, value)
- def optionmenu_font_family_callback(value):
+ def optionmenuFontFamilyCallback(value):
callFunctionIfCallable(view_variable.CALLBACK_SET_FONT_FAMILY, value)
- def optionmenu_ui_language_callback(value):
+ def optionmenuUiLanguageCallback(value):
callFunctionIfCallable(view_variable.CALLBACK_SET_UI_LANGUAGE, value)
- def checkbox_enable_restore_main_window_geometry_callback(checkbox_box_widget):
+ def checkboxEnableRestoreMainWindowGeometryCallback(checkbox_box_widget):
callFunctionIfCallable(view_variable.CALLBACK_SET_ENABLE_RESTORE_MAIN_WINDOW_GEOMETRY, checkbox_box_widget.get())
row=0
@@ -40,7 +39,7 @@ def createSettingBox_Appearance(setting_box_wrapper, config_window, settings, vi
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: slider_transparency_callback(value),
+ 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,
@@ -55,7 +54,7 @@ def createSettingBox_Appearance(setting_box_wrapper, config_window, settings, vi
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: optionmenu_appearance_theme_callback(value),
+ command=lambda value: optionmenuAppearanceThemeCallback(value),
variable=view_variable.VAR_APPEARANCE_THEME,
)
config_window.sb__appearance_theme.grid(row=row)
@@ -68,7 +67,7 @@ def createSettingBox_Appearance(setting_box_wrapper, config_window, settings, vi
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: optionmenu_ui_scaling_callback(value),
+ command=lambda value: optionmenuUiScalingCallback(value),
variable=view_variable.VAR_UI_SCALING,
)
config_window.sb__ui_scaling.grid(row=row)
@@ -79,7 +78,7 @@ def createSettingBox_Appearance(setting_box_wrapper, config_window, settings, vi
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: slider_text_box_ui_scaling_callback(value),
+ 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,
@@ -93,7 +92,7 @@ def createSettingBox_Appearance(setting_box_wrapper, config_window, settings, vi
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: slider_message_box_ratio_callback(value),
+ 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,
@@ -107,7 +106,7 @@ def createSettingBox_Appearance(setting_box_wrapper, config_window, settings, vi
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: optionmenu_font_family_callback(value),
+ command=lambda value: optionmenuFontFamilyCallback(value),
variable=view_variable.VAR_FONT_FAMILY,
)
config_window.sb__font_family.grid(row=row)
@@ -119,7 +118,7 @@ def createSettingBox_Appearance(setting_box_wrapper, config_window, settings, vi
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: optionmenu_ui_language_callback(value),
+ command=lambda value: optionmenuUiLanguageCallback(value),
variable=view_variable.VAR_UI_LANGUAGE,
)
config_window.sb__ui_language.grid(row=row)
@@ -129,7 +128,7 @@ def createSettingBox_Appearance(setting_box_wrapper, config_window, settings, vi
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: checkbox_enable_restore_main_window_geometry_callback(config_window.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)
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
index bacfa71f..b32116fe 100644
--- 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
@@ -9,25 +9,25 @@ def createSettingBox_Others(setting_box_wrapper, config_window, settings, view_v
createSettingBoxAutoExportMessageLogs = sbg.createSettingBoxAutoExportMessageLogs
- def checkbox_auto_clear_message_box_callback(checkbox_box_widget):
+ def checkboxAutoClearMessageBoxCallback(checkbox_box_widget):
callFunctionIfCallable(view_variable.CALLBACK_SET_ENABLE_AUTO_CLEAR_MESSAGE_BOX, checkbox_box_widget.get())
- def checkbox_send_only_translated_messages_callback(checkbox_box_widget):
+ def checkboxSendOnlyTranslatedMessagesCallback(checkbox_box_widget):
callFunctionIfCallable(view_variable.CALLBACK_SET_ENABLE_SEND_ONLY_TRANSLATED_MESSAGES, checkbox_box_widget.get())
- def checkbox_send_message_button_type_callback():
+ def checkboxSendMessageButtonTypeCallback():
callFunctionIfCallable(view_variable.CALLBACK_SET_SEND_MESSAGE_BUTTON_TYPE, view_variable.VAR_SEND_MESSAGE_BUTTON_TYPE.get())
- def checkbox_notice_xsoverlay_callback(checkbox_box_widget):
+ def checkboxNoticeXsoverlayCallback(checkbox_box_widget):
callFunctionIfCallable(view_variable.CALLBACK_SET_ENABLE_NOTICE_XSOVERLAY, checkbox_box_widget.get())
- def checkbox_auto_export_message_logs_callback(checkbox_box_widget):
+ def checkboxAutoExportMessageLogsCallback(checkbox_box_widget):
callFunctionIfCallable(view_variable.CALLBACK_SET_ENABLE_AUTO_EXPORT_MESSAGE_LOGS, checkbox_box_widget.get())
- def button_auto_export_message_logs_callback():
+ def buttonAutoExportMessageLogsCallback():
callFunctionIfCallable(view_variable.CALLBACK_OPEN_FILEPATH_LOGS)
- def checkbox_enable_send_message_to_vrc_callback(checkbox_box_widget):
+ def checkboxEnableSendMessageToVrcCallback(checkbox_box_widget):
callFunctionIfCallable(view_variable.CALLBACK_SET_ENABLE_SEND_MESSAGE_TO_VRC, checkbox_box_widget.get())
@@ -36,7 +36,7 @@ def createSettingBox_Others(setting_box_wrapper, config_window, settings, view_v
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: checkbox_auto_clear_message_box_callback(config_window.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)
@@ -46,7 +46,7 @@ def createSettingBox_Others(setting_box_wrapper, config_window, settings, view_v
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: checkbox_send_only_translated_messages_callback(config_window.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)
@@ -56,7 +56,7 @@ def createSettingBox_Others(setting_box_wrapper, config_window, settings, view_v
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: checkbox_send_message_button_type_callback(),
+ command=lambda: checkboxSendMessageButtonTypeCallback(),
variable=view_variable.VAR_SEND_MESSAGE_BUTTON_TYPE,
radiobutton_keys_values=view_variable.KEYS_VALUES_SEND_MESSAGE_BUTTON_TYPE,
)
@@ -67,7 +67,7 @@ def createSettingBox_Others(setting_box_wrapper, config_window, settings, view_v
for_var_label_text=view_variable.VAR_LABEL_ENABLE_NOTICE_XSOVERLAY,
for_var_desc_text=view_variable.VAR_DESC_ENABLE_NOTICE_XSOVERLAY,
checkbox_attr_name="sb__checkbox_notice_xsoverlay",
- command=lambda: checkbox_notice_xsoverlay_callback(config_window.sb__checkbox_notice_xsoverlay),
+ command=lambda: checkboxNoticeXsoverlayCallback(config_window.sb__checkbox_notice_xsoverlay),
variable=view_variable.VAR_ENABLE_NOTICE_XSOVERLAY,
)
config_window.sb__notice_xsoverlay.grid(row=row)
@@ -78,8 +78,8 @@ def createSettingBox_Others(setting_box_wrapper, config_window, settings, view_v
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: checkbox_auto_export_message_logs_callback(config_window.sb__checkbox_auto_export_message_logs),
- button_command=lambda _e: button_auto_export_message_logs_callback(),
+ 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)
@@ -90,7 +90,7 @@ def createSettingBox_Others(setting_box_wrapper, config_window, settings, view_v
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: checkbox_enable_send_message_to_vrc_callback(config_window.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)
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
index b7f39f91..577ef373 100644
--- 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
@@ -6,7 +6,7 @@ def createSettingBox_Others_Additional(setting_box_wrapper, config_window, setti
sbg = _SettingBoxGenerator(setting_box_wrapper, config_window, settings, view_variable)
createSettingBoxCheckbox = sbg.createSettingBoxCheckbox
- def checkbox_enable_send_received_message_to_vrc_callback(checkbox_box_widget):
+ def checkboxEnableSendReceivedMessageToVrcCallback(checkbox_box_widget):
callFunctionIfCallable(view_variable.CALLBACK_SET_ENABLE_SEND_RECEIVED_MESSAGE_TO_VRC, checkbox_box_widget.get())
@@ -15,7 +15,7 @@ def createSettingBox_Others_Additional(setting_box_wrapper, config_window, setti
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: checkbox_enable_send_received_message_to_vrc_callback(config_window.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)
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
index 0d0bbca7..ac8bffa6 100644
--- 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
@@ -8,14 +8,14 @@ def createSettingBox_Others_ReceivedMessageFormats(setting_box_wrapper, config_w
createSettingBoxMessageFormatEntries = sbg.createSettingBoxMessageFormatEntries
createSettingBoxMessageFormatEntries_WithTranslation = sbg.createSettingBoxMessageFormatEntries_WithTranslation
- def entry_received_message_format_callback(value):
+ def entryReceivedMessageFormatCallback(value):
callFunctionIfCallable(view_variable.CALLBACK_SET_RECEIVED_MESSAGE_FORMAT, value)
- def entry_received_message_format_with_t_callback(value):
+ def entryReceivedMessageFormatWithTCallback(value):
callFunctionIfCallable(view_variable.CALLBACK_SET_RECEIVED_MESSAGE_FORMAT_WITH_T, value)
- def entry_swap_received_message_format_with_t_callback(_e):
+ def entrySwapReceivedMessageFormatWithTCallback(_e):
callFunctionIfCallable(view_variable.CALLBACK_SWAP_RECEIVED_MESSAGE_FORMAT_WITH_T_REQUIRED_TEXT)
row=0
@@ -33,7 +33,7 @@ def createSettingBox_Others_ReceivedMessageFormats(setting_box_wrapper, config_w
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: entry_received_message_format_callback(value),
+ 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)
@@ -57,8 +57,8 @@ def createSettingBox_Others_ReceivedMessageFormats(setting_box_wrapper, config_w
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: entry_received_message_format_with_t_callback(value),
- swap_button_command=entry_swap_received_message_format_with_t_callback,
+ 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)
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
index 6180ffd8..61c89dd2 100644
--- 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
@@ -8,14 +8,14 @@ def createSettingBox_Others_SendMessageFormats(setting_box_wrapper, config_windo
createSettingBoxMessageFormatEntries = sbg.createSettingBoxMessageFormatEntries
createSettingBoxMessageFormatEntries_WithTranslation = sbg.createSettingBoxMessageFormatEntries_WithTranslation
- def entry_send_message_format_callback(value):
+ def entrySendMessageFormatCallback(value):
callFunctionIfCallable(view_variable.CALLBACK_SET_SEND_MESSAGE_FORMAT, value)
- def entry_send_message_format_with_t_callback(value):
+ def entrySendMessageFormatWithTCallback(value):
callFunctionIfCallable(view_variable.CALLBACK_SET_SEND_MESSAGE_FORMAT_WITH_T, value)
- def entry_swap_message_format_with_t_callback(_e):
+ def entrySwapMessageFormatWithTCallback(_e):
callFunctionIfCallable(view_variable.CALLBACK_SWAP_SEND_MESSAGE_FORMAT_WITH_T_REQUIRED_TEXT)
@@ -34,7 +34,7 @@ def createSettingBox_Others_SendMessageFormats(setting_box_wrapper, config_windo
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: entry_send_message_format_callback(value),
+ 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)
@@ -58,8 +58,8 @@ def createSettingBox_Others_SendMessageFormats(setting_box_wrapper, config_windo
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: entry_send_message_format_with_t_callback(value),
- swap_button_command=entry_swap_message_format_with_t_callback,
+ 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)
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
index d5ece1b6..50eb8d2e 100644
--- 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
@@ -12,39 +12,40 @@ def createSettingBox_Mic(setting_box_wrapper, config_window, settings, view_vari
createSettingBoxAddAndDeleteAbleList = sbg.createSettingBoxAddAndDeleteAbleList
- def checkbox_input_mic_threshold_check_callback(is_turned_on):
+ def checkboxInputMicThresholdCheckCallback(is_turned_on):
callFunctionIfCallable(view_variable.CALLBACK_CHECK_MIC_THRESHOLD, is_turned_on)
- def optionmenu_mic_host_callback(value):
+ def optionmenuMicHostCallback(value):
callFunctionIfCallable(view_variable.CALLBACK_SET_MIC_HOST, value)
- def optionmenu_input_mic_device_callback(value):
+ def optionmenuInputMicDeviceCallback(value):
callFunctionIfCallable(view_variable.CALLBACK_SET_MIC_DEVICE, value)
- def slider_input_mic_energy_threshold_callback(value):
+ def sliderInputMicEnergyThresholdCallback(value):
callFunctionIfCallable(view_variable.CALLBACK_SET_MIC_ENERGY_THRESHOLD, value)
- def checkbox_input_mic_dynamic_energy_threshold_callback(checkbox_box_widget):
+ def checkboxInputMicDynamicEnergyThresholdCallback(checkbox_box_widget):
callFunctionIfCallable(view_variable.CALLBACK_SET_MIC_DYNAMIC_ENERGY_THRESHOLD, checkbox_box_widget.get())
- def entry_input_mic_record_timeout_callback(value):
+ def entryInputMicRecordTimeoutCallback(value):
callFunctionIfCallable(view_variable.CALLBACK_SET_MIC_RECORD_TIMEOUT, value)
- def entry_input_mic_phrase_timeout_callback(value):
+ def entryInputMicPhraseTimeoutCallback(value):
callFunctionIfCallable(view_variable.CALLBACK_SET_MIC_PHRASE_TIMEOUT, value)
- def entry_input_mic_max_phrases_callback(value):
+ def entryInputMicMaxPhrasesCallback(value):
callFunctionIfCallable(view_variable.CALLBACK_SET_MIC_MAX_PHRASES, value)
- def arrow_switch_mic_word_filter_list_open_callback(value):
+ def arrowSwitchMicWordFilterListOpenCallback(value):
callFunctionIfCallable(view_variable.CALLBACK_ARROW_SWITCH_MIC_WORD_FILTER_LIST_OPEN)
- def arrow_switch_mic_word_filter_list_close_callback(value):
+ def arrowSwitchMicWordFilterListCloseCallback(value):
callFunctionIfCallable(view_variable.CALLBACK_ARROW_SWITCH_MIC_WORD_FILTER_LIST_CLOSE)
- def entry_input_mic_word_filters_callback(value):
- callFunctionIfCallable(view_variable.CALLBACK_SET_MIC_WORD_FILTER, value)
+# 直接 SettingBoxGenerator.pyでcallFunctionIfCallableから呼んでいます。(word filter 専用関数になっているのでそのままですが、良くはない)
+ # def entry_input_mic_word_filters_callback(value):
+ # callFunctionIfCallable(view_variable.CALLBACK_SET_MIC_WORD_FILTER, value)
row=0
@@ -54,7 +55,7 @@ def createSettingBox_Mic(setting_box_wrapper, config_window, settings, view_vari
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: optionmenu_mic_host_callback(value),
+ command=lambda value: optionmenuMicHostCallback(value),
variable=view_variable.VAR_MIC_HOST,
)
config_window.sb__mic_host.grid(row=row)
@@ -65,7 +66,7 @@ def createSettingBox_Mic(setting_box_wrapper, config_window, settings, view_vari
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: optionmenu_input_mic_device_callback(value),
+ command=lambda value: optionmenuInputMicDeviceCallback(value),
variable=view_variable.VAR_MIC_DEVICE,
)
config_window.sb__mic_device.grid(row=row)
@@ -75,14 +76,14 @@ def createSettingBox_Mic(setting_box_wrapper, config_window, settings, view_vari
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: checkbox_input_mic_dynamic_energy_threshold_callback(config_window.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=slider_input_mic_energy_threshold_callback,
+ command=sliderInputMicEnergyThresholdCallback,
progressbar_x_slider_attr_name="sb__mic_energy_threshold",
entry_attr_name="sb__progressbar_x_slider__entry_mic_energy_threshold",
@@ -97,9 +98,9 @@ def createSettingBox_Mic(setting_box_wrapper, config_window, settings, view_vari
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: checkbox_input_mic_threshold_check_callback(True),
+ 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: checkbox_input_mic_threshold_check_callback(False),
+ 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,
@@ -114,7 +115,7 @@ def createSettingBox_Mic(setting_box_wrapper, config_window, settings, view_vari
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: entry_input_mic_record_timeout_callback(value),
+ 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,
)
@@ -126,7 +127,7 @@ def createSettingBox_Mic(setting_box_wrapper, config_window, settings, view_vari
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: entry_input_mic_phrase_timeout_callback(value),
+ 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,
)
@@ -138,7 +139,7 @@ def createSettingBox_Mic(setting_box_wrapper, config_window, settings, view_vari
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: entry_input_mic_max_phrases_callback(value),
+ 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,
)
@@ -151,8 +152,8 @@ def createSettingBox_Mic(setting_box_wrapper, config_window, settings, view_vari
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: arrow_switch_mic_word_filter_list_open_callback(value),
- close_command=lambda value: arrow_switch_mic_word_filter_list_close_callback(value),
+ 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)
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
index a9d1ad9b..846dbd8e 100644
--- 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
@@ -9,24 +9,24 @@ def createSettingBox_Speaker(setting_box_wrapper, config_window, settings, view_
createSettingBoxEntry = sbg.createSettingBoxEntry
- def checkbox_input_speaker_threshold_check_callback(is_turned_on):
+ def checkboxInputSpeakerThresholdCheckCallback(is_turned_on):
callFunctionIfCallable(view_variable.CALLBACK_CHECK_SPEAKER_THRESHOLD, is_turned_on)
- def slider_input_speaker_energy_threshold_callback(value):
+ def sliderInputSpeakerEnergyThresholdCallback(value):
callFunctionIfCallable(view_variable.CALLBACK_SET_SPEAKER_ENERGY_THRESHOLD, value)
- def checkbox_input_speaker_dynamic_energy_threshold_callback(checkbox_box_widget):
+ def checkboxInputSpeakerDynamicEnergyThresholdCallback(checkbox_box_widget):
callFunctionIfCallable(view_variable.CALLBACK_SET_SPEAKER_DYNAMIC_ENERGY_THRESHOLD, checkbox_box_widget.get())
- def entry_input_speaker_record_timeout_callback(value):
+ def entryInputSpeakerRecordTimeoutCallback(value):
callFunctionIfCallable(view_variable.CALLBACK_SET_SPEAKER_RECORD_TIMEOUT, value)
- def entry_input_speaker_phrase_timeout_callback(value):
+ def entryInputSpeakerPhraseTimeoutCallback(value):
callFunctionIfCallable(view_variable.CALLBACK_SET_SPEAKER_PHRASE_TIMEOUT, value)
- def entry_input_speaker_max_phrases_callback(value):
+ def entryInputSpeakerMaxPhrasesCallback(value):
callFunctionIfCallable(view_variable.CALLBACK_SET_SPEAKER_MAX_PHRASES, value)
@@ -36,14 +36,14 @@ def createSettingBox_Speaker(setting_box_wrapper, config_window, settings, view_
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: checkbox_input_speaker_dynamic_energy_threshold_callback(config_window.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=slider_input_speaker_energy_threshold_callback,
+ command=sliderInputSpeakerEnergyThresholdCallback,
progressbar_x_slider_attr_name="sb__speaker_energy_threshold",
entry_variable=view_variable.VAR_SPEAKER_ENERGY_THRESHOLD__ENTRY,
@@ -58,9 +58,9 @@ def createSettingBox_Speaker(setting_box_wrapper, config_window, settings, view_
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: checkbox_input_speaker_threshold_check_callback(True),
+ 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: checkbox_input_speaker_threshold_check_callback(False),
+ 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,
@@ -75,7 +75,7 @@ def createSettingBox_Speaker(setting_box_wrapper, config_window, settings, view_
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: entry_input_speaker_record_timeout_callback(value),
+ 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,
)
@@ -87,7 +87,7 @@ def createSettingBox_Speaker(setting_box_wrapper, config_window, settings, view_
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: entry_input_speaker_phrase_timeout_callback(value),
+ 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,
)
@@ -99,7 +99,7 @@ def createSettingBox_Speaker(setting_box_wrapper, config_window, settings, view_
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: entry_input_speaker_max_phrases_callback(value),
+ 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,
)
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
index d2975d0d..f245c387 100644
--- 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
@@ -4,21 +4,50 @@ 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 = sbg.createSettingBoxEntry
+ def switchUseTranslationFeatureCallback(switch_widget):
+ callFunctionIfCallable(view_variable.CALLBACK_SET_USE_TRANSLATION_FEATURE, switch_widget.get())
- def deepl_authkey_callback(value):
- callFunctionIfCallable(view_variable.CALLBACK_SET_DEEPL_AUTHKEY, value)
+ 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__deepl_authkey = createSettingBoxEntry(
+ 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(
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_authkey",
+ entry_attr_name="sb__entry_deepl_auth_key",
entry_width=settings.uism.RESPONSIVE_UI_SIZE_INT_300,
- entry_bind__Any_KeyRelease=lambda value: deepl_authkey_callback(value),
+ entry_bind__Any_KeyRelease=lambda value: deeplAuthKeyCallback(value),
entry_textvariable=view_variable.VAR_DEEPL_AUTH_KEY,
)
- config_window.sb__deepl_authkey.grid(row=row, pady=0)
+ config_window.sb__deepl_auth_key.grid(row=row, pady=0)
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
index cbe96b4e..6678ffd3 100644
--- a/vrct_gui/main_window/widgets/_create_sidebar/createSidebarLanguagesSettings.py
+++ b/vrct_gui/main_window/widgets/_create_sidebar/createSidebarLanguagesSettings.py
@@ -1,6 +1,8 @@
from customtkinter import CTkFont, CTkFrame, CTkLabel, CTkImage
-from ....ui_utils import bindEnterAndLeaveColor, bindButtonPressColor, bindButtonReleaseFunction, switchActiveTabAndPassiveTab, switchTabsColor, createOptionMenuBox, bindButtonFunctionAndColor, bindEnterAndLeaveFunction
+from ...._CreateDropdownMenuWindow import _CreateDropdownMenuWindow
+
+from ....ui_utils import bindEnterAndLeaveColor, bindButtonPressColor, bindButtonReleaseFunction, switchActiveTabAndPassiveTab, switchTabsColor, createOptionMenuBox, bindButtonFunctionAndColor, bindEnterAndLeaveFunction, createLabelButton
from utils import callFunctionIfCallable
@@ -248,7 +250,7 @@ def createSidebarLanguagesSettings(settings, main_window, view_variable):
main_window.sls__both_direction_desc = CTkLabel(
main_window.sls__arrow_direction_swap_box,
- textvariable=view_variable.VAR_LABEL_BOTH_DIRECTION_DESC,
+ 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,
@@ -284,16 +286,10 @@ def createSidebarLanguagesSettings(settings, main_window, view_variable):
def adjustedCommand_Entered():
- main_window.sls__both_direction_desc.configure(
- textvariable=view_variable.VAR_LABEL_BOTH_DIRECTION_SWAP_BUTTON,
- text_color=settings.ctm.SLS__BOX_ARROWS_SWAP_BUTTON_TEXT_COLOR,
- )
+ callFunctionIfCallable(view_variable.CALLBACK_ENTERED_SWAP_LANGUAGES_BUTTON)
def adjustedCommand_Leaved():
- main_window.sls__both_direction_desc.configure(
- textvariable=view_variable.VAR_LABEL_BOTH_DIRECTION_DESC,
- text_color=settings.ctm.SLS__BOX_ARROWS_TEXT_COLOR,
- )
+ callFunctionIfCallable(view_variable.CALLBACK_LEAVED_SWAP_LANGUAGES_BUTTON)
bindEnterAndLeaveFunction(
target_widgets=[
@@ -336,4 +332,49 @@ def createSidebarLanguagesSettings(settings, main_window, view_variable):
height=0,
corner_radius=0,
image=CTkImage(settings.image_file.HEADPHONES_ICON_DISABLED, size=settings.uism.SLS__BOX_TRANSCRIPTION_STATUS_IMAGE_SIZE),
- )
\ No newline at end of file
+ )
+
+
+
+
+
+ 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,
+ dropdown_menu_min_width=settings.uism.SIDEBAR_MIN_WIDTH,
+ )
+
+ (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/splash_window/SplashWindow.py b/vrct_gui/splash_window/SplashWindow.py
index 2a2db684..3a1084c0 100644
--- a/vrct_gui/splash_window/SplashWindow.py
+++ b/vrct_gui/splash_window/SplashWindow.py
@@ -1,4 +1,7 @@
-from customtkinter import CTkImage, CTkLabel, CTkToplevel
+import math
+import time
+
+from customtkinter import CTkImage, CTkLabel, CTkToplevel, CTkProgressBar, CTkFrame
from ..ui_utils import openImageKeepAspectRatio, getImageFileFromUiUtils, setGeometryToCenterOfScreen, fadeInAnimation
class SplashWindow(CTkToplevel):
@@ -10,22 +13,229 @@ class SplashWindow(CTkToplevel):
self.title("SplashWindow")
self.wm_attributes("-toolwindow", True)
+ self.is_showed_weight_download_progressbar = False
- sw=self.winfo_screenwidth()
+ BG_HEIGHT= 220
+ BG_WIDTH= 450
+ BG_HEX_COLOR = "#292a2d"
- pw=int(sw/4)
+ 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.grid_columnconfigure((0,2), weight=1)
- self.grid_rowconfigure((0,2), weight=1)
- (img, desired_width, height) = openImageKeepAspectRatio(getImageFileFromUiUtils("vrct_logo_for_dark_mode.png"), pw)
- label = CTkLabel(
+
+ 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="#292a2d",
+ fg_color=BG_HEX_COLOR,
image=CTkImage(img, size=(desired_width, height))
)
- label.grid(row=1, column=1, padx=int(desired_width/7), pady=int(height/3))
+ 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
+
+ # This making gradient color process was made by ChatGPT.
+ def generateGradientColor(self, value):
+ # 0の時の色と1の時の色を指定
+ color_start = [242, 242, 242] # RGB values for #f2f2f2
+ color_end = [72, 164, 149] # RGB values for #48a495
+
+ # 補完色を計算
+ 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 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 = self.generateGradientColor(progress)
+ self.weight_download_progressbar_widget.configure(progress_color=progress_color)
+ self.weight_download_progressbar_widget.set(progress)
+ self.update_idletasks()
def showSplash(self):
diff --git a/vrct_gui/ui_managers/Themes/_darkTheme.py b/vrct_gui/ui_managers/Themes/_darkTheme.py
index fe3c1aa9..46592b4f 100644
--- a/vrct_gui/ui_managers/Themes/_darkTheme.py
+++ b/vrct_gui/ui_managers/Themes/_darkTheme.py
@@ -58,6 +58,7 @@ def _darkTheme(base_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,
@@ -90,6 +91,11 @@ def _darkTheme(base_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,
@@ -210,8 +216,11 @@ def _darkTheme(base_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,
diff --git a/vrct_gui/ui_managers/Themes/_lightTheme.py b/vrct_gui/ui_managers/Themes/_lightTheme.py
index 0815e602..08caeae1 100644
--- a/vrct_gui/ui_managers/Themes/_lightTheme.py
+++ b/vrct_gui/ui_managers/Themes/_lightTheme.py
@@ -58,6 +58,7 @@ def _lightTheme(base_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,
@@ -90,6 +91,11 @@ def _lightTheme(base_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,
@@ -203,8 +209,11 @@ def _lightTheme(base_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,
diff --git a/vrct_gui/ui_managers/UiScalingManager.py b/vrct_gui/ui_managers/UiScalingManager.py
index 2e02b1bf..bbf7326d 100644
--- a/vrct_gui/ui_managers/UiScalingManager.py
+++ b/vrct_gui/ui_managers/UiScalingManager.py
@@ -13,6 +13,7 @@ class UiScalingManager():
self.main_window_cover = SimpleNamespace()
self.error_message_window = SimpleNamespace()
self.confirmation_modal = SimpleNamespace()
+ self.dropdown_menu_window = SimpleNamespace()
self._calculatedUiSizes()
@@ -66,7 +67,7 @@ class UiScalingManager():
# Sidebar
# Sidebar Features
self.main.SF__LOGO_MAX_SIZE = self._calculateUiSize(120)
- self.main.SF__LOGO_PADY = (self._calculateUiSize(12),self._calculateUiSize(8))
+ 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)
@@ -84,34 +85,34 @@ class UiScalingManager():
# Sidebar Quick Language Settings, SQLS
- self.main.SLS__TITLE_FONT_SIZE = self._calculateUiSize(16)
- self.main.SLS__TITLE_PADY = (self._calculateUiSize(12), self._calculateUiSize(6))
+ 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_TRANSCRIPTION_STATUS_IMAGE_SIZE = self.dupTuple(self._calculateUiSize(14))
+ 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(18))
+ 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._calculateUiSize(20), self._calculateUiSize(20))
+ 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(4)
+ 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(6)
+ 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.SLS__BOX_TOP_PADY = self._calculateUiSize(16)
self.main.SIDEBAR_CONFIG_BUTTON_CORNER_RADIUS = self._calculateUiSize(6)
self.main.SIDEBAR_CONFIG_BUTTON_IMAGE_SIZE = self.main.SF__COMPACT_MODE_IMAGE_SIZE
@@ -140,6 +141,24 @@ class UiScalingManager():
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)
@@ -170,7 +189,7 @@ class UiScalingManager():
self.confirmation_modal.BUTTONS_IPADY = self._calculateUiSize(6)
# Dropdown Menu Window
- self.config_window.MARGIN_WIDTH = self._calculateUiSize(16)
+ self.dropdown_menu_window.MARGIN_WIDTH = self._calculateUiSize(16)
# Config Window
self.config_window.DEFAULT_WIDTH = self._calculateUiSize(1080)
@@ -256,7 +275,6 @@ class UiScalingManager():
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_WIDTH = self.config_window.SB__OPTIONMENU_MIN_WIDTH
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
diff --git a/vrct_gui/ui_utils/ui_utils.py b/vrct_gui/ui_utils/ui_utils.py
index bd6e5a9c..ca75416b 100644
--- a/vrct_gui/ui_utils/ui_utils.py
+++ b/vrct_gui/ui_utils/ui_utils.py
@@ -42,6 +42,17 @@ def getLongestText(text_list:list):
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
@@ -157,6 +168,60 @@ def createButtonWithImage(parent_widget, button_image_size, button_ipadxy, butto
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, label_button_min_height=None, label_button_min_width=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, sticky="ew")
+
+ 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))
+
+
+ bindEnterAndLeaveColor([label_button_label_wrapper, label_button_box, label_button_label_widget], label_button_hovered_bg_color, label_button_bg_color)
+ bindButtonPressColor([label_button_label_wrapper, label_button_box, label_button_label_widget], label_button_clicked_bg_color, label_button_hovered_bg_color)
+
+
+
+ bindButtonReleaseFunction([label_button_label_wrapper, label_button_box, label_button_label_widget], label_button_clicked_command)
+
+ def bindEventFromWidgets():
+ bindButtonReleaseFunction([label_button_label_wrapper, label_button_box, label_button_label_widget], label_button_clicked_command)
+ bindEventFromWidgets()
+
+ def unbindEventFromWidgets():
+ unbindEnterLEaveButtonPressButtonReleaseFunction([label_button_label_wrapper, label_button_box, label_button_label_widget])
+
+ label_button_box.unbindFunction = unbindEventFromWidgets
+ label_button_box.bindFunction = bindEventFromWidgets
+
+
+ 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")
@@ -205,13 +270,15 @@ def createOptionMenuBox(parent_widget, optionmenu_bg_color, optionmenu_hovered_b
bindButtonPressColor([optionmenu_label_wrapper, option_menu_box, optionmenu_label_widget, optionmenu_img_widget], optionmenu_clicked_bg_color, optionmenu_hovered_bg_color)
-
- bindButtonReleaseFunction([optionmenu_label_wrapper, option_menu_box, optionmenu_label_widget, optionmenu_img_widget], optionmenu_clicked_command)
+ 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)
diff --git a/vrct_gui/vrct_gui.py b/vrct_gui/vrct_gui.py
index 7c0bdc7f..25369a6a 100644
--- a/vrct_gui/vrct_gui.py
+++ b/vrct_gui/vrct_gui.py
@@ -71,14 +71,37 @@ class VRCT_GUI(CTk):
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.config_window,
+ 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,
@@ -227,14 +250,15 @@ class VRCT_GUI(CTk):
- def _changeMainWindowWidgetsStatus(self, status, target_names, to_hold_state:bool=False):
+ 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_hold_state=to_hold_state,
+ to_lock_state=to_lock_state,
+ release_locked_state=release_locked_state,
)
def _changeConfigWindowWidgetsStatus(self, status, target_names):