Merge branch 'refactoring' into develop

This commit is contained in:
Sakamoto Shiina
2024-01-02 04:55:27 +09:00
5 changed files with 64 additions and 39 deletions

View File

@@ -5,7 +5,6 @@ from json import load as json_load
from json import dump as json_dump from json import dump as json_dump
import tkinter as tk import tkinter as tk
from tkinter import font from tkinter import font
from languages import selectable_languages
from models.translation.translation_languages import translatorEngine from models.translation.translation_languages import translatorEngine
from models.transcription.transcription_utils import getInputDevices, getDefaultInputDevice from models.transcription.transcription_utils import getInputDevices, getDefaultInputDevice
from utils import generatePercentageStringsList, isUniqueStrings from utils import generatePercentageStringsList, isUniqueStrings
@@ -67,6 +66,30 @@ class Config:
def DOCUMENTS_URL(self): def DOCUMENTS_URL(self):
return self._DOCUMENTS_URL return self._DOCUMENTS_URL
@property
def TRANSPARENCY_RANGE(self):
return self._TRANSPARENCY_RANGE
@property
def APPEARANCE_THEME_LIST(self):
return self._APPEARANCE_THEME_LIST
@property
def UI_SCALING_LIST(self):
return self._UI_SCALING_LIST
@property
def TEXTBOX_UI_SCALING_RANGE(self):
return self._TEXTBOX_UI_SCALING_RANGE
@property
def MESSAGE_BOX_RATIO_RANGE(self):
return self._MESSAGE_BOX_RATIO_RANGE
@property
def SELECTABLE_UI_LANGUAGES_DICT(self):
return self._SELECTABLE_UI_LANGUAGES_DICT
@property @property
def MAX_MIC_ENERGY_THRESHOLD(self): def MAX_MIC_ENERGY_THRESHOLD(self):
return self._MAX_MIC_ENERGY_THRESHOLD return self._MAX_MIC_ENERGY_THRESHOLD
@@ -211,7 +234,7 @@ class Config:
@TRANSPARENCY.setter @TRANSPARENCY.setter
def TRANSPARENCY(self, value): def TRANSPARENCY(self, value):
if isinstance(value, int) and 0 <= value <= 100: if isinstance(value, int) and self.TRANSPARENCY_RANGE[0] <= value <= self.TRANSPARENCY_RANGE[1]:
self._TRANSPARENCY = value self._TRANSPARENCY = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
@@ -222,7 +245,7 @@ class Config:
@APPEARANCE_THEME.setter @APPEARANCE_THEME.setter
def APPEARANCE_THEME(self, value): def APPEARANCE_THEME(self, value):
if value in ["Light", "Dark", "System"]: if value in self.APPEARANCE_THEME_LIST:
self._APPEARANCE_THEME = value self._APPEARANCE_THEME = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
@@ -233,7 +256,7 @@ class Config:
@UI_SCALING.setter @UI_SCALING.setter
def UI_SCALING(self, value): def UI_SCALING(self, value):
if value in generatePercentageStringsList(start=40,end=200, step=10): if value in self.UI_SCALING_LIST:
self._UI_SCALING = value self._UI_SCALING = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
@@ -244,7 +267,7 @@ class Config:
@TEXTBOX_UI_SCALING.setter @TEXTBOX_UI_SCALING.setter
def TEXTBOX_UI_SCALING(self, value): def TEXTBOX_UI_SCALING(self, value):
if isinstance(value, int) and 50 <= value <= 200: if isinstance(value, int) and self.TEXTBOX_UI_SCALING_RANGE[0] <= value <= self.TEXTBOX_UI_SCALING_RANGE[1]:
self._TEXTBOX_UI_SCALING = value self._TEXTBOX_UI_SCALING = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
@@ -255,7 +278,7 @@ class Config:
@MESSAGE_BOX_RATIO.setter @MESSAGE_BOX_RATIO.setter
def MESSAGE_BOX_RATIO(self, value): def MESSAGE_BOX_RATIO(self, value):
if isinstance(value, int) and 1 <= value <= 99: if isinstance(value, int) and self.MESSAGE_BOX_RATIO_RANGE[0] <= value <= self.MESSAGE_BOX_RATIO_RANGE[1]:
self._MESSAGE_BOX_RATIO = value self._MESSAGE_BOX_RATIO = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
@@ -280,7 +303,7 @@ class Config:
@UI_LANGUAGE.setter @UI_LANGUAGE.setter
def UI_LANGUAGE(self, value): def UI_LANGUAGE(self, value):
if value in list(selectable_languages.keys()): if value in list(self.SELECTABLE_UI_LANGUAGES_DICT.keys()):
self._UI_LANGUAGE = value self._UI_LANGUAGE = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
@@ -627,7 +650,7 @@ class Config:
def init_config(self): def init_config(self):
# Read Only # Read Only
self._VERSION = "2.0.1" self._VERSION = "2.0.1"
self._ENABLE_SPEAKER2CHATBOX = False self._ENABLE_SPEAKER2CHATBOX = False # Speaker2Chatbox
self._LOCAL_PATH = os_path.dirname(sys.argv[0]) self._LOCAL_PATH = os_path.dirname(sys.argv[0])
self._PATH_CONFIG = os_path.join(self._LOCAL_PATH, "config.json") self._PATH_CONFIG = os_path.join(self._LOCAL_PATH, "config.json")
self._PATH_LOGS = os_path.join(self._LOCAL_PATH, "logs") self._PATH_LOGS = os_path.join(self._LOCAL_PATH, "logs")
@@ -635,6 +658,17 @@ class Config:
self._GITHUB_URL = "https://api.github.com/repos/misyaguziya/VRCT/releases/latest" self._GITHUB_URL = "https://api.github.com/repos/misyaguziya/VRCT/releases/latest"
self._BOOTH_URL = "https://misyaguziya.booth.pm/" self._BOOTH_URL = "https://misyaguziya.booth.pm/"
self._DOCUMENTS_URL = "https://mzsoftware.notion.site/VRCT-Documents-be79b7a165f64442ad8f326d86c22246" self._DOCUMENTS_URL = "https://mzsoftware.notion.site/VRCT-Documents-be79b7a165f64442ad8f326d86c22246"
self._TRANSPARENCY_RANGE = (50, 100)
self._APPEARANCE_THEME_LIST = ["Light", "Dark", "System"]
self._UI_SCALING_LIST = generatePercentageStringsList(start=40, end=200, step=10)
self._TEXTBOX_UI_SCALING_RANGE = (50, 200)
self._MESSAGE_BOX_RATIO_RANGE = (1, 99)
self._SELECTABLE_UI_LANGUAGES_DICT = {
"en": "English",
"ja": "日本語",
"ko": "한국어(일부 지원)"
# If you want to add a new language and key, please append it here.
}
self._MAX_MIC_ENERGY_THRESHOLD = 2000 self._MAX_MIC_ENERGY_THRESHOLD = 2000
self._MAX_SPEAKER_ENERGY_THRESHOLD = 4000 self._MAX_SPEAKER_ENERGY_THRESHOLD = 4000
@@ -708,7 +742,7 @@ class Config:
self._ENABLE_SEND_ONLY_TRANSLATED_MESSAGES = False self._ENABLE_SEND_ONLY_TRANSLATED_MESSAGES = False
self._ENABLE_NOTICE_XSOVERLAY = False self._ENABLE_NOTICE_XSOVERLAY = False
self._ENABLE_SEND_MESSAGE_TO_VRC = True self._ENABLE_SEND_MESSAGE_TO_VRC = True
self._ENABLE_SEND_RECEIVED_MESSAGE_TO_VRC = False # speaker2Chatbox self._ENABLE_SEND_RECEIVED_MESSAGE_TO_VRC = False # Speaker2Chatbox
self._ENABLE_LOGGER = False self._ENABLE_LOGGER = False
self._IS_CONFIG_WINDOW_COMPACT_MODE = False self._IS_CONFIG_WINDOW_COMPACT_MODE = False

View File

@@ -4,8 +4,7 @@ from threading import Thread
from config import config from config import config
from model import model from model import model
from view import view from view import view
from utils import get_key_by_value, isUniqueStrings from utils import getKeyByValue, isUniqueStrings
from languages import selectable_languages
import argparse import argparse
# Common # Common
@@ -420,8 +419,8 @@ def callbackSetFontFamily(value):
def callbackSetUiLanguage(value): def callbackSetUiLanguage(value):
print("callbackSetUiLanguage", value) print("callbackSetUiLanguage", value)
value = get_key_by_value(selectable_languages, value) value = getKeyByValue(config.SELECTABLE_UI_LANGUAGES_DICT, value)
print("callbackSetUiLanguage__after_get_key_by_value", value) print("callbackSetUiLanguage__after_getKeyByValue", value)
config.UI_LANGUAGE = value config.UI_LANGUAGE = value
view.showRestartButtonIfRequired(locale=config.UI_LANGUAGE) view.showRestartButtonIfRequired(locale=config.UI_LANGUAGE)

View File

@@ -1,6 +0,0 @@
selectable_languages = {
"en": "English",
"ja": "日本語",
"ko": "한국어(일부 지원)"
# 新しい言語とキーを追加する場合はここに追記してください
}

View File

@@ -6,7 +6,7 @@ def getImageFile(file_name):
img = Image_open(os_path.join(os_path.dirname(__file__), "img", file_name)) img = Image_open(os_path.join(os_path.dirname(__file__), "img", file_name))
return img return img
def get_key_by_value(dictionary, value): def getKeyByValue(dictionary, value):
for key, val in dictionary.items(): for key, val in dictionary.items():
if val == value: if val == value:
return key return key
@@ -24,7 +24,7 @@ def makeEven(number, minus:bool=False):
return number if isEven(number) else number - 1 return number if isEven(number) else number - 1
return number if isEven(number) else number + 1 return number if isEven(number) else number + 1
def generatePercentageStringsList(start=40, end=200, step=10): def generatePercentageStringsList(start:int, end:int, step:int):
strings = [] strings = []
for percent in range(start, end + 1, step): for percent in range(start, end + 1, step):
strings.append(f"{percent}%") strings.append(f"{percent}%")

34
view.py
View File

@@ -5,12 +5,10 @@ from tkinter import font as tk_font
import webbrowser import webbrowser
import i18n import i18n
from languages import selectable_languages from customtkinter import StringVar, IntVar, BooleanVar, get_appearance_mode
from customtkinter import StringVar, IntVar, BooleanVar, END as CTK_END, get_appearance_mode
from vrct_gui.ui_managers import ColorThemeManager, UiScalingManager from vrct_gui.ui_managers import ColorThemeManager, UiScalingManager
from vrct_gui import vrct_gui from vrct_gui import vrct_gui
from utils import callFunctionIfCallable, generatePercentageStringsList, intToPercentageStringsFormatter from utils import callFunctionIfCallable, intToPercentageStringsFormatter
from config import config from config import config
@@ -143,7 +141,7 @@ class View():
CALLBACK_SELECTED_LANGUAGE_PRESET_TAB=None, CALLBACK_SELECTED_LANGUAGE_PRESET_TAB=None,
VAR_LABEL_YOUR_LANGUAGE=StringVar(value=i18n.t("main_window.your_language")), VAR_LABEL_YOUR_LANGUAGE=StringVar(value=i18n.t("main_window.your_language")),
VAR_YOUR_LANGUAGE = StringVar(value="Japanese\n(Japan)"), VAR_YOUR_LANGUAGE = StringVar(value=f"{config.SOURCE_LANGUAGE}\n({config.SOURCE_COUNTRY})"),
CALLBACK_OPEN_SELECTABLE_YOUR_LANGUAGE_WINDOW=None, CALLBACK_OPEN_SELECTABLE_YOUR_LANGUAGE_WINDOW=None,
IS_OPENED_SELECTABLE_YOUR_LANGUAGE_WINDOW=False, IS_OPENED_SELECTABLE_YOUR_LANGUAGE_WINDOW=False,
CALLBACK_SELECTED_YOUR_LANGUAGE=None, CALLBACK_SELECTED_YOUR_LANGUAGE=None,
@@ -153,7 +151,7 @@ class View():
CALLBACK_SWAP_LANGUAGES=None, CALLBACK_SWAP_LANGUAGES=None,
VAR_LABEL_TARGET_LANGUAGE=StringVar(value=i18n.t("main_window.target_language")), VAR_LABEL_TARGET_LANGUAGE=StringVar(value=i18n.t("main_window.target_language")),
VAR_TARGET_LANGUAGE = StringVar(value="English\n(United States)"), VAR_TARGET_LANGUAGE = StringVar(value=f"{config.TARGET_LANGUAGE}\n({config.TARGET_COUNTRY})"),
CALLBACK_OPEN_SELECTABLE_TARGET_LANGUAGE_WINDOW=None, CALLBACK_OPEN_SELECTABLE_TARGET_LANGUAGE_WINDOW=None,
IS_OPENED_SELECTABLE_TARGET_LANGUAGE_WINDOW=False, IS_OPENED_SELECTABLE_TARGET_LANGUAGE_WINDOW=False,
CALLBACK_SELECTED_TARGET_LANGUAGE=None, CALLBACK_SELECTED_TARGET_LANGUAGE=None,
@@ -202,7 +200,7 @@ class View():
# Appearance Tab # Appearance Tab
VAR_LABEL_TRANSPARENCY=StringVar(value=i18n.t("config_window.transparency.label")), VAR_LABEL_TRANSPARENCY=StringVar(value=i18n.t("config_window.transparency.label")),
VAR_DESC_TRANSPARENCY=StringVar(value=i18n.t("config_window.transparency.desc")), VAR_DESC_TRANSPARENCY=StringVar(value=i18n.t("config_window.transparency.desc")),
SLIDER_RANGE_TRANSPARENCY=(50, 100), SLIDER_RANGE_TRANSPARENCY=config.TRANSPARENCY_RANGE,
CALLBACK_SET_TRANSPARENCY=None, CALLBACK_SET_TRANSPARENCY=None,
VAR_TRANSPARENCY=IntVar(value=config.TRANSPARENCY), VAR_TRANSPARENCY=IntVar(value=config.TRANSPARENCY),
CALLBACK_BUTTON_PRESS_TRANSPARENCY=self._closeTheCoverOfMainWindow, CALLBACK_BUTTON_PRESS_TRANSPARENCY=self._closeTheCoverOfMainWindow,
@@ -210,19 +208,19 @@ class View():
VAR_LABEL_APPEARANCE_THEME=StringVar(value=i18n.t("config_window.appearance_theme.label")), VAR_LABEL_APPEARANCE_THEME=StringVar(value=i18n.t("config_window.appearance_theme.label")),
VAR_DESC_APPEARANCE_THEME=StringVar(value=i18n.t("config_window.appearance_theme.desc")), VAR_DESC_APPEARANCE_THEME=StringVar(value=i18n.t("config_window.appearance_theme.desc")),
LIST_APPEARANCE_THEME=["Light", "Dark", "System"], LIST_APPEARANCE_THEME=config.APPEARANCE_THEME_LIST,
CALLBACK_SET_APPEARANCE_THEME=None, CALLBACK_SET_APPEARANCE_THEME=None,
VAR_APPEARANCE_THEME=StringVar(value=config.APPEARANCE_THEME), VAR_APPEARANCE_THEME=StringVar(value=config.APPEARANCE_THEME),
VAR_LABEL_UI_SCALING=StringVar(value=i18n.t("config_window.ui_size.label")), VAR_LABEL_UI_SCALING=StringVar(value=i18n.t("config_window.ui_size.label")),
VAR_DESC_UI_SCALING=None, VAR_DESC_UI_SCALING=None,
LIST_UI_SCALING=generatePercentageStringsList(start=40,end=200, step=10), LIST_UI_SCALING=config.UI_SCALING_LIST,
CALLBACK_SET_UI_SCALING=None, CALLBACK_SET_UI_SCALING=None,
VAR_UI_SCALING=StringVar(value=config.UI_SCALING), VAR_UI_SCALING=StringVar(value=config.UI_SCALING),
VAR_LABEL_TEXTBOX_UI_SCALING=StringVar(value=i18n.t("config_window.textbox_ui_size.label")), VAR_LABEL_TEXTBOX_UI_SCALING=StringVar(value=i18n.t("config_window.textbox_ui_size.label")),
VAR_DESC_TEXTBOX_UI_SCALING=StringVar(value=i18n.t("config_window.textbox_ui_size.desc")), VAR_DESC_TEXTBOX_UI_SCALING=StringVar(value=i18n.t("config_window.textbox_ui_size.desc")),
SLIDER_RANGE_TEXTBOX_UI_SCALING=(50, 200), SLIDER_RANGE_TEXTBOX_UI_SCALING=config.TEXTBOX_UI_SCALING_RANGE,
CALLBACK_SET_TEXTBOX_UI_SCALING=None, CALLBACK_SET_TEXTBOX_UI_SCALING=None,
VAR_TEXTBOX_UI_SCALING=IntVar(value=config.TEXTBOX_UI_SCALING), VAR_TEXTBOX_UI_SCALING=IntVar(value=config.TEXTBOX_UI_SCALING),
CALLBACK_BUTTON_PRESS_TEXTBOX_UI_SCALING=self._closeTheCoverOfMainWindow, CALLBACK_BUTTON_PRESS_TEXTBOX_UI_SCALING=self._closeTheCoverOfMainWindow,
@@ -230,7 +228,7 @@ class View():
VAR_LABEL_MESSAGE_BOX_RATIO=StringVar(value=i18n.t("config_window.message_box_ratio.label")), VAR_LABEL_MESSAGE_BOX_RATIO=StringVar(value=i18n.t("config_window.message_box_ratio.label")),
VAR_DESC_MESSAGE_BOX_RATIO=StringVar(value=i18n.t("config_window.message_box_ratio.desc")), VAR_DESC_MESSAGE_BOX_RATIO=StringVar(value=i18n.t("config_window.message_box_ratio.desc")),
SLIDER_RANGE_MESSAGE_BOX_RATIO=(1, 99), SLIDER_RANGE_MESSAGE_BOX_RATIO=config.MESSAGE_BOX_RATIO_RANGE,
CALLBACK_SET_MESSAGE_BOX_RATIO=None, CALLBACK_SET_MESSAGE_BOX_RATIO=None,
VAR_MESSAGE_BOX_RATIO=IntVar(value=config.MESSAGE_BOX_RATIO), VAR_MESSAGE_BOX_RATIO=IntVar(value=config.MESSAGE_BOX_RATIO),
CALLBACK_BUTTON_PRESS_MESSAGE_BOX_RATIO=self._closeTheCoverOfMainWindow, CALLBACK_BUTTON_PRESS_MESSAGE_BOX_RATIO=self._closeTheCoverOfMainWindow,
@@ -244,9 +242,9 @@ class View():
VAR_LABEL_UI_LANGUAGE=StringVar(value=i18n.t("config_window.ui_language.label")), VAR_LABEL_UI_LANGUAGE=StringVar(value=i18n.t("config_window.ui_language.label")),
VAR_DESC_UI_LANGUAGE=None, VAR_DESC_UI_LANGUAGE=None,
LIST_UI_LANGUAGE=list(selectable_languages.values()), LIST_UI_LANGUAGE=list(config.SELECTABLE_UI_LANGUAGES_DICT.values()),
CALLBACK_SET_UI_LANGUAGE=None, CALLBACK_SET_UI_LANGUAGE=None,
VAR_UI_LANGUAGE=StringVar(value=selectable_languages[config.UI_LANGUAGE]), VAR_UI_LANGUAGE=StringVar(value=config.SELECTABLE_UI_LANGUAGES_DICT[config.UI_LANGUAGE]),
VAR_LABEL_ENABLE_RESTORE_MAIN_WINDOW_GEOMETRY=StringVar(value=i18n.t("config_window.to_restore_main_window_geometry.label")), VAR_LABEL_ENABLE_RESTORE_MAIN_WINDOW_GEOMETRY=StringVar(value=i18n.t("config_window.to_restore_main_window_geometry.label")),
VAR_DESC_ENABLE_RESTORE_MAIN_WINDOW_GEOMETRY=StringVar(value=i18n.t("config_window.to_restore_main_window_geometry.desc")), VAR_DESC_ENABLE_RESTORE_MAIN_WINDOW_GEOMETRY=StringVar(value=i18n.t("config_window.to_restore_main_window_geometry.desc")),
@@ -1111,13 +1109,13 @@ class View():
@staticmethod @staticmethod
def setMainWindowMessageBoxRatio(message_box_ratio:int): def setMainWindowMessageBoxRatio(message_box_ratio:int):
if message_box_ratio <= 0 or message_box_ratio > 99: if message_box_ratio < config.MESSAGE_BOX_RATIO_RANGE[0] or message_box_ratio > config.MESSAGE_BOX_RATIO_RANGE[1]:
raise ValueError("Input must be between 1 and 99 (inclusive)") raise ValueError(f"Input must be between {config.MESSAGE_BOX_RATIO_RANGE[0]} and {config.MESSAGE_BOX_RATIO_RANGE[1]} (inclusive)")
vrct_gui.main_bg_container.grid_rowconfigure(tuple(range(1, 101)), weight=1) vrct_gui.main_bg_container.grid_rowconfigure(tuple(range(config.MESSAGE_BOX_RATIO_RANGE[0], config.MESSAGE_BOX_RATIO_RANGE[1]+2)), weight=1)
textbox_ratio = int(100 - message_box_ratio) textbox_ratio = int((config.MESSAGE_BOX_RATIO_RANGE[1]+1) - message_box_ratio)
message_box_row = int(textbox_ratio + 1) message_box_row = int(textbox_ratio + 1)
message_box_rowwpan = int(100 - textbox_ratio) message_box_rowwpan = int((config.MESSAGE_BOX_RATIO_RANGE[1]+1) - textbox_ratio)
# print(textbox_ratio, message_box_row, message_box_rowwpan) # print(textbox_ratio, message_box_row, message_box_rowwpan)
vrct_gui.main_textbox_container.grid(row=1, rowspan=textbox_ratio, column=0, sticky="nsew") vrct_gui.main_textbox_container.grid(row=1, rowspan=textbox_ratio, column=0, sticky="nsew")
vrct_gui.main_entry_message_container.grid(row=message_box_row, rowspan=message_box_rowwpan, column=0, sticky="nsew") vrct_gui.main_entry_message_container.grid(row=message_box_row, rowspan=message_box_rowwpan, column=0, sticky="nsew")