From 4526c2a28ef1aeb71f40cac38c42c9be17915167 Mon Sep 17 00:00:00 2001 From: Sakamoto Shiina <68018796+ShiinaSakamoto@users.noreply.github.com> Date: Mon, 23 Oct 2023 15:24:16 +0900 Subject: [PATCH 01/44] =?UTF-8?q?[Refactor]=20view.py=E3=81=AE=E3=83=AA?= =?UTF-8?q?=E3=83=95=E3=82=A1=E3=82=AF=E3=82=BF=E3=83=AA=E3=83=B3=E3=82=B0?= =?UTF-8?q?=E3=80=82=E4=B8=8D=E8=A6=81=E3=81=AA=E3=82=B3=E3=83=BC=E3=83=89?= =?UTF-8?q?=E3=81=AE=E5=89=8A=E9=99=A4=E3=82=84=E4=B8=A6=E3=81=B3=E6=9B=BF?= =?UTF-8?q?=E3=81=88=E3=80=81=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0=E3=81=AA=E3=81=A9=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- view.py | 652 +++++++++++++++++++++++-------------------- vrct_gui/vrct_gui.py | 9 - 2 files changed, 347 insertions(+), 314 deletions(-) diff --git a/view.py b/view.py index 3e348a96..ae1948d3 100644 --- a/view.py +++ b/view.py @@ -16,21 +16,15 @@ from config import config class View(): def __init__(self): - self.settings = SimpleNamespace() - # theme = get_appearance_mode() if config.APPEARANCE_THEME == "System" else config.APPEARANCE_THEME - theme = "Dark" - all_ctm = ColorThemeManager(theme) - all_uism = UiScalingManager(config.UI_SCALING) - image_file = ImageFileManager(theme) - + # Localization i18n.load_path.append(os_path.join(os_path.dirname(__file__), "locales")) i18n.set("fallback", "en") # The fallback language is English. i18n.set("skip_locale_root_data", True) i18n.set("filename_format", "{locale}.{format}") i18n.set("enable_memoization", True) - i18n.set("locale", config.UI_LANGUAGE) + # Save settings at startup for items that require a restart VRCT for the changes to apply self.restart_required_configs_pre_data = SimpleNamespace( appearance_theme=config.APPEARANCE_THEME, ui_scaling=config.UI_SCALING, @@ -38,6 +32,12 @@ class View(): ui_language=config.UI_LANGUAGE, ) + self.settings = SimpleNamespace() + # theme = get_appearance_mode() if config.APPEARANCE_THEME == "System" else config.APPEARANCE_THEME + theme = "Dark" + all_ctm = ColorThemeManager(theme) + all_uism = UiScalingManager(config.UI_SCALING) + image_file = ImageFileManager(theme) common_args = { "image_file": image_file, @@ -95,7 +95,7 @@ class View(): VAR_LABEL_CONFIRMATION_MODAL_DENY_BUTTON=StringVar(value=""), VAR_LABEL_CONFIRMATION_MODAL_ACCEPT_BUTTON=StringVar(value=""), - # Open Config Window + # Window Control (Config Window) CALLBACK_CLICKED_OPEN_CONFIG_WINDOW_BUTTON=self._openConfigWindow, CALLBACK_CLICKED_CLOSE_CONFIG_WINDOW_BUTTON=self._closeConfigWindow, CALLBACK_OPEN_CONFIG_WINDOW=None, @@ -253,26 +253,26 @@ class View(): CALLBACK_CHECK_MIC_THRESHOLD=None, VAR_MIC_ENERGY_THRESHOLD__SLIDER=IntVar(value=config.INPUT_MIC_ENERGY_THRESHOLD), VAR_MIC_ENERGY_THRESHOLD__ENTRY=StringVar(value=config.INPUT_MIC_ENERGY_THRESHOLD), - CALLBACK_FOCUS_OUT_MIC_ENERGY_THRESHOLD=self.setLatestConfigVariable_MicEnergyThreshold, + CALLBACK_FOCUS_OUT_MIC_ENERGY_THRESHOLD=self.callbackBindFocusOut_MicEnergyThreshold, VAR_LABEL_MIC_RECORD_TIMEOUT=StringVar(value=i18n.t("config_window.mic_record_timeout.label")), VAR_DESC_MIC_RECORD_TIMEOUT=StringVar(value=i18n.t("config_window.mic_record_timeout.desc")), CALLBACK_SET_MIC_RECORD_TIMEOUT=None, VAR_MIC_RECORD_TIMEOUT=StringVar(value=config.INPUT_MIC_RECORD_TIMEOUT), - CALLBACK_FOCUS_OUT_MIC_RECORD_TIMEOUT=self.setLatestConfigVariable_MicRecordTimeout, + CALLBACK_FOCUS_OUT_MIC_RECORD_TIMEOUT=self.callbackBindFocusOut_MicRecordTimeout, VAR_LABEL_MIC_PHRASE_TIMEOUT=StringVar(value=i18n.t("config_window.mic_phrase_timeout.label")), VAR_DESC_MIC_PHRASE_TIMEOUT=StringVar(value=i18n.t("config_window.mic_phrase_timeout.desc")), CALLBACK_SET_MIC_PHRASE_TIMEOUT=None, VAR_MIC_PHRASE_TIMEOUT=StringVar(value=config.INPUT_MIC_PHRASE_TIMEOUT), - CALLBACK_FOCUS_OUT_MIC_PHRASE_TIMEOUT=self.setLatestConfigVariable_MicPhraseTimeout, + CALLBACK_FOCUS_OUT_MIC_PHRASE_TIMEOUT=self.callbackBindFocusOut_MicPhraseTimeout, VAR_LABEL_MIC_MAX_PHRASES=StringVar(value=i18n.t("config_window.mic_max_phrase.label")), VAR_DESC_MIC_MAX_PHRASES=StringVar(value=i18n.t("config_window.mic_max_phrase.desc")), CALLBACK_SET_MIC_MAX_PHRASES=None, VAR_MIC_MAX_PHRASES=StringVar(value=config.INPUT_MIC_MAX_PHRASES), - CALLBACK_FOCUS_OUT_MIC_MAX_PHRASES=self.setLatestConfigVariable_MicMaxPhrases, + CALLBACK_FOCUS_OUT_MIC_MAX_PHRASES=self.callbackBindFocusOut_MicMaxPhrases, VAR_LABEL_MIC_WORD_FILTER=StringVar(value=i18n.t("config_window.mic_word_filter.label")), VAR_DESC_MIC_WORD_FILTER=StringVar(value=i18n.t("config_window.mic_word_filter.desc")), @@ -290,26 +290,26 @@ class View(): CALLBACK_CHECK_SPEAKER_THRESHOLD=None, VAR_SPEAKER_ENERGY_THRESHOLD__SLIDER=IntVar(value=config.INPUT_SPEAKER_ENERGY_THRESHOLD), VAR_SPEAKER_ENERGY_THRESHOLD__ENTRY=StringVar(value=config.INPUT_SPEAKER_ENERGY_THRESHOLD), - CALLBACK_FOCUS_OUT_SPEAKER_ENERGY_THRESHOLD=self.setLatestConfigVariable_SpeakerEnergyThreshold, + CALLBACK_FOCUS_OUT_SPEAKER_ENERGY_THRESHOLD=self.callbackBindFocusOut_SpeakerEnergyThreshold, VAR_LABEL_SPEAKER_RECORD_TIMEOUT=StringVar(value=i18n.t("config_window.speaker_record_timeout.label")), VAR_DESC_SPEAKER_RECORD_TIMEOUT=StringVar(value=i18n.t("config_window.speaker_record_timeout.desc")), CALLBACK_SET_SPEAKER_RECORD_TIMEOUT=None, VAR_SPEAKER_RECORD_TIMEOUT=StringVar(value=config.INPUT_SPEAKER_RECORD_TIMEOUT), - CALLBACK_FOCUS_OUT_SPEAKER_RECORD_TIMEOUT=self.setLatestConfigVariable_SpeakerRecordTimeout, + CALLBACK_FOCUS_OUT_SPEAKER_RECORD_TIMEOUT=self.callbackBindFocusOut_SpeakerRecordTimeout, VAR_LABEL_SPEAKER_PHRASE_TIMEOUT=StringVar(value=i18n.t("config_window.speaker_phrase_timeout.label")), VAR_DESC_SPEAKER_PHRASE_TIMEOUT=StringVar(value=i18n.t("config_window.speaker_phrase_timeout.desc")), CALLBACK_SET_SPEAKER_PHRASE_TIMEOUT=None, VAR_SPEAKER_PHRASE_TIMEOUT=StringVar(value=config.INPUT_SPEAKER_PHRASE_TIMEOUT), - CALLBACK_FOCUS_OUT_SPEAKER_PHRASE_TIMEOUT=self.setLatestConfigVariable_SpeakerPhraseTimeout, + CALLBACK_FOCUS_OUT_SPEAKER_PHRASE_TIMEOUT=self.callbackBindFocusOut_SpeakerPhraseTimeout, VAR_LABEL_SPEAKER_MAX_PHRASES=StringVar(value=i18n.t("config_window.speaker_max_phrase.label")), VAR_DESC_SPEAKER_MAX_PHRASES=StringVar(value=i18n.t("config_window.speaker_max_phrase.desc")), CALLBACK_SET_SPEAKER_MAX_PHRASES=None, VAR_SPEAKER_MAX_PHRASES=StringVar(value=config.INPUT_SPEAKER_MAX_PHRASES), - CALLBACK_FOCUS_OUT_SPEAKER_MAX_PHRASES=self.setLatestConfigVariable_SpeakerMaxPhrases, + CALLBACK_FOCUS_OUT_SPEAKER_MAX_PHRASES=self.callbackBindFocusOut_SpeakerMaxPhrases, # Others Tab @@ -518,6 +518,23 @@ class View(): # self._insertSampleConversationToTextbox() + +# GUI process + def createGUI(self): + vrct_gui._createGUI(settings=self.settings, view_variable=self.view_variable) + + @staticmethod + def showGUI(): + vrct_gui._showGUI() + + @staticmethod + def startMainLoop(): + vrct_gui._showGUI() + vrct_gui._startMainLoop() + + + +# Common @staticmethod def getAvailableFonts(): available_fonts = list(tk_font.families()) @@ -529,6 +546,8 @@ class View(): def openWebPage(url:str): webbrowser.open_new_tab(url) + +# Open Webpage Functions def openWebPage_Booth(self): self.openWebPage(config.BOOTH_URL) self._printToTextbox_Info(i18n.t("main_window.textbox_system_message.opened_web_page_booth")) @@ -537,6 +556,16 @@ class View(): self.openWebPage(config.DOCUMENTS_URL) self._printToTextbox_Info(i18n.t("main_window.textbox_system_message.opened_web_page_vrct_documents")) +# Widget Control + # Common + @staticmethod + def _clearEntryBox(entry_widget): + entry_widget.delete(0, CTK_END) + + def clearErrorMessage(self): + vrct_gui._clearErrorMessage() + + @staticmethod def showUpdateAvailableButton(): vrct_gui.update_available_container.grid() @@ -550,7 +579,179 @@ class View(): vrct_gui._changeMainWindowWidgetsStatus("disabled", "All") + def enableMainWindowSidebarCompactMode(self): + self.view_variable.IS_MAIN_WINDOW_SIDEBAR_COMPACT_MODE = True + vrct_gui._enableMainWindowSidebarCompactMode() + def disableMainWindowSidebarCompactMode(self): + self.view_variable.IS_MAIN_WINDOW_SIDEBAR_COMPACT_MODE = False + vrct_gui._disableMainWindowSidebarCompactMode() + + + # Config Window + def enableConfigWindowCompactMode(self): + for additional_widget in vrct_gui.config_window.additional_widgets: + additional_widget.grid_remove() + + def disableConfigWindowCompactMode(self): + for additional_widget in vrct_gui.config_window.additional_widgets: + additional_widget.grid() + + + def 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 + ) + + if locale is None: + locale = config.UI_LANGUAGE + + if is_restart_required is True: + self._showRestartButton(locale) + else: + self._hideRestartButton() + + + def _showRestartButton(self, locale:Union[None,str]=None): + self.view_variable.VAR_CONFIG_WINDOW_RESTART_BUTTON_LABEL.set(i18n.t("config_window.restart_message", locale=locale)) + vrct_gui.config_window.restart_button_container.grid() + def _hideRestartButton(self): + vrct_gui.config_window.restart_button_container.grid_remove() + + + + @staticmethod + def setWidgetsStatus_ConfigWindowCompactModeSwitch_Disabled(): + vrct_gui.config_window.setting_box_compact_mode_switch_box.configure(state="disabled") + + @staticmethod + def setWidgetsStatus_ConfigWindowCompactModeSwitch_Normal(): + vrct_gui.config_window.setting_box_compact_mode_switch_box.configure(state="normal") + + + + def openMicEnergyThresholdWidget(self): + self.view_variable.VAR_LABEL_MIC_DYNAMIC_ENERGY_THRESHOLD.set(i18n.t("config_window.mic_dynamic_energy_threshold.label_for_manual")) + self.view_variable.VAR_DESC_MIC_DYNAMIC_ENERGY_THRESHOLD.set(i18n.t("config_window.mic_dynamic_energy_threshold.desc_for_manual")) + vrct_gui.config_window.sb__mic_dynamic_energy_threshold.grid(pady=0) + vrct_gui.config_window.sb__mic_energy_threshold.grid() + + def closeMicEnergyThresholdWidget(self): + self.view_variable.VAR_LABEL_MIC_DYNAMIC_ENERGY_THRESHOLD.set(i18n.t("config_window.mic_dynamic_energy_threshold.label_for_automatic")) + self.view_variable.VAR_DESC_MIC_DYNAMIC_ENERGY_THRESHOLD.set(i18n.t("config_window.mic_dynamic_energy_threshold.desc_for_automatic")) + vrct_gui.config_window.sb__mic_dynamic_energy_threshold.grid(pady=(0,1)) + vrct_gui.config_window.sb__mic_energy_threshold.grid_remove() + + def openSpeakerEnergyThresholdWidget(self): + self.view_variable.VAR_LABEL_SPEAKER_DYNAMIC_ENERGY_THRESHOLD.set(i18n.t("config_window.speaker_dynamic_energy_threshold.label_for_manual")) + self.view_variable.VAR_DESC_SPEAKER_DYNAMIC_ENERGY_THRESHOLD.set(i18n.t("config_window.speaker_dynamic_energy_threshold.desc_for_manual")) + vrct_gui.config_window.sb__speaker_dynamic_energy_threshold.grid(pady=0) + vrct_gui.config_window.sb__speaker_energy_threshold.grid() + + def closeSpeakerEnergyThresholdWidget(self): + self.view_variable.VAR_LABEL_SPEAKER_DYNAMIC_ENERGY_THRESHOLD.set(i18n.t("config_window.speaker_dynamic_energy_threshold.label_for_automatic")) + self.view_variable.VAR_DESC_SPEAKER_DYNAMIC_ENERGY_THRESHOLD.set(i18n.t("config_window.speaker_dynamic_energy_threshold.desc_for_automatic")) + vrct_gui.config_window.sb__speaker_dynamic_energy_threshold.grid(pady=(0,1)) + vrct_gui.config_window.sb__speaker_energy_threshold.grid_remove() + + + + def initMicThresholdCheckButton(self): + if config.CHOICE_MIC_HOST == "NoHost" or config.CHOICE_MIC_DEVICE == "NoDevice": + self.replaceMicThresholdCheckButton_Disabled() + else: + self.replaceMicThresholdCheckButton_Passive() + + @staticmethod + def replaceMicThresholdCheckButton_Active(): + vrct_gui.config_window.sb__progressbar_x_slider__passive_button_mic_energy_threshold.grid_remove() + vrct_gui.config_window.sb__progressbar_x_slider__disabled_button_mic_energy_threshold.grid_remove() + vrct_gui.config_window.sb__progressbar_x_slider__active_button_mic_energy_threshold.grid() + + @staticmethod + def replaceMicThresholdCheckButton_Disabled(): + vrct_gui.config_window.sb__progressbar_x_slider__passive_button_mic_energy_threshold.grid_remove() + vrct_gui.config_window.sb__progressbar_x_slider__active_button_mic_energy_threshold.grid_remove() + vrct_gui.config_window.sb__progressbar_x_slider__disabled_button_mic_energy_threshold.grid() + + @staticmethod + def replaceMicThresholdCheckButton_Passive(): + vrct_gui.config_window.sb__progressbar_x_slider__active_button_mic_energy_threshold.grid_remove() + vrct_gui.config_window.sb__progressbar_x_slider__disabled_button_mic_energy_threshold.grid_remove() + vrct_gui.config_window.sb__progressbar_x_slider__passive_button_mic_energy_threshold.grid() + + + + def initSpeakerThresholdCheckButton(self): + self.replaceSpeakerThresholdCheckButton_Passive() + + @staticmethod + def replaceSpeakerThresholdCheckButton_Active(): + vrct_gui.config_window.sb__progressbar_x_slider__passive_button_speaker_energy_threshold.grid_remove() + vrct_gui.config_window.sb__progressbar_x_slider__disabled_button_speaker_energy_threshold.grid_remove() + vrct_gui.config_window.sb__progressbar_x_slider__active_button_speaker_energy_threshold.grid() + + @staticmethod + def replaceSpeakerThresholdCheckButton_Disabled(): + vrct_gui.config_window.sb__progressbar_x_slider__passive_button_speaker_energy_threshold.grid_remove() + vrct_gui.config_window.sb__progressbar_x_slider__active_button_speaker_energy_threshold.grid_remove() + vrct_gui.config_window.sb__progressbar_x_slider__disabled_button_speaker_energy_threshold.grid() + + @staticmethod + def replaceSpeakerThresholdCheckButton_Passive(): + vrct_gui.config_window.sb__progressbar_x_slider__active_button_speaker_energy_threshold.grid_remove() + vrct_gui.config_window.sb__progressbar_x_slider__disabled_button_speaker_energy_threshold.grid_remove() + vrct_gui.config_window.sb__progressbar_x_slider__passive_button_speaker_energy_threshold.grid() + + + + + def updateList_MicHost(self, new_mic_host_list:list): + self.view_variable.LIST_MIC_HOST = new_mic_host_list + vrct_gui.dropdown_menu_window.updateDropdownMenuValues( + dropdown_menu_widget_id="sb__optionmenu_mic_host", + dropdown_menu_values=new_mic_host_list, + ) + + def updateSelected_MicHost(self, selected_mic_host_name:str): + self.view_variable.VAR_MIC_HOST.set(selected_mic_host_name) + + def updateList_MicDevice(self, new_mic_device_list:list): + self.view_variable.LIST_MIC_DEVICE = new_mic_device_list + vrct_gui.dropdown_menu_window.updateDropdownMenuValues( + dropdown_menu_widget_id="sb__optionmenu_mic_device", + dropdown_menu_values=new_mic_device_list, + ) + + def updateSelected_MicDevice(self, default_selected_mic_device_name:str): + self.view_variable.VAR_MIC_DEVICE.set(default_selected_mic_device_name) + + + @staticmethod + def updateSetProgressBar_MicEnergy(new_mic_energy): + vrct_gui.config_window.sb__progressbar_x_slider__progressbar_mic_energy_threshold.set(new_mic_energy/config.MAX_MIC_ENERGY_THRESHOLD) + + @staticmethod + def initProgressBar_MicEnergy(): + vrct_gui.config_window.sb__progressbar_x_slider__progressbar_mic_energy_threshold.set(0) + + + @staticmethod + def updateSetProgressBar_SpeakerEnergy(new_speaker_energy): + vrct_gui.config_window.sb__progressbar_x_slider__progressbar_speaker_energy_threshold.set(new_speaker_energy/config.MAX_SPEAKER_ENERGY_THRESHOLD) + + @staticmethod + def initProgressBar_SpeakerEnergy(): + vrct_gui.config_window.sb__progressbar_x_slider__progressbar_speaker_energy_threshold.set(0) + + + + + +# Widget Control (Whole) def foregroundOnIfForegroundEnabled(self): if config.ENABLE_FOREGROUND: self.foregroundOn() @@ -569,6 +770,12 @@ class View(): vrct_gui.attributes("-topmost", False) + @staticmethod + def setMainWindowTransparency(transparency:float): + vrct_gui.wm_attributes("-alpha", transparency) + + +# Function def _adjustUiSizeAndRestart(self): current_percentage = int(config.UI_SCALING.replace("%","")) target_percentage = current_percentage - 20 @@ -582,8 +789,22 @@ 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() @@ -629,33 +850,15 @@ class View(): self.view_variable.CALLBACK_HIDE_CONFIRMATION_MODAL=self._hideInformationModal self.view_variable.CALLBACK_ACCEPTED_CONFIRMATION_MODAL=self._hideInformationModal - # self.view_variable.CALLBACK_DENIED_CONFIRMATION_MODAL=self._hideConfirmationModal 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_DENY_BUTTON.set(i18n.t("main_window.confirmation_message.deny_update_software")) self.view_variable.VAR_LABEL_CONFIRMATION_MODAL_ACCEPT_BUTTON.set(i18n.t("main_window.confirmation_message.accept_translation_engine_limit_error")) vrct_gui.information_modal.show(hide_title_bar=False, close_when_focusout=False) - 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() - - - - - - +# Hide Modal def _hideInformationModal(self): vrct_gui.information_modal.hide() vrct_gui.main_window_cover.hide() @@ -667,9 +870,8 @@ class View(): vrct_gui.main_window_cover.hide() self.foregroundOnIfForegroundEnabled() - # def _deniedUpdateSoftware(self): - # self._hideConfirmationModal() +# Process def _startUpdateSoftware(self): self.view_variable.VAR_MESSAGE_CONFIRMATION_MODAL.set(i18n.t("main_window.confirmation_message.updating")) vrct_gui.confirmation_modal.hide_buttons() @@ -679,6 +881,7 @@ class View(): +# Window Control def _openConfigWindow(self): self.view_variable.VAR_LABEL_MAIN_WINDOW_COVER_MESSAGE.set(i18n.t("main_window.cover_message")) callFunctionIfCallable(self.view_variable.CALLBACK_OPEN_CONFIG_WINDOW) @@ -688,8 +891,7 @@ class View(): callFunctionIfCallable(self.view_variable.CALLBACK_CLOSE_CONFIG_WINDOW) vrct_gui._closeConfigWindow() - - +# Window Control (Main Window Cover) def _openTheCoverOfMainWindow(self): vrct_gui.main_window_cover.show() vrct_gui.config_window.lift() @@ -698,14 +900,7 @@ class View(): def _closeTheCoverOfMainWindow(): vrct_gui.main_window_cover.withdraw() - def enableMainWindowSidebarCompactMode(self): - self.view_variable.IS_MAIN_WINDOW_SIDEBAR_COMPACT_MODE = True - vrct_gui._enableMainWindowSidebarCompactMode() - - def disableMainWindowSidebarCompactMode(self): - self.view_variable.IS_MAIN_WINDOW_SIDEBAR_COMPACT_MODE = False - vrct_gui._disableMainWindowSidebarCompactMode() - +# Window Control (Selectable Languages Window) def openSelectableLanguagesWindow_YourLanguage(self, _e): self.view_variable.VAR_TITLE_LABEL_SELECTABLE_LANGUAGE.set(i18n.t("selectable_language_window.title_your_language")) vrct_gui._openSelectableLanguagesWindow("your_language") @@ -715,6 +910,7 @@ class View(): vrct_gui._openSelectableLanguagesWindow("target_language") +# Update GuiVariable (view_variable) def updateGuiVariableByPresetTabNo(self, tab_no:str): self.view_variable.VAR_YOUR_LANGUAGE.set(config.SELECTED_TAB_YOUR_LANGUAGES[tab_no]) self.view_variable.VAR_TARGET_LANGUAGE.set(config.SELECTED_TAB_TARGET_LANGUAGES[tab_no]) @@ -723,7 +919,75 @@ class View(): def updateList_selectableLanguages(self, new_selectable_language_list:list): self.view_variable.LIST_SELECTABLE_LANGUAGES = new_selectable_language_list + # (Config Window Setting Box Tab) + def _updateActiveSettingBoxTabNo(self, active_setting_box_tab_attr_name:str): + self.view_variable.ACTIVE_SETTING_BOX_TAB_ATTR_NAME = active_setting_box_tab_attr_name + +# Set GuiVariable (view_variable) + def setGuiVariable_MicEnergyThreshold(self, value): + self.view_variable.VAR_MIC_ENERGY_THRESHOLD__SLIDER.set(int(value)) + self.view_variable.VAR_MIC_ENERGY_THRESHOLD__ENTRY.set(str(value)) + + + def setGuiVariable_SpeakerEnergyThreshold(self, value): + self.view_variable.VAR_SPEAKER_ENERGY_THRESHOLD__SLIDER.set(int(value)) + self.view_variable.VAR_SPEAKER_ENERGY_THRESHOLD__ENTRY.set(str(value)) + + + def setGuiVariable_MicRecordTimeout(self, value): + self.view_variable.VAR_MIC_RECORD_TIMEOUT.set(str(value)) + + + def setGuiVariable_MicPhraseTimeout(self, value): + self.view_variable.VAR_MIC_PHRASE_TIMEOUT.set(str(value)) + + + def setGuiVariable_MicMaxPhrases(self, value): + self.view_variable.VAR_MIC_MAX_PHRASES.set(str(value)) + + + + def setGuiVariable_SpeakerRecordTimeout(self, value): + self.view_variable.VAR_SPEAKER_RECORD_TIMEOUT.set(str(value)) + + + def setGuiVariable_SpeakerPhraseTimeout(self, value): + self.view_variable.VAR_SPEAKER_PHRASE_TIMEOUT.set(str(value)) + + + def setGuiVariable_SpeakerMaxPhrases(self, value): + self.view_variable.VAR_SPEAKER_MAX_PHRASES.set(str(value)) + + + + + + + def setLatestConfigVariable(self, target_name:str): + match (target_name): + case "MicEnergyThreshold": + self.setGuiVariable_MicEnergyThreshold(config.INPUT_MIC_ENERGY_THRESHOLD) + case "SpeakerEnergyThreshold": + self.setGuiVariable_SpeakerEnergyThreshold(config.INPUT_SPEAKER_ENERGY_THRESHOLD) + case "MicRecordTimeout": + self.setGuiVariable_MicRecordTimeout(config.INPUT_MIC_RECORD_TIMEOUT) + case "MicPhraseTimeout": + self.setGuiVariable_MicPhraseTimeout(config.INPUT_MIC_PHRASE_TIMEOUT) + case "MicMaxPhrases": + self.setGuiVariable_MicMaxPhrases(config.INPUT_MIC_MAX_PHRASES) + case "SpeakerRecordTimeout": + self.setGuiVariable_SpeakerRecordTimeout(config.INPUT_SPEAKER_RECORD_TIMEOUT) + case "SpeakerPhraseTimeout": + self.setGuiVariable_SpeakerPhraseTimeout(config.INPUT_SPEAKER_PHRASE_TIMEOUT) + case "SpeakerMaxPhrases": + self.setGuiVariable_SpeakerMaxPhrases(config.INPUT_SPEAKER_MAX_PHRASES) + + case _: + raise ValueError(f"No matching case for target_name: {target_name}") + + +# Print To Textbox. def printToTextbox_enableTranslation(self): self._printToTextbox_Info(i18n.t("main_window.textbox_system_message.enabled_translation")) def printToTextbox_disableTranslation(self): @@ -821,271 +1085,59 @@ class View(): ) +# Message Box @staticmethod def getTextFromMessageBox(): return vrct_gui.entry_message_box.get() - @staticmethod - def clearMessageBox(): - vrct_gui.entry_message_box.delete(0, CTK_END) - - @staticmethod - def setMainWindowTransparency(transparency:float): - vrct_gui.wm_attributes("-alpha", transparency) - - - def enableConfigWindowCompactMode(self): - for additional_widget in vrct_gui.config_window.additional_widgets: - additional_widget.grid_remove() - - def disableConfigWindowCompactMode(self): - for additional_widget in vrct_gui.config_window.additional_widgets: - additional_widget.grid() + def clearMessageBox(self): + self._clearEntryBox(vrct_gui.entry_message_box) - def createGUI(self): - vrct_gui._createGUI(settings=self.settings, view_variable=self.view_variable) - @staticmethod - def showGUI(): - vrct_gui._showGUI() +# Callback Bind FocusOut + def callbackBindFocusOut_MicEnergyThreshold(self, _e=None): + self.setLatestConfigVariable("MicEnergyThreshold") + self.clearErrorMessage() - @staticmethod - def startMainLoop(): - vrct_gui._showGUI() - vrct_gui._startMainLoop() - - - # Config Window - 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 - ) - - if locale is None: - locale = config.UI_LANGUAGE - - if is_restart_required is True: - self._showRestartButton(locale) - else: - self._hideRestartButton() - - - def _showRestartButton(self, locale:Union[None,str]=None): - self.view_variable.VAR_CONFIG_WINDOW_RESTART_BUTTON_LABEL.set(i18n.t("config_window.restart_message", locale=locale)) - vrct_gui.config_window.restart_button_container.grid() - def _hideRestartButton(self): - vrct_gui.config_window.restart_button_container.grid_remove() - - def _updateActiveSettingBoxTabNo(self, active_setting_box_tab_attr_name:str): - self.view_variable.ACTIVE_SETTING_BOX_TAB_ATTR_NAME = active_setting_box_tab_attr_name - - @staticmethod - def setWidgetsStatus_ConfigWindowCompactModeSwitch_Disabled(): - vrct_gui.config_window.setting_box_compact_mode_switch_box.configure(state="disabled") - - @staticmethod - def setWidgetsStatus_ConfigWindowCompactModeSwitch_Normal(): - vrct_gui.config_window.setting_box_compact_mode_switch_box.configure(state="normal") - - def openMicEnergyThresholdWidget(self): - self.view_variable.VAR_LABEL_MIC_DYNAMIC_ENERGY_THRESHOLD.set(i18n.t("config_window.mic_dynamic_energy_threshold.label_for_manual")) - self.view_variable.VAR_DESC_MIC_DYNAMIC_ENERGY_THRESHOLD.set(i18n.t("config_window.mic_dynamic_energy_threshold.desc_for_manual")) - vrct_gui.config_window.sb__mic_dynamic_energy_threshold.grid(pady=0) - vrct_gui.config_window.sb__mic_energy_threshold.grid() - - def closeMicEnergyThresholdWidget(self): - self.view_variable.VAR_LABEL_MIC_DYNAMIC_ENERGY_THRESHOLD.set(i18n.t("config_window.mic_dynamic_energy_threshold.label_for_automatic")) - self.view_variable.VAR_DESC_MIC_DYNAMIC_ENERGY_THRESHOLD.set(i18n.t("config_window.mic_dynamic_energy_threshold.desc_for_automatic")) - vrct_gui.config_window.sb__mic_dynamic_energy_threshold.grid(pady=(0,1)) - vrct_gui.config_window.sb__mic_energy_threshold.grid_remove() - - def openSpeakerEnergyThresholdWidget(self): - self.view_variable.VAR_LABEL_SPEAKER_DYNAMIC_ENERGY_THRESHOLD.set(i18n.t("config_window.speaker_dynamic_energy_threshold.label_for_manual")) - self.view_variable.VAR_DESC_SPEAKER_DYNAMIC_ENERGY_THRESHOLD.set(i18n.t("config_window.speaker_dynamic_energy_threshold.desc_for_manual")) - vrct_gui.config_window.sb__speaker_dynamic_energy_threshold.grid(pady=0) - vrct_gui.config_window.sb__speaker_energy_threshold.grid() - - def closeSpeakerEnergyThresholdWidget(self): - self.view_variable.VAR_LABEL_SPEAKER_DYNAMIC_ENERGY_THRESHOLD.set(i18n.t("config_window.speaker_dynamic_energy_threshold.label_for_automatic")) - self.view_variable.VAR_DESC_SPEAKER_DYNAMIC_ENERGY_THRESHOLD.set(i18n.t("config_window.speaker_dynamic_energy_threshold.desc_for_automatic")) - vrct_gui.config_window.sb__speaker_dynamic_energy_threshold.grid(pady=(0,1)) - vrct_gui.config_window.sb__speaker_energy_threshold.grid_remove() - - - - def initMicThresholdCheckButton(self): - if config.CHOICE_MIC_HOST == "NoHost" or config.CHOICE_MIC_DEVICE == "NoDevice": - self.replaceMicThresholdCheckButton_Disabled() - else: - self.replaceMicThresholdCheckButton_Passive() - - @staticmethod - def replaceMicThresholdCheckButton_Active(): - vrct_gui.config_window.sb__progressbar_x_slider__passive_button_mic_energy_threshold.grid_remove() - vrct_gui.config_window.sb__progressbar_x_slider__disabled_button_mic_energy_threshold.grid_remove() - vrct_gui.config_window.sb__progressbar_x_slider__active_button_mic_energy_threshold.grid() - - @staticmethod - def replaceMicThresholdCheckButton_Disabled(): - vrct_gui.config_window.sb__progressbar_x_slider__passive_button_mic_energy_threshold.grid_remove() - vrct_gui.config_window.sb__progressbar_x_slider__active_button_mic_energy_threshold.grid_remove() - vrct_gui.config_window.sb__progressbar_x_slider__disabled_button_mic_energy_threshold.grid() - - @staticmethod - def replaceMicThresholdCheckButton_Passive(): - vrct_gui.config_window.sb__progressbar_x_slider__active_button_mic_energy_threshold.grid_remove() - vrct_gui.config_window.sb__progressbar_x_slider__disabled_button_mic_energy_threshold.grid_remove() - vrct_gui.config_window.sb__progressbar_x_slider__passive_button_mic_energy_threshold.grid() - - - - def initSpeakerThresholdCheckButton(self): - self.replaceSpeakerThresholdCheckButton_Passive() - - @staticmethod - def replaceSpeakerThresholdCheckButton_Active(): - vrct_gui.config_window.sb__progressbar_x_slider__passive_button_speaker_energy_threshold.grid_remove() - vrct_gui.config_window.sb__progressbar_x_slider__disabled_button_speaker_energy_threshold.grid_remove() - vrct_gui.config_window.sb__progressbar_x_slider__active_button_speaker_energy_threshold.grid() - - @staticmethod - def replaceSpeakerThresholdCheckButton_Disabled(): - vrct_gui.config_window.sb__progressbar_x_slider__passive_button_speaker_energy_threshold.grid_remove() - vrct_gui.config_window.sb__progressbar_x_slider__active_button_speaker_energy_threshold.grid_remove() - vrct_gui.config_window.sb__progressbar_x_slider__disabled_button_speaker_energy_threshold.grid() - - @staticmethod - def replaceSpeakerThresholdCheckButton_Passive(): - vrct_gui.config_window.sb__progressbar_x_slider__active_button_speaker_energy_threshold.grid_remove() - vrct_gui.config_window.sb__progressbar_x_slider__disabled_button_speaker_energy_threshold.grid_remove() - vrct_gui.config_window.sb__progressbar_x_slider__passive_button_speaker_energy_threshold.grid() - - - - def updateList_MicHost(self, new_mic_host_list:list): - self.view_variable.LIST_MIC_HOST = new_mic_host_list - vrct_gui.dropdown_menu_window.updateDropdownMenuValues( - dropdown_menu_widget_id="sb__optionmenu_mic_host", - dropdown_menu_values=new_mic_host_list, - ) - - def updateSelected_MicHost(self, selected_mic_host_name:str): - self.view_variable.VAR_MIC_HOST.set(selected_mic_host_name) - - def updateList_MicDevice(self, new_mic_device_list:list): - self.view_variable.LIST_MIC_DEVICE = new_mic_device_list - vrct_gui.dropdown_menu_window.updateDropdownMenuValues( - dropdown_menu_widget_id="sb__optionmenu_mic_device", - dropdown_menu_values=new_mic_device_list, - ) - - def updateSelected_MicDevice(self, default_selected_mic_device_name:str): - self.view_variable.VAR_MIC_DEVICE.set(default_selected_mic_device_name) - - - @staticmethod - def updateSetProgressBar_MicEnergy(new_mic_energy): - vrct_gui.config_window.sb__progressbar_x_slider__progressbar_mic_energy_threshold.set(new_mic_energy/config.MAX_MIC_ENERGY_THRESHOLD) - - @staticmethod - def initProgressBar_MicEnergy(): - vrct_gui.config_window.sb__progressbar_x_slider__progressbar_mic_energy_threshold.set(0) - - - @staticmethod - def updateSetProgressBar_SpeakerEnergy(new_speaker_energy): - vrct_gui.config_window.sb__progressbar_x_slider__progressbar_speaker_energy_threshold.set(new_speaker_energy/config.MAX_SPEAKER_ENERGY_THRESHOLD) - - @staticmethod - def initProgressBar_SpeakerEnergy(): - vrct_gui.config_window.sb__progressbar_x_slider__progressbar_speaker_energy_threshold.set(0) - - - - def setGuiVariable_MicEnergyThreshold(self, value): - self.view_variable.VAR_MIC_ENERGY_THRESHOLD__SLIDER.set(int(value)) - self.view_variable.VAR_MIC_ENERGY_THRESHOLD__ENTRY.set(str(value)) - - def setLatestConfigVariable_MicEnergyThreshold(self, _e=None): - self.setGuiVariable_MicEnergyThreshold(config.INPUT_MIC_ENERGY_THRESHOLD) + def callbackBindFocusOut_SpeakerEnergyThreshold(self, _e=None): + self.setLatestConfigVariable("SpeakerEnergyThreshold") self.clearErrorMessage() - def setGuiVariable_SpeakerEnergyThreshold(self, value): - self.view_variable.VAR_SPEAKER_ENERGY_THRESHOLD__SLIDER.set(int(value)) - self.view_variable.VAR_SPEAKER_ENERGY_THRESHOLD__ENTRY.set(str(value)) + def callbackBindFocusOut_MicRecordTimeout(self, _e=None): + self.setLatestConfigVariable("MicRecordTimeout") + self.clearErrorMessage() - def setLatestConfigVariable_SpeakerEnergyThreshold(self, _e=None): - self.setGuiVariable_SpeakerEnergyThreshold(config.INPUT_SPEAKER_ENERGY_THRESHOLD) + def callbackBindFocusOut_MicPhraseTimeout(self, _e=None): + self.setLatestConfigVariable("MicPhraseTimeout") + self.clearErrorMessage() + + def callbackBindFocusOut_MicMaxPhrases(self, _e=None): + self.setLatestConfigVariable("MicMaxPhrases") + self.clearErrorMessage() + + + def callbackBindFocusOut_SpeakerRecordTimeout(self, _e=None): + self.setLatestConfigVariable("SpeakerRecordTimeout") + self.clearErrorMessage() + + def callbackBindFocusOut_SpeakerPhraseTimeout(self, _e=None): + self.setLatestConfigVariable("SpeakerPhraseTimeout") + self.clearErrorMessage() + + def callbackBindFocusOut_SpeakerMaxPhrases(self, _e=None): + self.setLatestConfigVariable("SpeakerMaxPhrases") self.clearErrorMessage() - def setGuiVariable_MicRecordTimeout(self, value, delete=False): - if delete is True: self._clearEntryBox(vrct_gui.config_window.sb__entry_mic_record_timeout) - self.view_variable.VAR_MIC_RECORD_TIMEOUT.set(str(value)) - - def setLatestConfigVariable_MicRecordTimeout(self, _e=None): - self.setGuiVariable_MicRecordTimeout(config.INPUT_MIC_RECORD_TIMEOUT) - self.clearErrorMessage() - - - def setGuiVariable_MicPhraseTimeout(self, value, delete=False): - if delete is True: self._clearEntryBox(vrct_gui.config_window.sb__entry_mic_phrase_timeout) - self.view_variable.VAR_MIC_PHRASE_TIMEOUT.set(str(value)) - - def setLatestConfigVariable_MicPhraseTimeout(self, _e=None): - self.setGuiVariable_MicPhraseTimeout(config.INPUT_MIC_PHRASE_TIMEOUT) - self.clearErrorMessage() - - - def setGuiVariable_MicMaxPhrases(self, value, delete=False): - if delete is True: self._clearEntryBox(vrct_gui.config_window.sb__entry_mic_max_phrases) - self.view_variable.VAR_MIC_MAX_PHRASES.set(str(value)) - - def setLatestConfigVariable_MicMaxPhrases(self, _e=None): - self.setGuiVariable_MicMaxPhrases(config.INPUT_MIC_MAX_PHRASES) - self.clearErrorMessage() - def setGuiVariable_SpeakerRecordTimeout(self, value, delete=False): - if delete is True: self._clearEntryBox(vrct_gui.config_window.sb__entry_speaker_record_timeout) - self.view_variable.VAR_SPEAKER_RECORD_TIMEOUT.set(str(value)) - - def setLatestConfigVariable_SpeakerRecordTimeout(self, _e=None): - self.setGuiVariable_SpeakerRecordTimeout(config.INPUT_SPEAKER_RECORD_TIMEOUT) - self.clearErrorMessage() - - - def setGuiVariable_SpeakerPhraseTimeout(self, value, delete=False): - if delete is True: self._clearEntryBox(vrct_gui.config_window.sb__entry_speaker_phrase_timeout) - self.view_variable.VAR_SPEAKER_PHRASE_TIMEOUT.set(str(value)) - - def setLatestConfigVariable_SpeakerPhraseTimeout(self, _e=None): - self.setGuiVariable_SpeakerPhraseTimeout(config.INPUT_SPEAKER_PHRASE_TIMEOUT) - self.clearErrorMessage() - - - def setGuiVariable_SpeakerMaxPhrases(self, value, delete=False): - if delete is True: self._clearEntryBox(vrct_gui.config_window.sb__entry_speaker_max_phrases) - self.view_variable.VAR_SPEAKER_MAX_PHRASES.set(str(value)) - - def setLatestConfigVariable_SpeakerMaxPhrases(self, _e=None): - self.setGuiVariable_SpeakerMaxPhrases(config.INPUT_SPEAKER_MAX_PHRASES) - self.clearErrorMessage() - - - @staticmethod - def _clearEntryBox(entry_widget): - entry_widget.delete(0, CTK_END) - +# Show Error Message (Config Window) def showErrorMessage_MicEnergyThreshold(self): self._showErrorMessage( vrct_gui.config_window.sb__progressbar_x_slider__entry_mic_energy_threshold, @@ -1162,27 +1214,17 @@ class View(): self._makeInvalidValueErrorMessage(i18n.t("config_window.speaker_dynamic_energy_threshold.no_device_error_message")) ) - def _showErrorMessage(self, target_widget, message): - self.view_variable.VAR_ERROR_MESSAGE.set(message) - vrct_gui._showErrorMessage(target_widget=target_widget) - @staticmethod def _makeInvalidValueErrorMessage(error_message): return i18n.t("config_window.common_error_message.invalid_value") + "\n" + error_message - def clearErrorMessage(self): - vrct_gui._clearErrorMessage() + def _showErrorMessage(self, target_widget, message): + self.view_variable.VAR_ERROR_MESSAGE.set(message) + vrct_gui._showErrorMessage(target_widget=target_widget) - @staticmethod - def showSplash(): - vrct_gui.showSplash() - - @staticmethod - def destroySplash(): - vrct_gui.destroySplash() # These conversations are generated by ChatGPT def _insertSampleConversationToTextbox(self): diff --git a/vrct_gui/vrct_gui.py b/vrct_gui/vrct_gui.py index 73e3d805..06f5f4f5 100644 --- a/vrct_gui/vrct_gui.py +++ b/vrct_gui/vrct_gui.py @@ -134,9 +134,6 @@ class VRCT_GUI(CTk): ) - # self.update() - # self.geometry("{}x{}".format(self.winfo_width(), self.winfo_height())) - def _startMainLoop(self): self.mainloop() @@ -174,9 +171,6 @@ class VRCT_GUI(CTk): def _openSelectableLanguagesWindow(self, selectable_language_window_type): - # print("___________________________________open____________________________________________________") - # print("your", self._view_variable.IS_OPENED_SELECTABLE_YOUR_LANGUAGE_WINDOW) - # print("target", self._view_variable.IS_OPENED_SELECTABLE_TARGET_LANGUAGE_WINDOW) if selectable_language_window_type == "your_language": if self._view_variable.IS_OPENED_SELECTABLE_YOUR_LANGUAGE_WINDOW is False: self.sls__arrow_img_your_language.configure(image=CTkImage(self.settings.main.image_file.ARROW_LEFT, size=self.settings.main.uism.SLS__BOX_OPTION_MENU_ARROW_IMAGE_SIZE)) @@ -208,9 +202,6 @@ class VRCT_GUI(CTk): self.selectable_languages_window.withdraw() - # print("______________________________________close_________________________________________________") - # print("your", self._view_variable.IS_OPENED_SELECTABLE_YOUR_LANGUAGE_WINDOW) - # print("target", self._view_variable.IS_OPENED_SELECTABLE_TARGET_LANGUAGE_WINDOW) if self._view_variable.IS_OPENED_SELECTABLE_TARGET_LANGUAGE_WINDOW is not False or self._view_variable.IS_OPENED_SELECTABLE_YOUR_LANGUAGE_WINDOW is not False: def callback(): self._view_variable.IS_OPENED_SELECTABLE_TARGET_LANGUAGE_WINDOW = False From 78c9a290cc092641bdb7ef9c7968d41756a0dbca Mon Sep 17 00:00:00 2001 From: Sakamoto Shiina <68018796+ShiinaSakamoto@users.noreply.github.com> Date: Mon, 23 Oct 2023 15:35:25 +0900 Subject: [PATCH 02/44] =?UTF-8?q?[Refactor]=20=E3=83=A1=E3=82=A4=E3=83=B3?= =?UTF-8?q?=E7=94=BB=E9=9D=A2=E3=81=AE=E9=96=89=E3=81=98=E3=82=8B=E3=83=9C?= =?UTF-8?q?=E3=82=BF=E3=83=B3=E3=82=92=E6=8A=BC=E3=81=97=E3=81=9F=E3=81=A8?= =?UTF-8?q?=E3=81=8D=E3=81=AE=E5=87=A6=E7=90=86=E3=82=92CALLBACK=E9=96=A2?= =?UTF-8?q?=E6=95=B0=E3=81=AB=E3=81=97=E3=81=A6view.py=E3=81=AB=E7=A7=BB?= =?UTF-8?q?=E5=8B=95=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- view.py | 2 ++ vrct_gui/main_window/createMainWindowWidgets.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/view.py b/view.py index ae1948d3..40cc0cb9 100644 --- a/view.py +++ b/view.py @@ -85,6 +85,8 @@ class View(): CALLBACK_RESTART_SOFTWARE=None, CALLBACK_UPDATE_SOFTWARE=None, + CALLBACK_QUIT_VRCT=vrct_gui._quitVRCT, + CALLBACK_WHEN_DETECT_WINDOW_OVERED_SIZE=self._showDisplayOverUiSizeConfirmationModal, # Confirmation Modal diff --git a/vrct_gui/main_window/createMainWindowWidgets.py b/vrct_gui/main_window/createMainWindowWidgets.py index 2bcea306..088a3075 100644 --- a/vrct_gui/main_window/createMainWindowWidgets.py +++ b/vrct_gui/main_window/createMainWindowWidgets.py @@ -6,7 +6,7 @@ from utils import callFunctionIfCallable from ..ui_utils import createButtonWithImage, getImagePath, bindButtonFunctionAndColor def createMainWindowWidgets(vrct_gui, settings, view_variable): - vrct_gui.protocol("WM_DELETE_WINDOW", vrct_gui._quitVRCT) + vrct_gui.protocol("WM_DELETE_WINDOW", lambda: callFunctionIfCallable(view_variable.CALLBACK_QUIT_VRCT)) vrct_gui.iconbitmap(getImagePath("vrct_logo_mark_black.ico")) From 7bbf539f140e04f497b1aa1db48bce836394cad2 Mon Sep 17 00:00:00 2001 From: Sakamoto Shiina <68018796+ShiinaSakamoto@users.noreply.github.com> Date: Tue, 24 Oct 2023 09:43:04 +0900 Subject: [PATCH 03/44] =?UTF-8?q?[bugfix]=20Word=20filter=E3=81=A7?= =?UTF-8?q?=E6=A4=9C=E5=87=BA=E3=81=95=E3=82=8C=E3=81=9F=E9=9A=9B=E3=81=AB?= =?UTF-8?q?=E3=80=81=E3=83=86=E3=82=AD=E3=82=B9=E3=83=88=E3=83=9C=E3=83=83?= =?UTF-8?q?=E3=82=AF=E3=82=B9=E3=81=AB=E3=83=AD=E3=82=B0=E3=81=8C=E9=80=81?= =?UTF-8?q?=E4=BF=A1=E3=81=95=E3=82=8C=E3=81=AA=E3=81=84=E3=83=90=E3=82=B0?= =?UTF-8?q?=E3=82=92=E4=BF=AE=E6=AD=A3=E3=80=82i18n=E3=81=AE=E6=8C=87?= =?UTF-8?q?=E5=AE=9A=E3=81=AE=E4=BB=95=E6=96=B9=E3=81=8C=E6=82=AA=E3=81=8B?= =?UTF-8?q?=E3=81=A3=E3=81=9F=E3=81=BF=E3=81=9F=E3=81=84=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- view.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/view.py b/view.py index 40cc0cb9..6a5ff860 100644 --- a/view.py +++ b/view.py @@ -1031,7 +1031,7 @@ class View(): # 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) + self._printToTextbox_Info(i18n.t("main_window.textbox_system_message.detected_by_word_filter", detected_message=detected_message)) From 8cffee569a4fb0a8310a1dac45855f82f8d2370e Mon Sep 17 00:00:00 2001 From: Sakamoto Shiina <68018796+ShiinaSakamoto@users.noreply.github.com> Date: Tue, 24 Oct 2023 16:07:29 +0900 Subject: [PATCH 04/44] =?UTF-8?q?[Refactor]=20Textbox=E3=81=AEUi=20Size?= =?UTF-8?q?=E3=82=92=E7=8B=AC=E7=AB=8B=E3=81=95=E3=81=9B=E3=82=8B=E3=81=9F?= =?UTF-8?q?=E3=82=81=E3=81=AE=E6=BA=96=E5=82=99=E3=81=A7=E3=83=AA=E3=83=95?= =?UTF-8?q?=E3=82=A1=E3=82=AF=E3=82=BF=E3=83=AA=E3=83=B3=E3=82=B0=E3=80=82?= =?UTF-8?q?=E3=82=AF=E3=83=A9=E3=82=B9=E3=81=AA=E3=81=A9=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- view.py | 6 +- vrct_gui/_printToTextbox.py | 150 ++++++++++++++++------- vrct_gui/ui_managers/UiScalingManager.py | 8 +- vrct_gui/ui_utils/ui_utils.py | 8 ++ vrct_gui/vrct_gui.py | 18 +-- 5 files changed, 132 insertions(+), 58 deletions(-) diff --git a/view.py b/view.py index 6a5ff860..51215f7a 100644 --- a/view.py +++ b/view.py @@ -517,7 +517,7 @@ class View(): # Insert sample conversation for testing. - # self._insertSampleConversationToTextbox() + self._insertSampleConversationToTextbox() @@ -1054,11 +1054,11 @@ class View(): @staticmethod - def _printToTextbox_Info(info_message): + def _printToTextbox_Info(info_message, **kwargs): vrct_gui._printToTextbox( target_type="SYSTEM", original_message=info_message, - # translated_message="", + **kwargs, ) diff --git a/vrct_gui/_printToTextbox.py b/vrct_gui/_printToTextbox.py index 943b047d..ddc4b411 100644 --- a/vrct_gui/_printToTextbox.py +++ b/vrct_gui/_printToTextbox.py @@ -1,66 +1,116 @@ from datetime import datetime from customtkinter import CTkFont +from .ui_utils import calculateUiSize -def _printToTextbox(vrct_gui, - settings, - target_type, - original_message=None, - translated_message=None, - tags=None, - disable_print_to_textbox_all:bool=False, - ): +class _PrintToTextbox(): + def __init__( + self, + vrct_gui, + settings, + ): - now_raw_data = datetime.now() - # now = now_raw_data.strftime("%H:%M:%S") - now_hm = now_raw_data.strftime("%H:%M") - # set target textbox widget + self.vrct_gui = vrct_gui + self.settings = settings - is_only_one_message = True if original_message is None or translated_message is None or translated_message == "" else False - - match (target_type): - case "SYSTEM": - target_textbox = vrct_gui.textbox_system - case "SENT": - target_textbox = vrct_gui.textbox_sent - case "RECEIVED": - target_textbox = vrct_gui.textbox_received - case (_): - raise ValueError(f"No matching case for target_type: {target_type}") + self._DEFAULT_TEXTBOX_FIRST_INSERT_SPACING = self.settings.uism.TEXTBOX_FIRST_INSERT_SPACING + self._DEFAULT_TEXTBOX_FONT_SIZE__LABEL = self.settings.uism.TEXTBOX_FONT_SIZE__LABEL + self._DEFAULT_TEXTBOX_FONT_SIZE__TIMESTAMP = self.settings.uism.TEXTBOX_FONT_SIZE__TIMESTAMP + self._DEFAULT_TEXTBOX_FONT_SIZE__SYSTEM_TEXT_FONT = self.settings.uism.TEXTBOX_FONT_SIZE__SYSTEM_TEXT_FONT + self._DEFAULT_TEXTBOX_FONT_SIZE__SECONDARY_TEXT_FONT = self.settings.uism.TEXTBOX_FONT_SIZE__SECONDARY_TEXT_FONT + self._DEFAULT_TEXTBOX_FONT_SIZE__MAIN_TEXT_FONT = self.settings.uism.TEXTBOX_FONT_SIZE__MAIN_TEXT_FONT - def printEachTextbox(target_textbox): + + self.textbox_first_insert_spacing = None + self.textbox_font_size__label = None + self.textbox_font_size__timestamp = None + self.textbox_font_size__system_text_font = None + self.textbox_font_size__secondary_text_font = None + self.textbox_font_size__main_text_font = None + + + self.all_textbox_widgets = [self.vrct_gui.textbox_all, self.vrct_gui.textbox_system, self.vrct_gui.textbox_sent, self.vrct_gui.textbox_received] + + + self.setTagsSettings() + + + def printToTextbox(self, target_type, original_message=None, translated_message=None, to_print_to_textbox_all:bool=True): + self._printEachTextbox( + target_textbox=self._getTargetTextboxWidget(target_type), + print_type=target_type, + original_message=original_message, + translated_message=translated_message, + ) + + # To automatically print the same log to the textbox_all widget as well. + if to_print_to_textbox_all is True: + self._printEachTextbox( + target_textbox=self._getTargetTextboxWidget("ALL"), + print_type=target_type, + original_message=original_message, + translated_message=translated_message, + ) + + def setTagsSettings(self, custom_font_size_scale:float=1.0): + # Calculate Textbox's ui size by default size * textbox_ui_scale + self.textbox_first_insert_spacing = calculateUiSize(self._DEFAULT_TEXTBOX_FIRST_INSERT_SPACING, custom_font_size_scale) + self.textbox_font_size__label = calculateUiSize(self._DEFAULT_TEXTBOX_FONT_SIZE__LABEL, custom_font_size_scale) + self.textbox_font_size__timestamp = calculateUiSize(self._DEFAULT_TEXTBOX_FONT_SIZE__TIMESTAMP, custom_font_size_scale) + self.textbox_font_size__system_text_font = calculateUiSize(self._DEFAULT_TEXTBOX_FONT_SIZE__SYSTEM_TEXT_FONT, custom_font_size_scale) + self.textbox_font_size__secondary_text_font = calculateUiSize(self._DEFAULT_TEXTBOX_FONT_SIZE__SECONDARY_TEXT_FONT, custom_font_size_scale) + self.textbox_font_size__main_text_font = calculateUiSize(self._DEFAULT_TEXTBOX_FONT_SIZE__MAIN_TEXT_FONT, custom_font_size_scale) + + for each_textbox_widget in self.all_textbox_widgets: + self._setTagsSettings(target_textbox=each_textbox_widget) + + + def _setTagsSettings(self, target_textbox): target_textbox.tag_config("JUSTIFY_CENTER", justify="center") target_textbox.tag_config("JUSTIFY_RIGHT", justify="right") target_textbox.tag_config("JUSTIFY_LEFT", justify="left") # common tag settings # target_textbox._textbox.tag_configure("START", spacing1=16) - target_textbox._textbox.tag_configure("LABEL", font=CTkFont(family=settings.FONT_FAMILY, size=settings.uism.TEXTBOX_FONT_SIZE__LABEL, weight="normal")) - target_textbox._textbox.tag_configure("TIMESTAMP", font=CTkFont(family=settings.FONT_FAMILY, size=settings.uism.TEXTBOX_FONT_SIZE__TIMESTAMP, weight="normal"), foreground=settings.ctm.TEXTBOX_TIMESTAMP_TEXT_COLOR) - target_textbox._textbox.tag_configure("SECONDARY_TEXT_FONT", font=CTkFont(family=settings.FONT_FAMILY, size=settings.uism.TEXTBOX_FONT_SIZE__SECONDARY_TEXT_FONT, weight="normal")) - target_textbox._textbox.tag_configure("MAIN_TEXT_FONT", font=CTkFont(family=settings.FONT_FAMILY, size=settings.uism.TEXTBOX_FONT_SIZE__MAIN_TEXT_FONT, weight="normal")) + target_textbox.tag_config("FIRST_INSERT_SPACING", spacing1=self.textbox_first_insert_spacing) + target_textbox._textbox.tag_configure("LABEL", font=CTkFont(family=self.settings.FONT_FAMILY, size=self.textbox_font_size__label, weight="normal")) + target_textbox._textbox.tag_configure("TIMESTAMP", font=CTkFont(family=self.settings.FONT_FAMILY, size=self.textbox_font_size__timestamp, weight="normal"), foreground=self.settings.ctm.TEXTBOX_TIMESTAMP_TEXT_COLOR) + target_textbox._textbox.tag_configure("SECONDARY_TEXT_FONT", font=CTkFont(family=self.settings.FONT_FAMILY, size=self.textbox_font_size__secondary_text_font, weight="normal")) + target_textbox._textbox.tag_configure("MAIN_TEXT_FONT", font=CTkFont(family=self.settings.FONT_FAMILY, size=self.textbox_font_size__main_text_font, weight="normal")) # System Tag Settings - target_textbox.tag_config("FIRST_INSERT_SPACING", spacing1=settings.uism.TEXTBOX_FIRST_INSERT_SPACING) - target_textbox.tag_config("SYSTEM_TAG", foreground=settings.ctm.TEXTBOX_SYSTEM_TAG_TEXT_COLOR) - target_textbox.tag_config("SYSTEM_TEXT", foreground=settings.ctm.TEXTBOX_TEXT_SUB_COLOR) - target_textbox._textbox.tag_configure("SYSTEM_TEXT_FONT", font=CTkFont(family=settings.FONT_FAMILY, size=settings.uism.TEXTBOX_FONT_SIZE__SYSTEM_TEXT_FONT, weight="normal")) + target_textbox.tag_config("SYSTEM_TAG", foreground=self.settings.ctm.TEXTBOX_SYSTEM_TAG_TEXT_COLOR) + target_textbox.tag_config("SYSTEM_TEXT", foreground=self.settings.ctm.TEXTBOX_TEXT_SUB_COLOR) + target_textbox._textbox.tag_configure("SYSTEM_TEXT_FONT", font=CTkFont(family=self.settings.FONT_FAMILY, size=self.textbox_font_size__system_text_font, weight="normal")) # Sent Tag Settings - target_textbox.tag_config("SENT_TAG", foreground=settings.ctm.TEXTBOX_SENT_TAG_TEXT_COLOR) - target_textbox.tag_config("SENT_TEXT", foreground=settings.ctm.TEXTBOX_TEXT_COLOR) - target_textbox.tag_config("SENT_SUB_TEXT", foreground=settings.ctm.TEXTBOX_TEXT_SUB_COLOR) + target_textbox.tag_config("SENT_TAG", foreground=self.settings.ctm.TEXTBOX_SENT_TAG_TEXT_COLOR) + target_textbox.tag_config("SENT_TEXT", foreground=self.settings.ctm.TEXTBOX_TEXT_COLOR) + target_textbox.tag_config("SENT_SUB_TEXT", foreground=self.settings.ctm.TEXTBOX_TEXT_SUB_COLOR) # Received Tag Settings - target_textbox.tag_config("RECEIVED_TAG", foreground=settings.ctm.TEXTBOX_RECEIVED_TAG_TEXT_COLOR) - target_textbox.tag_config("RECEIVED_TEXT", foreground=settings.ctm.TEXTBOX_TEXT_COLOR) - target_textbox.tag_config("RECEIVED_SUB_TEXT", foreground=settings.ctm.TEXTBOX_TEXT_SUB_COLOR) + target_textbox.tag_config("RECEIVED_TAG", foreground=self.settings.ctm.TEXTBOX_RECEIVED_TAG_TEXT_COLOR) + target_textbox.tag_config("RECEIVED_TEXT", foreground=self.settings.ctm.TEXTBOX_TEXT_COLOR) + target_textbox.tag_config("RECEIVED_SUB_TEXT", foreground=self.settings.ctm.TEXTBOX_TEXT_SUB_COLOR) + + + def _printEachTextbox( + self, + target_textbox, + print_type, + original_message, + translated_message, + ): + now_raw_data = datetime.now() + now_hm = now_raw_data.strftime("%H:%M") + + is_only_one_message = True if original_message is None or translated_message is None or translated_message == "" else False FAKE_MARGIN = " " # insert target_textbox.configure(state="normal") target_textbox.insert("end", "\n") - match (target_type): + match (print_type): case "SYSTEM": target_textbox.insert("end", "System", ("SYSTEM_TAG", "FIRST_INSERT_SPACING", "JUSTIFY_CENTER", "LABEL")) target_textbox.insert("end", FAKE_MARGIN+original_message+FAKE_MARGIN, ("SYSTEM_TEXT", "SYSTEM_TEXT_FONT", "JUSTIFY_CENTER")) @@ -92,7 +142,23 @@ def _printToTextbox(vrct_gui, target_textbox.configure(state="disabled") target_textbox.see("end") - printEachTextbox(target_textbox) - # To automatically print the same log to the textbox_all widget as well. - if disable_print_to_textbox_all is not True: printEachTextbox(vrct_gui.textbox_all) \ No newline at end of file + + + + + + def _getTargetTextboxWidget(self, target_type): + match (target_type): + case "ALL": + target_textbox = self.vrct_gui.textbox_all + case "SYSTEM": + target_textbox = self.vrct_gui.textbox_system + case "SENT": + target_textbox = self.vrct_gui.textbox_sent + case "RECEIVED": + target_textbox = self.vrct_gui.textbox_received + case (_): + raise ValueError(f"No matching case for target_type: {target_type}") + + return target_textbox \ No newline at end of file diff --git a/vrct_gui/ui_managers/UiScalingManager.py b/vrct_gui/ui_managers/UiScalingManager.py index dc385b34..8f5a9c09 100644 --- a/vrct_gui/ui_managers/UiScalingManager.py +++ b/vrct_gui/ui_managers/UiScalingManager.py @@ -1,5 +1,7 @@ from types import SimpleNamespace +from ..ui_utils import calculateUiSize + class UiScalingManager(): def __init__(self, scaling_percentage): scaling_float = int(scaling_percentage.replace("%", "")) / 100 @@ -274,11 +276,7 @@ class UiScalingManager(): def _calculateUiSize(self, default_size, is_allowed_odd:bool=False, is_zero_allowed:bool=False): - size = int(default_size * self.SCALING_FLOAT) - size += 1 if not is_allowed_odd and size % 2 != 0 else 0 - if size <= 0: - size = 0 if is_zero_allowed else 1 - + size = calculateUiSize(default_size, self.SCALING_FLOAT, is_allowed_odd, is_zero_allowed) return size @staticmethod diff --git a/vrct_gui/ui_utils/ui_utils.py b/vrct_gui/ui_utils/ui_utils.py index bf64a985..5138fb5c 100644 --- a/vrct_gui/ui_utils/ui_utils.py +++ b/vrct_gui/ui_utils/ui_utils.py @@ -42,6 +42,14 @@ def getLongestText(text_list:list): longest_text = text return longest_text +def calculateUiSize(default_size, scaling_float, is_allowed_odd:bool=False, is_zero_allowed:bool=False): + size = int(default_size * scaling_float) + size += 1 if not is_allowed_odd and size % 2 != 0 else 0 + if size <= 0: + size = 0 if is_zero_allowed else 1 + + return size + def bindEnterAndLeaveColor(target_widgets, enter_color, leave_color): for target_widget in target_widgets: target_widget.bind("", lambda e, widgets=target_widgets: [w.configure(fg_color=enter_color) for w in widgets], "+") diff --git a/vrct_gui/vrct_gui.py b/vrct_gui/vrct_gui.py index 06f5f4f5..b423cb1d 100644 --- a/vrct_gui/vrct_gui.py +++ b/vrct_gui/vrct_gui.py @@ -8,7 +8,7 @@ from ._CreateDropdownMenuWindow import _CreateDropdownMenuWindow from ._changeMainWindowWidgetsStatus import _changeMainWindowWidgetsStatus from ._changeConfigWindowWidgetsStatus import _changeConfigWindowWidgetsStatus from ._CreateConfirmationModal import _CreateConfirmationModal -from ._printToTextbox import _printToTextbox +from ._PrintToTextbox import _PrintToTextbox from .main_window import createMainWindowWidgets from .config_window import ConfigWindow @@ -133,6 +133,12 @@ class VRCT_GUI(CTk): modal_type="information" ) + self.print_to_textbox = _PrintToTextbox( + vrct_gui=self, + settings=self.settings.main, + ) + + def _startMainLoop(self): @@ -229,14 +235,10 @@ class VRCT_GUI(CTk): target_names=target_names, ) - def _printToTextbox(self, target_type, original_message=None, translated_message=None): - _printToTextbox( - vrct_gui=self, - settings=self.settings.main, + def _printToTextbox(self, target_type, **kwargs): + self.print_to_textbox.printToTextbox( target_type=target_type, - original_message=original_message, - translated_message=translated_message, - tags=target_type, + **kwargs ) def _setDefaultActiveLanguagePresetTab(self, tab_no:str): From 8f2934e5101953492e195b9127be3fd7420a5b98 Mon Sep 17 00:00:00 2001 From: Sakamoto Shiina <68018796+ShiinaSakamoto@users.noreply.github.com> Date: Tue, 24 Oct 2023 18:12:39 +0900 Subject: [PATCH 05/44] =?UTF-8?q?[Update]=20=E3=83=86=E3=82=AD=E3=82=B9?= =?UTF-8?q?=E3=83=88=E3=83=9C=E3=83=83=E3=82=AF=E3=82=B9=E3=81=AE=E3=83=95?= =?UTF-8?q?=E3=82=A9=E3=83=B3=E3=83=88=E3=82=B5=E3=82=A4=E3=82=BA=E3=82=92?= =?UTF-8?q?=E3=80=81UI=E5=85=A8=E4=BD=93=E3=81=AE=E3=82=B5=E3=82=A4?= =?UTF-8?q?=E3=82=BA=E3=81=A8=E3=81=AF=E5=88=A5=E3=81=A7=E3=83=A6=E3=83=BC?= =?UTF-8?q?=E3=82=B6=E3=83=BC=E3=81=8C=E5=A4=89=E3=81=88=E3=82=89=E3=82=8C?= =?UTF-8?q?=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E3=80=82=20(UI=20size,=20s?= =?UTF-8?q?caling=E3=82=92=E5=9F=BA=E6=BA=96=E3=81=A8=E3=81=97=E3=81=9F?= =?UTF-8?q?=E5=80=8D=E7=8E=87)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.py | 12 ++++++++++++ controller.py | 6 ++++++ locales/en.yml | 4 ++++ locales/ja.yml | 4 ++++ view.py | 14 +++++++++++++- vrct_gui/_printToTextbox.py | 6 +++++- .../createSettingBox_Appearance.py | 16 ++++++++++++++++ vrct_gui/vrct_gui.py | 1 + 8 files changed, 61 insertions(+), 2 deletions(-) diff --git a/config.py b/config.py index 65f8fa15..afd25f43 100644 --- a/config.py +++ b/config.py @@ -225,6 +225,17 @@ class Config: self._UI_SCALING = value saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + @property + @json_serializable('TEXTBOX_UI_SCALING') + def TEXTBOX_UI_SCALING(self): + return self._TEXTBOX_UI_SCALING + + @TEXTBOX_UI_SCALING.setter + def TEXTBOX_UI_SCALING(self, value): + if type(value) is int and 50 <= value <= 200: + self._TEXTBOX_UI_SCALING = value + saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + @property @json_serializable('FONT_FAMILY') def FONT_FAMILY(self): @@ -546,6 +557,7 @@ class Config: self._TRANSPARENCY = 100 self._APPEARANCE_THEME = "System" self._UI_SCALING = "100%" + self._TEXTBOX_UI_SCALING = 100 self._FONT_FAMILY = "Yu Gothic UI" self._UI_LANGUAGE = "en" self._CHOICE_MIC_HOST = getDefaultInputDevice()["host"]["name"] diff --git a/controller.py b/controller.py index d8dfc1fb..f3ee030d 100644 --- a/controller.py +++ b/controller.py @@ -352,6 +352,11 @@ def callbackSetUiScaling(value): print("callbackSetUiScaling_new_scaling_float", new_scaling_float) view.showRestartButtonIfRequired() +def callbackSetTextboxUiScaling(value): + print("callbackSetTextboxUiScaling", int(value)) + config.TEXTBOX_UI_SCALING = int(value) + view.setMainWindowTextboxUiSize(config.TEXTBOX_UI_SCALING/100) + def callbackSetFontFamily(value): print("callbackSetFontFamily", value) config.FONT_FAMILY = value @@ -694,6 +699,7 @@ def createMainWindow(): "callback_set_transparency": callbackSetTransparency, "callback_set_appearance": callbackSetAppearance, "callback_set_ui_scaling": callbackSetUiScaling, + "callback_set_textbox_ui_scaling": callbackSetTextboxUiScaling, "callback_set_font_family": callbackSetFontFamily, "callback_set_ui_language": callbackSetUiLanguage, diff --git a/locales/en.yml b/locales/en.yml index 3e5c4aff..3af662cf 100644 --- a/locales/en.yml +++ b/locales/en.yml @@ -95,6 +95,10 @@ config_window: ui_size: label: UI Size + textbox_ui_size: + label: Text Box Font Size + desc: You can adjust the font size used in the logs relative to the UI size. + font_family: label: Font Family diff --git a/locales/ja.yml b/locales/ja.yml index 952dbfc3..e608c2b2 100644 --- a/locales/ja.yml +++ b/locales/ja.yml @@ -95,6 +95,10 @@ config_window: ui_size: label: UIサイズ + textbox_ui_size: + label: テキストボックス フォントサイズ + desc: ログã«è¡¨ç¤ºã•れるフォントã®ã‚µã‚¤ã‚ºã‚’ã€UIサイズを基準ã«ã—ã¦å€çŽ‡ã‚’å¤‰ãˆã‚‰ã‚Œã¾ã™ã€‚ + font_family: label: 使用フォント diff --git a/view.py b/view.py index 51215f7a..6f70b83c 100644 --- a/view.py +++ b/view.py @@ -211,6 +211,14 @@ class View(): CALLBACK_SET_UI_SCALING=None, VAR_UI_SCALING=StringVar(value=config.UI_SCALING), + VAR_LABEL_TEXTBOX_UI_SCALING=StringVar(value=i18n.t("config_window.textbox_ui_size.label")), + VAR_DESC_TEXTBOX_UI_SCALING=StringVar(value=i18n.t("config_window.textbox_ui_size.desc")), + SLIDER_RANGE_TEXTBOX_UI_SCALING=(50, 200), + CALLBACK_SET_TEXTBOX_UI_SCALING=None, + VAR_TEXTBOX_UI_SCALING=IntVar(value=config.TEXTBOX_UI_SCALING), + CALLBACK_BUTTON_PRESS_TEXTBOX_UI_SCALING=self._closeTheCoverOfMainWindow, + CALLBACK_BUTTON_RELEASE_TEXTBOX_UI_SCALING=self._openTheCoverOfMainWindow, + VAR_LABEL_FONT_FAMILY=StringVar(value=i18n.t("config_window.font_family.label")), VAR_DESC_FONT_FAMILY=None, LIST_FONT_FAMILY=self.getAvailableFonts(), @@ -432,6 +440,7 @@ class View(): self.view_variable.CALLBACK_SET_APPEARANCE = config_window_registers.get("callback_set_appearance", None) self.view_variable.CALLBACK_SET_UI_SCALING = config_window_registers.get("callback_set_ui_scaling", None) + self.view_variable.CALLBACK_SET_TEXTBOX_UI_SCALING = config_window_registers.get("callback_set_textbox_ui_scaling", None) self.view_variable.CALLBACK_SET_FONT_FAMILY = config_window_registers.get("callback_set_font_family", None) self.view_variable.CALLBACK_SET_UI_LANGUAGE = config_window_registers.get("callback_set_ui_language", None) @@ -517,7 +526,7 @@ class View(): # Insert sample conversation for testing. - self._insertSampleConversationToTextbox() + # self._insertSampleConversationToTextbox() @@ -776,6 +785,9 @@ class View(): def setMainWindowTransparency(transparency:float): vrct_gui.wm_attributes("-alpha", transparency) + @staticmethod + def setMainWindowTextboxUiSize(custom_font_size_scale:float): + vrct_gui.print_to_textbox.setTagsSettings(custom_font_size_scale=custom_font_size_scale) # Function def _adjustUiSizeAndRestart(self): diff --git a/vrct_gui/_printToTextbox.py b/vrct_gui/_printToTextbox.py index ddc4b411..6d68cfdc 100644 --- a/vrct_gui/_printToTextbox.py +++ b/vrct_gui/_printToTextbox.py @@ -7,10 +7,12 @@ class _PrintToTextbox(): self, vrct_gui, settings, + init_scaling:float, ): self.vrct_gui = vrct_gui self.settings = settings + self.init_scaling = init_scaling self._DEFAULT_TEXTBOX_FIRST_INSERT_SPACING = self.settings.uism.TEXTBOX_FIRST_INSERT_SPACING self._DEFAULT_TEXTBOX_FONT_SIZE__LABEL = self.settings.uism.TEXTBOX_FONT_SIZE__LABEL @@ -32,7 +34,7 @@ class _PrintToTextbox(): self.all_textbox_widgets = [self.vrct_gui.textbox_all, self.vrct_gui.textbox_system, self.vrct_gui.textbox_sent, self.vrct_gui.textbox_received] - self.setTagsSettings() + self.setTagsSettings(self.init_scaling) def printToTextbox(self, target_type, original_message=None, translated_message=None, to_print_to_textbox_all:bool=True): @@ -63,6 +65,8 @@ class _PrintToTextbox(): for each_textbox_widget in self.all_textbox_widgets: self._setTagsSettings(target_textbox=each_textbox_widget) + each_textbox_widget.see("end") + def _setTagsSettings(self, target_textbox): 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 cc33684c..d0a30746 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 @@ -18,6 +18,9 @@ def createSettingBox_Appearance(setting_box_wrapper, config_window, settings, vi def optionmenu_ui_scaling_callback(value): callFunctionIfCallable(view_variable.CALLBACK_SET_UI_SCALING, value) + def slider_text_box_ui_scaling_callback(value): + callFunctionIfCallable(view_variable.CALLBACK_SET_TEXTBOX_UI_SCALING, value) + def optionmenu_font_family_callback(value): callFunctionIfCallable(view_variable.CALLBACK_SET_FONT_FAMILY, value) @@ -64,6 +67,19 @@ def createSettingBox_Appearance(setting_box_wrapper, config_window, settings, vi config_window.sb__ui_scaling.grid(row=row) row+=1 + config_window.sb__textbox_uis_scaling = createSettingBoxSlider( + for_var_label_text=view_variable.VAR_LABEL_TEXTBOX_UI_SCALING, + for_var_desc_text=view_variable.VAR_DESC_TEXTBOX_UI_SCALING, + slider_attr_name="sb__slider_transparency", + slider_range=view_variable.SLIDER_RANGE_TEXTBOX_UI_SCALING, + command=lambda value: slider_text_box_ui_scaling_callback(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, + ) + config_window.sb__textbox_uis_scaling.grid(row=row) + row+=1 + config_window.sb__font_family = createSettingBoxDropdownMenu( for_var_label_text=view_variable.VAR_LABEL_FONT_FAMILY, diff --git a/vrct_gui/vrct_gui.py b/vrct_gui/vrct_gui.py index b423cb1d..da9939dd 100644 --- a/vrct_gui/vrct_gui.py +++ b/vrct_gui/vrct_gui.py @@ -136,6 +136,7 @@ class VRCT_GUI(CTk): self.print_to_textbox = _PrintToTextbox( vrct_gui=self, settings=self.settings.main, + init_scaling=(self._view_variable.VAR_TEXTBOX_UI_SCALING.get()/100) ) From c6d52f05c53029186d5c133bef81583e62b9bd84 Mon Sep 17 00:00:00 2001 From: Sakamoto Shiina <68018796+ShiinaSakamoto@users.noreply.github.com> Date: Tue, 24 Oct 2023 19:39:32 +0900 Subject: [PATCH 06/44] =?UTF-8?q?[Update]=20Config=20Window:=20Slider?= =?UTF-8?q?=E7=B3=BB=E3=81=ABtooltip=E8=BF=BD=E5=8A=A0=E3=80=82Thanks=20of?= =?UTF-8?q?=20Akascape.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- requirements.txt | 3 ++- .../setting_box_containers/_SettingBoxGenerator.py | 11 +++++++++++ vrct_gui/ui_managers/ColorThemeManager.py | 2 ++ vrct_gui/ui_managers/UiScalingManager.py | 1 + 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index a399733d..42f4be2c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,4 +5,5 @@ customtkinter == 5.2.0 deepl == 1.15.0 flashtext == 2.7 pyyaml == 6.0.1 -python-i18n == 0.3.9 \ No newline at end of file +python-i18n == 0.3.9 +CTkToolTip == 0.8 \ 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 f11c56b5..100b761a 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 @@ -3,6 +3,7 @@ from types import SimpleNamespace from typing import Union from customtkinter import CTkOptionMenu, CTkFont, CTkFrame, CTkLabel, CTkRadioButton, CTkEntry, CTkSlider, CTkSwitch, CTkCheckBox, CTkProgressBar +from CTkToolTip import * from vrct_gui.ui_utils import createButtonWithImage, getLatestWidth, createOptionMenuBox from vrct_gui import vrct_gui @@ -260,11 +261,21 @@ class _SettingBoxGenerator(): ) setattr(self.config_window, slider_attr_name, slider_widget) + slider_tooltip = CTkToolTip( + slider_widget, + message=variable.get(), + delay=0, + bg_color=self.settings.ctm.SB__SLIDER_TOOLTIP_BG_COLOR, + text_color=self.settings.ctm.SB__SLIDER_TOOLTIP_TEXT_COLOR, + font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.SB__SLIDER_TOOLTIP_FONT_SIZE, weight="normal"), + ) + slider_widget.grid(row=1, column=SETTING_BOX_COLUMN, sticky="e") if slider_bind__ButtonPress is not None: def adjusted_slider_bind__ButtonPress(_e): command(_e) + slider_tooltip.configure(message=slider_widget.get()) slider_bind__ButtonPress() slider_widget.configure(command=adjusted_slider_bind__ButtonPress) diff --git a/vrct_gui/ui_managers/ColorThemeManager.py b/vrct_gui/ui_managers/ColorThemeManager.py index ab55e996..19f9f884 100644 --- a/vrct_gui/ui_managers/ColorThemeManager.py +++ b/vrct_gui/ui_managers/ColorThemeManager.py @@ -282,6 +282,8 @@ class ColorThemeManager(): self.config_window.SB__SLIDER_PROGRESS_BG_COLOR = self.DARK_500_COLOR self.config_window.SB__SLIDER_BUTTON_COLOR = self.DARK_700_COLOR self.config_window.SB__SLIDER_BUTTON_HOVERED_COLOR = self.DARK_600_COLOR + self.config_window.SB__SLIDER_TOOLTIP_BG_COLOR = self.DARK_850_COLOR + self.config_window.SB__SLIDER_TOOLTIP_TEXT_COLOR = self.DARK_200_COLOR self.config_window.SB__SWITCH_BOX_BG_COLOR = self.DARK_800_COLOR self.config_window.SB__SWITCH_BOX_ACTIVE_BG_COLOR = self.PRIMARY_500_COLOR diff --git a/vrct_gui/ui_managers/UiScalingManager.py b/vrct_gui/ui_managers/UiScalingManager.py index 8f5a9c09..fae26c79 100644 --- a/vrct_gui/ui_managers/UiScalingManager.py +++ b/vrct_gui/ui_managers/UiScalingManager.py @@ -262,6 +262,7 @@ class UiScalingManager(): self.config_window.SB__SLIDER_WIDTH = self._calculateUiSize(200) self.config_window.SB__SLIDER_HEIGHT = self._calculateUiSize(16) + self.config_window.SB__SLIDER_TOOLTIP_FONT_SIZE = self._calculateUiSize(16) self.config_window.SB__PROGRESSBAR_X_SLIDER__ENTRY_WIDTH = self.config_window.RESPONSIVE_UI_SIZE_INT_50 self.config_window.SB__PROGRESSBAR_X_SLIDER__ENTRY_HEIGHT = self.config_window.SB__ENTRY_HEIGHT From b7af5699961407d756b90a9fdfb524f53627c189 Mon Sep 17 00:00:00 2001 From: Sakamoto Shiina <68018796+ShiinaSakamoto@users.noreply.github.com> Date: Tue, 24 Oct 2023 20:29:22 +0900 Subject: [PATCH 07/44] =?UTF-8?q?[Update]=20Config=20Window:=20slider=20to?= =?UTF-8?q?oltips.=20=E3=82=B9=E3=83=86=E3=83=83=E3=83=97=E3=82=921?= =?UTF-8?q?=E3=81=9A=E3=81=A4=E3=81=AB=E3=81=97=E3=81=A6=E3=80=81=E3=81=95?= =?UTF-8?q?=E3=82=89=E3=81=AB=E3=83=91=E3=83=BC=E3=82=BB=E3=83=B3=E3=83=86?= =?UTF-8?q?=E3=83=BC=E3=82=B8=E8=A1=A8=E8=A8=98=E3=81=99=E3=82=8B=E3=82=88?= =?UTF-8?q?=E3=81=86=E3=81=AB=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils.py | 5 ++++- view.py | 4 +++- .../setting_box_containers/_SettingBoxGenerator.py | 14 +++++++++++--- .../createSettingBox_Appearance.py | 2 ++ 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/utils.py b/utils.py index 6efe6d0a..242faf15 100644 --- a/utils.py +++ b/utils.py @@ -26,4 +26,7 @@ def generatePercentageStringsList(start=40, end=200, step=10): strings = [] for percent in range(start, end + 1, step): strings.append(f"{percent}%") - return strings \ No newline at end of file + return strings + +def intToPercentageStringsFormatter(value:int): + return f"{value}%" \ No newline at end of file diff --git a/view.py b/view.py index 6f70b83c..2a309a06 100644 --- a/view.py +++ b/view.py @@ -10,7 +10,7 @@ from languages import selectable_languages from customtkinter import StringVar, IntVar, BooleanVar, END as CTK_END, get_appearance_mode from vrct_gui.ui_managers import ColorThemeManager, ImageFileManager, UiScalingManager from vrct_gui import vrct_gui -from utils import callFunctionIfCallable, generatePercentageStringsList +from utils import callFunctionIfCallable, generatePercentageStringsList, intToPercentageStringsFormatter from config import config @@ -176,6 +176,8 @@ class View(): VAR_CONFIG_WINDOW_COMPACT_MODE_LABEL=StringVar(value=i18n.t("config_window.compact_mode")), VAR_CONFIG_WINDOW_RESTART_BUTTON_LABEL=StringVar(value=i18n.t("config_window.restart_message")), + CALLBACK_SLIDER_TOOLTIP_PERCENTAGE_FORMATTER=intToPercentageStringsFormatter, + # Side Menu Labels VAR_SIDE_MENU_LABEL_APPEARANCE=StringVar(value=i18n.t("config_window.side_menu_labels.appearance")), 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 100b761a..3c152958 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 @@ -239,11 +239,14 @@ class _SettingBoxGenerator(): slider_number_of_steps: Union[int, None] = None, slider_bind__ButtonPress=None, - slider_bind__ButtonRelease=None + slider_bind__ButtonRelease=None, + sliderTooltipFormatter=None, ): (setting_box_frame, setting_box_item_frame) = self._createSettingBoxFrame(slider_attr_name, for_var_label_text, for_var_desc_text) + if slider_number_of_steps is None: + slider_number_of_steps = int(slider_range[1] - slider_range[0]) slider_widget = CTkSlider( setting_box_item_frame, @@ -261,9 +264,14 @@ class _SettingBoxGenerator(): ) setattr(self.config_window, slider_attr_name, slider_widget) + def getSliderValueWAfterFormatting(): + return sliderTooltipFormatter(variable.get()) if sliderTooltipFormatter else variable.get() + + + slider_tooltip = CTkToolTip( slider_widget, - message=variable.get(), + message=getSliderValueWAfterFormatting(), delay=0, bg_color=self.settings.ctm.SB__SLIDER_TOOLTIP_BG_COLOR, text_color=self.settings.ctm.SB__SLIDER_TOOLTIP_TEXT_COLOR, @@ -275,7 +283,7 @@ class _SettingBoxGenerator(): if slider_bind__ButtonPress is not None: def adjusted_slider_bind__ButtonPress(_e): command(_e) - slider_tooltip.configure(message=slider_widget.get()) + slider_tooltip.configure(message=getSliderValueWAfterFormatting()) slider_bind__ButtonPress() slider_widget.configure(command=adjusted_slider_bind__ButtonPress) 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 d0a30746..dd5f68ab 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 @@ -38,6 +38,7 @@ def createSettingBox_Appearance(setting_box_wrapper, config_window, settings, vi variable=view_variable.VAR_TRANSPARENCY, slider_bind__ButtonPress=view_variable.CALLBACK_BUTTON_PRESS_TRANSPARENCY, slider_bind__ButtonRelease=view_variable.CALLBACK_BUTTON_RELEASE_TRANSPARENCY, + sliderTooltipFormatter=view_variable.CALLBACK_SLIDER_TOOLTIP_PERCENTAGE_FORMATTER, ) config_window.sb__transparency.grid(row=row) row+=1 @@ -76,6 +77,7 @@ def createSettingBox_Appearance(setting_box_wrapper, config_window, settings, vi variable=view_variable.VAR_TEXTBOX_UI_SCALING, slider_bind__ButtonPress=view_variable.CALLBACK_BUTTON_PRESS_TEXTBOX_UI_SCALING, slider_bind__ButtonRelease=view_variable.CALLBACK_BUTTON_RELEASE_TEXTBOX_UI_SCALING, + sliderTooltipFormatter=view_variable.CALLBACK_SLIDER_TOOLTIP_PERCENTAGE_FORMATTER, ) config_window.sb__textbox_uis_scaling.grid(row=row) row+=1 From 6119e254a60e149c2e79e4725ac75df6268ef6fb Mon Sep 17 00:00:00 2001 From: Sakamoto Shiina <68018796+ShiinaSakamoto@users.noreply.github.com> Date: Tue, 24 Oct 2023 21:29:19 +0900 Subject: [PATCH 08/44] [fix/tmp] copy _printToTextbox --- vrct_gui/{_printToTextbox.py => _PrintToTextbox_copy.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename vrct_gui/{_printToTextbox.py => _PrintToTextbox_copy.py} (100%) diff --git a/vrct_gui/_printToTextbox.py b/vrct_gui/_PrintToTextbox_copy.py similarity index 100% rename from vrct_gui/_printToTextbox.py rename to vrct_gui/_PrintToTextbox_copy.py From a6f5e30e39e4ea59dc083ca2a25978b0e846fb2f Mon Sep 17 00:00:00 2001 From: Sakamoto Shiina <68018796+ShiinaSakamoto@users.noreply.github.com> Date: Tue, 24 Oct 2023 21:30:37 +0900 Subject: [PATCH 09/44] =?UTF-8?q?[fix]=20=5FPrintToTextbox:=20=E3=83=95?= =?UTF-8?q?=E3=82=A1=E3=82=A4=E3=83=AB=E5=90=8D=E3=81=AE=E5=A4=89=E6=9B=B4?= =?UTF-8?q?=E3=81=8C=E3=83=88=E3=83=A9=E3=83=83=E3=82=AD=E3=83=B3=E3=82=B0?= =?UTF-8?q?=E3=81=95=E3=82=8C=E3=81=A6=E3=81=8A=E3=82=89=E3=81=9A=E3=80=81?= =?UTF-8?q?=E8=AA=AD=E8=BE=BC=E3=81=BF=E6=99=82=E3=81=AB=E3=82=A8=E3=83=A9?= =?UTF-8?q?=E3=83=BC=E3=81=8C=E3=81=A7=E3=81=A6=E3=81=84=E3=81=9F=E3=81=AE?= =?UTF-8?q?=E3=82=92=E7=84=A1=E7=90=86=E3=82=84=E3=82=8A=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vrct_gui/{_PrintToTextbox_copy.py => _PrintToTextbox.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename vrct_gui/{_PrintToTextbox_copy.py => _PrintToTextbox.py} (100%) diff --git a/vrct_gui/_PrintToTextbox_copy.py b/vrct_gui/_PrintToTextbox.py similarity index 100% rename from vrct_gui/_PrintToTextbox_copy.py rename to vrct_gui/_PrintToTextbox.py From fc8b8ac5eec8304c748cef68d7ef397e82396fbe Mon Sep 17 00:00:00 2001 From: misyaguziya Date: Wed, 25 Oct 2023 22:45:28 +0900 Subject: [PATCH 10/44] =?UTF-8?q?=F0=9F=91=8D[Update]=20Model=20:=20Add=20?= =?UTF-8?q?Installer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.py | 15 +++++- installer/Install.nsi | 108 ++++++++++++++++++++++++++++++++++++++++ installer/Uninstall.nsi | 14 ++++++ model.py | 4 +- 4 files changed, 138 insertions(+), 3 deletions(-) create mode 100644 installer/Install.nsi create mode 100644 installer/Uninstall.nsi diff --git a/config.py b/config.py index afd25f43..cf2c91bf 100644 --- a/config.py +++ b/config.py @@ -1,6 +1,8 @@ import sys import inspect from os import path as os_path +from os import getenv as os_getenv +from os import makedirs as os_makedirs from json import load as json_load from json import dump as json_dump import tkinter as tk @@ -39,10 +41,18 @@ class Config: def VERSION(self): return self._VERSION + @property + def LOCAL_PATH(self): + return self._LOCAL_PATH + @property def PATH_CONFIG(self): return self._PATH_CONFIG + @property + def PATH_LOGS(self): + return self._PATH_LOGS + @property def GITHUB_URL(self): return self._GITHUB_URL @@ -520,7 +530,10 @@ class Config: def init_config(self): # Read Only self._VERSION = "2.0.0" - self._PATH_CONFIG = os_path.join(os_path.dirname(sys.argv[0]), "config.json") + self._LOCAL_PATH = os_path.join(os_getenv('LOCALAPPDATA'), "VRCT") + self._PATH_CONFIG = os_path.join(self._LOCAL_PATH, "config.json") + self._PATH_LOGS = os_path.join(self._LOCAL_PATH, "logs") + os_makedirs(self._LOCAL_PATH, exist_ok=True) self._GITHUB_URL = "https://api.github.com/repos/misyaguziya/VRCT/releases/latest" self._BOOTH_URL = "https://misyaguziya.booth.pm/" self._DOCUMENTS_URL = "https://mzsoftware.notion.site/VRCT-Documents-be79b7a165f64442ad8f326d86c22246" diff --git a/installer/Install.nsi b/installer/Install.nsi new file mode 100644 index 00000000..f32b7b0f --- /dev/null +++ b/installer/Install.nsi @@ -0,0 +1,108 @@ +# Modern UI +!include MUI2.nsh +# nsDialogs +!include nsDialogs.nsh +# LogicLib +!include LogicLib.nsh + +# ƒAƒvƒŠƒP[ƒVƒ‡ƒ“–¼ +Name "VRCT Setup" +# 쬂³‚ê‚éƒCƒ“ƒXƒg[ƒ‰ +OutFile "VRCT_Setup.exe" + +RequestExecutionLevel admin +ShowInstDetails show + +# ˆ³kƒƒ\ƒbƒh +SetCompressor lzma +# ƒCƒ“ƒXƒg[ƒ‹‚³‚ê‚éƒfƒBƒŒƒNƒgƒŠ +InstallDir "$PROGRAMFILES\VRCT" +# XPƒ}ƒjƒtƒFƒXƒg +XPStyle on +# ƒy[ƒW +!insertmacro MUI_PAGE_WELCOME +!insertmacro MUI_PAGE_DIRECTORY +Page custom OptionPage OptionPageLeave +!insertmacro MUI_PAGE_INSTFILES +!insertmacro MUI_PAGE_FINISH +# ƒAƒ“ƒCƒ“ƒXƒg[ƒ‰ ƒy[ƒW +!insertmacro MUI_UNPAGE_WELCOME +!insertmacro MUI_UNPAGE_CONFIRM +!insertmacro MUI_UNPAGE_INSTFILES +!insertmacro MUI_UNPAGE_FINISH +# “ú–{ŒêUI +!insertmacro MUI_LANGUAGE "Japanese" +# ƒCƒ“ƒ^[ƒtƒF[ƒX Ý’è +!define MUI_ABORTWARNING +# •Ï” +Var Checkbox_InstallDocs +Var Dialog_Options +Var InstallDocs +Var Label_DescriptionOptions + +# ‰Šú‰»ŽžƒR[ƒ‹ƒoƒbƒN +Function .onInit + # ƒIƒvƒVƒ‡ƒ“’l‚ð‰Šú‰»‚µ‚Ü‚·B + StrCpy $InstallDocs ${BST_CHECKED} +FunctionEnd + +# ƒIƒvƒVƒ‡ƒ“ ƒy[ƒW +Function OptionPage + # nsDialogs‚ð쬂µ‚Ü‚·B + nsDialogs::Create 1018 + # 쬂³‚ꂽnsDialogs‚ð•Ï”‚É‘ã“ü‚µ‚Ü‚·B + Pop $Dialog_Options + + ${If} $Dialog_Options == error + # ƒ_ƒCƒAƒƒO‚Ì쬂Ɏ¸”s‚µ‚½ê‡‚É‚ÍI—¹‚µ‚Ü‚·B + Abort + ${EndIf} + + # ƒ‰ƒxƒ‹‚ð쬂µ‚Ü‚·B + ${NSD_CreateLabel} 0 0 100% 12u "ƒIƒvƒVƒ‡ƒ“‚ð‘I‘ð‚µ‚Ä‚­‚¾‚³‚¢B" + # ƒ‰ƒxƒ‹‚ð•Ï”‚É‘ã“ü‚µ‚Ü‚·B + Pop $Label_DescriptionOptions + + ${NSD_CreateCheckbox} 0 13u 100% 12u "ƒhƒLƒ…ƒƒ“ƒg‚ðƒCƒ“ƒXƒg[ƒ‹‚·‚é(&D)" + Pop $Checkbox_InstallDocs + + ${If} $InstallDocs == ${BST_CHECKED} + # ƒ`ƒFƒbƒN‚ª“ü—ÍÏ‚Ìê‡Aƒ`ƒFƒbƒNƒ{ƒbƒNƒX‚Ƀ`ƒFƒbƒN‚ð“ü‚ê‚Ü‚·B + ${NSD_Check} $Checkbox_InstallDocs + ${EndIf} + nsDialogs::Show +FunctionEnd + +# ƒIƒvƒVƒ‡ƒ“ ƒy[ƒW‘ÞoƒR[ƒ‹ƒoƒbƒN +Function OptionPageLeave + ${NSD_GetState} $Checkbox_InstallDocs $InstallDocs +FunctionEnd + +# ƒfƒtƒHƒ‹ƒg ƒZƒNƒVƒ‡ƒ“ +Section + # o—Íæ‚ðŽw’肵‚Ü‚·B + SetOutPath "$INSTDIR" + # ƒCƒ“ƒXƒg[ƒ‹‚³‚ê‚éƒtƒ@ƒCƒ‹ + File "..\dist\VRCT.exe" + + ${If} $InstallDocs == ${BST_CHECKED} + # ƒhƒLƒ…ƒƒ“ƒg‚ðƒCƒ“ƒXƒg[ƒ‹‚·‚éê‡ + # o—Íæ‚ðŽw’肵‚Ü‚·B + SetOutPath "$INSTDIR\docs" + # ƒCƒ“ƒXƒg[ƒ‹‚³‚ê‚éƒtƒ@ƒCƒ‹ + File "..\dist\README.txt" + ${EndIf} + + # ƒAƒ“ƒCƒ“ƒXƒg[ƒ‰‚ðo—Í + WriteUninstaller "$INSTDIR\Uninstall.exe" + # ƒXƒ^[ƒg ƒƒjƒ…[‚ɃVƒ‡[ƒgƒJƒbƒg‚ð“o˜^ + CreateDirectory "$SMPROGRAMS\VRCT" + SetOutPath "$INSTDIR" + CreateShortcut "$SMPROGRAMS\VRCT\VRCT.lnk" "$INSTDIR\VRCT.exe" "" + # ƒŒƒWƒXƒgƒŠ‚É“o˜^ + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\VRCT" "DisplayName" "VRCT" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\VRCT" "UninstallString" '"$INSTDIR\Uninstall.exe"' +SectionEnd + +# ƒAƒ“ƒCƒ“ƒXƒg[ƒ‰ +!include Uninstall.nsi diff --git a/installer/Uninstall.nsi b/installer/Uninstall.nsi new file mode 100644 index 00000000..4187f6c5 --- /dev/null +++ b/installer/Uninstall.nsi @@ -0,0 +1,14 @@ +# アンインストーラ +Section "Uninstall" + # アンインストーラを削除 + Delete "$INSTDIR\Uninstall.exe" + # ファイルを削除 + Delete "$INSTDIR\VRCT.exe" + # ディレクトリを削除 + RMDir /r "$INSTDIR" + # スタート メニューã‹ã‚‰å‰Šé™¤ + Delete "$SMPROGRAMS\VRCT\VRCT.lnk" + RMDir "$SMPROGRAMS\VRCT" + # レジストリ キーを削除 + DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\VRCT" +SectionEnd \ No newline at end of file diff --git a/model.py b/model.py index 51a881dd..1be1ce9f 100644 --- a/model.py +++ b/model.py @@ -91,10 +91,10 @@ class Model: return result def startLogger(self): - os_makedirs(os_path.join(os_path.dirname(sys.argv[0]), "logs"), exist_ok=True) + os_makedirs(config.PATH_LOGS, exist_ok=True) logger = getLogger() logger.setLevel(INFO) - file_name = os_path.join(os_path.dirname(sys.argv[0]), "logs", f"{datetime.now().strftime('%Y-%m-%d_%H-%M-%S')}.log") + file_name = os_path.join(config.PATH_LOGS, f"{datetime.now().strftime('%Y-%m-%d_%H-%M-%S')}.log") file_handler = FileHandler(file_name, encoding="utf-8", delay=True) formatter = Formatter("[%(asctime)s] %(message)s") file_handler.setFormatter(formatter) From ad3a8f38ae591734036f61090ea259725e8b3388 Mon Sep 17 00:00:00 2001 From: misyaguziya Date: Thu, 26 Oct 2023 03:52:12 +0900 Subject: [PATCH 11/44] =?UTF-8?q?=F0=9F=91=8D[Update]=20Model=20:=20update?= =?UTF-8?q?=20installer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.bat | 2 +- installer/Install.nsi | 21 ++++++++++++++++++++- installer/Uninstall.nsi | 6 ++++-- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/build.bat b/build.bat index 6dcbbf71..7b723572 100644 --- a/build.bat +++ b/build.bat @@ -1 +1 @@ -pyinstaller --onedir --onefile --windowed --clean --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 \ No newline at end of file +pyinstaller --windowed --clean --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 \ No newline at end of file diff --git a/installer/Install.nsi b/installer/Install.nsi index f32b7b0f..6221b3a5 100644 --- a/installer/Install.nsi +++ b/installer/Install.nsi @@ -5,6 +5,7 @@ # LogicLib !include LogicLib.nsh +Unicode True # ƒAƒvƒŠƒP[ƒVƒ‡ƒ“–¼ Name "VRCT Setup" # 쬂³‚ê‚éƒCƒ“ƒXƒg[ƒ‰ @@ -36,14 +37,17 @@ Page custom OptionPage OptionPageLeave !define MUI_ABORTWARNING # •Ï” Var Checkbox_InstallDocs +Var Checkbox_InstallShortcut Var Dialog_Options Var InstallDocs +Var InstallShortcut Var Label_DescriptionOptions # ‰Šú‰»ŽžƒR[ƒ‹ƒoƒbƒN Function .onInit # ƒIƒvƒVƒ‡ƒ“’l‚ð‰Šú‰»‚µ‚Ü‚·B StrCpy $InstallDocs ${BST_CHECKED} + StrCpy $InstallShortcut ${BST_CHECKED} FunctionEnd # ƒIƒvƒVƒ‡ƒ“ ƒy[ƒW @@ -66,16 +70,24 @@ Function OptionPage ${NSD_CreateCheckbox} 0 13u 100% 12u "ƒhƒLƒ…ƒƒ“ƒg‚ðƒCƒ“ƒXƒg[ƒ‹‚·‚é(&D)" Pop $Checkbox_InstallDocs + ${NSD_CreateCheckbox} 0 26u 100% 12u "ƒfƒXƒNƒgƒbƒv‚ɃVƒ‡[ƒgƒJƒbƒg‚ðì¬(&D)" + Pop $Checkbox_InstallShortcut + ${If} $InstallDocs == ${BST_CHECKED} # ƒ`ƒFƒbƒN‚ª“ü—ÍÏ‚Ìê‡Aƒ`ƒFƒbƒNƒ{ƒbƒNƒX‚Ƀ`ƒFƒbƒN‚ð“ü‚ê‚Ü‚·B ${NSD_Check} $Checkbox_InstallDocs ${EndIf} + ${If} $InstallShortcut == ${BST_CHECKED} + # ƒ`ƒFƒbƒN‚ª“ü—ÍÏ‚Ìê‡Aƒ`ƒFƒbƒNƒ{ƒbƒNƒX‚Ƀ`ƒFƒbƒN‚ð“ü‚ê‚Ü‚·B + ${NSD_Check} $Checkbox_InstallShortcut + ${EndIf} nsDialogs::Show FunctionEnd # ƒIƒvƒVƒ‡ƒ“ ƒy[ƒW‘ÞoƒR[ƒ‹ƒoƒbƒN Function OptionPageLeave ${NSD_GetState} $Checkbox_InstallDocs $InstallDocs + ${NSD_GetState} $Checkbox_InstallShortcut $InstallShortcut FunctionEnd # ƒfƒtƒHƒ‹ƒg ƒZƒNƒVƒ‡ƒ“ @@ -83,7 +95,7 @@ Section # o—Íæ‚ðŽw’肵‚Ü‚·B SetOutPath "$INSTDIR" # ƒCƒ“ƒXƒg[ƒ‹‚³‚ê‚éƒtƒ@ƒCƒ‹ - File "..\dist\VRCT.exe" + File /r "..\dist\VRCT\" ${If} $InstallDocs == ${BST_CHECKED} # ƒhƒLƒ…ƒƒ“ƒg‚ðƒCƒ“ƒXƒg[ƒ‹‚·‚éê‡ @@ -95,6 +107,12 @@ Section # ƒAƒ“ƒCƒ“ƒXƒg[ƒ‰‚ðo—Í WriteUninstaller "$INSTDIR\Uninstall.exe" + + ${If} $InstallDocs == ${BST_CHECKED} + # ƒfƒXƒNƒgƒbƒv‚ɃVƒ‡[ƒgƒJƒbƒg‚ðì¬ + CreateShortCut "$DESKTOP\VRCT.lnk" "$INSTDIR\VRCT.exe" + ${EndIf} + # ƒXƒ^[ƒg ƒƒjƒ…[‚ɃVƒ‡[ƒgƒJƒbƒg‚ð“o˜^ CreateDirectory "$SMPROGRAMS\VRCT" SetOutPath "$INSTDIR" @@ -102,6 +120,7 @@ Section # ƒŒƒWƒXƒgƒŠ‚É“o˜^ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\VRCT" "DisplayName" "VRCT" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\VRCT" "UninstallString" '"$INSTDIR\Uninstall.exe"' + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\VRCT" "DisplayIcon" '"$INSTDIR\_internal\img\vrct_logo_mark_black.ico"' SectionEnd # ƒAƒ“ƒCƒ“ƒXƒg[ƒ‰ diff --git a/installer/Uninstall.nsi b/installer/Uninstall.nsi index 4187f6c5..f44b7ac7 100644 --- a/installer/Uninstall.nsi +++ b/installer/Uninstall.nsi @@ -1,14 +1,16 @@ # アンインストーラ Section "Uninstall" # アンインストーラを削除 - Delete "$INSTDIR\Uninstall.exe" + # Delete "$INSTDIR\Uninstall.exe" # ファイルを削除 - Delete "$INSTDIR\VRCT.exe" + # Delete "$INSTDIR\VRCT.exe" # ディレクトリを削除 RMDir /r "$INSTDIR" # スタート メニューã‹ã‚‰å‰Šé™¤ Delete "$SMPROGRAMS\VRCT\VRCT.lnk" RMDir "$SMPROGRAMS\VRCT" + # デスクトップ ショートカットを削除 + Delete "$DESKTOP\VRCT.lnk" # レジストリ キーを削除 DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\VRCT" SectionEnd \ No newline at end of file From 85f285271e09f12bfb8713b01acabb76ea230157 Mon Sep 17 00:00:00 2001 From: misyaguziya Date: Thu, 26 Oct 2023 03:52:56 +0900 Subject: [PATCH 12/44] =?UTF-8?q?=F0=9F=90=9B[bugfix]=20Model=20:=20remake?= =?UTF-8?q?=20restart.bat?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- batch/restart.bat | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/batch/restart.bat b/batch/restart.bat index b86be544..c3b7418f 100644 --- a/batch/restart.bat +++ b/batch/restart.bat @@ -1,4 +1,7 @@ @if not "%~0"=="%~dp0.\%~nx0" start /min cmd /c,"%~dp0.\%~nx0" %* & goto :eof -taskkill /im %1 /F -START "" %1 \ No newline at end of file +set name=%1 + +taskkill /im %name% /F + +START "" %name% \ No newline at end of file From b4479e570ad75d1aa2c091962561181206bcaaba Mon Sep 17 00:00:00 2001 From: Sakamoto Shiina <68018796+ShiinaSakamoto@users.noreply.github.com> Date: Thu, 26 Oct 2023 19:26:41 +0900 Subject: [PATCH 13/44] =?UTF-8?q?[Update]=20Config=20Window:=20Mic/Speaker?= =?UTF-8?q?=20Energy=20Threshold=20Check.=20=E3=81=97=E3=81=8D=E3=81=84?= =?UTF-8?q?=E5=80=A4=E3=82=92=E8=B6=85=E3=81=88=E3=82=8B=E3=81=A8=E8=89=B2?= =?UTF-8?q?=E3=81=8C=E5=A4=89=E3=82=8F=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?= =?UTF-8?q?=E3=80=82=20ProgressBar=20Widget=E3=82=92=E5=A4=89=E5=8C=96?= =?UTF-8?q?=E3=81=95=E3=81=9B=E3=82=8B=E3=81=AE=E3=81=AF=E5=95=8F=E9=A1=8C?= =?UTF-8?q?=E3=81=AA=E3=81=84=E3=81=8C=E3=80=81entry=20widget=E3=81=AA?= =?UTF-8?q?=E3=81=A9=E3=80=81=E4=BB=96=E3=81=AEwidget=E3=81=A0=E3=81=A8?= =?UTF-8?q?=E3=82=B9=E3=82=BF=E3=83=83=E3=82=AF=E3=81=97=E3=81=A6=EF=BC=9F?= =?UTF-8?q?=E9=81=85=E5=BB=B6=E3=81=8C=E7=99=BA=E7=94=9F=E3=81=99=E3=82=8B?= =?UTF-8?q?=E3=81=AE=E3=81=A7=E3=80=81=E3=81=A7=E3=81=8D=E3=82=8B=E3=81=AE?= =?UTF-8?q?=E3=81=AF=E4=BB=8A=E3=81=AE=E3=81=A8=E3=81=93=E3=82=8D=E3=81=93?= =?UTF-8?q?=E3=81=93=E3=81=BE=E3=81=A7=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- view.py | 33 ++++++++++++++++++----- vrct_gui/ui_managers/ColorThemeManager.py | 3 ++- 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/view.py b/view.py index 2a309a06..1bebcfd4 100644 --- a/view.py +++ b/view.py @@ -743,24 +743,45 @@ class View(): self.view_variable.VAR_MIC_DEVICE.set(default_selected_mic_device_name) - @staticmethod - def updateSetProgressBar_MicEnergy(new_mic_energy): - vrct_gui.config_window.sb__progressbar_x_slider__progressbar_mic_energy_threshold.set(new_mic_energy/config.MAX_MIC_ENERGY_THRESHOLD) + def updateSetProgressBar_MicEnergy(self, new_mic_energy): + self.updateProgressBar( + target_progressbar_widget=vrct_gui.config_window.sb__progressbar_x_slider__progressbar_mic_energy_threshold, + new_energy=new_mic_energy, + max_energy=config.MAX_MIC_ENERGY_THRESHOLD, + energy_threshold=config.INPUT_MIC_ENERGY_THRESHOLD, + ) + @staticmethod def initProgressBar_MicEnergy(): vrct_gui.config_window.sb__progressbar_x_slider__progressbar_mic_energy_threshold.set(0) - @staticmethod - def updateSetProgressBar_SpeakerEnergy(new_speaker_energy): - vrct_gui.config_window.sb__progressbar_x_slider__progressbar_speaker_energy_threshold.set(new_speaker_energy/config.MAX_SPEAKER_ENERGY_THRESHOLD) + def updateSetProgressBar_SpeakerEnergy(self, new_speaker_energy): + self.updateProgressBar( + target_progressbar_widget=vrct_gui.config_window.sb__progressbar_x_slider__progressbar_speaker_energy_threshold, + new_energy=new_speaker_energy, + max_energy=config.MAX_SPEAKER_ENERGY_THRESHOLD, + energy_threshold=config.INPUT_SPEAKER_ENERGY_THRESHOLD, + ) @staticmethod def initProgressBar_SpeakerEnergy(): vrct_gui.config_window.sb__progressbar_x_slider__progressbar_speaker_energy_threshold.set(0) + def updateProgressBar( + self, + target_progressbar_widget, + new_energy, + max_energy, + energy_threshold, + ): + target_progressbar_widget.set(new_energy/max_energy) + if new_energy >= energy_threshold: + target_progressbar_widget.configure(progress_color=self.settings.config_window.ctm.SB__PROGRESSBAR_X_SLIDER__PROGRESSBAR_PROGRESS_EXCEED_THRESHOLD_BG_COLOR) + else: + target_progressbar_widget.configure(progress_color=self.settings.config_window.ctm.SB__PROGRESSBAR_X_SLIDER__PROGRESSBAR_PROGRESS_BG_COLOR) diff --git a/vrct_gui/ui_managers/ColorThemeManager.py b/vrct_gui/ui_managers/ColorThemeManager.py index 19f9f884..30507698 100644 --- a/vrct_gui/ui_managers/ColorThemeManager.py +++ b/vrct_gui/ui_managers/ColorThemeManager.py @@ -301,7 +301,8 @@ class ColorThemeManager(): self.config_window.SB__PROGRESSBAR_X_SLIDER__PROGRESSBAR_BG_COLOR = self.DARK_800_COLOR - self.config_window.SB__PROGRESSBAR_X_SLIDER__PROGRESSBAR_PROGRESS_BG_COLOR = self.PRIMARY_400_COLOR + self.config_window.SB__PROGRESSBAR_X_SLIDER__PROGRESSBAR_PROGRESS_BG_COLOR = self.PRIMARY_750_COLOR + self.config_window.SB__PROGRESSBAR_X_SLIDER__PROGRESSBAR_PROGRESS_EXCEED_THRESHOLD_BG_COLOR = self.PRIMARY_400_COLOR self.config_window.SB__PROGRESSBAR_X_SLIDER__SLIDER_BUTTON_COLOR = self.PRIMARY_600_COLOR self.config_window.SB__PROGRESSBAR_X_SLIDER__SLIDER_BUTTON_HOVERED_COLOR = self.PRIMARY_400_COLOR From 7fe43cc88219efa097c1180c1971f5b8bdc80352 Mon Sep 17 00:00:00 2001 From: misyaguziya Date: Fri, 27 Oct 2023 04:08:21 +0900 Subject: [PATCH 14/44] =?UTF-8?q?=F0=9F=90=9B[bugfix]=20Installer=20:=20?= =?UTF-8?q?=E3=82=A8=E3=83=B3=E3=82=B3=E3=83=BC=E3=83=89=E3=82=92Shift-jis?= =?UTF-8?q?=20->=20UTD-8=20with=20BOM=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- installer/Install.nsi | 74 +++++++++++++++++++++---------------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/installer/Install.nsi b/installer/Install.nsi index 6221b3a5..913d0c38 100644 --- a/installer/Install.nsi +++ b/installer/Install.nsi @@ -1,41 +1,41 @@ -# Modern UI +# Modern UI !include MUI2.nsh # nsDialogs !include nsDialogs.nsh # LogicLib !include LogicLib.nsh -Unicode True -# ƒAƒvƒŠƒP[ƒVƒ‡ƒ“–¼ +Unicode true +# アプリケーションå Name "VRCT Setup" -# 쬂³‚ê‚éƒCƒ“ƒXƒg[ƒ‰ +# 作æˆã•れるインストーラ OutFile "VRCT_Setup.exe" RequestExecutionLevel admin ShowInstDetails show -# ˆ³kƒƒ\ƒbƒh +# 圧縮メソッド SetCompressor lzma -# ƒCƒ“ƒXƒg[ƒ‹‚³‚ê‚éƒfƒBƒŒƒNƒgƒŠ +# インストールã•れるディレクトリ InstallDir "$PROGRAMFILES\VRCT" -# XPƒ}ƒjƒtƒFƒXƒg +# XPマニフェスト XPStyle on -# ƒy[ƒW +# ページ !insertmacro MUI_PAGE_WELCOME !insertmacro MUI_PAGE_DIRECTORY Page custom OptionPage OptionPageLeave !insertmacro MUI_PAGE_INSTFILES !insertmacro MUI_PAGE_FINISH -# ƒAƒ“ƒCƒ“ƒXƒg[ƒ‰ ƒy[ƒW +# アンインストーラ ページ !insertmacro MUI_UNPAGE_WELCOME !insertmacro MUI_UNPAGE_CONFIRM !insertmacro MUI_UNPAGE_INSTFILES !insertmacro MUI_UNPAGE_FINISH -# “ú–{ŒêUI +# 日本語UI !insertmacro MUI_LANGUAGE "Japanese" -# ƒCƒ“ƒ^[ƒtƒF[ƒX Ý’è +# インターフェース 設定 !define MUI_ABORTWARNING -# •Ï” +# 変数 Var Checkbox_InstallDocs Var Checkbox_InstallShortcut Var Dialog_Options @@ -43,85 +43,85 @@ Var InstallDocs Var InstallShortcut Var Label_DescriptionOptions -# ‰Šú‰»ŽžƒR[ƒ‹ƒoƒbƒN +# åˆæœŸåŒ–時コールãƒãƒƒã‚¯ Function .onInit - # ƒIƒvƒVƒ‡ƒ“’l‚ð‰Šú‰»‚µ‚Ü‚·B + # ã‚ªãƒ—ã‚·ãƒ§ãƒ³å€¤ã‚’åˆæœŸåŒ–ã—ã¾ã™ã€‚ StrCpy $InstallDocs ${BST_CHECKED} StrCpy $InstallShortcut ${BST_CHECKED} FunctionEnd -# ƒIƒvƒVƒ‡ƒ“ ƒy[ƒW +# オプション ページ Function OptionPage - # nsDialogs‚ð쬂µ‚Ü‚·B + # nsDialogsを作æˆã—ã¾ã™ã€‚ nsDialogs::Create 1018 - # 쬂³‚ꂽnsDialogs‚ð•Ï”‚É‘ã“ü‚µ‚Ü‚·B + # 作æˆã•れãŸnsDialogsを変数ã«ä»£å…¥ã—ã¾ã™ã€‚ Pop $Dialog_Options ${If} $Dialog_Options == error - # ƒ_ƒCƒAƒƒO‚Ì쬂Ɏ¸”s‚µ‚½ê‡‚É‚ÍI—¹‚µ‚Ü‚·B + # ダイアログã®ä½œæˆã«å¤±æ•—ã—ãŸå ´åˆã«ã¯çµ‚了ã—ã¾ã™ã€‚ Abort ${EndIf} - # ƒ‰ƒxƒ‹‚ð쬂µ‚Ü‚·B - ${NSD_CreateLabel} 0 0 100% 12u "ƒIƒvƒVƒ‡ƒ“‚ð‘I‘ð‚µ‚Ä‚­‚¾‚³‚¢B" - # ƒ‰ƒxƒ‹‚ð•Ï”‚É‘ã“ü‚µ‚Ü‚·B + # ラベルを作æˆã—ã¾ã™ã€‚ + ${NSD_CreateLabel} 0 0 100% 12u "ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã‚’é¸æŠžã—ã¦ãã ã•ã„。" + # ラベルを変数ã«ä»£å…¥ã—ã¾ã™ã€‚ Pop $Label_DescriptionOptions - ${NSD_CreateCheckbox} 0 13u 100% 12u "ƒhƒLƒ…ƒƒ“ƒg‚ðƒCƒ“ƒXƒg[ƒ‹‚·‚é(&D)" + ${NSD_CreateCheckbox} 0 13u 100% 12u "ドキュメントをインストールã™ã‚‹(&D)" Pop $Checkbox_InstallDocs - ${NSD_CreateCheckbox} 0 26u 100% 12u "ƒfƒXƒNƒgƒbƒv‚ɃVƒ‡[ƒgƒJƒbƒg‚ðì¬(&D)" + ${NSD_CreateCheckbox} 0 26u 100% 12u "デスクトップã«ã‚·ãƒ§ãƒ¼ãƒˆã‚«ãƒƒãƒˆã‚’作æˆ(&D)" Pop $Checkbox_InstallShortcut ${If} $InstallDocs == ${BST_CHECKED} - # ƒ`ƒFƒbƒN‚ª“ü—ÍÏ‚Ìê‡Aƒ`ƒFƒbƒNƒ{ƒbƒNƒX‚Ƀ`ƒFƒbƒN‚ð“ü‚ê‚Ü‚·B + # ãƒã‚§ãƒƒã‚¯ãŒå…¥åŠ›æ¸ˆã®å ´åˆã€ãƒã‚§ãƒƒã‚¯ãƒœãƒƒã‚¯ã‚¹ã«ãƒã‚§ãƒƒã‚¯ã‚’入れã¾ã™ã€‚ ${NSD_Check} $Checkbox_InstallDocs ${EndIf} ${If} $InstallShortcut == ${BST_CHECKED} - # ƒ`ƒFƒbƒN‚ª“ü—ÍÏ‚Ìê‡Aƒ`ƒFƒbƒNƒ{ƒbƒNƒX‚Ƀ`ƒFƒbƒN‚ð“ü‚ê‚Ü‚·B + # ãƒã‚§ãƒƒã‚¯ãŒå…¥åŠ›æ¸ˆã®å ´åˆã€ãƒã‚§ãƒƒã‚¯ãƒœãƒƒã‚¯ã‚¹ã«ãƒã‚§ãƒƒã‚¯ã‚’入れã¾ã™ã€‚ ${NSD_Check} $Checkbox_InstallShortcut ${EndIf} nsDialogs::Show FunctionEnd -# ƒIƒvƒVƒ‡ƒ“ ƒy[ƒW‘ÞoƒR[ƒ‹ƒoƒbƒN +# オプション ページ退出コールãƒãƒƒã‚¯ Function OptionPageLeave ${NSD_GetState} $Checkbox_InstallDocs $InstallDocs ${NSD_GetState} $Checkbox_InstallShortcut $InstallShortcut FunctionEnd -# ƒfƒtƒHƒ‹ƒg ƒZƒNƒVƒ‡ƒ“ +# デフォルト セクション Section - # o—Íæ‚ðŽw’肵‚Ü‚·B + # 出力先を指定ã—ã¾ã™ã€‚ SetOutPath "$INSTDIR" - # ƒCƒ“ƒXƒg[ƒ‹‚³‚ê‚éƒtƒ@ƒCƒ‹ + # インストールã•れるファイル File /r "..\dist\VRCT\" ${If} $InstallDocs == ${BST_CHECKED} - # ƒhƒLƒ…ƒƒ“ƒg‚ðƒCƒ“ƒXƒg[ƒ‹‚·‚éê‡ - # o—Íæ‚ðŽw’肵‚Ü‚·B + # ドキュメントをインストールã™ã‚‹å ´åˆ + # 出力先を指定ã—ã¾ã™ã€‚ SetOutPath "$INSTDIR\docs" - # ƒCƒ“ƒXƒg[ƒ‹‚³‚ê‚éƒtƒ@ƒCƒ‹ + # インストールã•れるファイル File "..\dist\README.txt" ${EndIf} - # ƒAƒ“ƒCƒ“ƒXƒg[ƒ‰‚ðo—Í + # アンインストーラを出力 WriteUninstaller "$INSTDIR\Uninstall.exe" ${If} $InstallDocs == ${BST_CHECKED} - # ƒfƒXƒNƒgƒbƒv‚ɃVƒ‡[ƒgƒJƒbƒg‚ðì¬ + # デスクトップã«ã‚·ãƒ§ãƒ¼ãƒˆã‚«ãƒƒãƒˆã‚’ä½œæˆ CreateShortCut "$DESKTOP\VRCT.lnk" "$INSTDIR\VRCT.exe" ${EndIf} - # ƒXƒ^[ƒg ƒƒjƒ…[‚ɃVƒ‡[ƒgƒJƒbƒg‚ð“o˜^ + # スタート メニューã«ã‚·ãƒ§ãƒ¼ãƒˆã‚«ãƒƒãƒˆã‚’登録 CreateDirectory "$SMPROGRAMS\VRCT" SetOutPath "$INSTDIR" CreateShortcut "$SMPROGRAMS\VRCT\VRCT.lnk" "$INSTDIR\VRCT.exe" "" - # ƒŒƒWƒXƒgƒŠ‚É“o˜^ + # レジストリã«ç™»éŒ² WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\VRCT" "DisplayName" "VRCT" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\VRCT" "UninstallString" '"$INSTDIR\Uninstall.exe"' WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\VRCT" "DisplayIcon" '"$INSTDIR\_internal\img\vrct_logo_mark_black.ico"' SectionEnd -# ƒAƒ“ƒCƒ“ƒXƒg[ƒ‰ +# アンインストーラ !include Uninstall.nsi From 5fd156545fc531a15a4c4871448314f6017751c1 Mon Sep 17 00:00:00 2001 From: Sakamoto Shiina <68018796+ShiinaSakamoto@users.noreply.github.com> Date: Fri, 27 Oct 2023 10:37:22 +0900 Subject: [PATCH 15/44] =?UTF-8?q?[Refactor]=20ColorThemeManager:=20SimpleN?= =?UTF-8?q?amespace=E3=82=92=E4=BD=BF=E3=81=A3=E3=81=9F=E8=A8=98=E8=BF=B0?= =?UTF-8?q?=E3=81=AB=E5=88=87=E3=82=8A=E6=9B=BF=E3=81=88=E3=81=A6=E5=8F=AF?= =?UTF-8?q?=E8=AA=AD=E6=80=A7=E3=81=A8=E5=88=A9=E4=BE=BF=E6=80=A7=E3=82=A2?= =?UTF-8?q?=E3=83=83=E3=83=97=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- view.py | 1 - vrct_gui/ui_managers/ColorThemeManager.py | 557 ++++++++-------------- 2 files changed, 204 insertions(+), 354 deletions(-) diff --git a/view.py b/view.py index 1bebcfd4..5468c7a3 100644 --- a/view.py +++ b/view.py @@ -69,7 +69,6 @@ class View(): ) self.settings.error_message_window = SimpleNamespace( - ctm=all_ctm.error_message_window, uism=all_uism.error_message_window, **common_args ) diff --git a/vrct_gui/ui_managers/ColorThemeManager.py b/vrct_gui/ui_managers/ColorThemeManager.py index 30507698..db6b73c1 100644 --- a/vrct_gui/ui_managers/ColorThemeManager.py +++ b/vrct_gui/ui_managers/ColorThemeManager.py @@ -2,12 +2,12 @@ from types import SimpleNamespace class ColorThemeManager(): def __init__(self, theme): - self.main = SimpleNamespace() - self.config_window = SimpleNamespace() - self.selectable_language_window = SimpleNamespace() - self.main_window_cover = SimpleNamespace() - self.error_message_window = SimpleNamespace() - self.confirmation_modal = SimpleNamespace() + # self.main = SimpleNamespace() + # self.config_window = SimpleNamespace() + # self.selectable_language_window = SimpleNamespace() + # self.main_window_cover = SimpleNamespace() + # self.error_message_window = SimpleNamespace() + # self.confirmation_modal = SimpleNamespace() # old one. But leave it here for now. # self.PRIMARY_100_COLOR = "#c4eac1" @@ -88,401 +88,252 @@ class ColorThemeManager(): if theme == "Dark": self._createDarkModeColor() - elif theme == "Light": - self._createLightModeColor() + # elif theme == "Light": + # self._createLightModeColor() def _createDarkModeColor(self): - # Common - self.main.BASIC_TEXT_COLOR = self.LIGHT_100_COLOR - self.main.LABELS_TEXT_COLOR = self.main.BASIC_TEXT_COLOR + self.main = SimpleNamespace( + # Common + BASIC_TEXT_COLOR = self.LIGHT_100_COLOR, + LABELS_TEXT_COLOR = self.LIGHT_100_COLOR, - # Main - self.main.MAIN_BG_COLOR = self.DARK_888_COLOR + # Main + MAIN_BG_COLOR = self.DARK_888_COLOR, - self.main.TEXTBOX_BG_COLOR = self.DARK_900_COLOR - self.main.TEXTBOX_TEXT_COLOR = self.main.BASIC_TEXT_COLOR - self.main.TEXTBOX_TEXT_SUB_COLOR = self.DARK_450_COLOR - self.main.TEXTBOX_SYSTEM_TAG_TEXT_COLOR = self.PRIMARY_300_COLOR - self.main.TEXTBOX_SENT_TAG_TEXT_COLOR = "#6197b4" - self.main.TEXTBOX_RECEIVED_TAG_TEXT_COLOR = "#a861b4" - self.main.TEXTBOX_ERROR_TAG_TEXT_COLOR = "#c27583" - self.main.TEXTBOX_TIMESTAMP_TEXT_COLOR = self.DARK_600_COLOR - self.main.TEXTBOX_TAB_BG_PASSIVE_COLOR = self.DARK_850_COLOR - self.main.TEXTBOX_TAB_BG_ACTIVE_COLOR = self.main.TEXTBOX_BG_COLOR - self.main.TEXTBOX_TAB_BG_HOVERED_COLOR = self.DARK_800_COLOR - self.main.TEXTBOX_TAB_BG_CLICKED_COLOR = self.DARK_925_COLOR - self.main.TEXTBOX_TAB_TEXT_ACTIVE_COLOR = self.main.BASIC_TEXT_COLOR - self.main.TEXTBOX_TAB_TEXT_PASSIVE_COLOR = self.DARK_500_COLOR + TEXTBOX_BG_COLOR = self.DARK_900_COLOR, + TEXTBOX_TEXT_COLOR = self.LIGHT_100_COLOR, + TEXTBOX_TEXT_SUB_COLOR = self.DARK_450_COLOR, + TEXTBOX_SYSTEM_TAG_TEXT_COLOR = self.PRIMARY_300_COLOR, + TEXTBOX_SENT_TAG_TEXT_COLOR = "#6197b4", + TEXTBOX_RECEIVED_TAG_TEXT_COLOR = "#a861b4", + TEXTBOX_ERROR_TAG_TEXT_COLOR = "#c27583", + TEXTBOX_TIMESTAMP_TEXT_COLOR = self.DARK_600_COLOR, - self.main.TEXTBOX_ENTRY_TEXT_COLOR = self.DARK_300_COLOR - self.main.TEXTBOX_ENTRY_TEXT_DISABLED_COLOR = self.DARK_500_COLOR - self.main.TEXTBOX_ENTRY_BG_COLOR = self.DARK_875_COLOR - self.main.TEXTBOX_ENTRY_BORDER_COLOR = self.DARK_750_COLOR - self.main.TEXTBOX_ENTRY_PLACEHOLDER_COLOR = self.DARK_500_COLOR - self.main.TEXTBOX_ENTRY_PLACEHOLDER_DISABLED_COLOR = self.DARK_700_COLOR + TEXTBOX_TAB_BG_PASSIVE_COLOR = self.DARK_850_COLOR, + TEXTBOX_TAB_BG_ACTIVE_COLOR = self.DARK_900_COLOR, + TEXTBOX_TAB_BG_HOVERED_COLOR = self.DARK_800_COLOR, + TEXTBOX_TAB_BG_CLICKED_COLOR = self.DARK_925_COLOR, + TEXTBOX_TAB_TEXT_ACTIVE_COLOR = self.LIGHT_100_COLOR, + TEXTBOX_TAB_TEXT_PASSIVE_COLOR = self.DARK_500_COLOR, + + TEXTBOX_ENTRY_TEXT_COLOR = self.DARK_300_COLOR, + TEXTBOX_ENTRY_TEXT_DISABLED_COLOR = self.DARK_500_COLOR, + TEXTBOX_ENTRY_BG_COLOR = self.DARK_875_COLOR, + TEXTBOX_ENTRY_BORDER_COLOR = self.DARK_750_COLOR, + TEXTBOX_ENTRY_PLACEHOLDER_COLOR = self.DARK_500_COLOR, + TEXTBOX_ENTRY_PLACEHOLDER_DISABLED_COLOR = self.DARK_700_COLOR, + + + # Sidebar + SIDEBAR_BG_COLOR = self.DARK_850_COLOR, + + # Sidebar Features + SF__BG_COLOR = self.DARK_825_COLOR, + SF__HOVERED_BG_COLOR = self.DARK_800_COLOR, + SF__CLICKED_BG_COLOR = self.DARK_875_COLOR, + SF__TEXT_DISABLED_COLOR = self.DARK_500_COLOR, + + SF__SWITCH_BOX_BG_COLOR = self.DARK_775_COLOR, + SF__SWITCH_BOX_HOVERED_BG_COLOR = self.DARK_725_COLOR, + SF__SWITCH_BOX_CLICKED_BG_COLOR = self.DARK_825_COLOR, + SF__SWITCH_BOX_ACTIVE_BG_COLOR = self.PRIMARY_500_COLOR, + SF__SWITCH_BOX_ACTIVE_HOVERED_BG_COLOR = self.PRIMARY_400_COLOR, + SF__SWITCH_BOX_ACTIVE_CLICKED_BG_COLOR = self.PRIMARY_700_COLOR, + SF__SWITCH_BOX_DISABLE_BG_COLOR = self.PRIMARY_800_COLOR, + + SF__SWITCH_BOX_BUTTON_COLOR = self.DARK_400_COLOR, + # It's not working because It overrode internally. + SF__SWITCH_BOX_BUTTON_HOVERED_COLOR = self.DARK_350_COLOR, + + SF__SELECTED_MARK_ACTIVE_BG_COLOR = self.PRIMARY_500_COLOR, + SF__SELECTED_MARK_ACTIVE_HOVERED_BG_COLOR = self.PRIMARY_400_COLOR, + SF__SELECTED_MARK_ACTIVE_CLICKED_BG_COLOR = self.PRIMARY_700_COLOR, + SF__SELECTED_MARK_DISABLE_BG_COLOR = self.PRIMARY_800_COLOR, + + + # Sidebar Languages Settings + SLS__TITLE_TEXT_COLOR = self.DARK_400_COLOR, + + SLS__BG_COLOR = self.DARK_800_COLOR, + + SLS__PRESETS_TAB_BG_HOVERED_COLOR = self.DARK_825_COLOR, + SLS__PRESETS_TAB_BG_CLICKED_COLOR = self.DARK_875_COLOR, + SLS__PRESETS_TAB_BG_PASSIVE_COLOR = self.DARK_850_COLOR, + SLS__PRESETS_TAB_BG_ACTIVE_COLOR = self.DARK_800_COLOR, + SLS__PRESETS_TAB_ACTIVE_TEXT_COLOR_PASSIVE = self.DARK_600_COLOR, + SLS__PRESETS_TAB_ACTIVE_TEXT_COLOR = self.LIGHT_100_COLOR, + + SLS__BOX_BG_COLOR = self.DARK_825_COLOR, + SLS__BOX_SECTION_TITLE_TEXT_COLOR = self.DARK_400_COLOR, + SLS__BOX_ARROWS_TEXT_COLOR = self.DARK_500_COLOR, + + SLS__OPTIONMENU_BG_COLOR = self.DARK_888_COLOR, + SLS__OPTIONMENU_HOVERED_BG_COLOR = self.DARK_875_COLOR, + SLS__OPTIONMENU_CLICKED_BG_COLOR = self.DARK_900_COLOR, + + + CONFIG_BUTTON_BG_COLOR = self.DARK_850_COLOR, + CONFIG_BUTTON_HOVERED_BG_COLOR = self.DARK_800_COLOR, + CONFIG_BUTTON_CLICKED_BG_COLOR = self.DARK_875_COLOR, + + MINIMIZE_SIDEBAR_BUTTON_BG_COLOR = self.DARK_850_COLOR, + MINIMIZE_SIDEBAR_BUTTON_HOVERED_BG_COLOR = self.DARK_800_COLOR, + MINIMIZE_SIDEBAR_BUTTON_CLICKED_BG_COLOR = self.DARK_900_COLOR, - # Sidebar - self.main.SIDEBAR_BG_COLOR = self.DARK_850_COLOR + TOP_BAR_BUTTON_BG_COLOR = self.DARK_888_COLOR, + TOP_BAR_BUTTON_HOVERED_BG_COLOR = self.DARK_850_COLOR, + TOP_BAR_BUTTON_CLICKED_BG_COLOR = self.DARK_900_COLOR, - # Sidebar Features - self.main.SF__BG_COLOR = self.DARK_825_COLOR - self.main.SF__HOVERED_BG_COLOR = self.DARK_800_COLOR - self.main.SF__CLICKED_BG_COLOR = self.DARK_875_COLOR - self.main.SF__TEXT_DISABLED_COLOR = self.DARK_500_COLOR + UPDATE_AVAILABLE_BUTTON_BG_COLOR = self.DARK_888_COLOR, + UPDATE_AVAILABLE_BUTTON_HOVERED_BG_COLOR = self.DARK_850_COLOR, + UPDATE_AVAILABLE_BUTTON_CLICKED_BG_COLOR = self.DARK_900_COLOR, + UPDATE_AVAILABLE_BUTTON_TEXT_COLOR = self.PRIMARY_300_COLOR, - self.main.SF__SWITCH_BOX_BG_COLOR = self.DARK_775_COLOR - self.main.SF__SWITCH_BOX_HOVERED_BG_COLOR = self.DARK_725_COLOR - self.main.SF__SWITCH_BOX_CLICKED_BG_COLOR = self.DARK_825_COLOR - self.main.SF__SWITCH_BOX_ACTIVE_BG_COLOR = self.PRIMARY_500_COLOR - self.main.SF__SWITCH_BOX_ACTIVE_HOVERED_BG_COLOR = self.PRIMARY_400_COLOR - self.main.SF__SWITCH_BOX_ACTIVE_CLICKED_BG_COLOR = self.PRIMARY_700_COLOR - self.main.SF__SWITCH_BOX_DISABLE_BG_COLOR = self.PRIMARY_800_COLOR - - self.main.SF__SWITCH_BOX_BUTTON_COLOR = self.DARK_400_COLOR - # It's not working because It overrode internally. - self.main.SF__SWITCH_BOX_BUTTON_HOVERED_COLOR = self.DARK_350_COLOR - - self.main.SF__SELECTED_MARK_ACTIVE_BG_COLOR = self.main.SF__SWITCH_BOX_ACTIVE_BG_COLOR - self.main.SF__SELECTED_MARK_ACTIVE_HOVERED_BG_COLOR = self.main.SF__SWITCH_BOX_ACTIVE_HOVERED_BG_COLOR - self.main.SF__SELECTED_MARK_ACTIVE_CLICKED_BG_COLOR = self.main.SF__SWITCH_BOX_ACTIVE_CLICKED_BG_COLOR - self.main.SF__SELECTED_MARK_DISABLE_BG_COLOR = self.main.SF__SWITCH_BOX_DISABLE_BG_COLOR + HELP_AND_INFO_BUTTON_BG_COLOR = self.DARK_888_COLOR, + HELP_AND_INFO_BUTTON_HOVERED_BG_COLOR = self.DARK_850_COLOR, + HELP_AND_INFO_BUTTON_CLICKED_BG_COLOR = self.DARK_900_COLOR, + ) - # Sidebar Languages Settings - self.main.SLS__TITLE_TEXT_COLOR = self.DARK_400_COLOR + self.selectable_language_window = SimpleNamespace( + # Selectable Language Window + BASIC_TEXT_COLOR = self.LIGHT_100_COLOR, - self.main.SLS__BG_COLOR = self.DARK_800_COLOR + MAIN_BG_COLOR = self.DARK_875_COLOR, - self.main.SLS__PRESETS_TAB_BG_HOVERED_COLOR = self.DARK_825_COLOR - self.main.SLS__PRESETS_TAB_BG_CLICKED_COLOR = self.DARK_875_COLOR - self.main.SLS__PRESETS_TAB_BG_PASSIVE_COLOR = self.main.SIDEBAR_BG_COLOR - self.main.SLS__PRESETS_TAB_BG_ACTIVE_COLOR = self.main.SLS__BG_COLOR - self.main.SLS__PRESETS_TAB_ACTIVE_TEXT_COLOR_PASSIVE = self.DARK_600_COLOR - self.main.SLS__PRESETS_TAB_ACTIVE_TEXT_COLOR = self.main.BASIC_TEXT_COLOR + GO_BACK_BUTTON_BG_COLOR = self.DARK_800_COLOR, + GO_BACK_BUTTON_BG_HOVERED_COLOR = self.DARK_750_COLOR, + GO_BACK_BUTTON_BG_CLICKED_COLOR = self.DARK_875_COLOR, - self.main.SLS__BOX_BG_COLOR = self.DARK_825_COLOR - self.main.SLS__BOX_SECTION_TITLE_TEXT_COLOR = self.DARK_400_COLOR - self.main.SLS__BOX_ARROWS_TEXT_COLOR = self.DARK_500_COLOR + TOP_BG_COLOR = self.DARK_850_COLOR, + TITLE_TEXT_COLOR = self.DARK_400_COLOR, + LANGUAGE_BUTTON_BG_COLOR = self.LIGHT_100_COLOR, + LANGUAGE_BUTTON_BG_HOVERED_COLOR = self.DARK_825_COLOR, + LANGUAGE_BUTTON_BG_CLICKED_COLOR = self.DARK_888_COLOR, + ) - self.main.SLS__OPTIONMENU_BG_COLOR = self.DARK_888_COLOR - self.main.SLS__OPTIONMENU_HOVERED_BG_COLOR = self.DARK_875_COLOR - self.main.SLS__OPTIONMENU_CLICKED_BG_COLOR = self.DARK_900_COLOR - - - self.main.CONFIG_BUTTON_BG_COLOR = self.main.SIDEBAR_BG_COLOR - self.main.CONFIG_BUTTON_HOVERED_BG_COLOR = self.DARK_800_COLOR - self.main.CONFIG_BUTTON_CLICKED_BG_COLOR = self.DARK_875_COLOR - # self.main.CONFIG_BUTTON_DISABLE_COLOR = self.DARK_900_COLOR - - self.main.MINIMIZE_SIDEBAR_BUTTON_BG_COLOR = self.main.SIDEBAR_BG_COLOR - self.main.MINIMIZE_SIDEBAR_BUTTON_HOVERED_BG_COLOR = self.DARK_800_COLOR - self.main.MINIMIZE_SIDEBAR_BUTTON_CLICKED_BG_COLOR = self.DARK_900_COLOR - # self.main.MINIMIZE_SIDEBAR_BUTTON_DISABLE_COLOR = self.DARK_900_COLOR - - - - self.main.TOP_BAR_BUTTON_BG_COLOR = self.main.MAIN_BG_COLOR - self.main.TOP_BAR_BUTTON_HOVERED_BG_COLOR = self.DARK_850_COLOR - self.main.TOP_BAR_BUTTON_CLICKED_BG_COLOR = self.DARK_900_COLOR - # self.main.TOP_BAR_BUTTON_DISABLE_COLOR = self.DARK_900_COLOR - - self.main.UPDATE_AVAILABLE_BUTTON_BG_COLOR = self.main.TOP_BAR_BUTTON_BG_COLOR - self.main.UPDATE_AVAILABLE_BUTTON_HOVERED_BG_COLOR = self.main.TOP_BAR_BUTTON_HOVERED_BG_COLOR - self.main.UPDATE_AVAILABLE_BUTTON_CLICKED_BG_COLOR = self.main.TOP_BAR_BUTTON_CLICKED_BG_COLOR - # self.main.UPDATE_AVAILABLE_BUTTON_DISABLE_COLOR = self.main.TOP_BAR_BUTTON_DISABLE_COLOR - self.main.UPDATE_AVAILABLE_BUTTON_TEXT_COLOR = self.PRIMARY_300_COLOR - - self.main.HELP_AND_INFO_BUTTON_BG_COLOR = self.main.TOP_BAR_BUTTON_BG_COLOR - self.main.HELP_AND_INFO_BUTTON_HOVERED_BG_COLOR = self.main.TOP_BAR_BUTTON_HOVERED_BG_COLOR - self.main.HELP_AND_INFO_BUTTON_CLICKED_BG_COLOR = self.main.TOP_BAR_BUTTON_CLICKED_BG_COLOR - # self.main.HELP_AND_INFO_BUTTON_DISABLE_COLOR = self.main.TOP_BAR_BUTTON_DISABLE_COLOR - - - - # Selectable Language Window - self.selectable_language_window.BASIC_TEXT_COLOR = self.main.BASIC_TEXT_COLOR - - self.selectable_language_window.MAIN_BG_COLOR = self.DARK_875_COLOR - - self.selectable_language_window.GO_BACK_BUTTON_BG_COLOR = self.DARK_800_COLOR - self.selectable_language_window.GO_BACK_BUTTON_BG_HOVERED_COLOR = self.DARK_750_COLOR - self.selectable_language_window.GO_BACK_BUTTON_BG_CLICKED_COLOR = self.DARK_875_COLOR - - - self.selectable_language_window.TOP_BG_COLOR = self.main.SIDEBAR_BG_COLOR - self.selectable_language_window.TITLE_TEXT_COLOR = self.DARK_400_COLOR - self.selectable_language_window.LANGUAGE_BUTTON_BG_COLOR = self.selectable_language_window.MAIN_BG_COLOR - self.selectable_language_window.LANGUAGE_BUTTON_BG_HOVERED_COLOR = self.DARK_825_COLOR - self.selectable_language_window.LANGUAGE_BUTTON_BG_CLICKED_COLOR = self.DARK_888_COLOR # Modal Window (Main Window) - self.main_window_cover.TEXT_COLOR = self.LIGHT_100_COLOR + self.main_window_cover = SimpleNamespace( + TEXT_COLOR = self.LIGHT_100_COLOR, + ) - self.confirmation_modal.MESSAGE_TEXT_COLOR = self.LIGHT_100_COLOR - self.confirmation_modal.FAKE_BORDER_COLOR = self.DARK_600_COLOR - self.confirmation_modal.BG_COLOR = self.DARK_800_COLOR - self.confirmation_modal.CONFIRMATION_BUTTONS_TEXT_COLOR = self.LIGHT_100_COLOR + self.confirmation_modal = SimpleNamespace( + MESSAGE_TEXT_COLOR = self.LIGHT_100_COLOR, + FAKE_BORDER_COLOR = self.DARK_600_COLOR, + BG_COLOR = self.DARK_800_COLOR, + CONFIRMATION_BUTTONS_TEXT_COLOR = self.LIGHT_100_COLOR, - self.confirmation_modal.ACCEPT_BUTTON_BG_COLOR = self.PRIMARY_600_COLOR - self.confirmation_modal.ACCEPT_BUTTON_HOVERED_BG_COLOR = self.PRIMARY_450_COLOR - self.confirmation_modal.ACCEPT_BUTTON_CLICKED_BG_COLOR = self.PRIMARY_750_COLOR - self.confirmation_modal.DENY_BUTTON_BG_COLOR = self.DARK_750_COLOR - self.confirmation_modal.DENY_BUTTON_HOVERED_BG_COLOR = self.DARK_700_COLOR - self.confirmation_modal.DENY_BUTTON_CLICKED_BG_COLOR = self.DARK_825_COLOR + ACCEPT_BUTTON_BG_COLOR = self.PRIMARY_600_COLOR, + ACCEPT_BUTTON_HOVERED_BG_COLOR = self.PRIMARY_450_COLOR, + ACCEPT_BUTTON_CLICKED_BG_COLOR = self.PRIMARY_750_COLOR, + DENY_BUTTON_BG_COLOR = self.DARK_750_COLOR, + DENY_BUTTON_HOVERED_BG_COLOR = self.DARK_700_COLOR, + DENY_BUTTON_CLICKED_BG_COLOR = self.DARK_825_COLOR, + ) - # Common - self.config_window.BASIC_TEXT_COLOR = self.main.BASIC_TEXT_COLOR - self.config_window.LABELS_TEXT_COLOR = self.config_window.BASIC_TEXT_COLOR - self.config_window.LABELS_DESC_TEXT_COLOR = self.DARK_500_COLOR + self.config_window = SimpleNamespace( + # Common + BASIC_TEXT_COLOR = self.LIGHT_100_COLOR, + LABELS_TEXT_COLOR = self.LIGHT_100_COLOR, + LABELS_DESC_TEXT_COLOR = self.DARK_500_COLOR, - self.config_window.LABELS_TEXT_DISABLED_COLOR = self.DARK_600_COLOR + LABELS_TEXT_DISABLED_COLOR = self.DARK_600_COLOR, - # Top bar - self.config_window.TOP_BAR_BG_COLOR = self.DARK_850_COLOR + # Top bar + TOP_BAR_BG_COLOR = self.DARK_850_COLOR, - # Restart Button - self.config_window.RESTART_BUTTON_BG_COLOR = self.PRIMARY_600_COLOR - self.config_window.RESTART_BUTTON_HOVERED_BG_COLOR = self.PRIMARY_500_COLOR - self.config_window.RESTART_BUTTON_CLICKED_BG_COLOR = self.PRIMARY_700_COLOR + # Restart Button + RESTART_BUTTON_BG_COLOR = self.PRIMARY_600_COLOR, + RESTART_BUTTON_HOVERED_BG_COLOR = self.PRIMARY_500_COLOR, + RESTART_BUTTON_CLICKED_BG_COLOR = self.PRIMARY_700_COLOR, - # Compact Mode - self.config_window.COMPACT_MODE_SWITCH_BOX_BG_COLOR = self.DARK_775_COLOR - self.config_window.COMPACT_MODE_SWITCH_BOX_ACTIVE_BG_COLOR = self.PRIMARY_500_COLOR - self.config_window.COMPACT_MODE_SWITCH_BOX_BUTTON_COLOR = self.DARK_350_COLOR - self.config_window.COMPACT_MODE_SWITCH_BOX_BUTTON_HOVERED_COLOR = self.DARK_300_COLOR + # Compact Mode + COMPACT_MODE_SWITCH_BOX_BG_COLOR = self.DARK_775_COLOR, + COMPACT_MODE_SWITCH_BOX_ACTIVE_BG_COLOR = self.PRIMARY_500_COLOR, + COMPACT_MODE_SWITCH_BOX_BUTTON_COLOR = self.DARK_350_COLOR, + COMPACT_MODE_SWITCH_BOX_BUTTON_HOVERED_COLOR = self.DARK_300_COLOR, - # Main - self.config_window.MAIN_BG_COLOR = self.DARK_950_COLOR + # Main + MAIN_BG_COLOR = self.DARK_950_COLOR, - # This is for fake border color - self.config_window.SB__WRAPPER_BG_COLOR = self.DARK_750_COLOR + # This is for fake border color + SB__WRAPPER_BG_COLOR = self.DARK_750_COLOR, - self.config_window.SB__BG_COLOR = self.DARK_888_COLOR + SB__BG_COLOR = self.DARK_888_COLOR, - self.config_window.SB__OPTIONMENU_BG_COLOR = self.DARK_925_COLOR - self.config_window.SB__OPTIONMENU_HOVERED_BG_COLOR = self.DARK_850_COLOR - self.config_window.SB__OPTIONMENU_CLICKED_BG_COLOR = self.DARK_950_COLOR - self.config_window.SB__DROPDOWN_MENU_WINDOW_BG_COLOR = self.config_window.MAIN_BG_COLOR - self.config_window.SB__DROPDOWN_MENU_WINDOW_BORDER_COLOR = self.DARK_600_COLOR - # self.config_window.SB__DROPDOWN_MENU_WINDOW_BG_COLOR = self.DARK_700_COLOR - self.config_window.SB__DROPDOWN_MENU_BG_COLOR = self.DARK_875_COLOR - self.config_window.SB__DROPDOWN_MENU_HOVERED_BG_COLOR = self.DARK_800_COLOR - self.config_window.SB__DROPDOWN_MENU_CLICKED_BG_COLOR = self.DARK_900_COLOR + SB__OPTIONMENU_BG_COLOR = self.DARK_925_COLOR, + SB__OPTIONMENU_HOVERED_BG_COLOR = self.DARK_850_COLOR, + SB__OPTIONMENU_CLICKED_BG_COLOR = self.DARK_950_COLOR, + SB__DROPDOWN_MENU_WINDOW_BG_COLOR = self.DARK_950_COLOR, + SB__DROPDOWN_MENU_WINDOW_BORDER_COLOR = self.DARK_600_COLOR, + SB__DROPDOWN_MENU_BG_COLOR = self.DARK_875_COLOR, + SB__DROPDOWN_MENU_HOVERED_BG_COLOR = self.DARK_800_COLOR, + SB__DROPDOWN_MENU_CLICKED_BG_COLOR = self.DARK_900_COLOR, - self.config_window.SB__SLIDER_BG_COLOR = self.DARK_700_COLOR - self.config_window.SB__SLIDER_PROGRESS_BG_COLOR = self.DARK_500_COLOR - self.config_window.SB__SLIDER_BUTTON_COLOR = self.DARK_700_COLOR - self.config_window.SB__SLIDER_BUTTON_HOVERED_COLOR = self.DARK_600_COLOR - self.config_window.SB__SLIDER_TOOLTIP_BG_COLOR = self.DARK_850_COLOR - self.config_window.SB__SLIDER_TOOLTIP_TEXT_COLOR = self.DARK_200_COLOR + SB__SLIDER_BG_COLOR = self.DARK_700_COLOR, + SB__SLIDER_PROGRESS_BG_COLOR = self.DARK_500_COLOR, + SB__SLIDER_BUTTON_COLOR = self.DARK_700_COLOR, + SB__SLIDER_BUTTON_HOVERED_COLOR = self.DARK_600_COLOR, + SB__SLIDER_TOOLTIP_BG_COLOR = self.DARK_850_COLOR, + SB__SLIDER_TOOLTIP_TEXT_COLOR = self.DARK_200_COLOR, - self.config_window.SB__SWITCH_BOX_BG_COLOR = self.DARK_800_COLOR - self.config_window.SB__SWITCH_BOX_ACTIVE_BG_COLOR = self.PRIMARY_500_COLOR - self.config_window.SB__SWITCH_BOX_BUTTON_COLOR = self.DARK_400_COLOR - self.config_window.SB__SWITCH_BOX_BUTTON_HOVERED_COLOR = self.DARK_350_COLOR + SB__SWITCH_BOX_BG_COLOR = self.DARK_800_COLOR, + SB__SWITCH_BOX_ACTIVE_BG_COLOR = self.PRIMARY_500_COLOR, + SB__SWITCH_BOX_BUTTON_COLOR = self.DARK_400_COLOR, + SB__SWITCH_BOX_BUTTON_HOVERED_COLOR = self.DARK_350_COLOR, - self.config_window.SB__CHECKBOX_BORDER_COLOR = self.DARK_600_COLOR - self.config_window.SB__CHECKBOX_HOVER_COLOR = self.DARK_800_COLOR - self.config_window.SB__CHECKBOX_CHECKED_COLOR = self.PRIMARY_700_COLOR - self.config_window.SB__CHECKBOX_CHECKMARK_COLOR = self.config_window.BASIC_TEXT_COLOR + SB__CHECKBOX_BORDER_COLOR = self.DARK_600_COLOR, + SB__CHECKBOX_HOVER_COLOR = self.DARK_800_COLOR, + SB__CHECKBOX_CHECKED_COLOR = self.PRIMARY_700_COLOR, + SB__CHECKBOX_CHECKMARK_COLOR = self.LIGHT_100_COLOR, - self.config_window.SB__ENTRY_TEXT_COLOR = self.DARK_300_COLOR - self.config_window.SB__ENTRY_BG_COLOR = self.DARK_863_COLOR - self.config_window.SB__ENTRY_BORDER_COLOR = self.DARK_775_COLOR + SB__ENTRY_TEXT_COLOR = self.DARK_300_COLOR, + SB__ENTRY_BG_COLOR = self.DARK_863_COLOR, + SB__ENTRY_BORDER_COLOR = self.DARK_775_COLOR, - self.config_window.SB__PROGRESSBAR_X_SLIDER__PROGRESSBAR_BG_COLOR = self.DARK_800_COLOR - self.config_window.SB__PROGRESSBAR_X_SLIDER__PROGRESSBAR_PROGRESS_BG_COLOR = self.PRIMARY_750_COLOR - self.config_window.SB__PROGRESSBAR_X_SLIDER__PROGRESSBAR_PROGRESS_EXCEED_THRESHOLD_BG_COLOR = self.PRIMARY_400_COLOR + SB__PROGRESSBAR_X_SLIDER__PROGRESSBAR_BG_COLOR = self.DARK_800_COLOR, + SB__PROGRESSBAR_X_SLIDER__PROGRESSBAR_PROGRESS_BG_COLOR = self.PRIMARY_750_COLOR, + SB__PROGRESSBAR_X_SLIDER__PROGRESSBAR_PROGRESS_EXCEED_THRESHOLD_BG_COLOR = self.PRIMARY_400_COLOR, - self.config_window.SB__PROGRESSBAR_X_SLIDER__SLIDER_BUTTON_COLOR = self.PRIMARY_600_COLOR - self.config_window.SB__PROGRESSBAR_X_SLIDER__SLIDER_BUTTON_HOVERED_COLOR = self.PRIMARY_400_COLOR - self.config_window.SB__PROGRESSBAR_X_SLIDER__PASSIVE_BUTTON_COLOR = self.DARK_800_COLOR + SB__PROGRESSBAR_X_SLIDER__SLIDER_BUTTON_COLOR = self.PRIMARY_600_COLOR, + SB__PROGRESSBAR_X_SLIDER__SLIDER_BUTTON_HOVERED_COLOR = self.PRIMARY_400_COLOR, - self.config_window.SB__PROGRESSBAR_X_SLIDER__PASSIVE_BUTTON_COLOR = self.DARK_800_COLOR - self.config_window.SB__PROGRESSBAR_X_SLIDER__PASSIVE_BUTTON_HOVERED_COLOR = self.DARK_700_COLOR - self.config_window.SB__PROGRESSBAR_X_SLIDER__PASSIVE_BUTTON_CLICKED_COLOR = self.DARK_900_COLOR - self.config_window.SB__PROGRESSBAR_X_SLIDER__PASSIVE_BUTTON_DISABLED_COLOR = self.DARK_850_COLOR + SB__PROGRESSBAR_X_SLIDER__PASSIVE_BUTTON_COLOR = self.DARK_800_COLOR, + SB__PROGRESSBAR_X_SLIDER__PASSIVE_BUTTON_HOVERED_COLOR = self.DARK_700_COLOR, + SB__PROGRESSBAR_X_SLIDER__PASSIVE_BUTTON_CLICKED_COLOR = self.DARK_900_COLOR, + SB__PROGRESSBAR_X_SLIDER__PASSIVE_BUTTON_DISABLED_COLOR = self.DARK_850_COLOR, - self.config_window.SB__PROGRESSBAR_X_SLIDER__ACTIVE_BUTTON_COLOR = self.PRIMARY_600_COLOR - self.config_window.SB__PROGRESSBAR_X_SLIDER__ACTIVE_BUTTON_HOVERED_COLOR = self.PRIMARY_500_COLOR - self.config_window.SB__PROGRESSBAR_X_SLIDER__ACTIVE_BUTTON_CLICKED_COLOR = self.PRIMARY_800_COLOR - # self.config_window.SB__PROGRESSBAR_X_SLIDER__ACTIVE_BUTTON_DISABLED_COLOR = self.PRIMARY_900_COLOR + SB__PROGRESSBAR_X_SLIDER__ACTIVE_BUTTON_COLOR = self.PRIMARY_600_COLOR, + SB__PROGRESSBAR_X_SLIDER__ACTIVE_BUTTON_HOVERED_COLOR = self.PRIMARY_500_COLOR, + SB__PROGRESSBAR_X_SLIDER__ACTIVE_BUTTON_CLICKED_COLOR = self.PRIMARY_800_COLOR, - # Side menu - self.config_window.SIDE_MENU_BG_COLOR = self.config_window.MAIN_BG_COLOR + # Side menu + SIDE_MENU_BG_COLOR = self.DARK_950_COLOR, - self.config_window.SIDE_MENU_LABELS_BG_COLOR = self.config_window.SIDE_MENU_BG_COLOR - self.config_window.SIDE_MENU_LABELS_BG_FOR_FAKE_BORDER_COLOR = self.config_window.SIDE_MENU_BG_COLOR - self.config_window.SIDE_MENU_LABELS_HOVERED_BG_COLOR = self.DARK_850_COLOR - self.config_window.SIDE_MENU_LABELS_CLICKED_BG_COLOR = self.PRIMARY_750_COLOR - self.config_window.SIDE_MENU_LABELS_SELECTED_TEXT_COLOR = self.PRIMARY_200_COLOR + SIDE_MENU_LABELS_BG_COLOR = self.DARK_950_COLOR, + SIDE_MENU_LABELS_BG_FOR_FAKE_BORDER_COLOR = self.DARK_950_COLOR, + SIDE_MENU_LABELS_HOVERED_BG_COLOR = self.DARK_850_COLOR, + SIDE_MENU_LABELS_CLICKED_BG_COLOR = self.PRIMARY_750_COLOR, + SIDE_MENU_LABELS_SELECTED_TEXT_COLOR = self.PRIMARY_200_COLOR, - self.config_window.SIDE_MENU_SELECTED_MARK_ACTIVE_BG_COLOR = self.main.SF__SWITCH_BOX_ACTIVE_BG_COLOR + SIDE_MENU_SELECTED_MARK_ACTIVE_BG_COLOR = self.PRIMARY_500_COLOR, - self.config_window.NOW_VERSION_TEXT_COLOR = self.DARK_300_COLOR + NOW_VERSION_TEXT_COLOR = self.DARK_300_COLOR, - # Error Message Window for Config Window - # The color code [#bb4448] is a mixture of [#a9555c] and [#cc3333] (for a redder shade). - self.config_window.SB__ERROR_MESSAGE_BG_COLOR = "#bb4448" - self.config_window.SB__ERROR_MESSAGE_TEXT_COLOR = "#fff" - - - - - - - - - - # def _createLightModeColor(self): - # # Common - # self.main.BASIC_TEXT_COLOR = self.DARK_1000_COLOR - # self.main.LABELS_TEXT_COLOR = self.main.BASIC_TEXT_COLOR - - # # Main - # self.main.MAIN_BG_COLOR = self.LIGHT_300_COLOR - - # self.main.TEXTBOX_BG_COLOR = self.LIGHT_200_COLOR - # self.main.TEXTBOX_TEXT_COLOR = self.main.BASIC_TEXT_COLOR - # self.main.TEXTBOX_TAB_BG_PASSIVE_COLOR = self.LIGHT_350_COLOR - # self.main.TEXTBOX_TAB_BG_ACTIVE_COLOR = self.main.TEXTBOX_BG_COLOR - # self.main.TEXTBOX_TAB_BG_HOVERED_COLOR = self.LIGHT_300_COLOR - # self.main.TEXTBOX_TAB_BG_CLICKED_COLOR = self.LIGHT_350_COLOR - # self.main.TEXTBOX_TAB_TEXT_ACTIVE_COLOR = self.main.BASIC_TEXT_COLOR - # self.main.TEXTBOX_TAB_TEXT_PASSIVE_COLOR = self.LIGHT_600_COLOR - - # self.main.TEXTBOX_ENTRY_TEXT_COLOR = self.LIGHT_800_COLOR - # self.main.TEXTBOX_ENTRY_TEXT_DISABLED_COLOR = self.LIGHT_500_COLOR - # self.main.TEXTBOX_ENTRY_BG_COLOR = self.LIGHT_325_COLOR - # self.main.TEXTBOX_ENTRY_BORDER_COLOR = self.LIGHT_400_COLOR - # self.main.TEXTBOX_ENTRY_PLACEHOLDER_COLOR = self.LIGHT_600_COLOR - # self.main.TEXTBOX_ENTRY_PLACEHOLDER_DISABLED_COLOR = self.LIGHT_700_COLOR - - - - # # Sidebar - # self.main.SIDEBAR_BG_COLOR = self.LIGHT_350_COLOR - - # # Sidebar Features - # self.main.SF__BG_COLOR = self.LIGHT_375_COLOR - # self.main.SF__HOVERED_BG_COLOR = self.LIGHT_300_COLOR - # self.main.SF__CLICKED_BG_COLOR = self.LIGHT_200_COLOR - # self.main.SF__TEXT_DISABLED_COLOR = self.LIGHT_500_COLOR - - # self.main.SF__SWITCH_BOX_BG_COLOR = self.LIGHT_300_COLOR - # self.main.SF__SWITCH_BOX_HOVERED_BG_COLOR = self.LIGHT_450_COLOR - # self.main.SF__SWITCH_BOX_CLICKED_BG_COLOR = self.LIGHT_350_COLOR - # self.main.SF__SWITCH_BOX_ACTIVE_BG_COLOR = self.PRIMARY_650_COLOR - # self.main.SF__SWITCH_BOX_ACTIVE_HOVERED_BG_COLOR = self.PRIMARY_500_COLOR - # self.main.SF__SWITCH_BOX_ACTIVE_CLICKED_BG_COLOR = self.PRIMARY_700_COLOR - # self.main.SF__SWITCH_BOX_DISABLE_BG_COLOR = self.PRIMARY_900_COLOR - - # self.main.SF__SELECTED_MARK_ACTIVE_BG_COLOR = self.main.SF__SWITCH_BOX_ACTIVE_BG_COLOR - # self.main.SF__SELECTED_MARK_ACTIVE_HOVERED_BG_COLOR = self.main.SF__SWITCH_BOX_ACTIVE_HOVERED_BG_COLOR - # self.main.SF__SELECTED_MARK_ACTIVE_CLICKED_BG_COLOR = self.main.SF__SWITCH_BOX_ACTIVE_CLICKED_BG_COLOR - # self.main.SF__SELECTED_MARK_DISABLE_BG_COLOR = self.main.SF__SWITCH_BOX_DISABLE_BG_COLOR - - - # # Sidebar quick settings - # self.main.SLS__TITLE_TEXT_COLOR = self.LIGHT_800_COLOR - - # self.main.SLS__BG_COLOR = self.LIGHT_300_COLOR - - # self.main.SLS__PRESETS_TAB_BG_HOVERED_COLOR = self.LIGHT_350_COLOR - # self.main.SLS__PRESETS_TAB_BG_CLICKED_COLOR = self.LIGHT_800_COLOR - # self.main.SLS__PRESETS_TAB_BG_PASSIVE_COLOR = self.main.SIDEBAR_BG_COLOR - # self.main.SLS__PRESETS_TAB_BG_ACTIVE_COLOR = self.main.SLS__BG_COLOR - # self.main.SLS__PRESETS_TAB_ACTIVE_TEXT_COLOR_PASSIVE = self.LIGHT_600_COLOR - # self.main.SLS__PRESETS_TAB_ACTIVE_TEXT_COLOR = self.main.BASIC_TEXT_COLOR - - # self.main.SLS__BOX_BG_COLOR = self.LIGHT_350_COLOR - # self.main.SLS__BOX_SECTION_TITLE_TEXT_COLOR = self.LIGHT_800_COLOR - # self.main.SLS__BOX_ARROWS_TEXT_COLOR = self.LIGHT_700_COLOR - - # self.main.SLS__OPTIONMENU_BG_COLOR = self.LIGHT_500_COLOR - - - # self.main.CONFIG_BUTTON_BG_COLOR = self.main.SIDEBAR_BG_COLOR - # self.main.CONFIG_BUTTON_HOVERED_BG_COLOR = self.LIGHT_800_COLOR - # self.main.CONFIG_BUTTON_CLICKED_BG_COLOR = self.LIGHT_900_COLOR - # # self.main.CONFIG_BUTTON_DISABLE_COLOR = self.LIGHT_900_COLOR - - # self.main.MINIMIZE_SIDEBAR_BUTTON_BG_COLOR = self.main.SIDEBAR_BG_COLOR - # self.main.MINIMIZE_SIDEBAR_BUTTON_HOVERED_BG_COLOR = self.LIGHT_800_COLOR - # self.main.MINIMIZE_SIDEBAR_BUTTON_CLICKED_BG_COLOR = self.LIGHT_900_COLOR - # # self.main.MINIMIZE_SIDEBAR_BUTTON_DISABLE_COLOR = self.LIGHT_900_COLOR - - # self.main.HELP_AND_INFO_BUTTON_BG_COLOR = self.main.MAIN_BG_COLOR - # self.main.HELP_AND_INFO_BUTTON_HOVERED_BG_COLOR = self.LIGHT_350_COLOR - # self.main.HELP_AND_INFO_BUTTON_CLICKED_BG_COLOR = self.LIGHT_450_COLOR - # # self.main.HELP_AND_INFO_BUTTON_DISABLE_COLOR = self.LIGHT_900_COLOR - - - # # Common - # self.config_window.BASIC_TEXT_COLOR = self.main.BASIC_TEXT_COLOR - # self.config_window.LABELS_TEXT_COLOR = self.config_window.BASIC_TEXT_COLOR - # self.config_window.LABELS_DESC_TEXT_COLOR = self.DARK_500_COLOR - - - # # Top bar - # self.config_window.TOP_BAR_BG_COLOR = self.DARK_850_COLOR - - - # # Main - # self.config_window.MAIN_BG_COLOR = self.DARK_950_COLOR - - # # This is for fake border color - # self.config_window.SB__WRAPPER_BG_COLOR = self.DARK_750_COLOR - - # self.config_window.SB__BG_COLOR = self.DARK_888_COLOR - - # self.config_window.SB__OPTIONMENU_BG_COLOR = self.DARK_925_COLOR - # self.config_window.SB__OPTIONMENU_HOVERED_BG_COLOR = self.DARK_875_COLOR - - # self.config_window.SB__SLIDER_BUTTON_COLOR = self.DARK_700_COLOR - # self.config_window.SB__SLIDER_BUTTON_HOVERED_COLOR = self.DARK_600_COLOR - - # self.config_window.SB__SWITCH_BOX_BG_COLOR = self.main.SF__SWITCH_BOX_BG_COLOR - # self.config_window.SB__SWITCH_BOX_ACTIVE_BG_COLOR = self.main.SF__SWITCH_BOX_ACTIVE_BG_COLOR - - # self.config_window.SB__CHECKBOX_BORDER_COLOR = self.DARK_500_COLOR - # self.config_window.SB__CHECKBOX_HOVER_COLOR = self.DARK_800_COLOR - # self.config_window.SB__CHECKBOX_CHECKED_COLOR = self.PRIMARY_700_COLOR - # self.config_window.SB__CHECKBOX_CHECKMARK_COLOR = self.config_window.BASIC_TEXT_COLOR - - # self.config_window.SB__PROGRESSBAR_X_SLIDER__SLIDER_BUTTON_COLOR = self.PRIMARY_700_COLOR - # self.config_window.SB__PROGRESSBAR_X_SLIDER__SLIDER_BUTTON_HOVERED_COLOR = self.PRIMARY_500_COLOR - # self.config_window.SB__PROGRESSBAR_X_SLIDER__PASSIVE_BUTTON_COLOR = self.DARK_800_COLOR - - # self.config_window.SB__PROGRESSBAR_X_SLIDER__PASSIVE_BUTTON_COLOR = self.DARK_800_COLOR - # self.config_window.SB__PROGRESSBAR_X_SLIDER__PASSIVE_BUTTON_HOVERED_COLOR = self.DARK_700_COLOR - # self.config_window.SB__PROGRESSBAR_X_SLIDER__PASSIVE_BUTTON_CLICKED_COLOR = self.DARK_900_COLOR - # self.config_window.SB__PROGRESSBAR_X_SLIDER__PASSIVE_BUTTON_DISABLED_COLOR = self.DARK_850_COLOR - - # self.config_window.SB__PROGRESSBAR_X_SLIDER__ACTIVE_BUTTON_COLOR = self.PRIMARY_700_COLOR - # self.config_window.SB__PROGRESSBAR_X_SLIDER__ACTIVE_BUTTON_HOVERED_COLOR = self.PRIMARY_600_COLOR - # self.config_window.SB__PROGRESSBAR_X_SLIDER__ACTIVE_BUTTON_CLICKED_COLOR = self.PRIMARY_900_COLOR - # # self.config_window.SB__PROGRESSBAR_X_SLIDER__ACTIVE_BUTTON_DISABLED_COLOR = self.PRIMARY_900_COLOR - - - # # Side menu - # self.config_window.SIDE_MENU_BG_COLOR = self.config_window.MAIN_BG_COLOR - - # self.config_window.SIDE_MENU_LABELS_BG_COLOR = self.config_window.SIDE_MENU_BG_COLOR - # self.config_window.SIDE_MENU_LABELS_BG_FOR_FAKE_BORDER_COLOR = self.config_window.SIDE_MENU_BG_COLOR - # self.config_window.SIDE_MENU_LABELS_HOVERED_BG_COLOR = self.DARK_850_COLOR - # self.config_window.SIDE_MENU_LABELS_CLICKED_BG_COLOR = self.PRIMARY_900_COLOR - # self.config_window.SIDE_MENU_LABELS_SELECTED_TEXT_COLOR = self.PRIMARY_300_COLOR - - # self.config_window.SIDE_MENU_SELECTED_MARK_ACTIVE_BG_COLOR = self.main.SF__SWITCH_BOX_ACTIVE_BG_COLOR + # Error Message Window for Config Window + # The color code [#bb4448] is a mixture of [#a9555c] and [#cc3333] (for a redder shade). + SB__ERROR_MESSAGE_BG_COLOR = "#bb4448", + SB__ERROR_MESSAGE_TEXT_COLOR = "#fff", + ) \ No newline at end of file From 958cd45b0cde793f043e2a65634b6914331a1cce Mon Sep 17 00:00:00 2001 From: misyaguziya Date: Fri, 27 Oct 2023 17:14:52 +0900 Subject: [PATCH 16/44] =?UTF-8?q?[Update]=20installer=20:=20=E6=97=A2?= =?UTF-8?q?=E3=81=AB=E3=82=A4=E3=83=B3=E3=82=B9=E3=83=88=E3=83=BC=E3=83=AB?= =?UTF-8?q?=E6=B8=88=E3=81=BF=E3=81=AE=E5=A0=B4=E5=90=88=E3=80=81=E3=83=95?= =?UTF-8?q?=E3=82=A1=E3=82=A4=E3=83=AB=E3=82=92=E5=89=8A=E9=99=A4=E3=81=97?= =?UTF-8?q?=E3=81=A6=E7=BD=AE=E3=81=8D=E6=8F=9B=E3=81=88=E3=82=8B=E3=82=88?= =?UTF-8?q?=E3=81=86=E3=81=AB=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- installer/Install.nsi | 128 +++++++++++++++++++++++++++++----------- installer/Uninstall.nsi | 16 ----- 2 files changed, 92 insertions(+), 52 deletions(-) delete mode 100644 installer/Uninstall.nsi diff --git a/installer/Install.nsi b/installer/Install.nsi index 913d0c38..5fcb57d6 100644 --- a/installer/Install.nsi +++ b/installer/Install.nsi @@ -1,41 +1,60 @@ -# Modern UI +!define PRODUCT_VERSION "1.0.0.0" +!define VERSION "1.0.0.0" +VIProductVersion "${PRODUCT_VERSION}" +VIFileVersion "${VERSION}" +VIAddVersionKey "FileVersion" "${VERSION}" +VIAddVersionKey "ProductName" "VRCT" +VIAddVersionKey "ProductVersion" "${PRODUCT_VERSION}" +VIAddVersionKey "LegalCopyright" "Copyright m's software" +VIAddVersionKey "FileDescription" "Communication tool with translation & transcription for VRChat" + +; Modern UI !include MUI2.nsh -# nsDialogs +; nsDialogs !include nsDialogs.nsh -# LogicLib +; LogicLib !include LogicLib.nsh +; FileFunc +!include FileFunc.nsh + +!define MUI_ICON "..\img\vrct_logo_mark_black.ico" +!define MUI_UNICON "..\img\vrct_logo_mark_black.ico" Unicode true -# アプリケーションå +; アプリケーションå Name "VRCT Setup" -# 作æˆã•れるインストーラ +; 作æˆã•れるインストーラ OutFile "VRCT_Setup.exe" RequestExecutionLevel admin ShowInstDetails show -# 圧縮メソッド +; 圧縮メソッド SetCompressor lzma -# インストールã•れるディレクトリ +; インストールã•れるディレクトリ InstallDir "$PROGRAMFILES\VRCT" -# XPマニフェスト +; XPマニフェスト XPStyle on -# ページ +; ページ !insertmacro MUI_PAGE_WELCOME +!insertmacro MUI_PAGE_LICENSE "..\LICENSE" !insertmacro MUI_PAGE_DIRECTORY Page custom OptionPage OptionPageLeave !insertmacro MUI_PAGE_INSTFILES !insertmacro MUI_PAGE_FINISH -# アンインストーラ ページ +; アンインストーラ ページ !insertmacro MUI_UNPAGE_WELCOME !insertmacro MUI_UNPAGE_CONFIRM !insertmacro MUI_UNPAGE_INSTFILES !insertmacro MUI_UNPAGE_FINISH -# 日本語UI +; 日本語UI !insertmacro MUI_LANGUAGE "Japanese" -# インターフェース 設定 +; 引数å–得マクロ +!insertmacro GetParameters +!insertmacro GetOptions +; インターフェース 設定 !define MUI_ABORTWARNING -# 変数 +; 変数 Var Checkbox_InstallDocs Var Checkbox_InstallShortcut Var Dialog_Options @@ -43,28 +62,28 @@ Var InstallDocs Var InstallShortcut Var Label_DescriptionOptions -# åˆæœŸåŒ–時コールãƒãƒƒã‚¯ +; åˆæœŸåŒ–時コールãƒãƒƒã‚¯ Function .onInit - # ã‚ªãƒ—ã‚·ãƒ§ãƒ³å€¤ã‚’åˆæœŸåŒ–ã—ã¾ã™ã€‚ + ; ã‚ªãƒ—ã‚·ãƒ§ãƒ³å€¤ã‚’åˆæœŸåŒ–ã—ã¾ã™ã€‚ StrCpy $InstallDocs ${BST_CHECKED} StrCpy $InstallShortcut ${BST_CHECKED} FunctionEnd -# オプション ページ +; オプション ページ Function OptionPage - # nsDialogsを作æˆã—ã¾ã™ã€‚ + ; nsDialogsを作æˆã—ã¾ã™ã€‚ nsDialogs::Create 1018 - # 作æˆã•れãŸnsDialogsを変数ã«ä»£å…¥ã—ã¾ã™ã€‚ + ; 作æˆã•れãŸnsDialogsを変数ã«ä»£å…¥ã—ã¾ã™ã€‚ Pop $Dialog_Options ${If} $Dialog_Options == error - # ダイアログã®ä½œæˆã«å¤±æ•—ã—ãŸå ´åˆã«ã¯çµ‚了ã—ã¾ã™ã€‚ + ; ダイアログã®ä½œæˆã«å¤±æ•—ã—ãŸå ´åˆã«ã¯çµ‚了ã—ã¾ã™ã€‚ Abort ${EndIf} - # ラベルを作æˆã—ã¾ã™ã€‚ + ; ラベルを作æˆã—ã¾ã™ã€‚ ${NSD_CreateLabel} 0 0 100% 12u "ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã‚’é¸æŠžã—ã¦ãã ã•ã„。" - # ラベルを変数ã«ä»£å…¥ã—ã¾ã™ã€‚ + ; ラベルを変数ã«ä»£å…¥ã—ã¾ã™ã€‚ Pop $Label_DescriptionOptions ${NSD_CreateCheckbox} 0 13u 100% 12u "ドキュメントをインストールã™ã‚‹(&D)" @@ -74,54 +93,91 @@ Function OptionPage Pop $Checkbox_InstallShortcut ${If} $InstallDocs == ${BST_CHECKED} - # ãƒã‚§ãƒƒã‚¯ãŒå…¥åŠ›æ¸ˆã®å ´åˆã€ãƒã‚§ãƒƒã‚¯ãƒœãƒƒã‚¯ã‚¹ã«ãƒã‚§ãƒƒã‚¯ã‚’入れã¾ã™ã€‚ + ; ãƒã‚§ãƒƒã‚¯ãŒå…¥åŠ›æ¸ˆã®å ´åˆã€ãƒã‚§ãƒƒã‚¯ãƒœãƒƒã‚¯ã‚¹ã«ãƒã‚§ãƒƒã‚¯ã‚’入れã¾ã™ã€‚ ${NSD_Check} $Checkbox_InstallDocs ${EndIf} ${If} $InstallShortcut == ${BST_CHECKED} - # ãƒã‚§ãƒƒã‚¯ãŒå…¥åŠ›æ¸ˆã®å ´åˆã€ãƒã‚§ãƒƒã‚¯ãƒœãƒƒã‚¯ã‚¹ã«ãƒã‚§ãƒƒã‚¯ã‚’入れã¾ã™ã€‚ + ; ãƒã‚§ãƒƒã‚¯ãŒå…¥åŠ›æ¸ˆã®å ´åˆã€ãƒã‚§ãƒƒã‚¯ãƒœãƒƒã‚¯ã‚¹ã«ãƒã‚§ãƒƒã‚¯ã‚’入れã¾ã™ã€‚ ${NSD_Check} $Checkbox_InstallShortcut ${EndIf} nsDialogs::Show FunctionEnd -# オプション ページ退出コールãƒãƒƒã‚¯ +; オプション ページ退出コールãƒãƒƒã‚¯ Function OptionPageLeave ${NSD_GetState} $Checkbox_InstallDocs $InstallDocs ${NSD_GetState} $Checkbox_InstallShortcut $InstallShortcut FunctionEnd -# デフォルト セクション +; デフォルト セクション Section - # 出力先を指定ã—ã¾ã™ã€‚ + ; If VRCT is already running, display a warning message and exit + StrCpy $1 "VRCT.exe" + nsProcess::_FindProcess "$1" + Pop $R1 + ${If} $R1 = 0 + nsExec::ExecToStack "taskkill /IM VRCT.exe" + ${EndIf} + + ; ディレクトリを削除 + RMDir /r "$INSTDIR" + ; スタート メニューã‹ã‚‰å‰Šé™¤ + Delete "$SMPROGRAMS\VRCT\VRCT.lnk" + RMDir "$SMPROGRAMS\VRCT" + ; デスクトップ ショートカットを削除 + Delete "$DESKTOP\VRCT.lnk" + ; レジストリ キーを削除 + DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\VRCT" + + ; 出力先を指定ã—ã¾ã™ã€‚ SetOutPath "$INSTDIR" - # インストールã•れるファイル + ; インストールã•れるファイル File /r "..\dist\VRCT\" ${If} $InstallDocs == ${BST_CHECKED} - # ドキュメントをインストールã™ã‚‹å ´åˆ - # 出力先を指定ã—ã¾ã™ã€‚ + ; ドキュメントをインストールã™ã‚‹å ´åˆ + ; 出力先を指定ã—ã¾ã™ã€‚ SetOutPath "$INSTDIR\docs" - # インストールã•れるファイル + ; インストールã•れるファイル File "..\dist\README.txt" ${EndIf} - # アンインストーラを出力 + ; アンインストーラを出力 WriteUninstaller "$INSTDIR\Uninstall.exe" ${If} $InstallDocs == ${BST_CHECKED} - # デスクトップã«ã‚·ãƒ§ãƒ¼ãƒˆã‚«ãƒƒãƒˆã‚’ä½œæˆ + ; デスクトップã«ã‚·ãƒ§ãƒ¼ãƒˆã‚«ãƒƒãƒˆã‚’ä½œæˆ CreateShortCut "$DESKTOP\VRCT.lnk" "$INSTDIR\VRCT.exe" ${EndIf} - # スタート メニューã«ã‚·ãƒ§ãƒ¼ãƒˆã‚«ãƒƒãƒˆã‚’登録 + ; スタート メニューã«ã‚·ãƒ§ãƒ¼ãƒˆã‚«ãƒƒãƒˆã‚’登録 CreateDirectory "$SMPROGRAMS\VRCT" SetOutPath "$INSTDIR" CreateShortcut "$SMPROGRAMS\VRCT\VRCT.lnk" "$INSTDIR\VRCT.exe" "" - # レジストリã«ç™»éŒ² + ; レジストリã«ç™»éŒ² WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\VRCT" "DisplayName" "VRCT" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\VRCT" "UninstallString" '"$INSTDIR\Uninstall.exe"' WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\VRCT" "DisplayIcon" '"$INSTDIR\_internal\img\vrct_logo_mark_black.ico"' SectionEnd -# アンインストーラ -!include Uninstall.nsi +; アンインストーラ +Section Uninstall + ; If VRCT is already running, display a warning message and exit + StrCpy $1 "VRCT.exe" + nsProcess::_FindProcess "$1" + Pop $R1 + ${If} $R1 = 0 + MessageBox MB_OK|MB_ICONEXCLAMATION "VRCT is still running. Cannot uninstall this software.$\nPlease close VRCT and try again." /SD IDOK + Abort + ${EndIf} + ; ディレクトリを削除 + RMDir /r "$INSTDIR" + RMDir /r "$LOCALAPPDATA\VRCT" + ; スタート メニューã‹ã‚‰å‰Šé™¤ + Delete "$SMPROGRAMS\VRCT\VRCT.lnk" + RMDir "$SMPROGRAMS\VRCT" + ; デスクトップ ショートカットを削除 + Delete "$DESKTOP\VRCT.lnk" + ; レジストリ キーを削除 + DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\VRCT" +SectionEnd \ No newline at end of file diff --git a/installer/Uninstall.nsi b/installer/Uninstall.nsi deleted file mode 100644 index f44b7ac7..00000000 --- a/installer/Uninstall.nsi +++ /dev/null @@ -1,16 +0,0 @@ -# アンインストーラ -Section "Uninstall" - # アンインストーラを削除 - # Delete "$INSTDIR\Uninstall.exe" - # ファイルを削除 - # Delete "$INSTDIR\VRCT.exe" - # ディレクトリを削除 - RMDir /r "$INSTDIR" - # スタート メニューã‹ã‚‰å‰Šé™¤ - Delete "$SMPROGRAMS\VRCT\VRCT.lnk" - RMDir "$SMPROGRAMS\VRCT" - # デスクトップ ショートカットを削除 - Delete "$DESKTOP\VRCT.lnk" - # レジストリ キーを削除 - DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\VRCT" -SectionEnd \ No newline at end of file From 2707332ec812f5b9f9a7e7de4e3680d67756d0ce Mon Sep 17 00:00:00 2001 From: Sakamoto Shiina <68018796+ShiinaSakamoto@users.noreply.github.com> Date: Fri, 27 Oct 2023 19:56:22 +0900 Subject: [PATCH 17/44] =?UTF-8?q?[Update]=20ColorThemeManager:=20(WIP)Ligh?= =?UTF-8?q?t=E3=83=86=E3=83=BC=E3=83=9E=E9=81=B8=E6=8A=9E=E6=99=82?= =?UTF-8?q?=E3=80=81=E3=82=AB=E3=83=A9=E3=83=BC=E6=8C=87=E5=AE=9A=E3=81=8C?= =?UTF-8?q?=E3=81=AA=E3=81=84=E6=99=82=E3=81=AB=E3=80=81Dark=E3=83=86?= =?UTF-8?q?=E3=83=BC=E3=83=9E=E3=81=A8=E3=83=9E=E3=83=BC=E3=82=B8=E3=81=97?= =?UTF-8?q?=E3=81=A6=E5=80=A4=E3=82=92=E6=8C=81=E3=81=A3=E3=81=A6=E3=81=8F?= =?UTF-8?q?=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vrct_gui/ui_managers/ColorThemeManager.py | 53 ++++++++++++++++++----- vrct_gui/ui_managers/ImageFileManager.py | 3 +- 2 files changed, 44 insertions(+), 12 deletions(-) diff --git a/vrct_gui/ui_managers/ColorThemeManager.py b/vrct_gui/ui_managers/ColorThemeManager.py index db6b73c1..3b7e330d 100644 --- a/vrct_gui/ui_managers/ColorThemeManager.py +++ b/vrct_gui/ui_managers/ColorThemeManager.py @@ -1,13 +1,8 @@ +import pprint from types import SimpleNamespace class ColorThemeManager(): def __init__(self, theme): - # self.main = SimpleNamespace() - # self.config_window = SimpleNamespace() - # self.selectable_language_window = SimpleNamespace() - # self.main_window_cover = SimpleNamespace() - # self.error_message_window = SimpleNamespace() - # self.confirmation_modal = SimpleNamespace() # old one. But leave it here for now. # self.PRIMARY_100_COLOR = "#c4eac1" @@ -86,13 +81,22 @@ class ColorThemeManager(): self.LIGHT_1000_COLOR = "#010101" + self._createDarkModeColor__Default() if theme == "Dark": - self._createDarkModeColor() - # elif theme == "Light": - # self._createLightModeColor() + pass + + elif theme == "Light": + color = self._createLightModeColor() + for c in color.__dict__.keys(): + s = getattr(self, c) + s_dict = s.__dict__ + data = getattr(color, c) + data_dict = data.__dict__ + + self.mergeNestedDicts(s_dict, data_dict) - def _createDarkModeColor(self): + def _createDarkModeColor__Default(self): self.main = SimpleNamespace( # Common BASIC_TEXT_COLOR = self.LIGHT_100_COLOR, @@ -336,4 +340,31 @@ class ColorThemeManager(): # The color code [#bb4448] is a mixture of [#a9555c] and [#cc3333] (for a redder shade). SB__ERROR_MESSAGE_BG_COLOR = "#bb4448", SB__ERROR_MESSAGE_TEXT_COLOR = "#fff", - ) \ No newline at end of file + ) + + def _createLightModeColor(self): + color = SimpleNamespace( + main = SimpleNamespace( + # Main + MAIN_BG_COLOR = self.DARK_200_COLOR, + ), + + config_window = SimpleNamespace( + # Common + BASIC_TEXT_COLOR = self.LIGHT_100_COLOR, + ), + ) + + return color + + + + @staticmethod + def mergeNestedDicts(d1, d2): + for key, value in d2.items(): + if key in d1 and isinstance(d1[key], dict) and isinstance(value, dict): + mergeNestedDicts(d1[key], value) + else: + d1[key] = value + + return d1 diff --git a/vrct_gui/ui_managers/ImageFileManager.py b/vrct_gui/ui_managers/ImageFileManager.py index 8bb71b4a..2de42c52 100644 --- a/vrct_gui/ui_managers/ImageFileManager.py +++ b/vrct_gui/ui_managers/ImageFileManager.py @@ -3,8 +3,9 @@ from ..ui_utils import getImageFileFromUiUtils class ImageFileManager(): def __init__(self, theme:str ="Dark"): + self._createDarkModeImages() if theme == "Dark": - self._createDarkModeImages() + pass elif theme == "Light": self._createLightModeImages() From 20f48999d18bc77eba2ced409b3b831033bb76b5 Mon Sep 17 00:00:00 2001 From: Sakamoto Shiina <68018796+ShiinaSakamoto@users.noreply.github.com> Date: Fri, 27 Oct 2023 19:59:58 +0900 Subject: [PATCH 18/44] =?UTF-8?q?[bugfix]=20ColorThemeManager:=20=E6=8C=87?= =?UTF-8?q?=E5=AE=9A=E3=83=9F=E3=82=B9=E4=BF=AE=E6=AD=A3=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vrct_gui/ui_managers/ColorThemeManager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vrct_gui/ui_managers/ColorThemeManager.py b/vrct_gui/ui_managers/ColorThemeManager.py index 3b7e330d..a54f0dee 100644 --- a/vrct_gui/ui_managers/ColorThemeManager.py +++ b/vrct_gui/ui_managers/ColorThemeManager.py @@ -215,7 +215,7 @@ class ColorThemeManager(): TOP_BG_COLOR = self.DARK_850_COLOR, TITLE_TEXT_COLOR = self.DARK_400_COLOR, - LANGUAGE_BUTTON_BG_COLOR = self.LIGHT_100_COLOR, + LANGUAGE_BUTTON_BG_COLOR = self.DARK_875_COLOR, LANGUAGE_BUTTON_BG_HOVERED_COLOR = self.DARK_825_COLOR, LANGUAGE_BUTTON_BG_CLICKED_COLOR = self.DARK_888_COLOR, ) From 1efd7d03306f108f9ecdc3324e80026d72d8f3d1 Mon Sep 17 00:00:00 2001 From: Sakamoto Shiina <68018796+ShiinaSakamoto@users.noreply.github.com> Date: Sat, 28 Oct 2023 16:05:18 +0900 Subject: [PATCH 19/44] =?UTF-8?q?[Refactor]=20ColorThemeManager:=20?= =?UTF-8?q?=E3=82=AB=E3=83=A9=E3=83=BC=E3=83=86=E3=83=BC=E3=83=9E=E3=81=94?= =?UTF-8?q?=E3=81=A8=E3=81=AB=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB=E5=88=86?= =?UTF-8?q?=E3=81=91=E3=80=82ImageFileManager=E5=BB=83=E6=AD=A2=E3=80=81Co?= =?UTF-8?q?lorThemeManager=E3=81=AB=E7=B5=B1=E5=90=88=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- view.py | 5 +- vrct_gui/ui_managers/ColorThemeManager.py | 414 ++++----------------- vrct_gui/ui_managers/ImageFileManager.py | 59 --- vrct_gui/ui_managers/Themes/__init__.py | 2 + vrct_gui/ui_managers/Themes/_darkTheme.py | 279 ++++++++++++++ vrct_gui/ui_managers/Themes/_lightTheme.py | 43 +++ vrct_gui/ui_managers/__init__.py | 1 - 7 files changed, 402 insertions(+), 401 deletions(-) delete mode 100644 vrct_gui/ui_managers/ImageFileManager.py create mode 100644 vrct_gui/ui_managers/Themes/__init__.py create mode 100644 vrct_gui/ui_managers/Themes/_darkTheme.py create mode 100644 vrct_gui/ui_managers/Themes/_lightTheme.py diff --git a/view.py b/view.py index 5468c7a3..1565aefa 100644 --- a/view.py +++ b/view.py @@ -8,7 +8,7 @@ import i18n from languages import selectable_languages from customtkinter import StringVar, IntVar, BooleanVar, END as CTK_END, get_appearance_mode -from vrct_gui.ui_managers import ColorThemeManager, ImageFileManager, UiScalingManager +from vrct_gui.ui_managers import ColorThemeManager, UiScalingManager from vrct_gui import vrct_gui from utils import callFunctionIfCallable, generatePercentageStringsList, intToPercentageStringsFormatter @@ -37,10 +37,9 @@ class View(): theme = "Dark" all_ctm = ColorThemeManager(theme) all_uism = UiScalingManager(config.UI_SCALING) - image_file = ImageFileManager(theme) common_args = { - "image_file": image_file, + "image_file": all_ctm.image_file, "FONT_FAMILY": config.FONT_FAMILY, } diff --git a/vrct_gui/ui_managers/ColorThemeManager.py b/vrct_gui/ui_managers/ColorThemeManager.py index a54f0dee..36c3862a 100644 --- a/vrct_gui/ui_managers/ColorThemeManager.py +++ b/vrct_gui/ui_managers/ColorThemeManager.py @@ -1,369 +1,107 @@ -import pprint from types import SimpleNamespace +from .Themes import _darkTheme, _lightTheme + class ColorThemeManager(): def __init__(self, theme): + self.base_color = SimpleNamespace( - # old one. But leave it here for now. - # self.PRIMARY_100_COLOR = "#c4eac1" - # self.PRIMARY_200_COLOR = "#9cdd98" - # self.PRIMARY_300_COLOR = "#70d16c" - # self.PRIMARY_400_COLOR = "#49c649" - # self.PRIMARY_500_COLOR = "#0abb1d" - # self.PRIMARY_600_COLOR = "#00ac11" - # self.PRIMARY_650_COLOR = "#00A309" - # self.PRIMARY_700_COLOR = "#009900" - # self.PRIMARY_800_COLOR = "#008800" - # self.PRIMARY_900_COLOR = "#006900" + PRIMARY_100_COLOR = "#b7ded8", + PRIMARY_200_COLOR = "#8acac0", + PRIMARY_300_COLOR = "#61b4a7", + PRIMARY_400_COLOR = "#48a495", + PRIMARY_450_COLOR = "#429c8c", + PRIMARY_500_COLOR = "#3b9483", + PRIMARY_600_COLOR = "#368777", + PRIMARY_650_COLOR = "#347f6f", + PRIMARY_700_COLOR = "#317767", + PRIMARY_750_COLOR = "#2F6F60", + PRIMARY_800_COLOR = "#2c6759", + PRIMARY_900_COLOR = "#214b3f", - # new one. - self.PRIMARY_100_COLOR = "#b7ded8" - self.PRIMARY_200_COLOR = "#8acac0" - self.PRIMARY_300_COLOR = "#61b4a7" - self.PRIMARY_400_COLOR = "#48a495" - self.PRIMARY_450_COLOR = "#429c8c" - self.PRIMARY_500_COLOR = "#3b9483" - self.PRIMARY_600_COLOR = "#368777" - self.PRIMARY_650_COLOR = "#347f6f" - self.PRIMARY_700_COLOR = "#317767" - self.PRIMARY_750_COLOR = "#2F6F60" - self.PRIMARY_800_COLOR = "#2c6759" - self.PRIMARY_900_COLOR = "#214b3f" + DARK_100_COLOR = "#f5f7fb", + DARK_200_COLOR = "#f1f2f6", + DARK_300_COLOR = "#e9eaee", + DARK_350_COLOR = "#d8d9dd", + DARK_400_COLOR = "#c7c8cc", + DARK_450_COLOR = "#b8b9bd", + DARK_500_COLOR = "#a9aaae", + DARK_600_COLOR = "#7f8084", + DARK_650_COLOR = "#75767a", + DARK_700_COLOR = "#6a6c6f", + DARK_725_COLOR = "#636467", + DARK_750_COLOR = "#5b5c5f", + DARK_775_COLOR = "#535457", + DARK_800_COLOR = "#4b4c4f", + DARK_825_COLOR = "#434447", + DARK_850_COLOR = "#3a3b3e", + DARK_863_COLOR = "#36373a", + DARK_875_COLOR = "#323336", + DARK_888_COLOR = "#2e2f32", + DARK_900_COLOR = "#292a2d", + DARK_925_COLOR = "#242528", + DARK_950_COLOR = "#1f2022", + DARK_975_COLOR = "#1a1b1d", + DARK_1000_COLOR = "#151517", # THE DARKEST COLOR - self.DARK_100_COLOR = "#f5f7fb" - self.DARK_200_COLOR = "#f1f2f6" - self.DARK_300_COLOR = "#e9eaee" - self.DARK_350_COLOR = "#d8d9dd" - self.DARK_400_COLOR = "#c7c8cc" - self.DARK_450_COLOR = "#b8b9bd" - self.DARK_500_COLOR = "#a9aaae" - self.DARK_600_COLOR = "#7f8084" - self.DARK_650_COLOR = "#75767a" - self.DARK_700_COLOR = "#6a6c6f" - self.DARK_725_COLOR = "#636467" - self.DARK_750_COLOR = "#5b5c5f" - self.DARK_775_COLOR = "#535457" - self.DARK_800_COLOR = "#4b4c4f" - self.DARK_825_COLOR = "#434447" - self.DARK_850_COLOR = "#3a3b3e" - self.DARK_863_COLOR = "#36373a" - self.DARK_875_COLOR = "#323336" - self.DARK_888_COLOR = "#2e2f32" - self.DARK_900_COLOR = "#292a2d" - self.DARK_925_COLOR = "#242528" - self.DARK_950_COLOR = "#1f2022" - self.DARK_975_COLOR = "#1a1b1d" - self.DARK_1000_COLOR = "#151517" # THE DARKEST COLOR + LIGHT_100_COLOR = "#f2f2f2", # THE LIGHTEST COLOR, + LIGHT_200_COLOR = "#e9e9e9", + LIGHT_250_COLOR = "#e1e1e1", + LIGHT_300_COLOR = "#d9d9d9", + LIGHT_325_COLOR = "#d0d0d0", + LIGHT_350_COLOR = "#c7c7c7", + LIGHT_375_COLOR = "#bebebe", + LIGHT_400_COLOR = "#b5b5b5", + LIGHT_450_COLOR = "#a5a5a5", + LIGHT_500_COLOR = "#959595", + LIGHT_600_COLOR = "#6d6d6d", + LIGHT_700_COLOR = "#5a5a5a", + LIGHT_750_COLOR = "#515151", + LIGHT_800_COLOR = "#3b3b3b", + LIGHT_850_COLOR = "#323232", + LIGHT_875_COLOR = "#2b2b2b", + LIGHT_900_COLOR = "#1b1b1b", + # LIGHT_925_COLOR = "#121212", + # LIGHT_950_COLOR = "#0c0c0c", + # LIGHT_975_COLOR = "#070707", + LIGHT_1000_COLOR = "#010101", + ) - self.LIGHT_100_COLOR = "#f2f2f2" # THE LIGHTEST COLOR - self.LIGHT_200_COLOR = "#e9e9e9" - self.LIGHT_250_COLOR = "#e1e1e1" - self.LIGHT_300_COLOR = "#d9d9d9" - self.LIGHT_325_COLOR = "#d0d0d0" - self.LIGHT_350_COLOR = "#c7c7c7" - self.LIGHT_375_COLOR = "#bebebe" - self.LIGHT_400_COLOR = "#b5b5b5" - self.LIGHT_450_COLOR = "#a5a5a5" - self.LIGHT_500_COLOR = "#959595" - self.LIGHT_600_COLOR = "#6d6d6d" - self.LIGHT_700_COLOR = "#5a5a5a" - self.LIGHT_750_COLOR = "#515151" - self.LIGHT_800_COLOR = "#3b3b3b" - self.LIGHT_850_COLOR = "#323232" - self.LIGHT_875_COLOR = "#2b2b2b" - self.LIGHT_900_COLOR = "#1b1b1b" - # self.LIGHT_925_COLOR = "#121212" - # self.LIGHT_950_COLOR = "#0c0c0c" - # self.LIGHT_975_COLOR = "#070707" - self.LIGHT_1000_COLOR = "#010101" + # It's actually meaningless to separate it from __init__. but it's just set to use the dark theme by default, so I did it just in case to change the default theme. + selected_color_theme = _darkTheme(self.base_color) + for each_key in selected_color_theme.__dict__.keys(): + setattr(self, each_key, getattr(selected_color_theme, each_key)) - self._createDarkModeColor__Default() if theme == "Dark": pass elif theme == "Light": - color = self._createLightModeColor() - for c in color.__dict__.keys(): - s = getattr(self, c) - s_dict = s.__dict__ - data = getattr(color, c) - data_dict = data.__dict__ + selected_color_theme = _lightTheme(self.base_color) + self._colorThemeDictsMerger(selected_color_theme) - self.mergeNestedDicts(s_dict, data_dict) - def _createDarkModeColor__Default(self): - self.main = SimpleNamespace( - # Common - BASIC_TEXT_COLOR = self.LIGHT_100_COLOR, - LABELS_TEXT_COLOR = self.LIGHT_100_COLOR, - # Main - MAIN_BG_COLOR = self.DARK_888_COLOR, + def _colorThemeDictsMerger(self, selected_color_theme): + # Each section(main, selectable_language_window, config_window...) marge to default theme. + for selected_theme_section_key in selected_color_theme.__dict__.keys(): + # Get same section data by section key from default theme. + default_theme_target_section_data = getattr(self, selected_theme_section_key) - TEXTBOX_BG_COLOR = self.DARK_900_COLOR, - TEXTBOX_TEXT_COLOR = self.LIGHT_100_COLOR, - TEXTBOX_TEXT_SUB_COLOR = self.DARK_450_COLOR, - TEXTBOX_SYSTEM_TAG_TEXT_COLOR = self.PRIMARY_300_COLOR, - TEXTBOX_SENT_TAG_TEXT_COLOR = "#6197b4", - TEXTBOX_RECEIVED_TAG_TEXT_COLOR = "#a861b4", - TEXTBOX_ERROR_TAG_TEXT_COLOR = "#c27583", - TEXTBOX_TIMESTAMP_TEXT_COLOR = self.DARK_600_COLOR, + selected_theme_section_data = getattr(selected_color_theme, selected_theme_section_key) + self._mergeNestedDicts(default_theme_target_section_data.__dict__, selected_theme_section_data.__dict__) - TEXTBOX_TAB_BG_PASSIVE_COLOR = self.DARK_850_COLOR, - TEXTBOX_TAB_BG_ACTIVE_COLOR = self.DARK_900_COLOR, - TEXTBOX_TAB_BG_HOVERED_COLOR = self.DARK_800_COLOR, - TEXTBOX_TAB_BG_CLICKED_COLOR = self.DARK_925_COLOR, - TEXTBOX_TAB_TEXT_ACTIVE_COLOR = self.LIGHT_100_COLOR, - TEXTBOX_TAB_TEXT_PASSIVE_COLOR = self.DARK_500_COLOR, - TEXTBOX_ENTRY_TEXT_COLOR = self.DARK_300_COLOR, - TEXTBOX_ENTRY_TEXT_DISABLED_COLOR = self.DARK_500_COLOR, - TEXTBOX_ENTRY_BG_COLOR = self.DARK_875_COLOR, - TEXTBOX_ENTRY_BORDER_COLOR = self.DARK_750_COLOR, - TEXTBOX_ENTRY_PLACEHOLDER_COLOR = self.DARK_500_COLOR, - TEXTBOX_ENTRY_PLACEHOLDER_DISABLED_COLOR = self.DARK_700_COLOR, - - # Sidebar - SIDEBAR_BG_COLOR = self.DARK_850_COLOR, - - # Sidebar Features - SF__BG_COLOR = self.DARK_825_COLOR, - SF__HOVERED_BG_COLOR = self.DARK_800_COLOR, - SF__CLICKED_BG_COLOR = self.DARK_875_COLOR, - SF__TEXT_DISABLED_COLOR = self.DARK_500_COLOR, - - SF__SWITCH_BOX_BG_COLOR = self.DARK_775_COLOR, - SF__SWITCH_BOX_HOVERED_BG_COLOR = self.DARK_725_COLOR, - SF__SWITCH_BOX_CLICKED_BG_COLOR = self.DARK_825_COLOR, - SF__SWITCH_BOX_ACTIVE_BG_COLOR = self.PRIMARY_500_COLOR, - SF__SWITCH_BOX_ACTIVE_HOVERED_BG_COLOR = self.PRIMARY_400_COLOR, - SF__SWITCH_BOX_ACTIVE_CLICKED_BG_COLOR = self.PRIMARY_700_COLOR, - SF__SWITCH_BOX_DISABLE_BG_COLOR = self.PRIMARY_800_COLOR, - - SF__SWITCH_BOX_BUTTON_COLOR = self.DARK_400_COLOR, - # It's not working because It overrode internally. - SF__SWITCH_BOX_BUTTON_HOVERED_COLOR = self.DARK_350_COLOR, - - SF__SELECTED_MARK_ACTIVE_BG_COLOR = self.PRIMARY_500_COLOR, - SF__SELECTED_MARK_ACTIVE_HOVERED_BG_COLOR = self.PRIMARY_400_COLOR, - SF__SELECTED_MARK_ACTIVE_CLICKED_BG_COLOR = self.PRIMARY_700_COLOR, - SF__SELECTED_MARK_DISABLE_BG_COLOR = self.PRIMARY_800_COLOR, - - - # Sidebar Languages Settings - SLS__TITLE_TEXT_COLOR = self.DARK_400_COLOR, - - SLS__BG_COLOR = self.DARK_800_COLOR, - - SLS__PRESETS_TAB_BG_HOVERED_COLOR = self.DARK_825_COLOR, - SLS__PRESETS_TAB_BG_CLICKED_COLOR = self.DARK_875_COLOR, - SLS__PRESETS_TAB_BG_PASSIVE_COLOR = self.DARK_850_COLOR, - SLS__PRESETS_TAB_BG_ACTIVE_COLOR = self.DARK_800_COLOR, - SLS__PRESETS_TAB_ACTIVE_TEXT_COLOR_PASSIVE = self.DARK_600_COLOR, - SLS__PRESETS_TAB_ACTIVE_TEXT_COLOR = self.LIGHT_100_COLOR, - - SLS__BOX_BG_COLOR = self.DARK_825_COLOR, - SLS__BOX_SECTION_TITLE_TEXT_COLOR = self.DARK_400_COLOR, - SLS__BOX_ARROWS_TEXT_COLOR = self.DARK_500_COLOR, - - SLS__OPTIONMENU_BG_COLOR = self.DARK_888_COLOR, - SLS__OPTIONMENU_HOVERED_BG_COLOR = self.DARK_875_COLOR, - SLS__OPTIONMENU_CLICKED_BG_COLOR = self.DARK_900_COLOR, - - - CONFIG_BUTTON_BG_COLOR = self.DARK_850_COLOR, - CONFIG_BUTTON_HOVERED_BG_COLOR = self.DARK_800_COLOR, - CONFIG_BUTTON_CLICKED_BG_COLOR = self.DARK_875_COLOR, - - MINIMIZE_SIDEBAR_BUTTON_BG_COLOR = self.DARK_850_COLOR, - MINIMIZE_SIDEBAR_BUTTON_HOVERED_BG_COLOR = self.DARK_800_COLOR, - MINIMIZE_SIDEBAR_BUTTON_CLICKED_BG_COLOR = self.DARK_900_COLOR, - - - - TOP_BAR_BUTTON_BG_COLOR = self.DARK_888_COLOR, - TOP_BAR_BUTTON_HOVERED_BG_COLOR = self.DARK_850_COLOR, - TOP_BAR_BUTTON_CLICKED_BG_COLOR = self.DARK_900_COLOR, - - UPDATE_AVAILABLE_BUTTON_BG_COLOR = self.DARK_888_COLOR, - UPDATE_AVAILABLE_BUTTON_HOVERED_BG_COLOR = self.DARK_850_COLOR, - UPDATE_AVAILABLE_BUTTON_CLICKED_BG_COLOR = self.DARK_900_COLOR, - UPDATE_AVAILABLE_BUTTON_TEXT_COLOR = self.PRIMARY_300_COLOR, - - HELP_AND_INFO_BUTTON_BG_COLOR = self.DARK_888_COLOR, - HELP_AND_INFO_BUTTON_HOVERED_BG_COLOR = self.DARK_850_COLOR, - HELP_AND_INFO_BUTTON_CLICKED_BG_COLOR = self.DARK_900_COLOR, - ) - - - self.selectable_language_window = SimpleNamespace( - # Selectable Language Window - BASIC_TEXT_COLOR = self.LIGHT_100_COLOR, - - MAIN_BG_COLOR = self.DARK_875_COLOR, - - GO_BACK_BUTTON_BG_COLOR = self.DARK_800_COLOR, - GO_BACK_BUTTON_BG_HOVERED_COLOR = self.DARK_750_COLOR, - GO_BACK_BUTTON_BG_CLICKED_COLOR = self.DARK_875_COLOR, - - TOP_BG_COLOR = self.DARK_850_COLOR, - TITLE_TEXT_COLOR = self.DARK_400_COLOR, - LANGUAGE_BUTTON_BG_COLOR = self.DARK_875_COLOR, - LANGUAGE_BUTTON_BG_HOVERED_COLOR = self.DARK_825_COLOR, - LANGUAGE_BUTTON_BG_CLICKED_COLOR = self.DARK_888_COLOR, - ) - - - - # Modal Window (Main Window) - self.main_window_cover = SimpleNamespace( - TEXT_COLOR = self.LIGHT_100_COLOR, - ) - - - self.confirmation_modal = SimpleNamespace( - MESSAGE_TEXT_COLOR = self.LIGHT_100_COLOR, - FAKE_BORDER_COLOR = self.DARK_600_COLOR, - BG_COLOR = self.DARK_800_COLOR, - CONFIRMATION_BUTTONS_TEXT_COLOR = self.LIGHT_100_COLOR, - - ACCEPT_BUTTON_BG_COLOR = self.PRIMARY_600_COLOR, - ACCEPT_BUTTON_HOVERED_BG_COLOR = self.PRIMARY_450_COLOR, - ACCEPT_BUTTON_CLICKED_BG_COLOR = self.PRIMARY_750_COLOR, - DENY_BUTTON_BG_COLOR = self.DARK_750_COLOR, - DENY_BUTTON_HOVERED_BG_COLOR = self.DARK_700_COLOR, - DENY_BUTTON_CLICKED_BG_COLOR = self.DARK_825_COLOR, - ) - - - self.config_window = SimpleNamespace( - # Common - BASIC_TEXT_COLOR = self.LIGHT_100_COLOR, - LABELS_TEXT_COLOR = self.LIGHT_100_COLOR, - LABELS_DESC_TEXT_COLOR = self.DARK_500_COLOR, - - LABELS_TEXT_DISABLED_COLOR = self.DARK_600_COLOR, - - - # Top bar - TOP_BAR_BG_COLOR = self.DARK_850_COLOR, - - # Restart Button - RESTART_BUTTON_BG_COLOR = self.PRIMARY_600_COLOR, - RESTART_BUTTON_HOVERED_BG_COLOR = self.PRIMARY_500_COLOR, - RESTART_BUTTON_CLICKED_BG_COLOR = self.PRIMARY_700_COLOR, - - - # Compact Mode - COMPACT_MODE_SWITCH_BOX_BG_COLOR = self.DARK_775_COLOR, - COMPACT_MODE_SWITCH_BOX_ACTIVE_BG_COLOR = self.PRIMARY_500_COLOR, - COMPACT_MODE_SWITCH_BOX_BUTTON_COLOR = self.DARK_350_COLOR, - COMPACT_MODE_SWITCH_BOX_BUTTON_HOVERED_COLOR = self.DARK_300_COLOR, - - # Main - MAIN_BG_COLOR = self.DARK_950_COLOR, - - # This is for fake border color - SB__WRAPPER_BG_COLOR = self.DARK_750_COLOR, - - SB__BG_COLOR = self.DARK_888_COLOR, - - SB__OPTIONMENU_BG_COLOR = self.DARK_925_COLOR, - SB__OPTIONMENU_HOVERED_BG_COLOR = self.DARK_850_COLOR, - SB__OPTIONMENU_CLICKED_BG_COLOR = self.DARK_950_COLOR, - SB__DROPDOWN_MENU_WINDOW_BG_COLOR = self.DARK_950_COLOR, - SB__DROPDOWN_MENU_WINDOW_BORDER_COLOR = self.DARK_600_COLOR, - SB__DROPDOWN_MENU_BG_COLOR = self.DARK_875_COLOR, - SB__DROPDOWN_MENU_HOVERED_BG_COLOR = self.DARK_800_COLOR, - SB__DROPDOWN_MENU_CLICKED_BG_COLOR = self.DARK_900_COLOR, - - SB__SLIDER_BG_COLOR = self.DARK_700_COLOR, - SB__SLIDER_PROGRESS_BG_COLOR = self.DARK_500_COLOR, - SB__SLIDER_BUTTON_COLOR = self.DARK_700_COLOR, - SB__SLIDER_BUTTON_HOVERED_COLOR = self.DARK_600_COLOR, - SB__SLIDER_TOOLTIP_BG_COLOR = self.DARK_850_COLOR, - SB__SLIDER_TOOLTIP_TEXT_COLOR = self.DARK_200_COLOR, - - SB__SWITCH_BOX_BG_COLOR = self.DARK_800_COLOR, - SB__SWITCH_BOX_ACTIVE_BG_COLOR = self.PRIMARY_500_COLOR, - SB__SWITCH_BOX_BUTTON_COLOR = self.DARK_400_COLOR, - SB__SWITCH_BOX_BUTTON_HOVERED_COLOR = self.DARK_350_COLOR, - - SB__CHECKBOX_BORDER_COLOR = self.DARK_600_COLOR, - SB__CHECKBOX_HOVER_COLOR = self.DARK_800_COLOR, - SB__CHECKBOX_CHECKED_COLOR = self.PRIMARY_700_COLOR, - SB__CHECKBOX_CHECKMARK_COLOR = self.LIGHT_100_COLOR, - - SB__ENTRY_TEXT_COLOR = self.DARK_300_COLOR, - SB__ENTRY_BG_COLOR = self.DARK_863_COLOR, - SB__ENTRY_BORDER_COLOR = self.DARK_775_COLOR, - - - SB__PROGRESSBAR_X_SLIDER__PROGRESSBAR_BG_COLOR = self.DARK_800_COLOR, - SB__PROGRESSBAR_X_SLIDER__PROGRESSBAR_PROGRESS_BG_COLOR = self.PRIMARY_750_COLOR, - SB__PROGRESSBAR_X_SLIDER__PROGRESSBAR_PROGRESS_EXCEED_THRESHOLD_BG_COLOR = self.PRIMARY_400_COLOR, - - SB__PROGRESSBAR_X_SLIDER__SLIDER_BUTTON_COLOR = self.PRIMARY_600_COLOR, - SB__PROGRESSBAR_X_SLIDER__SLIDER_BUTTON_HOVERED_COLOR = self.PRIMARY_400_COLOR, - - SB__PROGRESSBAR_X_SLIDER__PASSIVE_BUTTON_COLOR = self.DARK_800_COLOR, - SB__PROGRESSBAR_X_SLIDER__PASSIVE_BUTTON_HOVERED_COLOR = self.DARK_700_COLOR, - SB__PROGRESSBAR_X_SLIDER__PASSIVE_BUTTON_CLICKED_COLOR = self.DARK_900_COLOR, - SB__PROGRESSBAR_X_SLIDER__PASSIVE_BUTTON_DISABLED_COLOR = self.DARK_850_COLOR, - - SB__PROGRESSBAR_X_SLIDER__ACTIVE_BUTTON_COLOR = self.PRIMARY_600_COLOR, - SB__PROGRESSBAR_X_SLIDER__ACTIVE_BUTTON_HOVERED_COLOR = self.PRIMARY_500_COLOR, - SB__PROGRESSBAR_X_SLIDER__ACTIVE_BUTTON_CLICKED_COLOR = self.PRIMARY_800_COLOR, - - - # Side menu - SIDE_MENU_BG_COLOR = self.DARK_950_COLOR, - - SIDE_MENU_LABELS_BG_COLOR = self.DARK_950_COLOR, - SIDE_MENU_LABELS_BG_FOR_FAKE_BORDER_COLOR = self.DARK_950_COLOR, - SIDE_MENU_LABELS_HOVERED_BG_COLOR = self.DARK_850_COLOR, - SIDE_MENU_LABELS_CLICKED_BG_COLOR = self.PRIMARY_750_COLOR, - SIDE_MENU_LABELS_SELECTED_TEXT_COLOR = self.PRIMARY_200_COLOR, - - SIDE_MENU_SELECTED_MARK_ACTIVE_BG_COLOR = self.PRIMARY_500_COLOR, - - NOW_VERSION_TEXT_COLOR = self.DARK_300_COLOR, - - # Error Message Window for Config Window - # The color code [#bb4448] is a mixture of [#a9555c] and [#cc3333] (for a redder shade). - SB__ERROR_MESSAGE_BG_COLOR = "#bb4448", - SB__ERROR_MESSAGE_TEXT_COLOR = "#fff", - ) - - def _createLightModeColor(self): - color = SimpleNamespace( - main = SimpleNamespace( - # Main - MAIN_BG_COLOR = self.DARK_200_COLOR, - ), - - config_window = SimpleNamespace( - # Common - BASIC_TEXT_COLOR = self.LIGHT_100_COLOR, - ), - ) - - return color - - - - @staticmethod - def mergeNestedDicts(d1, d2): + def _mergeNestedDicts(self, d1, d2): for key, value in d2.items(): if key in d1 and isinstance(d1[key], dict) and isinstance(value, dict): - mergeNestedDicts(d1[key], value) + self._mergeNestedDicts(d1[key], value) else: d1[key] = value diff --git a/vrct_gui/ui_managers/ImageFileManager.py b/vrct_gui/ui_managers/ImageFileManager.py deleted file mode 100644 index 2de42c52..00000000 --- a/vrct_gui/ui_managers/ImageFileManager.py +++ /dev/null @@ -1,59 +0,0 @@ -from ..ui_utils import getImageFileFromUiUtils - - -class ImageFileManager(): - def __init__(self, theme:str ="Dark"): - self._createDarkModeImages() - if theme == "Dark": - pass - elif theme == "Light": - self._createLightModeImages() - - - def _createDarkModeImages(self): - self.VRCT_LOGO = getImageFileFromUiUtils("vrct_logo_for_dark_mode.png") - self.VRCT_LOGO_MARK = getImageFileFromUiUtils("vrct_logo_mark_white.png") - - self.TRANSLATION_ICON = getImageFileFromUiUtils("translation_icon_white.png") - self.TRANSLATION_ICON_DISABLED = getImageFileFromUiUtils("translation_icon_disabled.png") - self.MIC_ICON = getImageFileFromUiUtils("mic_icon_white.png") - self.MIC_ICON_DISABLED = getImageFileFromUiUtils("mic_icon_disabled.png") - self.HEADPHONES_ICON = getImageFileFromUiUtils("headphones_icon_white.png") - self.HEADPHONES_ICON_DISABLED = getImageFileFromUiUtils("headphones_icon_disabled.png") - self.FOREGROUND_ICON = getImageFileFromUiUtils("foreground_icon_white.png") - self.FOREGROUND_ICON_DISABLED = getImageFileFromUiUtils("foreground_icon_disabled.png") - - self.NARROW_ARROW_DOWN = getImageFileFromUiUtils("narrow_arrow_down.png") - - self.CONFIGURATION_ICON = getImageFileFromUiUtils("configuration_icon_white.png") - self.CONFIGURATION_ICON_DISABLED = getImageFileFromUiUtils("configuration_icon_disabled.png") - - self.ARROW_LEFT = getImageFileFromUiUtils("arrow_left_white.png") - self.ARROW_LEFT_DISABLED = getImageFileFromUiUtils("arrow_left_disabled.png") - - self.REFRESH_ICON = getImageFileFromUiUtils("refresh_icon.png") - self.HELP_ICON = getImageFileFromUiUtils("help_icon_white.png") - - def _createLightModeImages(self): - self.VRCT_LOGO = getImageFileFromUiUtils("vrct_logo_for_light_mode.png") - self.VRCT_LOGO_MARK = getImageFileFromUiUtils("vrct_logo_mark_black.png") - - - self.TRANSLATION_ICON = getImageFileFromUiUtils("translation_icon_white.png") - self.TRANSLATION_ICON_DISABLED = getImageFileFromUiUtils("translation_icon_disabled.png") - self.MIC_ICON = getImageFileFromUiUtils("mic_icon_white.png") - self.MIC_ICON_DISABLED = getImageFileFromUiUtils("mic_icon_disabled.png") - self.HEADPHONES_ICON = getImageFileFromUiUtils("headphones_icon_white.png") - self.HEADPHONES_ICON_DISABLED = getImageFileFromUiUtils("headphones_icon_disabled.png") - self.FOREGROUND_ICON = getImageFileFromUiUtils("foreground_icon_white.png") - self.FOREGROUND_ICON_DISABLED = getImageFileFromUiUtils("foreground_icon_disabled.png") - - self.NARROW_ARROW_DOWN = getImageFileFromUiUtils("narrow_arrow_down.png") - - self.CONFIGURATION_ICON = getImageFileFromUiUtils("configuration_icon_white.png") - self.CONFIGURATION_ICON_DISABLED = getImageFileFromUiUtils("configuration_icon_disabled.png") - - self.ARROW_LEFT = getImageFileFromUiUtils("arrow_left_white.png") - self.ARROW_LEFT_DISABLED = getImageFileFromUiUtils("arrow_left_disabled.png") - - self.HELP_ICON = getImageFileFromUiUtils("help_icon_white.png") \ No newline at end of file diff --git a/vrct_gui/ui_managers/Themes/__init__.py b/vrct_gui/ui_managers/Themes/__init__.py new file mode 100644 index 00000000..fb61579d --- /dev/null +++ b/vrct_gui/ui_managers/Themes/__init__.py @@ -0,0 +1,2 @@ +from ._darkTheme import _darkTheme +from ._lightTheme import _lightTheme \ No newline at end of file diff --git a/vrct_gui/ui_managers/Themes/_darkTheme.py b/vrct_gui/ui_managers/Themes/_darkTheme.py new file mode 100644 index 00000000..cd8ec6a7 --- /dev/null +++ b/vrct_gui/ui_managers/Themes/_darkTheme.py @@ -0,0 +1,279 @@ +from types import SimpleNamespace +from ...ui_utils import getImageFileFromUiUtils + +def _darkTheme(base_color): + theme_settings = SimpleNamespace( + main = SimpleNamespace( + # Common + BASIC_TEXT_COLOR = base_color.LIGHT_100_COLOR, + LABELS_TEXT_COLOR = base_color.LIGHT_100_COLOR, + + # Main + MAIN_BG_COLOR = base_color.DARK_888_COLOR, + + + TEXTBOX_BG_COLOR = base_color.DARK_900_COLOR, + TEXTBOX_TEXT_COLOR = base_color.LIGHT_100_COLOR, + TEXTBOX_TEXT_SUB_COLOR = base_color.DARK_450_COLOR, + TEXTBOX_SYSTEM_TAG_TEXT_COLOR = base_color.PRIMARY_300_COLOR, + TEXTBOX_SENT_TAG_TEXT_COLOR = "#6197b4", + TEXTBOX_RECEIVED_TAG_TEXT_COLOR = "#a861b4", + TEXTBOX_ERROR_TAG_TEXT_COLOR = "#c27583", + TEXTBOX_TIMESTAMP_TEXT_COLOR = base_color.DARK_600_COLOR, + + TEXTBOX_TAB_BG_PASSIVE_COLOR = base_color.DARK_850_COLOR, + TEXTBOX_TAB_BG_ACTIVE_COLOR = base_color.DARK_900_COLOR, + TEXTBOX_TAB_BG_HOVERED_COLOR = base_color.DARK_800_COLOR, + TEXTBOX_TAB_BG_CLICKED_COLOR = base_color.DARK_925_COLOR, + TEXTBOX_TAB_TEXT_ACTIVE_COLOR = base_color.LIGHT_100_COLOR, + TEXTBOX_TAB_TEXT_PASSIVE_COLOR = base_color.DARK_500_COLOR, + + TEXTBOX_ENTRY_TEXT_COLOR = base_color.DARK_300_COLOR, + TEXTBOX_ENTRY_TEXT_DISABLED_COLOR = base_color.DARK_500_COLOR, + TEXTBOX_ENTRY_BG_COLOR = base_color.DARK_875_COLOR, + TEXTBOX_ENTRY_BORDER_COLOR = base_color.DARK_750_COLOR, + TEXTBOX_ENTRY_PLACEHOLDER_COLOR = base_color.DARK_500_COLOR, + TEXTBOX_ENTRY_PLACEHOLDER_DISABLED_COLOR = base_color.DARK_700_COLOR, + + + # Sidebar + SIDEBAR_BG_COLOR = base_color.DARK_850_COLOR, + + # Sidebar Features + SF__BG_COLOR = base_color.DARK_825_COLOR, + SF__HOVERED_BG_COLOR = base_color.DARK_800_COLOR, + SF__CLICKED_BG_COLOR = base_color.DARK_875_COLOR, + SF__TEXT_DISABLED_COLOR = base_color.DARK_500_COLOR, + + SF__SWITCH_BOX_BG_COLOR = base_color.DARK_775_COLOR, + SF__SWITCH_BOX_HOVERED_BG_COLOR = base_color.DARK_725_COLOR, + SF__SWITCH_BOX_CLICKED_BG_COLOR = base_color.DARK_825_COLOR, + SF__SWITCH_BOX_ACTIVE_BG_COLOR = base_color.PRIMARY_500_COLOR, + SF__SWITCH_BOX_ACTIVE_HOVERED_BG_COLOR = base_color.PRIMARY_400_COLOR, + SF__SWITCH_BOX_ACTIVE_CLICKED_BG_COLOR = base_color.PRIMARY_700_COLOR, + SF__SWITCH_BOX_DISABLE_BG_COLOR = base_color.PRIMARY_800_COLOR, + + SF__SWITCH_BOX_BUTTON_COLOR = base_color.DARK_400_COLOR, + # It's not working because It overrode internally. + SF__SWITCH_BOX_BUTTON_HOVERED_COLOR = base_color.DARK_350_COLOR, + + SF__SELECTED_MARK_ACTIVE_BG_COLOR = base_color.PRIMARY_500_COLOR, + SF__SELECTED_MARK_ACTIVE_HOVERED_BG_COLOR = base_color.PRIMARY_400_COLOR, + SF__SELECTED_MARK_ACTIVE_CLICKED_BG_COLOR = base_color.PRIMARY_700_COLOR, + SF__SELECTED_MARK_DISABLE_BG_COLOR = base_color.PRIMARY_800_COLOR, + + + # Sidebar Languages Settings + SLS__TITLE_TEXT_COLOR = base_color.DARK_400_COLOR, + + SLS__BG_COLOR = base_color.DARK_800_COLOR, + + SLS__PRESETS_TAB_BG_HOVERED_COLOR = base_color.DARK_825_COLOR, + SLS__PRESETS_TAB_BG_CLICKED_COLOR = base_color.DARK_875_COLOR, + SLS__PRESETS_TAB_BG_PASSIVE_COLOR = base_color.DARK_850_COLOR, + SLS__PRESETS_TAB_BG_ACTIVE_COLOR = base_color.DARK_800_COLOR, + SLS__PRESETS_TAB_ACTIVE_TEXT_COLOR_PASSIVE = base_color.DARK_600_COLOR, + SLS__PRESETS_TAB_ACTIVE_TEXT_COLOR = base_color.LIGHT_100_COLOR, + + SLS__BOX_BG_COLOR = base_color.DARK_825_COLOR, + SLS__BOX_SECTION_TITLE_TEXT_COLOR = base_color.DARK_400_COLOR, + SLS__BOX_ARROWS_TEXT_COLOR = base_color.DARK_500_COLOR, + + SLS__OPTIONMENU_BG_COLOR = base_color.DARK_888_COLOR, + SLS__OPTIONMENU_HOVERED_BG_COLOR = base_color.DARK_875_COLOR, + SLS__OPTIONMENU_CLICKED_BG_COLOR = base_color.DARK_900_COLOR, + + + CONFIG_BUTTON_BG_COLOR = base_color.DARK_850_COLOR, + CONFIG_BUTTON_HOVERED_BG_COLOR = base_color.DARK_800_COLOR, + CONFIG_BUTTON_CLICKED_BG_COLOR = base_color.DARK_875_COLOR, + + MINIMIZE_SIDEBAR_BUTTON_BG_COLOR = base_color.DARK_850_COLOR, + MINIMIZE_SIDEBAR_BUTTON_HOVERED_BG_COLOR = base_color.DARK_800_COLOR, + MINIMIZE_SIDEBAR_BUTTON_CLICKED_BG_COLOR = base_color.DARK_900_COLOR, + + + + TOP_BAR_BUTTON_BG_COLOR = base_color.DARK_888_COLOR, + TOP_BAR_BUTTON_HOVERED_BG_COLOR = base_color.DARK_850_COLOR, + TOP_BAR_BUTTON_CLICKED_BG_COLOR = base_color.DARK_900_COLOR, + + UPDATE_AVAILABLE_BUTTON_BG_COLOR = base_color.DARK_888_COLOR, + UPDATE_AVAILABLE_BUTTON_HOVERED_BG_COLOR = base_color.DARK_850_COLOR, + UPDATE_AVAILABLE_BUTTON_CLICKED_BG_COLOR = base_color.DARK_900_COLOR, + UPDATE_AVAILABLE_BUTTON_TEXT_COLOR = base_color.PRIMARY_300_COLOR, + + HELP_AND_INFO_BUTTON_BG_COLOR = base_color.DARK_888_COLOR, + HELP_AND_INFO_BUTTON_HOVERED_BG_COLOR = base_color.DARK_850_COLOR, + HELP_AND_INFO_BUTTON_CLICKED_BG_COLOR = base_color.DARK_900_COLOR, + ), + + + selectable_language_window = SimpleNamespace( + # Selectable Language Window + BASIC_TEXT_COLOR = base_color.LIGHT_100_COLOR, + + MAIN_BG_COLOR = base_color.DARK_875_COLOR, + + GO_BACK_BUTTON_BG_COLOR = base_color.DARK_800_COLOR, + GO_BACK_BUTTON_BG_HOVERED_COLOR = base_color.DARK_750_COLOR, + GO_BACK_BUTTON_BG_CLICKED_COLOR = base_color.DARK_875_COLOR, + + TOP_BG_COLOR = base_color.DARK_850_COLOR, + TITLE_TEXT_COLOR = base_color.DARK_400_COLOR, + LANGUAGE_BUTTON_BG_COLOR = base_color.DARK_875_COLOR, + LANGUAGE_BUTTON_BG_HOVERED_COLOR = base_color.DARK_825_COLOR, + LANGUAGE_BUTTON_BG_CLICKED_COLOR = base_color.DARK_888_COLOR, + ), + + + + # Modal Window (Main Window) + main_window_cover = SimpleNamespace( + TEXT_COLOR = base_color.LIGHT_100_COLOR, + ), + + + confirmation_modal = SimpleNamespace( + MESSAGE_TEXT_COLOR = base_color.LIGHT_100_COLOR, + FAKE_BORDER_COLOR = base_color.DARK_600_COLOR, + BG_COLOR = base_color.DARK_800_COLOR, + CONFIRMATION_BUTTONS_TEXT_COLOR = base_color.LIGHT_100_COLOR, + + ACCEPT_BUTTON_BG_COLOR = base_color.PRIMARY_600_COLOR, + ACCEPT_BUTTON_HOVERED_BG_COLOR = base_color.PRIMARY_450_COLOR, + ACCEPT_BUTTON_CLICKED_BG_COLOR = base_color.PRIMARY_750_COLOR, + DENY_BUTTON_BG_COLOR = base_color.DARK_750_COLOR, + DENY_BUTTON_HOVERED_BG_COLOR = base_color.DARK_700_COLOR, + DENY_BUTTON_CLICKED_BG_COLOR = base_color.DARK_825_COLOR, + ), + + + config_window = SimpleNamespace( + # Common + BASIC_TEXT_COLOR = base_color.LIGHT_100_COLOR, + LABELS_TEXT_COLOR = base_color.LIGHT_100_COLOR, + LABELS_DESC_TEXT_COLOR = base_color.DARK_500_COLOR, + + LABELS_TEXT_DISABLED_COLOR = base_color.DARK_600_COLOR, + + + # Top bar + TOP_BAR_BG_COLOR = base_color.DARK_850_COLOR, + + # Restart Button + RESTART_BUTTON_BG_COLOR = base_color.PRIMARY_600_COLOR, + RESTART_BUTTON_HOVERED_BG_COLOR = base_color.PRIMARY_500_COLOR, + RESTART_BUTTON_CLICKED_BG_COLOR = base_color.PRIMARY_700_COLOR, + + + # Compact Mode + COMPACT_MODE_SWITCH_BOX_BG_COLOR = base_color.DARK_775_COLOR, + COMPACT_MODE_SWITCH_BOX_ACTIVE_BG_COLOR = base_color.PRIMARY_500_COLOR, + COMPACT_MODE_SWITCH_BOX_BUTTON_COLOR = base_color.DARK_350_COLOR, + COMPACT_MODE_SWITCH_BOX_BUTTON_HOVERED_COLOR = base_color.DARK_300_COLOR, + + # Main + MAIN_BG_COLOR = base_color.DARK_950_COLOR, + + # This is for fake border color + SB__WRAPPER_BG_COLOR = base_color.DARK_750_COLOR, + + SB__BG_COLOR = base_color.DARK_888_COLOR, + + SB__OPTIONMENU_BG_COLOR = base_color.DARK_925_COLOR, + SB__OPTIONMENU_HOVERED_BG_COLOR = base_color.DARK_850_COLOR, + SB__OPTIONMENU_CLICKED_BG_COLOR = base_color.DARK_950_COLOR, + SB__DROPDOWN_MENU_WINDOW_BG_COLOR = base_color.DARK_950_COLOR, + SB__DROPDOWN_MENU_WINDOW_BORDER_COLOR = base_color.DARK_600_COLOR, + SB__DROPDOWN_MENU_BG_COLOR = base_color.DARK_875_COLOR, + SB__DROPDOWN_MENU_HOVERED_BG_COLOR = base_color.DARK_800_COLOR, + SB__DROPDOWN_MENU_CLICKED_BG_COLOR = base_color.DARK_900_COLOR, + + SB__SLIDER_BG_COLOR = base_color.DARK_700_COLOR, + SB__SLIDER_PROGRESS_BG_COLOR = base_color.DARK_500_COLOR, + SB__SLIDER_BUTTON_COLOR = base_color.DARK_700_COLOR, + SB__SLIDER_BUTTON_HOVERED_COLOR = base_color.DARK_600_COLOR, + SB__SLIDER_TOOLTIP_BG_COLOR = base_color.DARK_850_COLOR, + SB__SLIDER_TOOLTIP_TEXT_COLOR = base_color.DARK_200_COLOR, + + SB__SWITCH_BOX_BG_COLOR = base_color.DARK_800_COLOR, + SB__SWITCH_BOX_ACTIVE_BG_COLOR = base_color.PRIMARY_500_COLOR, + SB__SWITCH_BOX_BUTTON_COLOR = base_color.DARK_400_COLOR, + SB__SWITCH_BOX_BUTTON_HOVERED_COLOR = base_color.DARK_350_COLOR, + + SB__CHECKBOX_BORDER_COLOR = base_color.DARK_600_COLOR, + SB__CHECKBOX_HOVER_COLOR = base_color.DARK_800_COLOR, + SB__CHECKBOX_CHECKED_COLOR = base_color.PRIMARY_700_COLOR, + SB__CHECKBOX_CHECKMARK_COLOR = base_color.LIGHT_100_COLOR, + + SB__ENTRY_TEXT_COLOR = base_color.DARK_300_COLOR, + SB__ENTRY_BG_COLOR = base_color.DARK_863_COLOR, + SB__ENTRY_BORDER_COLOR = base_color.DARK_775_COLOR, + + + SB__PROGRESSBAR_X_SLIDER__PROGRESSBAR_BG_COLOR = base_color.DARK_800_COLOR, + SB__PROGRESSBAR_X_SLIDER__PROGRESSBAR_PROGRESS_BG_COLOR = base_color.PRIMARY_750_COLOR, + SB__PROGRESSBAR_X_SLIDER__PROGRESSBAR_PROGRESS_EXCEED_THRESHOLD_BG_COLOR = base_color.PRIMARY_400_COLOR, + + SB__PROGRESSBAR_X_SLIDER__SLIDER_BUTTON_COLOR = base_color.PRIMARY_600_COLOR, + SB__PROGRESSBAR_X_SLIDER__SLIDER_BUTTON_HOVERED_COLOR = base_color.PRIMARY_400_COLOR, + + SB__PROGRESSBAR_X_SLIDER__PASSIVE_BUTTON_COLOR = base_color.DARK_800_COLOR, + SB__PROGRESSBAR_X_SLIDER__PASSIVE_BUTTON_HOVERED_COLOR = base_color.DARK_700_COLOR, + SB__PROGRESSBAR_X_SLIDER__PASSIVE_BUTTON_CLICKED_COLOR = base_color.DARK_900_COLOR, + SB__PROGRESSBAR_X_SLIDER__PASSIVE_BUTTON_DISABLED_COLOR = base_color.DARK_850_COLOR, + + SB__PROGRESSBAR_X_SLIDER__ACTIVE_BUTTON_COLOR = base_color.PRIMARY_600_COLOR, + SB__PROGRESSBAR_X_SLIDER__ACTIVE_BUTTON_HOVERED_COLOR = base_color.PRIMARY_500_COLOR, + SB__PROGRESSBAR_X_SLIDER__ACTIVE_BUTTON_CLICKED_COLOR = base_color.PRIMARY_800_COLOR, + + + # Side menu + SIDE_MENU_BG_COLOR = base_color.DARK_950_COLOR, + + SIDE_MENU_LABELS_BG_COLOR = base_color.DARK_950_COLOR, + SIDE_MENU_LABELS_BG_FOR_FAKE_BORDER_COLOR = base_color.DARK_950_COLOR, + SIDE_MENU_LABELS_HOVERED_BG_COLOR = base_color.DARK_850_COLOR, + SIDE_MENU_LABELS_CLICKED_BG_COLOR = base_color.PRIMARY_750_COLOR, + SIDE_MENU_LABELS_SELECTED_TEXT_COLOR = base_color.PRIMARY_200_COLOR, + + SIDE_MENU_SELECTED_MARK_ACTIVE_BG_COLOR = base_color.PRIMARY_500_COLOR, + + NOW_VERSION_TEXT_COLOR = base_color.DARK_300_COLOR, + + # Error Message Window for Config Window + # The color code [#bb4448] is a mixture of [#a9555c] and [#cc3333] (for a redder shade). + SB__ERROR_MESSAGE_BG_COLOR = "#bb4448", + SB__ERROR_MESSAGE_TEXT_COLOR = "#fff", + ), + + + + image_file = SimpleNamespace( + VRCT_LOGO = getImageFileFromUiUtils("vrct_logo_for_dark_mode.png"), + VRCT_LOGO_MARK = getImageFileFromUiUtils("vrct_logo_mark_white.png"), + + TRANSLATION_ICON = getImageFileFromUiUtils("translation_icon_white.png"), + TRANSLATION_ICON_DISABLED = getImageFileFromUiUtils("translation_icon_disabled.png"), + MIC_ICON = getImageFileFromUiUtils("mic_icon_white.png"), + MIC_ICON_DISABLED = getImageFileFromUiUtils("mic_icon_disabled.png"), + HEADPHONES_ICON = getImageFileFromUiUtils("headphones_icon_white.png"), + HEADPHONES_ICON_DISABLED = getImageFileFromUiUtils("headphones_icon_disabled.png"), + FOREGROUND_ICON = getImageFileFromUiUtils("foreground_icon_white.png"), + FOREGROUND_ICON_DISABLED = getImageFileFromUiUtils("foreground_icon_disabled.png"), + + NARROW_ARROW_DOWN = getImageFileFromUiUtils("narrow_arrow_down.png"), + + CONFIGURATION_ICON = getImageFileFromUiUtils("configuration_icon_white.png"), + CONFIGURATION_ICON_DISABLED = getImageFileFromUiUtils("configuration_icon_disabled.png"), + + ARROW_LEFT = getImageFileFromUiUtils("arrow_left_white.png"), + ARROW_LEFT_DISABLED = getImageFileFromUiUtils("arrow_left_disabled.png"), + + REFRESH_ICON = getImageFileFromUiUtils("refresh_icon.png"), + HELP_ICON = getImageFileFromUiUtils("help_icon_white.png"), + ), + ) + + return theme_settings \ No newline at end of file diff --git a/vrct_gui/ui_managers/Themes/_lightTheme.py b/vrct_gui/ui_managers/Themes/_lightTheme.py new file mode 100644 index 00000000..835a3210 --- /dev/null +++ b/vrct_gui/ui_managers/Themes/_lightTheme.py @@ -0,0 +1,43 @@ +from types import SimpleNamespace +from ...ui_utils import getImageFileFromUiUtils + +def _lightTheme(base_color): + theme_settings = SimpleNamespace( + main = SimpleNamespace( + # Main + MAIN_BG_COLOR = base_color.DARK_200_COLOR, + ), + + config_window = SimpleNamespace( + # Common + BASIC_TEXT_COLOR = base_color.LIGHT_100_COLOR, + ), + + + image_file = SimpleNamespace( + VRCT_LOGO = getImageFileFromUiUtils("vrct_logo_for_light_mode.png"), + VRCT_LOGO_MARK = getImageFileFromUiUtils("vrct_logo_mark_black.png"), + + + TRANSLATION_ICON = getImageFileFromUiUtils("translation_icon_white.png"), + TRANSLATION_ICON_DISABLED = getImageFileFromUiUtils("translation_icon_disabled.png"), + MIC_ICON = getImageFileFromUiUtils("mic_icon_white.png"), + MIC_ICON_DISABLED = getImageFileFromUiUtils("mic_icon_disabled.png"), + HEADPHONES_ICON = getImageFileFromUiUtils("headphones_icon_white.png"), + HEADPHONES_ICON_DISABLED = getImageFileFromUiUtils("headphones_icon_disabled.png"), + FOREGROUND_ICON = getImageFileFromUiUtils("foreground_icon_white.png"), + FOREGROUND_ICON_DISABLED = getImageFileFromUiUtils("foreground_icon_disabled.png"), + + NARROW_ARROW_DOWN = getImageFileFromUiUtils("narrow_arrow_down.png"), + + CONFIGURATION_ICON = getImageFileFromUiUtils("configuration_icon_white.png"), + CONFIGURATION_ICON_DISABLED = getImageFileFromUiUtils("configuration_icon_disabled.png"), + + ARROW_LEFT = getImageFileFromUiUtils("arrow_left_white.png"), + ARROW_LEFT_DISABLED = getImageFileFromUiUtils("arrow_left_disabled.png"), + + HELP_ICON = getImageFileFromUiUtils("help_icon_white.png"), + ), + ) + + return theme_settings \ No newline at end of file diff --git a/vrct_gui/ui_managers/__init__.py b/vrct_gui/ui_managers/__init__.py index f0dd1edb..6304cb9e 100644 --- a/vrct_gui/ui_managers/__init__.py +++ b/vrct_gui/ui_managers/__init__.py @@ -1,3 +1,2 @@ from .ColorThemeManager import ColorThemeManager -from .ImageFileManager import ImageFileManager from .UiScalingManager import UiScalingManager \ No newline at end of file From 6e54b541ddf0e1953c079aaddfd1c6a7a5a3fa24 Mon Sep 17 00:00:00 2001 From: Sakamoto Shiina <68018796+ShiinaSakamoto@users.noreply.github.com> Date: Sun, 29 Oct 2023 00:10:04 +0900 Subject: [PATCH 20/44] =?UTF-8?q?[Chore]=20ColorThemeManager:=20=E5=A4=89?= =?UTF-8?q?=E6=95=B0=E5=90=8D=E5=A4=89=E6=9B=B4=E3=82=84=E3=82=B3=E3=83=A1?= =?UTF-8?q?=E3=83=B3=E3=83=88=E8=BF=BD=E5=8A=A0=E3=81=AA=E3=81=A9=E3=80=82?= =?UTF-8?q?=E3=83=80=E3=83=BC=E3=82=AF=E3=83=86=E3=83=BC=E3=83=9E=E3=81=AE?= =?UTF-8?q?=E5=9F=BA=E6=9C=AC=E3=83=86=E3=82=AD=E3=82=B9=E3=83=88=E3=82=AB?= =?UTF-8?q?=E3=83=A9=E3=83=BC=E3=82=92=E3=80=81=E5=85=83=E3=80=85Light?= =?UTF-8?q?=E3=83=86=E3=83=BC=E3=83=9E=E3=81=8B=E3=82=89=E6=8C=81=E3=81=A3?= =?UTF-8?q?=E3=81=A6=E3=81=8D=E3=81=A6=E3=81=84=E3=81=9F=E3=81=AE=E3=82=92?= =?UTF-8?q?Dark=E3=83=86=E3=83=BC=E3=83=9E=E5=9B=BA=E6=9C=89=E3=81=AE?= =?UTF-8?q?=E3=82=82=E3=81=AE=E3=81=AB(=E4=B8=AD=E8=BA=AB=E3=81=AF?= =?UTF-8?q?=E4=BB=8A=E3=81=AE=E3=81=A8=E3=81=93=E3=82=8D=E5=90=8C=E3=81=98?= =?UTF-8?q?=E3=81=A7f2f2f2=E3=81=A0=E3=81=91=E3=81=A9)=E3=80=82=20SENT?= =?UTF-8?q?=E3=82=84RECEIVED=E3=82=82=E5=A4=89=E6=95=B0=E5=8C=96=E3=80=82?= =?UTF-8?q?=E5=8F=82=E8=80=83=E3=81=AB=E3=81=97=E3=81=9F=E3=82=B5=E3=82=A4?= =?UTF-8?q?=E3=83=88=E3=81=AE=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88=E8=A8=98?= =?UTF-8?q?=E8=BF=B0=E3=81=AA=E3=81=A9=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vrct_gui/ui_managers/ColorThemeManager.py | 18 ++++++++----- vrct_gui/ui_managers/Themes/_darkTheme.py | 30 +++++++++++----------- vrct_gui/ui_managers/Themes/_lightTheme.py | 6 ++++- 3 files changed, 32 insertions(+), 22 deletions(-) diff --git a/vrct_gui/ui_managers/ColorThemeManager.py b/vrct_gui/ui_managers/ColorThemeManager.py index 36c3862a..707bc9a8 100644 --- a/vrct_gui/ui_managers/ColorThemeManager.py +++ b/vrct_gui/ui_managers/ColorThemeManager.py @@ -4,12 +4,15 @@ from .Themes import _darkTheme, _lightTheme class ColorThemeManager(): def __init__(self, theme): + # base_color 100, 200, 300...900 is generated by https://m2.material.io/design/color/the-color-system.html#tools-for-picking-colors . I put the comment "Source". I used it as a source color and generated. + # and like 750, 888... is made by https://meyerweb.com/eric/tools/color-blend/#:::hex + self.base_color = SimpleNamespace( PRIMARY_100_COLOR = "#b7ded8", PRIMARY_200_COLOR = "#8acac0", PRIMARY_300_COLOR = "#61b4a7", - PRIMARY_400_COLOR = "#48a495", + PRIMARY_400_COLOR = "#48a495", # Source PRIMARY_450_COLOR = "#429c8c", PRIMARY_500_COLOR = "#3b9483", PRIMARY_600_COLOR = "#368777", @@ -19,8 +22,11 @@ class ColorThemeManager(): PRIMARY_800_COLOR = "#2c6759", PRIMARY_900_COLOR = "#214b3f", + SENT_400_COLOR = "#6197b4", # Source PRIMARY_300_COLOR #61b4a7. ANALOGOUS' Second one. + RECEIVED_300_COLOR = "#a861b4", # Source PRIMARY_300_COLOR #61b4a7. TRIADIC' Second one. - DARK_100_COLOR = "#f5f7fb", + DARK_BASIC_TEXT_COLOR = "#f2f2f2", + DARK_100_COLOR = "#f5f7fb", # THE LIGHTEST BG COLOR DARK_200_COLOR = "#f1f2f6", DARK_300_COLOR = "#e9eaee", DARK_350_COLOR = "#d8d9dd", @@ -39,14 +45,14 @@ class ColorThemeManager(): DARK_863_COLOR = "#36373a", DARK_875_COLOR = "#323336", DARK_888_COLOR = "#2e2f32", - DARK_900_COLOR = "#292a2d", + DARK_900_COLOR = "#292a2d", # Source DARK_925_COLOR = "#242528", DARK_950_COLOR = "#1f2022", DARK_975_COLOR = "#1a1b1d", - DARK_1000_COLOR = "#151517", # THE DARKEST COLOR + DARK_1000_COLOR = "#151517", # THE DARKEST BG COLOR - LIGHT_100_COLOR = "#f2f2f2", # THE LIGHTEST COLOR, + LIGHT_100_COLOR = "#f2f2f2", # THE LIGHTEST BG COLOR LIGHT_200_COLOR = "#e9e9e9", LIGHT_250_COLOR = "#e1e1e1", LIGHT_300_COLOR = "#d9d9d9", @@ -66,7 +72,7 @@ class ColorThemeManager(): # LIGHT_925_COLOR = "#121212", # LIGHT_950_COLOR = "#0c0c0c", # LIGHT_975_COLOR = "#070707", - LIGHT_1000_COLOR = "#010101", + LIGHT_1000_COLOR = "#010101", # THE DARKEST BG COLOR ) diff --git a/vrct_gui/ui_managers/Themes/_darkTheme.py b/vrct_gui/ui_managers/Themes/_darkTheme.py index cd8ec6a7..8cadde2c 100644 --- a/vrct_gui/ui_managers/Themes/_darkTheme.py +++ b/vrct_gui/ui_managers/Themes/_darkTheme.py @@ -5,27 +5,27 @@ def _darkTheme(base_color): theme_settings = SimpleNamespace( main = SimpleNamespace( # Common - BASIC_TEXT_COLOR = base_color.LIGHT_100_COLOR, - LABELS_TEXT_COLOR = base_color.LIGHT_100_COLOR, + BASIC_TEXT_COLOR = base_color.DARK_BASIC_TEXT_COLOR, + LABELS_TEXT_COLOR = base_color.DARK_BASIC_TEXT_COLOR, # Main MAIN_BG_COLOR = base_color.DARK_888_COLOR, TEXTBOX_BG_COLOR = base_color.DARK_900_COLOR, - TEXTBOX_TEXT_COLOR = base_color.LIGHT_100_COLOR, + TEXTBOX_TEXT_COLOR = base_color.DARK_BASIC_TEXT_COLOR, TEXTBOX_TEXT_SUB_COLOR = base_color.DARK_450_COLOR, TEXTBOX_SYSTEM_TAG_TEXT_COLOR = base_color.PRIMARY_300_COLOR, - TEXTBOX_SENT_TAG_TEXT_COLOR = "#6197b4", - TEXTBOX_RECEIVED_TAG_TEXT_COLOR = "#a861b4", - TEXTBOX_ERROR_TAG_TEXT_COLOR = "#c27583", + TEXTBOX_SENT_TAG_TEXT_COLOR = base_color.SENT_400_COLOR, + TEXTBOX_RECEIVED_TAG_TEXT_COLOR = base_color.RECEIVED_300_COLOR, + # TEXTBOX_ERROR_TAG_TEXT_COLOR = "#c27583", TEXTBOX_TIMESTAMP_TEXT_COLOR = base_color.DARK_600_COLOR, TEXTBOX_TAB_BG_PASSIVE_COLOR = base_color.DARK_850_COLOR, TEXTBOX_TAB_BG_ACTIVE_COLOR = base_color.DARK_900_COLOR, TEXTBOX_TAB_BG_HOVERED_COLOR = base_color.DARK_800_COLOR, TEXTBOX_TAB_BG_CLICKED_COLOR = base_color.DARK_925_COLOR, - TEXTBOX_TAB_TEXT_ACTIVE_COLOR = base_color.LIGHT_100_COLOR, + TEXTBOX_TAB_TEXT_ACTIVE_COLOR = base_color.DARK_BASIC_TEXT_COLOR, TEXTBOX_TAB_TEXT_PASSIVE_COLOR = base_color.DARK_500_COLOR, TEXTBOX_ENTRY_TEXT_COLOR = base_color.DARK_300_COLOR, @@ -73,7 +73,7 @@ def _darkTheme(base_color): SLS__PRESETS_TAB_BG_PASSIVE_COLOR = base_color.DARK_850_COLOR, SLS__PRESETS_TAB_BG_ACTIVE_COLOR = base_color.DARK_800_COLOR, SLS__PRESETS_TAB_ACTIVE_TEXT_COLOR_PASSIVE = base_color.DARK_600_COLOR, - SLS__PRESETS_TAB_ACTIVE_TEXT_COLOR = base_color.LIGHT_100_COLOR, + SLS__PRESETS_TAB_ACTIVE_TEXT_COLOR = base_color.DARK_BASIC_TEXT_COLOR, SLS__BOX_BG_COLOR = base_color.DARK_825_COLOR, SLS__BOX_SECTION_TITLE_TEXT_COLOR = base_color.DARK_400_COLOR, @@ -111,7 +111,7 @@ def _darkTheme(base_color): selectable_language_window = SimpleNamespace( # Selectable Language Window - BASIC_TEXT_COLOR = base_color.LIGHT_100_COLOR, + BASIC_TEXT_COLOR = base_color.DARK_BASIC_TEXT_COLOR, MAIN_BG_COLOR = base_color.DARK_875_COLOR, @@ -130,15 +130,15 @@ def _darkTheme(base_color): # Modal Window (Main Window) main_window_cover = SimpleNamespace( - TEXT_COLOR = base_color.LIGHT_100_COLOR, + TEXT_COLOR = base_color.DARK_BASIC_TEXT_COLOR, ), confirmation_modal = SimpleNamespace( - MESSAGE_TEXT_COLOR = base_color.LIGHT_100_COLOR, + MESSAGE_TEXT_COLOR = base_color.DARK_BASIC_TEXT_COLOR, FAKE_BORDER_COLOR = base_color.DARK_600_COLOR, BG_COLOR = base_color.DARK_800_COLOR, - CONFIRMATION_BUTTONS_TEXT_COLOR = base_color.LIGHT_100_COLOR, + CONFIRMATION_BUTTONS_TEXT_COLOR = base_color.DARK_BASIC_TEXT_COLOR, ACCEPT_BUTTON_BG_COLOR = base_color.PRIMARY_600_COLOR, ACCEPT_BUTTON_HOVERED_BG_COLOR = base_color.PRIMARY_450_COLOR, @@ -151,8 +151,8 @@ def _darkTheme(base_color): config_window = SimpleNamespace( # Common - BASIC_TEXT_COLOR = base_color.LIGHT_100_COLOR, - LABELS_TEXT_COLOR = base_color.LIGHT_100_COLOR, + BASIC_TEXT_COLOR = base_color.DARK_BASIC_TEXT_COLOR, + LABELS_TEXT_COLOR = base_color.DARK_BASIC_TEXT_COLOR, LABELS_DESC_TEXT_COLOR = base_color.DARK_500_COLOR, LABELS_TEXT_DISABLED_COLOR = base_color.DARK_600_COLOR, @@ -205,7 +205,7 @@ def _darkTheme(base_color): SB__CHECKBOX_BORDER_COLOR = base_color.DARK_600_COLOR, SB__CHECKBOX_HOVER_COLOR = base_color.DARK_800_COLOR, SB__CHECKBOX_CHECKED_COLOR = base_color.PRIMARY_700_COLOR, - SB__CHECKBOX_CHECKMARK_COLOR = base_color.LIGHT_100_COLOR, + SB__CHECKBOX_CHECKMARK_COLOR = base_color.DARK_BASIC_TEXT_COLOR, SB__ENTRY_TEXT_COLOR = base_color.DARK_300_COLOR, SB__ENTRY_BG_COLOR = base_color.DARK_863_COLOR, diff --git a/vrct_gui/ui_managers/Themes/_lightTheme.py b/vrct_gui/ui_managers/Themes/_lightTheme.py index 835a3210..d861711a 100644 --- a/vrct_gui/ui_managers/Themes/_lightTheme.py +++ b/vrct_gui/ui_managers/Themes/_lightTheme.py @@ -4,8 +4,12 @@ from ...ui_utils import getImageFileFromUiUtils def _lightTheme(base_color): theme_settings = SimpleNamespace( main = SimpleNamespace( + # Common + BASIC_TEXT_COLOR = base_color.LIGHT_100_COLOR, + LABELS_TEXT_COLOR = base_color.LIGHT_100_COLOR, + # Main - MAIN_BG_COLOR = base_color.DARK_200_COLOR, + MAIN_BG_COLOR = base_color.DARK_888_COLOR, ), config_window = SimpleNamespace( From c85b312504a4b988863719e18a782b940f2f6ffb Mon Sep 17 00:00:00 2001 From: Sakamoto Shiina <68018796+ShiinaSakamoto@users.noreply.github.com> Date: Sun, 29 Oct 2023 19:02:04 +0900 Subject: [PATCH 21/44] =?UTF-8?q?[bugfix/Update]=20Config=20Window:=20Tool?= =?UTF-8?q?Tip.=20=E8=A7=92=E4=B8=B8=E3=82=92=E7=84=A1=E3=81=8F=E3=81=97?= =?UTF-8?q?=E3=81=BE=E3=81=97=E3=81=9F=E3=80=82=20=E7=90=86=E7=94=B1,=20OS?= =?UTF-8?q?=E5=81=B4=E3=81=A7=E3=83=A9=E3=82=A4=E3=83=88=E3=83=86=E3=83=BC?= =?UTF-8?q?=E3=83=9E=E3=81=AA=E3=81=A9=E9=81=B8=E6=8A=9E=E3=81=95=E3=82=8C?= =?UTF-8?q?=E3=81=9F=E6=99=82=E3=81=AB=E5=BD=B1=E9=9F=BF=E3=81=95=E3=82=8C?= =?UTF-8?q?=E3=81=A6=E5=91=A8=E3=82=8A=E3=81=8C=E7=99=BD=E3=81=8F=E3=81=AA?= =?UTF-8?q?=E3=81=A3=E3=81=A6=E3=81=97=E3=81=BE=E3=81=84=E3=80=81=E6=B6=88?= =?UTF-8?q?=E3=81=9D=E3=81=86=E3=81=AB=E3=82=82Tkinter=E3=81=AE=E9=80=8F?= =?UTF-8?q?=E9=81=8E=E3=81=8C=E4=B8=8D=E5=AE=8C=E5=85=A8=E3=81=99=E3=81=8E?= =?UTF-8?q?=E3=81=A6=E8=A6=8B=E3=81=88=E3=81=A1=E3=82=83=E3=81=86=E3=81=AE?= =?UTF-8?q?=E3=81=A7=E3=82=82=E3=81=86=E8=A7=92=E4=B8=B8=E3=82=92=E3=81=AA?= =?UTF-8?q?=E3=81=8F=E3=81=99=E3=81=93=E3=81=A8=E3=81=AB=E3=81=97=E3=81=BE?= =?UTF-8?q?=E3=81=97=E3=81=9F=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../setting_box_containers/_SettingBoxGenerator.py | 1 + 1 file changed, 1 insertion(+) 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 3c152958..d996fb2e 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 @@ -274,6 +274,7 @@ class _SettingBoxGenerator(): message=getSliderValueWAfterFormatting(), delay=0, bg_color=self.settings.ctm.SB__SLIDER_TOOLTIP_BG_COLOR, + corner_radius=0, text_color=self.settings.ctm.SB__SLIDER_TOOLTIP_TEXT_COLOR, font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.SB__SLIDER_TOOLTIP_FONT_SIZE, weight="normal"), ) From 676a64d0f50d04a4fd9e9e362f9b9c41666be496 Mon Sep 17 00:00:00 2001 From: misyaguziya Date: Mon, 30 Oct 2023 18:25:22 +0900 Subject: [PATCH 22/44] =?UTF-8?q?=F0=9F=91=8D[Update]=20installer=20:=20?= =?UTF-8?q?=E3=82=A4=E3=83=B3=E3=82=B9=E3=83=88=E3=83=BC=E3=83=AB=E3=81=99?= =?UTF-8?q?=E3=82=8B=E3=83=91=E3=82=B9=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.py | 3 +-- installer/Install.nsi | 6 +++--- model.py | 5 +++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/config.py b/config.py index cf2c91bf..7b7c4c27 100644 --- a/config.py +++ b/config.py @@ -530,10 +530,9 @@ class Config: def init_config(self): # Read Only self._VERSION = "2.0.0" - self._LOCAL_PATH = os_path.join(os_getenv('LOCALAPPDATA'), "VRCT") + 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") - os_makedirs(self._LOCAL_PATH, exist_ok=True) self._GITHUB_URL = "https://api.github.com/repos/misyaguziya/VRCT/releases/latest" self._BOOTH_URL = "https://misyaguziya.booth.pm/" self._DOCUMENTS_URL = "https://mzsoftware.notion.site/VRCT-Documents-be79b7a165f64442ad8f326d86c22246" diff --git a/installer/Install.nsi b/installer/Install.nsi index 5fcb57d6..5ee5b8bc 100644 --- a/installer/Install.nsi +++ b/installer/Install.nsi @@ -32,13 +32,13 @@ ShowInstDetails show ; 圧縮メソッド SetCompressor lzma ; インストールã•れるディレクトリ -InstallDir "$PROGRAMFILES\VRCT" +InstallDir "$LOCALAPPDATA\VRCT" ; XPマニフェスト XPStyle on ; ページ !insertmacro MUI_PAGE_WELCOME !insertmacro MUI_PAGE_LICENSE "..\LICENSE" -!insertmacro MUI_PAGE_DIRECTORY +;!insertmacro MUI_PAGE_DIRECTORY Page custom OptionPage OptionPageLeave !insertmacro MUI_PAGE_INSTFILES !insertmacro MUI_PAGE_FINISH @@ -132,7 +132,7 @@ Section ; 出力先を指定ã—ã¾ã™ã€‚ SetOutPath "$INSTDIR" ; インストールã•れるファイル - File /r "..\dist\VRCT\" + File /r "..\dist\VRCT" ${If} $InstallDocs == ${BST_CHECKED} ; ドキュメントをインストールã™ã‚‹å ´åˆ diff --git a/model.py b/model.py index 1be1ce9f..af1d3777 100644 --- a/model.py +++ b/model.py @@ -266,7 +266,7 @@ class Model: @staticmethod def updateSoftware(restart:bool=True): - filename = 'download.zip' + filename = 'VRCT.zip' program_name = 'VRCT.exe' temporary_name = '_VRCT.exe' tmp_directory_name = 'tmp' @@ -276,7 +276,8 @@ class Model: try: res = requests_get(config.GITHUB_URL) - url = res.json()['assets'][0]['browser_download_url'] + assets = res.json()['assets'][0]['browser_download_url'] + url = [i["browser_download_url"] for i in assets if i["name"] == filename][0] res = requests_get(url, stream=True) os_makedirs(os_path.join(current_directory, tmp_directory_name), exist_ok=True) with open(os_path.join(current_directory, tmp_directory_name, filename), 'wb') as file: From a25fe345ed4204891d97695ebc95965f16a0c97e Mon Sep 17 00:00:00 2001 From: misyaguziya Date: Mon, 30 Oct 2023 20:29:18 +0900 Subject: [PATCH 23/44] =?UTF-8?q?=F0=9F=91=8D[Update]=20installer=20:=20au?= =?UTF-8?q?toupdate=E3=81=AE=E5=87=A6=E7=90=86=E3=82=92=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- batch/update.bat | 19 ++++++++++++------- installer/Install.nsi | 2 +- model.py | 6 ++---- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/batch/update.bat b/batch/update.bat index 2a7fc7b2..a492fbc4 100644 --- a/batch/update.bat +++ b/batch/update.bat @@ -1,11 +1,16 @@ @if not "%~0"=="%~dp0.\%~nx0" start /min cmd /c,"%~dp0.\%~nx0" %* & goto :eof -taskkill /im %1 /F +set exe_name=%1 +set folder_name=%2 +set tmp_name=%3 +set restart=%4 + +taskkill /im %exe_name% /F ping -n 2 127.0.0.1 > nul -del /f %1 -ping -n 2 127.0.0.1 > nul -rename %2 %1 -ping -n 2 127.0.0.1 > nul -if %3 == True ( - START "" %1 +del /f %exe_name% +rmdir /s %folder_name% +move %tmp_name%\* .\ +del /f %tmp_name% +if %restart% == True ( + START "" %exe_name% ) \ No newline at end of file diff --git a/installer/Install.nsi b/installer/Install.nsi index 5ee5b8bc..45235ed8 100644 --- a/installer/Install.nsi +++ b/installer/Install.nsi @@ -139,7 +139,7 @@ Section ; 出力先を指定ã—ã¾ã™ã€‚ SetOutPath "$INSTDIR\docs" ; インストールã•れるファイル - File "..\dist\README.txt" + File "..\README.txt" ${EndIf} ; アンインストーラを出力 diff --git a/model.py b/model.py index af1d3777..ecf57fc3 100644 --- a/model.py +++ b/model.py @@ -268,7 +268,7 @@ class Model: def updateSoftware(restart:bool=True): filename = 'VRCT.zip' program_name = 'VRCT.exe' - temporary_name = '_VRCT.exe' + folder_name = '_internal' tmp_directory_name = 'tmp' batch_name = 'update.bat' current_directory = os_path.dirname(sys.argv[0]) @@ -285,9 +285,7 @@ class Model: file.write(chunk) with ZipFile(os_path.join(current_directory, tmp_directory_name, filename)) as zf: zf.extract(program_name, os_path.join(current_directory, tmp_directory_name)) - os_rename(os_path.join(current_directory, tmp_directory_name, program_name), os_path.join(current_directory, temporary_name)) - rmtree(os_path.join(current_directory, tmp_directory_name)) - command = [os_path.join(program_directory, "batch", batch_name), program_name, temporary_name, str(restart)] + command = [os_path.join(program_directory, "batch", batch_name), program_name, folder_name, tmp_directory_name, str(restart)] Popen(command) except: webbrowser.open(config.BOOTH_URL, new=2, autoraise=True) From bfd718ce76f9a5a60083304c39a85fccb6ed4105 Mon Sep 17 00:00:00 2001 From: misyaguziya Date: Tue, 31 Oct 2023 15:31:44 +0900 Subject: [PATCH 24/44] =?UTF-8?q?=F0=9F=90=9B[bugfix]=20installer=20:=20?= =?UTF-8?q?=E3=83=91=E3=82=B9=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- installer/Install.nsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/installer/Install.nsi b/installer/Install.nsi index 45235ed8..f02335ee 100644 --- a/installer/Install.nsi +++ b/installer/Install.nsi @@ -132,7 +132,7 @@ Section ; 出力先を指定ã—ã¾ã™ã€‚ SetOutPath "$INSTDIR" ; インストールã•れるファイル - File /r "..\dist\VRCT" + File /r "..\dist\VRCT\" ${If} $InstallDocs == ${BST_CHECKED} ; ドキュメントをインストールã™ã‚‹å ´åˆ From 033a64a725af7c690e95631abc92430b601c3ff8 Mon Sep 17 00:00:00 2001 From: misyaguziya Date: Tue, 31 Oct 2023 16:34:05 +0900 Subject: [PATCH 25/44] =?UTF-8?q?=F0=9F=91=8D[Update]=20installer=20:=20?= =?UTF-8?q?=E6=9A=AB=E5=AE=9A=E7=9A=84=E3=81=AB=E6=9B=B4=E6=96=B0=E5=87=A6?= =?UTF-8?q?=E7=90=86=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- batch/update.bat | 18 +++++++++++------- model.py | 28 +++++++++++++++++----------- 2 files changed, 28 insertions(+), 18 deletions(-) diff --git a/batch/update.bat b/batch/update.bat index a492fbc4..cb56a4bb 100644 --- a/batch/update.bat +++ b/batch/update.bat @@ -1,16 +1,20 @@ @if not "%~0"=="%~dp0.\%~nx0" start /min cmd /c,"%~dp0.\%~nx0" %* & goto :eof set exe_name=%1 -set folder_name=%2 -set tmp_name=%3 -set restart=%4 +set exe_tmp_name=%2 +set folder_name=%3 +set folder_tmp_name=%4 +set restart=%5 taskkill /im %exe_name% /F ping -n 2 127.0.0.1 > nul del /f %exe_name% -rmdir /s %folder_name% -move %tmp_name%\* .\ -del /f %tmp_name% +rename %exe_tmp_name% %exe_name% +rmdir /s /q %folder_name% +rename %folder_tmp_name% %folder_name% + if %restart% == True ( START "" %exe_name% -) \ No newline at end of file +) + +del /f "%~dp0%~nx0" \ No newline at end of file diff --git a/model.py b/model.py index ecf57fc3..119be153 100644 --- a/model.py +++ b/model.py @@ -1,9 +1,9 @@ import sys from zipfile import ZipFile -from subprocess import Popen +from subprocess import Popen, PIPE from os import makedirs as os_makedirs -from os import path as os_path, rename as os_rename -from shutil import rmtree +from os import path as os_path +from shutil import rmtree, move from datetime import datetime from logging import getLogger, FileHandler, Formatter, INFO from time import sleep @@ -268,15 +268,16 @@ class Model: def updateSoftware(restart:bool=True): filename = 'VRCT.zip' program_name = 'VRCT.exe' + program_tmp_name = '_VRCT.exe' folder_name = '_internal' + folder_tmp_name = '__internal' tmp_directory_name = 'tmp' batch_name = 'update.bat' - current_directory = os_path.dirname(sys.argv[0]) - program_directory = os_path.dirname(__file__) + current_directory = config.LOCAL_PATH try: res = requests_get(config.GITHUB_URL) - assets = res.json()['assets'][0]['browser_download_url'] + assets = res.json()['assets'] url = [i["browser_download_url"] for i in assets if i["name"] == filename][0] res = requests_get(url, stream=True) os_makedirs(os_path.join(current_directory, tmp_directory_name), exist_ok=True) @@ -284,10 +285,15 @@ class Model: for chunk in res.iter_content(chunk_size=1024): file.write(chunk) with ZipFile(os_path.join(current_directory, tmp_directory_name, filename)) as zf: - zf.extract(program_name, os_path.join(current_directory, tmp_directory_name)) - command = [os_path.join(program_directory, "batch", batch_name), program_name, folder_name, tmp_directory_name, str(restart)] - Popen(command) - except: + zf.extractall(os_path.join(current_directory, tmp_directory_name)) + move(os_path.join(current_directory, tmp_directory_name, program_name), os_path.join(current_directory, program_tmp_name)) + move(os_path.join(current_directory, tmp_directory_name, folder_name), os_path.join(current_directory, folder_tmp_name)) + move(os_path.join(current_directory, folder_name, "batch", batch_name), os_path.join(current_directory, batch_name)) + rmtree(os_path.join(current_directory, tmp_directory_name)) + command = [os_path.join(current_directory, batch_name), program_name, program_tmp_name, folder_name, folder_tmp_name, str(restart)] + Popen(command, cwd=current_directory) + except Exception as e: + print(e) webbrowser.open(config.BOOTH_URL, new=2, autoraise=True) @staticmethod @@ -296,7 +302,7 @@ class Model: batch_name = 'restart.bat' program_directory = os_path.dirname(__file__) command = [os_path.join(program_directory, "batch", batch_name), program_name] - Popen(command) + Popen(command, cwd=current_directory) @staticmethod def getListInputHost(): From 57a040f6482248541a89e74ceec702cfc3dee3f6 Mon Sep 17 00:00:00 2001 From: misyaguziya Date: Tue, 31 Oct 2023 17:24:46 +0900 Subject: [PATCH 26/44] =?UTF-8?q?=F0=9F=91=8D[Update]=20installer=20:=20?= =?UTF-8?q?=E3=83=87=E3=83=BC=E3=82=BF=E7=A7=BB=E8=A1=8C=E3=81=AE=E5=87=A6?= =?UTF-8?q?=E7=90=86=E3=82=92=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- batch/update.bat | 11 +++++------ model.py | 5 +---- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/batch/update.bat b/batch/update.bat index cb56a4bb..7353721c 100644 --- a/batch/update.bat +++ b/batch/update.bat @@ -1,17 +1,16 @@ @if not "%~0"=="%~dp0.\%~nx0" start /min cmd /c,"%~dp0.\%~nx0" %* & goto :eof set exe_name=%1 -set exe_tmp_name=%2 -set folder_name=%3 -set folder_tmp_name=%4 -set restart=%5 +set folder_name=%2 +set folder_tmp=%3 +set restart=%4 taskkill /im %exe_name% /F ping -n 2 127.0.0.1 > nul del /f %exe_name% -rename %exe_tmp_name% %exe_name% rmdir /s /q %folder_name% -rename %folder_tmp_name% %folder_name% +move /Y %exe_tmp_name%\* .\ +rmdir /s /q %exe_tmp_name% if %restart% == True ( START "" %exe_name% diff --git a/model.py b/model.py index 119be153..24d3b770 100644 --- a/model.py +++ b/model.py @@ -286,11 +286,8 @@ class Model: file.write(chunk) with ZipFile(os_path.join(current_directory, tmp_directory_name, filename)) as zf: zf.extractall(os_path.join(current_directory, tmp_directory_name)) - move(os_path.join(current_directory, tmp_directory_name, program_name), os_path.join(current_directory, program_tmp_name)) - move(os_path.join(current_directory, tmp_directory_name, folder_name), os_path.join(current_directory, folder_tmp_name)) move(os_path.join(current_directory, folder_name, "batch", batch_name), os_path.join(current_directory, batch_name)) - rmtree(os_path.join(current_directory, tmp_directory_name)) - command = [os_path.join(current_directory, batch_name), program_name, program_tmp_name, folder_name, folder_tmp_name, str(restart)] + command = [os_path.join(current_directory, batch_name), program_name, folder_name, tmp_directory_name, str(restart)] Popen(command, cwd=current_directory) except Exception as e: print(e) From c98912f31b27e88b7cfe0ec3362a42ac0da92a86 Mon Sep 17 00:00:00 2001 From: Sakamoto Shiina <68018796+ShiinaSakamoto@users.noreply.github.com> Date: Wed, 1 Nov 2023 02:49:10 +0900 Subject: [PATCH 27/44] =?UTF-8?q?[Update]=20Mic=20Word=20Filter:=20UI?= =?UTF-8?q?=E6=94=B9=E5=96=84=E3=80=81=E3=83=AA=E3=82=B9=E3=83=88=E8=A1=A8?= =?UTF-8?q?=E8=A8=98=E3=81=AB=E3=81=97=E3=80=81=E8=BF=BD=E5=8A=A0=E3=82=84?= =?UTF-8?q?=E5=89=8A=E9=99=A4=E3=82=82=E7=9B=B4=E6=84=9F=E7=9A=84=E3=81=AB?= =?UTF-8?q?=E8=A1=8C=E3=81=88=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E3=80=82?= =?UTF-8?q?=E2=80=BB=5FSettingBoxGenerator.py=E5=86=85=E3=81=AB=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0=E3=81=95=E3=82=8C=E3=81=9F=E9=96=A2=E6=95=B0=E3=81=8C?= =?UTF-8?q?=E3=80=81=E6=B1=8E=E7=94=A8=E7=9A=84=E3=81=A7=E3=81=AF=E3=81=AA?= =?UTF-8?q?=E3=81=8F=E3=80=81=E3=83=AF=E3=83=BC=E3=83=89=E3=83=95=E3=82=A3?= =?UTF-8?q?=E3=83=AB=E3=82=BF=E3=83=BC=E5=B0=82=E7=94=A8=E7=8A=B6=E6=85=8B?= =?UTF-8?q?=E3=81=A7=E3=81=99=E3=80=82=20config.py:=20=E7=99=BB=E9=8C=B2?= =?UTF-8?q?=E3=81=95=E3=82=8C=E3=81=9F=E5=8D=98=E8=AA=9E=E3=81=AF=E4=B8=80?= =?UTF-8?q?=E6=84=8F=E3=81=AB=E3=81=AA=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?= =?UTF-8?q?=E3=80=81=E9=A0=86=E5=BA=8F=E3=82=92=E4=BF=9D=E6=8C=81=E3=81=97?= =?UTF-8?q?=E3=81=A4=E3=81=A4=E9=87=8D=E8=A4=87=E5=89=8A=E9=99=A4=E5=87=A6?= =?UTF-8?q?=E7=90=86=E3=80=82=20=E3=81=9D=E3=81=AE=E4=BB=96=E3=83=AF?= =?UTF-8?q?=E3=83=BC=E3=83=89=E3=83=95=E3=82=A3=E3=83=AB=E3=82=BF=E3=83=BC?= =?UTF-8?q?=E3=81=AE=E8=AA=AC=E6=98=8E=E6=96=87=E8=A8=80=E8=AA=BF=E6=95=B4?= =?UTF-8?q?=E3=81=AA=E3=81=A9=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.py | 2 +- controller.py | 42 ++- img/cancel_icon.png | Bin 0 -> 2064 bytes img/redo_white.png | Bin 0 -> 1351 bytes locales/en.yml | 4 +- locales/ja.yml | 4 +- view.py | 54 ++- .../_SettingBoxGenerator.py | 314 +++++++++++++++++- .../createSettingBox_Mic.py | 28 +- vrct_gui/ui_managers/Themes/_darkTheme.py | 21 ++ vrct_gui/ui_managers/UiScalingManager.py | 26 ++ 11 files changed, 474 insertions(+), 21 deletions(-) create mode 100644 img/cancel_icon.png create mode 100644 img/redo_white.png diff --git a/config.py b/config.py index afd25f43..90896694 100644 --- a/config.py +++ b/config.py @@ -346,7 +346,7 @@ class Config: @INPUT_MIC_WORD_FILTER.setter def INPUT_MIC_WORD_FILTER(self, value): if type(value) is list: - self._INPUT_MIC_WORD_FILTER = value + self._INPUT_MIC_WORD_FILTER = sorted(set(value), key=value.index) saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @property diff --git a/controller.py b/controller.py index f3ee030d..f3f2d7c1 100644 --- a/controller.py +++ b/controller.py @@ -487,19 +487,40 @@ def callbackSetMicMaxPhrases(value): except: view.showErrorMessage_MicMaxPhrases() -def callbackSetMicWordFilter(value): - print("callbackSetMicWordFilter", value) - word_filter = str(value) - word_filter = [w.strip() for w in word_filter.split(",") if len(w.strip()) > 0] - word_filter = ",".join(word_filter) - print("callbackSetMicWordFilter_afterSplitting", word_filter) - if len(word_filter) > 0: - config.INPUT_MIC_WORD_FILTER = word_filter.split(",") - else: - config.INPUT_MIC_WORD_FILTER = [] +def callbackSetMicWordFilter(values): + print("callbackSetMicWordFilter", values) + values = str(values) + values = [w.strip() for w in values.split(",") if len(w.strip()) > 0] + # Copy the list + new_input_mic_word_filter_list = config.INPUT_MIC_WORD_FILTER + new_added_value = [] + for value in values: + if value in new_input_mic_word_filter_list: + # If the value is already in the list, do nothing. + pass + else: + new_input_mic_word_filter_list.append(value) + new_added_value.append(value) + config.INPUT_MIC_WORD_FILTER = new_input_mic_word_filter_list + + view.addValueToList_WordFilter(new_added_value) + view.clearEntryBox_WordFilter() + view.setLatestConfigVariable("MicMicWordFilter") + model.resetKeywordProcessor() model.addKeywords() +def callbackDeleteMicWordFilter(value): + print("callbackDeleteMicWordFilter", value) + try: + new_input_mic_word_filter_list = config.INPUT_MIC_WORD_FILTER + new_input_mic_word_filter_list.remove(str(value)) + config.INPUT_MIC_WORD_FILTER = new_input_mic_word_filter_list + view.setLatestConfigVariable("MicMicWordFilter") + except: + print("There was no the target word in config.INPUT_MIC_WORD_FILTER") + + def callbackSetSpeakerEnergyThreshold(value): print("callbackSetSpeakerEnergyThreshold", value) if value == "": return @@ -718,6 +739,7 @@ def createMainWindow(): "callback_set_mic_phrase_timeout": callbackSetMicPhraseTimeout, "callback_set_mic_max_phrases": callbackSetMicMaxPhrases, "callback_set_mic_word_filter": callbackSetMicWordFilter, + "callback_delete_mic_word_filter": callbackDeleteMicWordFilter, # Transcription Tab (Speaker) "callback_set_speaker_energy_threshold": callbackSetSpeakerEnergyThreshold, diff --git a/img/cancel_icon.png b/img/cancel_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..aa6c386e7b0dbca0361d5250ac115f4e2809b023 GIT binary patch literal 2064 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 JPDHLkV1kn~dAk4r literal 0 HcmV?d00001 diff --git a/locales/en.yml b/locales/en.yml index 3af662cf..7eee5744 100644 --- a/locales/en.yml +++ b/locales/en.yml @@ -138,7 +138,9 @@ config_window: mic_word_filter: label: Mic Word Filter - desc: "It will not send the sentence if the word(s) included in the set list of words.\nHow to set: e.g. AAA,BBB,CCC" + desc: "If a registered word is detected, the text will not be sent. To add multiple words at once, separate them with a \",\" (comma). \n*Duplicate words will not be registered." + add_button_label: Add + count_desc: "Current registered word count: %{count}" speaker_dynamic_energy_threshold: diff --git a/locales/ja.yml b/locales/ja.yml index e608c2b2..b662a3eb 100644 --- a/locales/ja.yml +++ b/locales/ja.yml @@ -138,7 +138,9 @@ config_window: mic_word_filter: label: ワードフィルター - desc: "設定ã•れãŸå˜èªžã‚’検出ã™ã‚‹ã¨ã€ãã®æ–‡ç« ã¯é€ä¿¡ã•れã¾ã›ã‚“。\n設定ã®ä¾‹: AAA,BBB,CCC" + desc: "登録ã•れãŸå˜èªžã‚’検出ã™ã‚‹ã¨ã€ãã®æ–‡ç« ã¯é€ä¿¡ã•れã¾ã›ã‚“。\n「,ã€ã‚«ãƒ³ãƒžã§åŒºåˆ‡ã‚‹ã¨ã€ã¾ã¨ã‚ã¦è¤‡æ•°ã®å˜èªžã‚’追加ã§ãã¾ã™ã€‚\n※é‡è¤‡ã—ãŸå˜èªžã¯ç™»éŒ²ã•れã¾ã›ã‚“。" + add_button_label: 追加 + count_desc: "ç¾åœ¨ç™»éŒ²ã•れã¦ã„ã‚‹å˜èªžæ•°: %{count}" speaker_dynamic_energy_threshold: diff --git a/view.py b/view.py index 1565aefa..ac1d0739 100644 --- a/view.py +++ b/view.py @@ -284,10 +284,15 @@ class View(): VAR_MIC_MAX_PHRASES=StringVar(value=config.INPUT_MIC_MAX_PHRASES), CALLBACK_FOCUS_OUT_MIC_MAX_PHRASES=self.callbackBindFocusOut_MicMaxPhrases, + CALLBACK_ARROW_SWITCH_MIC_WORD_FILTER_LIST_OPEN=self._openMicWordFilterList, + CALLBACK_ARROW_SWITCH_MIC_WORD_FILTER_LIST_CLOSE=self._closeMicWordFilterList, + VAR_LABEL_MIC_WORD_FILTER=StringVar(value=i18n.t("config_window.mic_word_filter.label")), VAR_DESC_MIC_WORD_FILTER=StringVar(value=i18n.t("config_window.mic_word_filter.desc")), + VAR_SWITCH_DESC_MIC_WORD_FILTER=StringVar(value=i18n.t("config_window.mic_word_filter.count_desc", count=len(config.INPUT_MIC_WORD_FILTER))), + VAR_LABEL_MIC_WORD_FILTER_ADD_BUTTON=StringVar(value=i18n.t("config_window.mic_word_filter.add_button_label")), CALLBACK_SET_MIC_WORD_FILTER=None, - VAR_MIC_WORD_FILTER=StringVar(value=",".join(config.INPUT_MIC_WORD_FILTER) if len(config.INPUT_MIC_WORD_FILTER) > 0 else ""), + MIC_WORD_FILTER_LIST=config.INPUT_MIC_WORD_FILTER, # Transcription Tab (Speaker) @@ -462,6 +467,7 @@ class View(): self.view_variable.CALLBACK_SET_MIC_PHRASE_TIMEOUT = config_window_registers.get("callback_set_mic_phrase_timeout", None) self.view_variable.CALLBACK_SET_MIC_MAX_PHRASES = config_window_registers.get("callback_set_mic_max_phrases", None) self.view_variable.CALLBACK_SET_MIC_WORD_FILTER = config_window_registers.get("callback_set_mic_word_filter", None) + self.view_variable.CALLBACK_DELETE_MIC_WORD_FILTER = config_window_registers.get("callback_delete_mic_word_filter", None) # Transcription Tab (Speaker) self.view_variable.CALLBACK_SET_SPEAKER_ENERGY_THRESHOLD = config_window_registers.get("callback_set_speaker_energy_threshold", None) @@ -603,10 +609,12 @@ class View(): def enableConfigWindowCompactMode(self): for additional_widget in vrct_gui.config_window.additional_widgets: additional_widget.grid_remove() + self._closeMicWordFilterList() def disableConfigWindowCompactMode(self): for additional_widget in vrct_gui.config_window.additional_widgets: additional_widget.grid() + self._closeMicWordFilterList() def showRestartButtonIfRequired(self, locale:Union[None,str]=None): @@ -783,6 +791,43 @@ class View(): + def _openMicWordFilterList(self): + target_widget = vrct_gui.config_window.sb__widgets["sb__arrow_switch_mic_word_filter"] + target_widget.arrow_switch_open.grid_remove() + target_widget.arrow_switch_close.grid() + + vrct_gui.config_window.sb__mic_word_filter_list.grid() + + def _closeMicWordFilterList(self): + target_widget = vrct_gui.config_window.sb__widgets["sb__arrow_switch_mic_word_filter"] + target_widget.arrow_switch_close.grid_remove() + target_widget.arrow_switch_open.grid() + + vrct_gui.config_window.sb__mic_word_filter_list.grid_remove() + + + def addValueToList_WordFilter(self, values:list): + target_widget = vrct_gui.config_window.sb__widgets["sb__add_and_delete_able_list_mic_word_filter_list"] + for t_item in target_widget.items: + if t_item.label in values: + values.remove(t_item.label) + t_item.redoFunction() + mic_word_filter_item_row_wrapper, accumulated_labels_width, last_row, last_column = target_widget.addValues( + values, + target_widget.mic_word_filter_item_row_wrapper, + target_widget.accumulated_labels_width, + target_widget.last_row, + target_widget.last_column + ) + target_widget.mic_word_filter_item_row_wrapper = mic_word_filter_item_row_wrapper + target_widget.accumulated_labels_width = accumulated_labels_width + target_widget.last_row = last_row + target_widget.last_column = last_column + + def clearEntryBox_WordFilter(self): + self._clearEntryBox(vrct_gui.config_window.sb__entry_mic_word_filter_list) + + # Widget Control (Whole) def foregroundOnIfForegroundEnabled(self): if config.ENABLE_FOREGROUND: @@ -924,6 +969,7 @@ class View(): def _closeConfigWindow(self): callFunctionIfCallable(self.view_variable.CALLBACK_CLOSE_CONFIG_WINDOW) + self._closeMicWordFilterList() vrct_gui._closeConfigWindow() # Window Control (Main Window Cover) @@ -981,7 +1027,8 @@ class View(): def setGuiVariable_MicMaxPhrases(self, value): self.view_variable.VAR_MIC_MAX_PHRASES.set(str(value)) - + def setGuiVariable_MicWordFilter_Length(self, value): + self.view_variable.VAR_SWITCH_DESC_MIC_WORD_FILTER.set(i18n.t("config_window.mic_word_filter.count_desc", count=value)) def setGuiVariable_SpeakerRecordTimeout(self, value): self.view_variable.VAR_SPEAKER_RECORD_TIMEOUT.set(str(value)) @@ -1011,6 +1058,9 @@ class View(): self.setGuiVariable_MicPhraseTimeout(config.INPUT_MIC_PHRASE_TIMEOUT) case "MicMaxPhrases": self.setGuiVariable_MicMaxPhrases(config.INPUT_MIC_MAX_PHRASES) + case "MicMicWordFilter": + self.setGuiVariable_MicWordFilter_Length(len(config.INPUT_MIC_WORD_FILTER)) + case "SpeakerRecordTimeout": self.setGuiVariable_SpeakerRecordTimeout(config.INPUT_SPEAKER_RECORD_TIMEOUT) case "SpeakerPhraseTimeout": 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 d996fb2e..8a7f3622 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 @@ -5,8 +5,9 @@ from typing import Union from customtkinter import CTkOptionMenu, CTkFont, CTkFrame, CTkLabel, CTkRadioButton, CTkEntry, CTkSlider, CTkSwitch, CTkCheckBox, CTkProgressBar from CTkToolTip import * -from vrct_gui.ui_utils import createButtonWithImage, getLatestWidth, createOptionMenuBox +from vrct_gui.ui_utils import createButtonWithImage, getLatestWidth, createOptionMenuBox, getLatestHeight, bindButtonFunctionAndColor from vrct_gui import vrct_gui +from utils import isEven, callFunctionIfCallable SETTING_BOX_COLUMN = 1 @@ -17,6 +18,8 @@ class _SettingBoxGenerator(): self.parent_widget = parent_widget self.settings = settings + self.MAIN_INNER_AREA_MIN_WIDTH = int(self.settings.uism.MAIN_AREA_MIN_WIDTH - self.settings.uism.SB__IPADX) + self.dropdown_menu_window = vrct_gui.vrct_gui.dropdown_menu_window def _createSettingBoxFrame(self, sb__attr_name, for_var_label_text=None, for_var_desc_text=None): @@ -449,6 +452,315 @@ class _SettingBoxGenerator(): return setting_box_frame + def createSettingBoxArrowSwitch( + self, + for_var_label_text, for_var_desc_text, + arrow_switch_attr_name, + open_command, + close_command, + var_switch_desc=None, + ): + + (setting_box_frame, setting_box_item_frame) = self._createSettingBoxFrame(arrow_switch_attr_name, for_var_label_text, for_var_desc_text) + + ARROW_BUTTON_COLUMN = SETTING_BOX_COLUMN + + if var_switch_desc is not None: + label_widget = CTkLabel( + setting_box_item_frame, + textvariable=var_switch_desc, + height=0, + corner_radius=0, + font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.SB__ARROW_SWITCH_DESC_FONT_SIZE, weight="normal"), + anchor="w", + text_color=self.settings.ctm.LABELS_DESC_TEXT_COLOR, + ) + + label_widget.grid(row=1, column=SETTING_BOX_COLUMN) + ARROW_BUTTON_COLUMN = SETTING_BOX_COLUMN + 1 + + + for_opening_button_wrapper = createButtonWithImage( + parent_widget=setting_box_item_frame, + button_fg_color=self.settings.ctm.SB__ARROW_SWITCH_BUTTON_COLOR, + button_enter_color=self.settings.ctm.SB__ARROW_SWITCH_BUTTON_HOVERED_COLOR, + button_clicked_color=self.settings.ctm.SB__ARROW_SWITCH_BUTTON_CLICKED_COLOR, + button_image_file=self.settings.image_file.ARROW_LEFT.rotate(270), + button_image_size=self.settings.uism.SB__ARROW_SWITCH_BUTTON_ICON_SIZE, + button_ipadxy=self.settings.uism.SB__ARROW_SWITCH_BUTTON_IPADXY, + button_command=open_command, + ) + for_opening_button_wrapper.grid(row=1, column=ARROW_BUTTON_COLUMN, padx=self.settings.uism.SB__ARROW_SWITCH_LEFT_PADX, sticky="e") + + self.config_window.sb__widgets[arrow_switch_attr_name].arrow_switch_open = for_opening_button_wrapper + + for_closing_button_wrapper = createButtonWithImage( + parent_widget=setting_box_item_frame, + button_fg_color=self.settings.ctm.SB__ARROW_SWITCH_BUTTON_COLOR, + button_enter_color=self.settings.ctm.SB__ARROW_SWITCH_BUTTON_HOVERED_COLOR, + button_clicked_color=self.settings.ctm.SB__ARROW_SWITCH_BUTTON_CLICKED_COLOR, + button_image_file=self.settings.image_file.ARROW_LEFT.rotate(90), + button_image_size=self.settings.uism.SB__ARROW_SWITCH_BUTTON_ICON_SIZE, + button_ipadxy=self.settings.uism.SB__ARROW_SWITCH_BUTTON_IPADXY, + button_command=close_command, + ) + for_closing_button_wrapper.grid(row=1, column=ARROW_BUTTON_COLUMN, padx=self.settings.uism.SB__ARROW_SWITCH_LEFT_PADX, sticky="e") + for_closing_button_wrapper.grid_remove() + + self.config_window.sb__widgets[arrow_switch_attr_name].arrow_switch_close = for_closing_button_wrapper + + + return setting_box_frame + + + + # I've added it for the word filter, but it's not currently generalized. If you want to use it in the same way elsewhere, it will require refactoring. + def createSettingBoxAddAndDeleteAbleList( + self, + add_and_delete_able_list_attr_name, + entry_attr_name, + entry_width, + mic_word_filter_list, + ): + + (setting_box_frame, setting_box_item_frame) = self._createSettingBoxFrame(add_and_delete_able_list_attr_name) + + self.config_window.sb__widgets[add_and_delete_able_list_attr_name].items = [] + + + list_container = CTkFrame(setting_box_item_frame, corner_radius=0, fg_color=self.settings.ctm.SB__BG_COLOR, width=0, height=0) + list_container.grid(row=1, column=0, sticky="nsew") + + + max_width = int(self.MAIN_INNER_AREA_MIN_WIDTH - (self.settings.uism.SB__IPADX*2)) + + def addValues(mic_word_filter_list, mic_word_filter_item_row_wrapper, accumulated_labels_width, row, column): + for mic_word_filter_item in mic_word_filter_list: + mic_word_filter_item_wrapper = self._createValue(add_and_delete_able_list_attr_name, mic_word_filter_item_row_wrapper, row, column, mic_word_filter_item) + + if int(accumulated_labels_width + getLatestWidth(mic_word_filter_item_wrapper) + self.settings.uism.ADD_AND_DELETE_ABLE_LIST__VALUES_LEFT_PADX[1]) >= max_width: + accumulated_labels_width = 0 + column = 0 + row += 1 + mic_word_filter_item_wrapper.destroy() + mic_word_filter_item_row_wrapper = self._createRowFrame(list_container, row) + mic_word_filter_item_wrapper = self._createValue(add_and_delete_able_list_attr_name, mic_word_filter_item_row_wrapper, row, column, mic_word_filter_item) + column += 1 + else: + column += 1 + + accumulated_labels_width += int(getLatestWidth(mic_word_filter_item_wrapper) + self.settings.uism.ADD_AND_DELETE_ABLE_LIST__VALUES_LEFT_PADX[1]) + + + + return mic_word_filter_item_row_wrapper, accumulated_labels_width, row, column + + accumulated_labels_width = 0 + row=0 + column=0 + mic_word_filter_item_row_wrapper = self._createRowFrame(list_container, row) + + + mic_word_filter_list = self.view_variable.MIC_WORD_FILTER_LIST + + mic_word_filter_item_row_wrapper, accumulated_labels_width, row, column = addValues(mic_word_filter_list, mic_word_filter_item_row_wrapper, accumulated_labels_width, row, column) + + + self.config_window.sb__widgets[add_and_delete_able_list_attr_name].mic_word_filter_item_row_wrapper = mic_word_filter_item_row_wrapper + self.config_window.sb__widgets[add_and_delete_able_list_attr_name].accumulated_labels_width = accumulated_labels_width + self.config_window.sb__widgets[add_and_delete_able_list_attr_name].last_row = row + self.config_window.sb__widgets[add_and_delete_able_list_attr_name].last_column = column + self.config_window.sb__widgets[add_and_delete_able_list_attr_name].addValues = lambda values, mic_word_filter_item_row_wrapper, accumulated_labels_width, last_row, last_column: addValues(values, mic_word_filter_item_row_wrapper, accumulated_labels_width, last_row, last_column) + + + entry_and_add_button_wrapper = CTkFrame(setting_box_item_frame, corner_radius=0, fg_color=self.settings.ctm.SB__BG_COLOR) + entry_and_add_button_wrapper.grid(row=2, column=0, pady=(self.settings.uism.SB__IPADY, 0), sticky="ew") + + entry_and_add_button_wrapper.grid_columnconfigure((0,3), weight=1) + + + + entry_widget = CTkEntry( + entry_and_add_button_wrapper, + text_color=self.settings.ctm.SB__ENTRY_TEXT_COLOR, + fg_color=self.settings.ctm.SB__ENTRY_BG_COLOR, + border_color=self.settings.ctm.SB__ENTRY_BORDER_COLOR, + width=entry_width, + placeholder_text="AAA or AAA,BBB,CCC", + height=self.settings.uism.SB__PROGRESSBAR_X_SLIDER__ENTRY_HEIGHT, + font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.SB__ENTRY_FONT_SIZE, weight="normal"), + ) + setattr(self.config_window, entry_attr_name, entry_widget) + + entry_widget.grid(row=0, column=1, sticky="ew") + + + + add_button = CTkFrame(entry_and_add_button_wrapper, corner_radius=self.settings.uism.BUTTONS_CORNER_RADIUS, fg_color=self.settings.ctm.SB__ADD_AND_DELETE_ABLE_LIST__ADD_BUTTON_COLOR, cursor="hand2") + add_button.grid(row=0, column=2, padx=self.settings.uism.ADD_AND_DELETE_ABLE_LIST__ADD_BUTTON_LEFT_PADX, sticky="ew") + + + add_button.grid_columnconfigure(0, weight=1) + add_button_label_wrapper = CTkFrame(add_button, corner_radius=0, fg_color=self.settings.ctm.SB__ADD_AND_DELETE_ABLE_LIST__ADD_BUTTON_COLOR) + add_button_label_wrapper.grid(row=0, column=0, padx=self.settings.uism.ADD_AND_DELETE_ABLE_LIST__ADD_BUTTON_IPADX, pady=self.settings.uism.ADD_AND_DELETE_ABLE_LIST__ADD_BUTTON_IPADY, sticky="ew") + + add_button_label_wrapper.grid_columnconfigure((0,2), weight=1) + add_button_label = CTkLabel( + add_button_label_wrapper, + textvariable=self.view_variable.VAR_LABEL_MIC_WORD_FILTER_ADD_BUTTON, + height=0, + corner_radius=0, + font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.ADD_AND_DELETE_ABLE_LIST__ADD_BUTTON_FONT_SIZE, weight="normal"), + anchor="w", + text_color=self.settings.ctm.LABELS_TEXT_COLOR, + ) + add_button_label.grid(row=0, column=1) + + + def adjustedCommand(): + callFunctionIfCallable(self.view_variable.CALLBACK_SET_MIC_WORD_FILTER, entry_widget.get()) + entry_widget.focus_set() + + bindButtonFunctionAndColor( + target_widgets=[ + add_button, + add_button_label_wrapper, + add_button_label, + ], + enter_color=self.settings.ctm.SB__ADD_AND_DELETE_ABLE_LIST__ADD_BUTTON_HOVERED_COLOR, + leave_color=self.settings.ctm.SB__ADD_AND_DELETE_ABLE_LIST__ADD_BUTTON_COLOR, + clicked_color=self.settings.ctm.SB__ADD_AND_DELETE_ABLE_LIST__ADD_BUTTON_CLICKED_COLOR, + buttonReleasedFunction=lambda _e: adjustedCommand(), + ) + + + return setting_box_frame + + + def _createRowFrame(self, parent_widget, row): + mic_word_filter_item_row_wrapper = CTkFrame(parent_widget, corner_radius=0, fg_color=self.settings.ctm.SB__BG_COLOR, width=0, height=0) + mic_word_filter_item_row_wrapper.grid(row=row, column=0, pady=self.settings.uism.ADD_AND_DELETE_ABLE_LIST__VALUES_BOTTOM_PADY, sticky="nsew") + + return mic_word_filter_item_row_wrapper + + + + def _createValue(self, add_and_delete_able_list_attr_name, parent_row_frame, row, column, mic_word_filter_item): + mic_word_filter_item_wrapper = CTkFrame(parent_row_frame, corner_radius=self.settings.uism.ADD_AND_DELETE_ABLE_LIST__VALUES_CORNER_RADIUS, fg_color=self.settings.ctm.SB__ADD_AND_DELETE_ABLE_LIST_BG_COLOR, width=0, height=0) + mic_word_filter_item_wrapper.grid(row=0, column=column, padx=self.settings.uism.ADD_AND_DELETE_ABLE_LIST__VALUES_LEFT_PADX, sticky="nsew") + setattr(self, f"{row}_{column}", mic_word_filter_item_wrapper) + + + + mic_word_filter_item_wrapper.grid_rowconfigure((0,2), weight=1) + label_widget = CTkLabel( + mic_word_filter_item_wrapper, + text=mic_word_filter_item, + height=0, + corner_radius=0, + font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.ADD_AND_DELETE_ABLE_LIST__VALUES_TEXT_FONT_SIZE, weight="normal"), + anchor="w", + text_color=self.settings.ctm.BASIC_TEXT_COLOR, + ) + + label_widget.grid(row=1, column=0, padx=self.settings.uism.ADD_AND_DELETE_ABLE_LIST__VALUES_TEXT_IPADX, pady=self.settings.uism.ADD_AND_DELETE_ABLE_LIST__VALUES_TEXT_IPADY) + + + if isEven(getLatestHeight(label_widget)) is False: + label_widget.grid( + pady=( + self.settings.uism.ADD_AND_DELETE_ABLE_LIST__VALUES_TEXT_IPADY, + self.settings.uism.ADD_AND_DELETE_ABLE_LIST__VALUES_TEXT_IPADY + 1 + ) + ) + + + if isEven(getLatestWidth(label_widget)) is False: + label_widget.grid( + padx=( + self.settings.uism.ADD_AND_DELETE_ABLE_LIST__VALUES_TEXT_IPADX[0], + self.settings.uism.ADD_AND_DELETE_ABLE_LIST__VALUES_TEXT_IPADX[1] + 1 + ) + ) + + + + def pressedDeleteButtonCommand(_e, delete_button, redo_button): + # overstrike true + label_widget.configure(font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.ADD_AND_DELETE_ABLE_LIST__VALUES_TEXT_FONT_SIZE, weight="normal", overstrike=True)) + # change fg_color + mic_word_filter_item_wrapper.configure(fg_color=self.settings.ctm.SB__ADD_AND_DELETE_ABLE_LIST_DELETED_BG_COLOR) + # change button img to redo button + delete_button.grid_remove() + redo_button.grid() + # callback delete function + callFunctionIfCallable(self.view_variable.CALLBACK_DELETE_MIC_WORD_FILTER, mic_word_filter_item) + + def pressedRedoButtonCommand(_e, delete_button, redo_button): + # overstrike false + label_widget.configure(font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.ADD_AND_DELETE_ABLE_LIST__VALUES_TEXT_FONT_SIZE, weight="normal", overstrike=False)) + # change fg_color + mic_word_filter_item_wrapper.configure(fg_color=self.settings.ctm.SB__ADD_AND_DELETE_ABLE_LIST_BG_COLOR) + # change button img to delete button + redo_button.grid_remove() + delete_button.grid() + # callback add function + callFunctionIfCallable(self.view_variable.CALLBACK_SET_MIC_WORD_FILTER, mic_word_filter_item) + + + + delete_button = createButtonWithImage( + parent_widget=mic_word_filter_item_wrapper, + button_fg_color=self.settings.ctm.SB__ADD_AND_DELETE_ABLE_LIST_BG_COLOR, + button_enter_color=self.settings.ctm.SB__ADD_AND_DELETE_ABLE_LIST__VALUES_ACTION_BUTTON_HOVERED_BG_COLOR, + button_clicked_color=self.settings.ctm.SB__ADD_AND_DELETE_ABLE_LIST__VALUES_ACTION_BUTTON_CLICKED_BG_COLOR, + button_image_file=self.settings.image_file.CANCEL_ICON, + button_image_size=self.settings.uism.ADD_AND_DELETE_ABLE_LIST__VALUES_ACTION_BUTTON_IMG_SIZE, + button_ipadxy=self.settings.uism.ADD_AND_DELETE_ABLE_LIST__VALUES_ACTION_BUTTON_IPADXY, + button_command=lambda _e: pressedDeleteButtonCommand(_e, delete_button, redo_button), + ) + delete_button.grid(row=1, column=1, padx=self.settings.uism.ADD_AND_DELETE_ABLE_LIST__VALUES_ACTION_BUTTON_PADX, sticky="e") + + redo_button = createButtonWithImage( + parent_widget=mic_word_filter_item_wrapper, + button_fg_color=self.settings.ctm.SB__ADD_AND_DELETE_ABLE_LIST_DELETED_BG_COLOR, + button_enter_color=self.settings.ctm.SB__ADD_AND_DELETE_ABLE_LIST__VALUES_DELETED_BUTTON_HOVERED_BG_COLOR, + button_clicked_color=self.settings.ctm.SB__ADD_AND_DELETE_ABLE_LIST__VALUES_DELETED_BUTTON_CLICKED_BG_COLOR, + button_image_file=self.settings.image_file.REDO_ICON, + button_image_size=self.settings.uism.ADD_AND_DELETE_ABLE_LIST__VALUES_ACTION_BUTTON_IMG_SIZE, + button_ipadxy=self.settings.uism.ADD_AND_DELETE_ABLE_LIST__VALUES_ACTION_BUTTON_IPADXY, + button_command=lambda _e: pressedRedoButtonCommand(_e, delete_button, redo_button), + ) + redo_button.grid(row=1, column=1, padx=self.settings.uism.ADD_AND_DELETE_ABLE_LIST__VALUES_ACTION_BUTTON_PADX, sticky="e") + redo_button.grid_remove() + + + partial_pressedRedoButtonCommand = partial(pressedRedoButtonCommand, _e=None, delete_button=delete_button, redo_button=redo_button) + item_data = SimpleNamespace( + label = mic_word_filter_item, + redoFunction = lambda: partial_pressedRedoButtonCommand(), + ) + + + items = self.config_window.sb__widgets[add_and_delete_able_list_attr_name].items + if len(items) == 0: + items.append(item_data) + else: + is_replaced = False + for i, item in enumerate(items): + if item.label == mic_word_filter_item: + items[i] = item_data + is_replaced = True + break + if is_replaced is False: items.append(item_data) + + + return mic_word_filter_item_wrapper + + + + + # if setting_box_type == "dropdown_menu_x_dropdown_menu": # self.setting_box_dropdown_menu_x_dropdown_menu = CTkFrame(self.setting_box, corner_radius=0, fg_color=self.settings.ctm.SB__BG_COLOR, width=0, height=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 472e5baa..d5ece1b6 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 @@ -8,6 +8,8 @@ def createSettingBox_Mic(setting_box_wrapper, config_window, settings, view_vari createSettingBoxSwitch = sbg.createSettingBoxSwitch createSettingBoxProgressbarXSlider = sbg.createSettingBoxProgressbarXSlider createSettingBoxEntry = sbg.createSettingBoxEntry + createSettingBoxArrowSwitch = sbg.createSettingBoxArrowSwitch + createSettingBoxAddAndDeleteAbleList = sbg.createSettingBoxAddAndDeleteAbleList def checkbox_input_mic_threshold_check_callback(is_turned_on): @@ -36,6 +38,11 @@ def createSettingBox_Mic(setting_box_wrapper, config_window, settings, view_vari def entry_input_mic_max_phrases_callback(value): callFunctionIfCallable(view_variable.CALLBACK_SET_MIC_MAX_PHRASES, value) + def arrow_switch_mic_word_filter_list_open_callback(value): + callFunctionIfCallable(view_variable.CALLBACK_ARROW_SWITCH_MIC_WORD_FILTER_LIST_OPEN) + def arrow_switch_mic_word_filter_list_close_callback(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) @@ -140,13 +147,24 @@ def createSettingBox_Mic(setting_box_wrapper, config_window, settings, view_vari # # __________ - config_window.sb__mic_word_filter = createSettingBoxEntry( + config_window.sb__mic_word_filter = createSettingBoxArrowSwitch( for_var_label_text=view_variable.VAR_LABEL_MIC_WORD_FILTER, for_var_desc_text=view_variable.VAR_DESC_MIC_WORD_FILTER, - entry_attr_name="sb__entry_mic_word_filter", - entry_width=settings.uism.RESPONSIVE_UI_SIZE_INT_300, - entry_bind__Any_KeyRelease=lambda value: entry_input_mic_word_filters_callback(value), - entry_textvariable=view_variable.VAR_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), + var_switch_desc=view_variable.VAR_SWITCH_DESC_MIC_WORD_FILTER, ) config_window.sb__mic_word_filter.grid(row=row, pady=0) + row+=1 + + config_window.sb__mic_word_filter_list = createSettingBoxAddAndDeleteAbleList( + add_and_delete_able_list_attr_name="sb__add_and_delete_able_list_mic_word_filter_list", + entry_attr_name="sb__entry_mic_word_filter_list", + entry_width=settings.uism.RESPONSIVE_UI_SIZE_INT_300, + mic_word_filter_list=view_variable.MIC_WORD_FILTER_LIST, + ) + config_window.sb__mic_word_filter_list.grid(row=row, pady=0) + # Default, close the list. + config_window.sb__mic_word_filter_list.grid_remove() row+=1 \ No newline at end of file diff --git a/vrct_gui/ui_managers/Themes/_darkTheme.py b/vrct_gui/ui_managers/Themes/_darkTheme.py index 8cadde2c..2522608a 100644 --- a/vrct_gui/ui_managers/Themes/_darkTheme.py +++ b/vrct_gui/ui_managers/Themes/_darkTheme.py @@ -229,6 +229,24 @@ def _darkTheme(base_color): SB__PROGRESSBAR_X_SLIDER__ACTIVE_BUTTON_CLICKED_COLOR = base_color.PRIMARY_800_COLOR, + SB__ARROW_SWITCH_BUTTON_COLOR = base_color.DARK_888_COLOR, + SB__ARROW_SWITCH_BUTTON_HOVERED_COLOR = base_color.DARK_800_COLOR, + SB__ARROW_SWITCH_BUTTON_CLICKED_COLOR = base_color.DARK_900_COLOR, + + SB__ADD_AND_DELETE_ABLE_LIST__ADD_BUTTON_COLOR = base_color.PRIMARY_600_COLOR, + SB__ADD_AND_DELETE_ABLE_LIST__ADD_BUTTON_HOVERED_COLOR = base_color.PRIMARY_500_COLOR, + SB__ADD_AND_DELETE_ABLE_LIST__ADD_BUTTON_CLICKED_COLOR = base_color.PRIMARY_700_COLOR, + SB__ADD_AND_DELETE_ABLE_LIST_BG_COLOR = base_color.DARK_800_COLOR, + + SB__ADD_AND_DELETE_ABLE_LIST__VALUES_ACTION_BUTTON_HOVERED_BG_COLOR = base_color.DARK_750_COLOR, + SB__ADD_AND_DELETE_ABLE_LIST__VALUES_ACTION_BUTTON_CLICKED_BG_COLOR = base_color.DARK_850_COLOR, + + SB__ADD_AND_DELETE_ABLE_LIST_DELETED_BG_COLOR = base_color.DARK_850_COLOR, + SB__ADD_AND_DELETE_ABLE_LIST__VALUES_DELETED_BUTTON_HOVERED_BG_COLOR = base_color.DARK_800_COLOR, + SB__ADD_AND_DELETE_ABLE_LIST__VALUES_DELETED_BUTTON_CLICKED_BG_COLOR = base_color.DARK_900_COLOR, + + + # Side menu SIDE_MENU_BG_COLOR = base_color.DARK_950_COLOR, @@ -273,6 +291,9 @@ def _darkTheme(base_color): REFRESH_ICON = getImageFileFromUiUtils("refresh_icon.png"), HELP_ICON = getImageFileFromUiUtils("help_icon_white.png"), + + CANCEL_ICON = getImageFileFromUiUtils("cancel_icon.png"), + REDO_ICON = getImageFileFromUiUtils("redo_white.png"), ), ) diff --git a/vrct_gui/ui_managers/UiScalingManager.py b/vrct_gui/ui_managers/UiScalingManager.py index fae26c79..9a1ad1c2 100644 --- a/vrct_gui/ui_managers/UiScalingManager.py +++ b/vrct_gui/ui_managers/UiScalingManager.py @@ -217,6 +217,10 @@ class UiScalingManager(): self.config_window.SB__DESC_TOP_PADY = self._calculateUiSize(2) + self.config_window.BUTTONS_CORNER_RADIUS = self._calculateUiSize(6) + # self.config_window.BUTTONS_IPADX = self._calculateUiSize(10) + # self.config_window.BUTTONS_IPADY = self._calculateUiSize(6) + self.config_window.SB__ERROR_MESSAGE_IPADX = (self._calculateUiSize(10), self._calculateUiSize(10)) self.config_window.SB__ERROR_MESSAGE_IPADY = (self._calculateUiSize(6), self._calculateUiSize(6)) self.config_window.SB__ERROR_MESSAGE_FONT_SIZE = self._calculateUiSize(14) @@ -276,6 +280,28 @@ class UiScalingManager(): + self.config_window.SB__ARROW_SWITCH_BUTTON_IPADXY = self._calculateUiSize(16) + self.config_window.SB__ARROW_SWITCH_BUTTON_ICON_SIZE = self._calculateUiSize(24) + self.config_window.SB__ARROW_SWITCH_DESC_FONT_SIZE = self._calculateUiSize(16) + self.config_window.SB__ARROW_SWITCH_LEFT_PADX = (self._calculateUiSize(20), 0) + + self.config_window.ADD_AND_DELETE_ABLE_LIST__ADD_BUTTON_IPADX = self._calculateUiSize(16) + self.config_window.ADD_AND_DELETE_ABLE_LIST__ADD_BUTTON_IPADY = self._calculateUiSize(6) + + self.config_window.ADD_AND_DELETE_ABLE_LIST__VALUES_CORNER_RADIUS = self._calculateUiSize(2) + self.config_window.ADD_AND_DELETE_ABLE_LIST__VALUES_LEFT_PADX = (0, self._calculateUiSize(4)) + self.config_window.ADD_AND_DELETE_ABLE_LIST__VALUES_BOTTOM_PADY = (0, self._calculateUiSize(4)) + + self.config_window.ADD_AND_DELETE_ABLE_LIST__VALUES_TEXT_FONT_SIZE = self._calculateUiSize(14) + self.config_window.ADD_AND_DELETE_ABLE_LIST__VALUES_TEXT_IPADX = (self._calculateUiSize(8), 0) + self.config_window.ADD_AND_DELETE_ABLE_LIST__VALUES_TEXT_IPADY = self._calculateUiSize(6) + self.config_window.ADD_AND_DELETE_ABLE_LIST__VALUES_ACTION_BUTTON_IMG_SIZE = self._calculateUiSize(14) + self.config_window.ADD_AND_DELETE_ABLE_LIST__VALUES_ACTION_BUTTON_IPADXY = self._calculateUiSize(6) + self.config_window.ADD_AND_DELETE_ABLE_LIST__VALUES_ACTION_BUTTON_PADX = (self._calculateUiSize(6), self._calculateUiSize(8)) + + self.config_window.ADD_AND_DELETE_ABLE_LIST__ADD_BUTTON_LEFT_PADX = (self._calculateUiSize(20), 0) + self.config_window.ADD_AND_DELETE_ABLE_LIST__ADD_BUTTON_FONT_SIZE = self._calculateUiSize(14) + def _calculateUiSize(self, default_size, is_allowed_odd:bool=False, is_zero_allowed:bool=False): size = calculateUiSize(default_size, self.SCALING_FLOAT, is_allowed_odd, is_zero_allowed) return size From 9951398c361518c4916590594fedd9bbb4a0a5bc Mon Sep 17 00:00:00 2001 From: misyaguziya Date: Wed, 1 Nov 2023 04:09:41 +0900 Subject: [PATCH 28/44] =?UTF-8?q?=F0=9F=90=9B[bugfix]=20installer=20:=20re?= =?UTF-8?q?start=E5=87=A6=E7=90=86=E6=99=82=E3=81=AB=E3=83=91=E3=82=B9?= =?UTF-8?q?=E3=81=8C=E3=81=8A=E3=81=8B=E3=81=97=E3=81=8F=E3=81=AA=E3=82=8B?= =?UTF-8?q?=E5=95=8F=E9=A1=8C=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- batch/restart.bat | 3 ++- batch/update.bat | 3 ++- model.py | 8 ++++---- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/batch/restart.bat b/batch/restart.bat index c3b7418f..e02b64a0 100644 --- a/batch/restart.bat +++ b/batch/restart.bat @@ -1,7 +1,8 @@ @if not "%~0"=="%~dp0.\%~nx0" start /min cmd /c,"%~dp0.\%~nx0" %* & goto :eof set name=%1 +set path=%~dp0 taskkill /im %name% /F -START "" %name% \ No newline at end of file +START "" %path%/%name% \ No newline at end of file diff --git a/batch/update.bat b/batch/update.bat index 7353721c..4bc2e679 100644 --- a/batch/update.bat +++ b/batch/update.bat @@ -4,6 +4,7 @@ set exe_name=%1 set folder_name=%2 set folder_tmp=%3 set restart=%4 +set path=%~dp0 taskkill /im %exe_name% /F ping -n 2 127.0.0.1 > nul @@ -13,7 +14,7 @@ move /Y %exe_tmp_name%\* .\ rmdir /s /q %exe_tmp_name% if %restart% == True ( - START "" %exe_name% + START "" %path%/%exe_name% ) del /f "%~dp0%~nx0" \ No newline at end of file diff --git a/model.py b/model.py index 24d3b770..f79c4dfc 100644 --- a/model.py +++ b/model.py @@ -268,9 +268,7 @@ class Model: def updateSoftware(restart:bool=True): filename = 'VRCT.zip' program_name = 'VRCT.exe' - program_tmp_name = '_VRCT.exe' folder_name = '_internal' - folder_tmp_name = '__internal' tmp_directory_name = 'tmp' batch_name = 'update.bat' current_directory = config.LOCAL_PATH @@ -296,9 +294,11 @@ class Model: @staticmethod def reStartSoftware(): program_name = 'VRCT.exe' + folder_name = '_internal' batch_name = 'restart.bat' - program_directory = os_path.dirname(__file__) - command = [os_path.join(program_directory, "batch", batch_name), program_name] + current_directory = config.LOCAL_PATH + + command = [os_path.join(current_directory, folder_name, "batch", batch_name), program_name] Popen(command, cwd=current_directory) @staticmethod From 2f27ae3464222fa90c184b9e88371e8e21354369 Mon Sep 17 00:00:00 2001 From: misyaguziya Date: Wed, 1 Nov 2023 06:00:51 +0900 Subject: [PATCH 29/44] =?UTF-8?q?=F0=9F=90=9B[bugfix]=20installer=20:=20up?= =?UTF-8?q?date=E5=87=A6=E7=90=86=E3=81=AE=E3=83=91=E3=82=B9=E3=82=92?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- batch/restart.bat | 7 ++++--- batch/update.bat | 14 +++++++------- model.py | 6 ++++-- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/batch/restart.bat b/batch/restart.bat index e02b64a0..b6e9b03b 100644 --- a/batch/restart.bat +++ b/batch/restart.bat @@ -1,8 +1,9 @@ @if not "%~0"=="%~dp0.\%~nx0" start /min cmd /c,"%~dp0.\%~nx0" %* & goto :eof set name=%1 -set path=%~dp0 +set local_path=%~dp0 taskkill /im %name% /F - -START "" %path%/%name% \ No newline at end of file +ping -n 2 127.0.0.1 > nul +START "" %local_path%%name% +del /f "%~dp0%~nx0" \ No newline at end of file diff --git a/batch/update.bat b/batch/update.bat index 4bc2e679..e0e83855 100644 --- a/batch/update.bat +++ b/batch/update.bat @@ -4,17 +4,17 @@ set exe_name=%1 set folder_name=%2 set folder_tmp=%3 set restart=%4 -set path=%~dp0 +set local_path=%~dp0 taskkill /im %exe_name% /F ping -n 2 127.0.0.1 > nul -del /f %exe_name% -rmdir /s /q %folder_name% -move /Y %exe_tmp_name%\* .\ -rmdir /s /q %exe_tmp_name% +del /f %local_path%%exe_name% +rmdir /s /q %local_path%%folder_name% +xcopy %local_path%%folder_tmp% %local_path% /E /I +rmdir /s /q %local_path%%folder_tmp% if %restart% == True ( - START "" %path%/%exe_name% + START "" %local_path%%exe_name% ) - +pause del /f "%~dp0%~nx0" \ No newline at end of file diff --git a/model.py b/model.py index f79c4dfc..ab5f49ce 100644 --- a/model.py +++ b/model.py @@ -3,6 +3,7 @@ from zipfile import ZipFile from subprocess import Popen, PIPE from os import makedirs as os_makedirs from os import path as os_path +from os import remove as os_remove from shutil import rmtree, move from datetime import datetime from logging import getLogger, FileHandler, Formatter, INFO @@ -284,6 +285,7 @@ class Model: file.write(chunk) with ZipFile(os_path.join(current_directory, tmp_directory_name, filename)) as zf: zf.extractall(os_path.join(current_directory, tmp_directory_name)) + os_remove(os_path.join(current_directory, tmp_directory_name, filename)) move(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, folder_name, tmp_directory_name, str(restart)] Popen(command, cwd=current_directory) @@ -297,8 +299,8 @@ class Model: folder_name = '_internal' batch_name = 'restart.bat' current_directory = config.LOCAL_PATH - - command = [os_path.join(current_directory, folder_name, "batch", batch_name), program_name] + move(os_path.join(current_directory, folder_name, "batch", batch_name), os_path.join(current_directory, batch_name)) + command = [os_path.join(current_directory, batch_name), program_name] Popen(command, cwd=current_directory) @staticmethod From 0dca7ff6a297f4bcce4ca0179d8a10b8c1d2ce0e Mon Sep 17 00:00:00 2001 From: misyaguziya Date: Wed, 1 Nov 2023 06:24:42 +0900 Subject: [PATCH 30/44] =?UTF-8?q?=F0=9F=91=8D[Update]=20installer=20:=20bu?= =?UTF-8?q?ild.bat=E3=81=ABNSIS=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.bat | 3 ++- installer/{Install.nsi => installer.nsi} | 0 2 files changed, 2 insertions(+), 1 deletion(-) rename installer/{Install.nsi => installer.nsi} (100%) diff --git a/build.bat b/build.bat index 7b723572..5ad8f73a 100644 --- a/build.bat +++ b/build.bat @@ -1 +1,2 @@ -pyinstaller --windowed --clean --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 \ No newline at end of file +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 +"C:\Program Files (x86)\NSIS\makensis.exe" installer/installer.nsi \ No newline at end of file diff --git a/installer/Install.nsi b/installer/installer.nsi similarity index 100% rename from installer/Install.nsi rename to installer/installer.nsi From f5b3b503e4af03c536f2e36b38e0b054dcbac0fa Mon Sep 17 00:00:00 2001 From: Sakamoto Shiina <68018796+ShiinaSakamoto@users.noreply.github.com> Date: Wed, 1 Nov 2023 09:19:40 +0900 Subject: [PATCH 31/44] =?UTF-8?q?[Update]=20config.py:=20Message=20Format.?= =?UTF-8?q?=20=E8=A8=AD=E5=AE=9A=E3=81=95=E3=82=8C=E3=81=9F=E6=96=87?= =?UTF-8?q?=E5=AD=97=E5=88=97=E3=81=AB"[message]"=E3=81=A8"[translation]"?= =?UTF-8?q?=E3=81=AE=E4=B8=A1=E6=96=B9=E3=81=8C=E5=85=A5=E3=81=A3=E3=81=A6?= =?UTF-8?q?=E3=81=84=E3=81=AA=E3=81=91=E3=82=8C=E3=81=B0=E5=88=9D=E6=9C=9F?= =?UTF-8?q?=E5=80=A4=E3=82=92=E8=A8=AD=E5=AE=9A=E3=81=99=E3=82=8B=E3=82=88?= =?UTF-8?q?=E3=81=86=E3=81=AB=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/config.py b/config.py index 90896694..eeda8c1e 100644 --- a/config.py +++ b/config.py @@ -447,6 +447,8 @@ class Config: @MESSAGE_FORMAT.setter def MESSAGE_FORMAT(self, value): if type(value) is str: + if "[message]" not in value or "[translation]" not in value: + value = "[message]([translation])" self._MESSAGE_FORMAT = value saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) From 44baaa84b8e645c5c54299b6f9d35e728fa0d465 Mon Sep 17 00:00:00 2001 From: Sakamoto Shiina <68018796+ShiinaSakamoto@users.noreply.github.com> Date: Sun, 5 Nov 2023 08:03:52 +0900 Subject: [PATCH 32/44] =?UTF-8?q?[Update]=20Message=20Format:=20UI?= =?UTF-8?q?=E6=94=B9=E5=96=84=E3=80=81[message]=E3=82=84[translation]?= =?UTF-8?q?=E3=81=AA=E3=81=A9=E5=BF=85=E9=A0=88=E3=81=AA=E3=82=82=E3=81=AE?= =?UTF-8?q?=E3=81=AF=E5=9B=BA=E5=AE=9A(=E5=85=A5=E3=82=8C=E6=9B=BF?= =?UTF-8?q?=E3=81=88=E5=8F=AF=E8=83=BD)=E3=81=97=E3=80=81=E3=83=A6?= =?UTF-8?q?=E3=83=BC=E3=82=B6=E3=83=BC=E3=81=AF=E7=B7=A8=E9=9B=86=E3=81=A7?= =?UTF-8?q?=E3=81=8D=E3=81=AA=E3=81=84=E3=82=88=E3=81=86=E3=81=AB=E3=80=82?= =?UTF-8?q?=E4=B8=8D=E5=AE=8C=E5=85=A8=E3=81=AA=E6=B0=97=E3=81=AF=E3=81=97?= =?UTF-8?q?=E3=81=A6=E3=81=84=E3=82=8B=E3=81=8C=E3=80=81=E8=A1=A8=E7=A4=BA?= =?UTF-8?q?=E3=81=AE=E4=BE=8B=E3=82=92=E8=BF=BD=E5=8A=A0=E3=81=97=E3=80=81?= =?UTF-8?q?=E7=9B=B4=E6=84=9F=E7=9A=84=E3=81=AB=E3=83=A1=E3=83=83=E3=82=BB?= =?UTF-8?q?=E3=83=BC=E3=82=B8=E3=83=95=E3=82=A9=E3=83=BC=E3=83=9E=E3=83=83?= =?UTF-8?q?=E3=83=88=E3=82=92=E4=BD=BF=E3=81=88=E3=82=8B=E3=82=88=E3=81=86?= =?UTF-8?q?=E3=81=AB=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controller.py | 1 + img/refresh_icon.png | Bin 1487 -> 1443 bytes img/refresh_update_icon.png | Bin 0 -> 1487 bytes img/swap_icon.png | Bin 0 -> 13436 bytes locales/en.yml | 1 + locales/ja.yml | 3 +- locales/ko.yml | 1 + view.py | 106 ++++++++ .../_SettingBoxGenerator.py | 244 +++++++++++++++++- .../createSettingBox_Others.py | 22 +- .../main_window/createMainWindowWidgets.py | 2 +- vrct_gui/ui_managers/Themes/_darkTheme.py | 9 + vrct_gui/ui_managers/UiScalingManager.py | 19 ++ 13 files changed, 393 insertions(+), 15 deletions(-) create mode 100644 img/refresh_update_icon.png create mode 100644 img/swap_icon.png diff --git a/controller.py b/controller.py index f3f2d7c1..4842196b 100644 --- a/controller.py +++ b/controller.py @@ -628,6 +628,7 @@ def callbackSetMessageFormat(value): print("callbackSetMessageFormat", value) if len(value) > 0: config.MESSAGE_FORMAT = value + view.setMessageFormatEntryWidgets(config.MESSAGE_FORMAT) def callbackSetEnableSendMessageToVrc(value): print("callbackSetEnableSendMessageToVrc", value) diff --git a/img/refresh_icon.png b/img/refresh_icon.png index c5acad15a2097d399ea98438bb784d5d25bde461..408bc2a65bc002ebe87de1bf5da9a72e1dcc4f65 100644 GIT binary patch delta 1403 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 OL5vjv-lfaghyM>Eb8cV& literal 0 HcmV?d00001 diff --git a/locales/en.yml b/locales/en.yml index 7eee5744..0a77d70d 100644 --- a/locales/en.yml +++ b/locales/en.yml @@ -181,6 +181,7 @@ config_window: message_format: label: Message Format desc: "You can change the decoration of the message you want to send.\n[message] will be replaced with the message, and [translation] will be replaced with the translated message.\nIt will be used in Notification XSOverlay too." + example_text: This is an example sentence. Fonts, line breaks, etc. may differ from the actual display. send_message_to_vrc: label: Send Message To VRChat diff --git a/locales/ja.yml b/locales/ja.yml index b662a3eb..a73b4e8e 100644 --- a/locales/ja.yml +++ b/locales/ja.yml @@ -179,7 +179,8 @@ config_window: message_format: label: é€ä¿¡ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ãƒ•ォーマット - desc: "VRChatã§ç›¸æ‰‹ã«å®Ÿéš›ã«è¦‹ãˆã‚‹ãƒ•ォーマットを変更ã§ãã¾ã™ã€‚\n[message]ãŒãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ç½®æ›ã•れã€\n[translation]ãŒç¿»è¨³ã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ç½®æ›ã•れã¾ã™ã€‚\n※XSOverlayã§ã®é€šçŸ¥å—ã‘å–り機能ã§ã‚‚使ã‚れã¾ã™ã€‚" + desc: "VRChatã§ç›¸æ‰‹ã«å®Ÿéš›ã«è¦‹ãˆã‚‹ãƒ•ォーマットを変更ã§ãã¾ã™ã€‚\n[message]ãŒãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ç½®æ›ã•れã€[translation]ãŒç¿»è¨³ã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ç½®æ›ã•れã¾ã™ã€‚\n※XSOverlayã§ã®é€šçŸ¥å—ã‘å–り機能ã§ã‚‚使ã‚れã¾ã™ã€‚" + example_text: ã“れã¯ä¾‹æ–‡ã§ã™ã€‚フォントや改行箇所ãªã©ã€å®Ÿéš›ã®è¡¨ç¤ºã¨ã¯ç•°ãªã‚‹å ´åˆãŒã‚りã¾ã™ã€‚ send_message_to_vrc: label: VRChatã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡ã™ã‚‹ diff --git a/locales/ko.yml b/locales/ko.yml index ad08942f..fa8cc2b2 100644 --- a/locales/ko.yml +++ b/locales/ko.yml @@ -175,6 +175,7 @@ config_window: message_format: label: 전송 í˜•ì‹ # 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.\nIt will be used in Notification XSOverlay too." + example_text: 예문입니다. 글꼴, 줄 바꿈 ë“±ì´ ì‹¤ì œ 표시와 다를 수 있습니다. # send_message_to_vrc: # label: Send Message To VRChat diff --git a/view.py b/view.py index ac1d0739..09267802 100644 --- a/view.py +++ b/view.py @@ -347,7 +347,14 @@ class View(): VAR_LABEL_MESSAGE_FORMAT=StringVar(value=i18n.t("config_window.message_format.label")), VAR_DESC_MESSAGE_FORMAT=StringVar(value=i18n.t("config_window.message_format.desc")), CALLBACK_SET_MESSAGE_FORMAT=None, + CALLBACK_SWAP_MESSAGE_FORMAT_REQUIRED_TEXT=self._swapMessageFormatRequiredText, VAR_MESSAGE_FORMAT=StringVar(value=config.MESSAGE_FORMAT), + VAR_LABEL_EXAMPLE_TEXT_MESSAGE_FORMAT=StringVar(value=""), + VAR_ENTRY_0_MESSAGE_FORMAT=StringVar(value=""), + VAR_ENTRY_1_MESSAGE_FORMAT=StringVar(value=""), + VAR_ENTRY_2_MESSAGE_FORMAT=StringVar(value=""), + VAR_TEXT_REQUIRED_0_MESSAGE_FORMAT=StringVar(value="[message]"), + VAR_TEXT_REQUIRED_1_MESSAGE_FORMAT=StringVar(value="[translation]"), VAR_LABEL_ENABLE_SEND_MESSAGE_TO_VRC=StringVar(value=i18n.t("config_window.send_message_to_vrc.label")), @@ -531,10 +538,56 @@ class View(): self.openSpeakerEnergyThresholdWidget() + self.setMessageFormatEntryWidgets(config.MESSAGE_FORMAT) + # Insert sample conversation for testing. # self._insertSampleConversationToTextbox() + def setMessageFormatEntryWidgets(self, message_format:str): + result = self.extractMessageFormat(message_format) + + if result.is_message_first is True: + self.view_variable.VAR_TEXT_REQUIRED_0_MESSAGE_FORMAT.set("[message]") + self.view_variable.VAR_TEXT_REQUIRED_1_MESSAGE_FORMAT.set("[translation]") + else: + self.view_variable.VAR_TEXT_REQUIRED_0_MESSAGE_FORMAT.set("[translation]") + self.view_variable.VAR_TEXT_REQUIRED_1_MESSAGE_FORMAT.set("[message]") + + self.view_variable.VAR_ENTRY_0_MESSAGE_FORMAT.set(result.before) + self.view_variable.VAR_ENTRY_1_MESSAGE_FORMAT.set(result.between) + self.view_variable.VAR_ENTRY_2_MESSAGE_FORMAT.set(result.after) + self.updateMessageFormat_ExampleTextWidget() + + def _swapMessageFormatRequiredText(self): + text_0 = self.view_variable.VAR_TEXT_REQUIRED_0_MESSAGE_FORMAT.get() + text_1 = self.view_variable.VAR_TEXT_REQUIRED_1_MESSAGE_FORMAT.get() + self.view_variable.VAR_TEXT_REQUIRED_0_MESSAGE_FORMAT.set(text_1) + self.view_variable.VAR_TEXT_REQUIRED_1_MESSAGE_FORMAT.set(text_0) + self.updateMessageFormat_ExampleTextWidget() + + new_message_format = self.getLatestMessageFormatFromWidget() + callFunctionIfCallable(self.view_variable.CALLBACK_SET_MESSAGE_FORMAT, new_message_format) + + + def getLatestMessageFormatFromWidget(self): + text_0 = self.view_variable.VAR_TEXT_REQUIRED_0_MESSAGE_FORMAT.get() + text_1 = self.view_variable.VAR_TEXT_REQUIRED_1_MESSAGE_FORMAT.get() + entry_0 = self.view_variable.VAR_ENTRY_0_MESSAGE_FORMAT.get() + entry_1 = self.view_variable.VAR_ENTRY_1_MESSAGE_FORMAT.get() + entry_2 = self.view_variable.VAR_ENTRY_2_MESSAGE_FORMAT.get() + return entry_0+text_0+entry_1+text_1+entry_2 + + def updateMessageFormat_ExampleTextWidget(self): + message = i18n.t("config_window.message_format.example_text", locale=config.UI_LANGUAGE) + translation_locale = "ja" if config.UI_LANGUAGE == "en" else "en" + translation = i18n.t("config_window.message_format.example_text", locale=translation_locale) + + example_message = config.MESSAGE_FORMAT.replace("[message]", message) + example_message = example_message.replace("[translation]", translation) + + self.view_variable.VAR_LABEL_EXAMPLE_TEXT_MESSAGE_FORMAT.set(example_message) + # GUI process def createGUI(self): @@ -1308,6 +1361,59 @@ class View(): vrct_gui._showErrorMessage(target_widget=target_widget) + @staticmethod + def extractMessageFormat(text): + import re + message_index = text.find("[message]") + translation_index = text.find("[translation]") + + result_data = SimpleNamespace( + is_message_first = True, + before = "", + between = "", + after = "", + ) + + if message_index < translation_index: + text_before_message = text[:message_index] + result_data.before = text_before_message + + match = re.search(r"\[message\](.*?)\[translation\]", text) + if match: + extracted_text = match.group(1) + result_data.between = extracted_text + + else: + raise ValueError("Invalid Message Format") + + text_after_translation = text[translation_index + len("[translation]"):] + result_data.after = text_after_translation + + + + + elif translation_index < message_index: + result_data.is_message_first = False + text_before_translation = text[:translation_index] + result_data.before = text_before_translation + + match = re.search(r"\[translation\](.*?)\[message\]", text) + if match: + extracted_text = match.group(1) + result_data.between = extracted_text + else: + raise ValueError("Invalid Message Format") + + text_after_message = text[message_index + len("[message]"):] + result_data.after = text_after_message + + else: + raise ValueError("Invalid Message Format") + + return result_data + + + 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 8a7f3622..82693501 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 @@ -2,7 +2,7 @@ from functools import partial from types import SimpleNamespace from typing import Union -from customtkinter import CTkOptionMenu, CTkFont, CTkFrame, CTkLabel, CTkRadioButton, CTkEntry, CTkSlider, CTkSwitch, CTkCheckBox, CTkProgressBar +from customtkinter import CTkOptionMenu, CTkFont, CTkFrame, CTkLabel, CTkRadioButton, CTkEntry, CTkSlider, CTkSwitch, CTkCheckBox, CTkProgressBar, CTkImage from CTkToolTip import * from vrct_gui.ui_utils import createButtonWithImage, getLatestWidth, createOptionMenuBox, getLatestHeight, bindButtonFunctionAndColor @@ -22,7 +22,7 @@ class _SettingBoxGenerator(): self.dropdown_menu_window = vrct_gui.vrct_gui.dropdown_menu_window - def _createSettingBoxFrame(self, sb__attr_name, for_var_label_text=None, for_var_desc_text=None): + def _createSettingBoxFrame(self, sb__attr_name, for_var_label_text=None, for_var_desc_text=None, expand_label_frame:bool=False): self.config_window.sb__widgets[sb__attr_name] = SimpleNamespace() setting_box_frame = CTkFrame(self.parent_widget, corner_radius=0, fg_color=self.settings.ctm.SB__BG_COLOR, width=0, height=0) @@ -34,8 +34,7 @@ class _SettingBoxGenerator(): setting_box_frame_wrapper = CTkFrame(setting_box_frame, corner_radius=0, fg_color=self.settings.ctm.SB__BG_COLOR, width=0, height=0) setting_box_frame_wrapper.grid(row=0, column=0, padx=self.settings.uism.SB__IPADX, pady=self.settings.uism.SB__IPADY, sticky="ew") - setting_box_frame_wrapper.grid_columnconfigure(0, weight=0, minsize=int(self.settings.uism.MAIN_AREA_MIN_WIDTH / 2)) - setting_box_frame_wrapper.grid_columnconfigure(2, weight=1, minsize=int(self.settings.uism.MAIN_AREA_MIN_WIDTH / 2)) + setting_box_frame_wrapper_fix_border = CTkFrame(setting_box_frame, corner_radius=0, width=0, height=0) setting_box_frame_wrapper_fix_border.grid(row=1, column=0, sticky="ew") @@ -43,10 +42,22 @@ class _SettingBoxGenerator(): setting_box_frame_wrapper_fix_border2 = CTkFrame(setting_box_frame, corner_radius=0, width=0, height=0) setting_box_frame_wrapper_fix_border2.grid(row=0, column=1, sticky="ns") - if for_var_label_text is not None: - self._setSettingBoxLabels(sb__attr_name, setting_box_frame_wrapper, for_var_label_text, for_var_desc_text) - # setting_box_item_frame = CTkFrame(setting_box_frame_wrapper, corner_radius=0, width=0, height=0, fg_color="red") + + if for_var_label_text is not None: + self._setSettingBoxLabels(sb__attr_name, setting_box_frame_wrapper, for_var_label_text, for_var_desc_text, expand_label_frame) + if expand_label_frame is True: + setting_box_frame_wrapper.grid_columnconfigure(0, weight=1, minsize=int(self.settings.uism.MAIN_AREA_MIN_WIDTH)) + setting_box_frame_wrapper.grid(columnspan=3) + return setting_box_frame + + + setting_box_frame_wrapper.grid_columnconfigure(0, weight=0, minsize=int(self.settings.uism.MAIN_AREA_MIN_WIDTH / 2)) + setting_box_frame_wrapper.grid_columnconfigure(2, weight=1, minsize=int(self.settings.uism.MAIN_AREA_MIN_WIDTH / 2)) + + + + setting_box_item_frame = CTkFrame(setting_box_frame_wrapper, corner_radius=0, width=0, height=0, fg_color=self.settings.ctm.SB__BG_COLOR) if for_var_label_text is not None: setting_box_item_frame.grid(row=0, column=2, padx=0, sticky="nsew") @@ -57,7 +68,7 @@ class _SettingBoxGenerator(): return (setting_box_frame, setting_box_item_frame) - def _setSettingBoxLabels(self, sb__attr_name, setting_box_frame_wrapper, for_var_label_text, for_var_desc_text=None): + def _setSettingBoxLabels(self, sb__attr_name, setting_box_frame_wrapper, for_var_label_text, for_var_desc_text=None, expand_label_frame:bool=False): setting_box_labels_frame = CTkFrame(setting_box_frame_wrapper, corner_radius=0, fg_color=self.settings.ctm.SB__BG_COLOR, width=0, height=0) setting_box_labels_frame.grid(row=0, column=0, padx=0, pady=0, sticky="nsew") @@ -86,6 +97,9 @@ class _SettingBoxGenerator(): font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.SB__DESC_FONT_SIZE, weight="normal"), text_color=self.settings.ctm.LABELS_DESC_TEXT_COLOR ) + if expand_label_frame is True: + setting_box_desc.configure(wraplength=self.settings.uism.MAIN_AREA_MIN_WIDTH) + setting_box_desc.grid(row=2, column=0, padx=0, pady=(self.settings.uism.SB__DESC_TOP_PADY,0), sticky="ew") self.config_window.additional_widgets.append(setting_box_desc) self.config_window.sb__widgets[sb__attr_name].desc_widget=setting_box_desc @@ -93,6 +107,16 @@ class _SettingBoxGenerator(): self.config_window.sb__widgets[sb__attr_name].desc_widget=None + def createSettingBox_Labels( + self, + for_var_label_text, for_var_desc_text, + labels_attr_name, + ): + + setting_box_frame= self._createSettingBoxFrame(labels_attr_name, for_var_label_text, for_var_desc_text, expand_label_frame=True) + + return setting_box_frame + def createSettingBoxDropdownMenu( @@ -452,6 +476,210 @@ class _SettingBoxGenerator(): return setting_box_frame + + + + def createSettingBoxMessageFormatEntries(self, + base_entry_attr_name, + entry_textvariable_0, + entry_textvariable_1, + entry_textvariable_2, + textvariable_0, + textvariable_1, + entry_bind__Any_KeyRelease, + entry_bind__FocusOut=None, + ): + + (setting_box_frame, setting_box_item_frame) = self._createSettingBoxFrame(base_entry_attr_name) + + + all_wrapper = CTkFrame(setting_box_item_frame, corner_radius=0, fg_color=self.settings.ctm.SB__BG_COLOR, width=0, height=0) + all_wrapper.grid(row=1, column=0, sticky="ew") + + all_wrapper.grid_columnconfigure(0, weight=1) + + + example_box_wrapper = CTkFrame(all_wrapper, corner_radius=0, fg_color=self.settings.ctm.SB__BG_COLOR, width=0, height=0) + example_box_wrapper.grid(row=0, column=0, pady=self.settings.uism.SB__MESSAGE_FORMAT__ENTRIES_BOTTOM_PADY, sticky="ew") + + entries_wrapper = CTkFrame(all_wrapper, corner_radius=0, fg_color=self.settings.ctm.SB__BG_COLOR, width=0, height=0) + entries_wrapper.grid(row=1, column=0, pady=self.settings.uism.SB__MESSAGE_FORMAT__ENTRIES_BOTTOM_PADY, sticky="ew") + + swap_button_wrapper = CTkFrame(all_wrapper, corner_radius=0, fg_color=self.settings.ctm.SB__BG_COLOR, width=0, height=0) + swap_button_wrapper.grid(row=2, column=0, sticky="e") + + + + + + example_box_wrapper.grid_columnconfigure((0,2), weight=1) + example_frame_widget = CTkFrame(example_box_wrapper, corner_radius=self.settings.uism.SB__MESSAGE_FORMAT__EXAMPLE_CORNER_RADIUS, fg_color=self.settings.ctm.SB__MESSAGE_FORMAT__EXAMPLE_BG_COLOR, width=0, height=0) + example_frame_widget.grid(row=0, column=1) + + example_frame_widget.grid_rowconfigure((0,2), weight=1) + example_frame_widget.grid_columnconfigure((0,2), weight=1) + example_label_widget = CTkLabel( + example_frame_widget, + textvariable=self.view_variable.VAR_LABEL_EXAMPLE_TEXT_MESSAGE_FORMAT, + anchor="center", + justify="center", + wraplength=self.settings.uism.SB__MESSAGE_FORMAT__EXAMPLE_WRAP_LENGTH, + height=0, + font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.SB__MESSAGE_FORMAT__REQUIRED_TEXT_FONT_SIZE, weight="normal"), + text_color=self.settings.ctm.LABELS_TEXT_COLOR, + ) + example_label_widget.grid(row=1, column=1, padx=self.settings.uism.SB__MESSAGE_FORMAT__EXAMPLE_IPADXY, pady=self.settings.uism.SB__MESSAGE_FORMAT__EXAMPLE_IPADXY, sticky="ew") + + self.config_window.additional_widgets.append(example_box_wrapper) + + + + + entry_textvariables = [entry_textvariable_0, entry_textvariable_1, entry_textvariable_2] + for i in range(3): + entry_widget = CTkEntry( + entries_wrapper, + text_color=self.settings.ctm.SB__ENTRY_TEXT_COLOR, + fg_color=self.settings.ctm.SB__ENTRY_BG_COLOR, + border_color=self.settings.ctm.SB__ENTRY_BORDER_COLOR, + height=self.settings.uism.SB__MESSAGE_FORMAT__ENTRY_HEIGHT, + textvariable=entry_textvariables[i], + justify="center", + font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.SB__ENTRY_FONT_SIZE, weight="normal"), + ) + setattr(self.config_window, base_entry_attr_name + str(i), entry_widget) + + + + if entry_bind__FocusOut is not None: + entry_widget.bind("", entry_bind__FocusOut, "+") + + + label_frame_widget_0 = CTkFrame(entries_wrapper, corner_radius=0, fg_color=self.settings.ctm.SB__BG_COLOR, width=0, height=0) + + label_frame_widget_0.grid_rowconfigure((0,2), weight=1) + label_frame_widget_0.grid_columnconfigure(0, weight=1) + label_widget_0 = CTkLabel( + label_frame_widget_0, + textvariable=textvariable_0, + anchor="center", + height=0, + font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.SB__MESSAGE_FORMAT__REQUIRED_TEXT_FONT_SIZE, weight="normal"), + text_color=self.settings.ctm.LABELS_TEXT_COLOR + ) + label_widget_0.grid(row=1, column=0, padx=0, pady=0, sticky="ew") + + + label_frame_widget_1 = CTkFrame(entries_wrapper, corner_radius=0, fg_color=self.settings.ctm.SB__BG_COLOR, width=0, height=0) + + label_frame_widget_1.grid_rowconfigure((0,2), weight=1) + label_frame_widget_1.grid_columnconfigure(0, weight=1) + label_widget_1 = CTkLabel( + label_frame_widget_1, + textvariable=textvariable_1, + anchor="center", + height=0, + font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.SB__MESSAGE_FORMAT__REQUIRED_TEXT_FONT_SIZE, weight="normal"), + text_color=self.settings.ctm.LABELS_TEXT_COLOR + ) + label_widget_1.grid(row=1, column=0, padx=0, pady=0, sticky="ew") + + + entries_wrapper.grid_columnconfigure((0,2,4), weight=1) + entries_wrapper.grid_columnconfigure((1,3), weight=0, uniform="message_format_fixed_labels") + + entry_widget_0 = getattr(self.config_window, base_entry_attr_name+"0") + entry_widget_1 = getattr(self.config_window, base_entry_attr_name+"1") + entry_widget_2 = getattr(self.config_window, base_entry_attr_name+"2") + entry_widget_0.grid(row=0, column=0, sticky="ew") + entry_widget_1.grid(row=0, column=2, sticky="ew") + entry_widget_2.grid(row=0, column=4, sticky="ew") + label_frame_widget_0.grid(row=0, column=1, padx=self.settings.uism.SB__MESSAGE_FORMAT__REQUIRED_TEXT_PADX, sticky="ew") + label_frame_widget_1.grid(row=0, column=3, padx=self.settings.uism.SB__MESSAGE_FORMAT__REQUIRED_TEXT_PADX, sticky="ew") + + def adjusted_command__for_entry_bind__Any_KeyRelease(_e): + message_format = entry_widget_0.get() + textvariable_0.get() + entry_widget_1.get() + textvariable_1.get() + entry_widget_2.get() + entry_bind__Any_KeyRelease(message_format) + + + entry_widget_0.bind("", adjusted_command__for_entry_bind__Any_KeyRelease) + entry_widget_1.bind("", adjusted_command__for_entry_bind__Any_KeyRelease) + entry_widget_2.bind("", adjusted_command__for_entry_bind__Any_KeyRelease) + + + + + + + swap_button = CTkFrame(swap_button_wrapper, corner_radius=self.settings.uism.BUTTONS_CORNER_RADIUS, fg_color=self.settings.ctm.SB__MESSAGE_FORMAT__SWAP_BUTTON_COLOR, cursor="hand2") + swap_button.grid(row=0, column=2, sticky="ew") + + + swap_button.grid_columnconfigure(0, weight=1) + swap_button_label_wrapper = CTkFrame(swap_button, corner_radius=0, fg_color=self.settings.ctm.SB__MESSAGE_FORMAT__SWAP_BUTTON_COLOR) + swap_button_label_wrapper.grid(row=0, column=0, padx=self.settings.uism.SB__MESSAGE_FORMAT__SWAP_BUTTON_IPADX, pady=self.settings.uism.SB__MESSAGE_FORMAT__SWAP_BUTTON_IPADY, sticky="ew") + + + swap_button_label_wrapper.grid_columnconfigure((0,4), weight=1) + swap_button_label_wrapper.grid_rowconfigure((0,2), weight=1) + + swap_button_label_0 = CTkLabel( + swap_button_label_wrapper, + textvariable=textvariable_0, + height=0, + corner_radius=0, + font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.SB__MESSAGE_FORMAT__SWAP_BUTTON_FONT_SIZE, weight="normal"), + anchor="w", + text_color=self.settings.ctm.LABELS_TEXT_COLOR, + ) + swap_button_label_0.grid(row=1, column=1) + + swap_button_both_direction_arrow_img = CTkLabel( + swap_button_label_wrapper, + text=None, + height=0, + corner_radius=0, + image=CTkImage((self.settings.image_file.SWAP_ICON), size=self.settings.uism.SB__MESSAGE_FORMAT__SWAP_BUTTON_ARROWS_IMG_SIZE), + anchor="w", + text_color=self.settings.ctm.LABELS_TEXT_COLOR, + ) + swap_button_both_direction_arrow_img.grid(row=1, column=2, padx=self.settings.uism.SB__MESSAGE_FORMAT__SWAP_TEXT_PADX) + + swap_button_label_1 = CTkLabel( + swap_button_label_wrapper, + textvariable=textvariable_1, + height=0, + corner_radius=0, + font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.SB__MESSAGE_FORMAT__SWAP_BUTTON_FONT_SIZE, weight="normal"), + anchor="w", + text_color=self.settings.ctm.LABELS_TEXT_COLOR, + ) + swap_button_label_1.grid(row=1, column=3) + + + def adjustedCommand(): + callFunctionIfCallable(self.view_variable.CALLBACK_SWAP_MESSAGE_FORMAT_REQUIRED_TEXT) + + bindButtonFunctionAndColor( + target_widgets=[ + swap_button, + swap_button_label_wrapper, + swap_button_label_0, + swap_button_both_direction_arrow_img, + swap_button_label_1, + ], + enter_color=self.settings.ctm.SB__MESSAGE_FORMAT__SWAP_BUTTON_HOVERED_COLOR, + leave_color=self.settings.ctm.SB__MESSAGE_FORMAT__SWAP_BUTTON_COLOR, + clicked_color=self.settings.ctm.SB__MESSAGE_FORMAT__SWAP_BUTTON_CLICKED_COLOR, + buttonReleasedFunction=lambda _e: adjustedCommand(), + ) + + + return setting_box_frame + + + + def createSettingBoxArrowSwitch( self, for_var_label_text, for_var_desc_text, 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 e4f46fb6..241d33c6 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 @@ -5,7 +5,8 @@ from .._SettingBoxGenerator import _SettingBoxGenerator def createSettingBox_Others(setting_box_wrapper, config_window, settings, view_variable): sbg = _SettingBoxGenerator(setting_box_wrapper, config_window, settings, view_variable) createSettingBoxCheckbox = sbg.createSettingBoxCheckbox - createSettingBoxEntry = sbg.createSettingBoxEntry + createSettingBox_Labels = sbg.createSettingBox_Labels + createSettingBoxMessageFormatEntries = sbg.createSettingBoxMessageFormatEntries # å…ƒ checkbox_auto_clear_chatbox_callback @@ -63,13 +64,24 @@ def createSettingBox_Others(setting_box_wrapper, config_window, settings, view_v row+=1 - config_window.sb__message_format = createSettingBoxEntry( + config_window.sb__message_format_labels = createSettingBox_Labels( for_var_label_text=view_variable.VAR_LABEL_MESSAGE_FORMAT, for_var_desc_text=view_variable.VAR_DESC_MESSAGE_FORMAT, - entry_attr_name="sb__entry_message_format", - entry_width=settings.uism.RESPONSIVE_UI_SIZE_INT_250, + labels_attr_name="sb__labels_message_format", + ) + config_window.sb__message_format_labels.grid(row=row, pady=0) + row+=1 + + config_window.sb__message_format = createSettingBoxMessageFormatEntries( + base_entry_attr_name="sb__entry_message_format", + # entry_width=settings.uism.RESPONSIVE_UI_SIZE_INT_150, + entry_textvariable_0=view_variable.VAR_ENTRY_0_MESSAGE_FORMAT, + entry_textvariable_1=view_variable.VAR_ENTRY_1_MESSAGE_FORMAT, + entry_textvariable_2=view_variable.VAR_ENTRY_2_MESSAGE_FORMAT, + textvariable_0=view_variable.VAR_TEXT_REQUIRED_0_MESSAGE_FORMAT, + textvariable_1=view_variable.VAR_TEXT_REQUIRED_1_MESSAGE_FORMAT, entry_bind__Any_KeyRelease=lambda value: entry_message_format_callback(value), - entry_textvariable=view_variable.VAR_MESSAGE_FORMAT, + # entry_textvariable=view_variable.VAR_MESSAGE_FORMAT, ) config_window.sb__message_format.grid(row=row) row+=1 diff --git a/vrct_gui/main_window/createMainWindowWidgets.py b/vrct_gui/main_window/createMainWindowWidgets.py index 088a3075..65661216 100644 --- a/vrct_gui/main_window/createMainWindowWidgets.py +++ b/vrct_gui/main_window/createMainWindowWidgets.py @@ -68,7 +68,7 @@ def createMainWindowWidgets(vrct_gui, settings, view_variable): text=None, corner_radius=0, height=0, - image=CTkImage(settings.image_file.REFRESH_ICON.rotate(25), size=settings.uism.UPDATE_AVAILABLE_BUTTON_SIZE) + image=CTkImage(settings.image_file.REFRESH_UPDATE_ICON.rotate(25), size=settings.uism.UPDATE_AVAILABLE_BUTTON_SIZE) ) vrct_gui.update_available_icon.grid(row=1, column=0, padx=(settings.uism.UPDATE_AVAILABLE_BUTTON_IPADX, settings.uism.UPDATE_AVAILABLE_PADX_BETWEEN_LABEL_AND_ICON), pady=0) diff --git a/vrct_gui/ui_managers/Themes/_darkTheme.py b/vrct_gui/ui_managers/Themes/_darkTheme.py index 2522608a..21296d03 100644 --- a/vrct_gui/ui_managers/Themes/_darkTheme.py +++ b/vrct_gui/ui_managers/Themes/_darkTheme.py @@ -246,6 +246,13 @@ def _darkTheme(base_color): SB__ADD_AND_DELETE_ABLE_LIST__VALUES_DELETED_BUTTON_CLICKED_BG_COLOR = base_color.DARK_900_COLOR, + SB__MESSAGE_FORMAT__EXAMPLE_BG_COLOR = "#3a4554", # from VRChat' chat display color + SB__MESSAGE_FORMAT__SWAP_BUTTON_COLOR = base_color.DARK_875_COLOR, + SB__MESSAGE_FORMAT__SWAP_BUTTON_HOVERED_COLOR = base_color.DARK_800_COLOR, + SB__MESSAGE_FORMAT__SWAP_BUTTON_CLICKED_COLOR = base_color.DARK_888_COLOR, + + + # Side menu SIDE_MENU_BG_COLOR = base_color.DARK_950_COLOR, @@ -289,11 +296,13 @@ def _darkTheme(base_color): ARROW_LEFT = getImageFileFromUiUtils("arrow_left_white.png"), ARROW_LEFT_DISABLED = getImageFileFromUiUtils("arrow_left_disabled.png"), + REFRESH_UPDATE_ICON = getImageFileFromUiUtils("refresh_update_icon.png"), REFRESH_ICON = getImageFileFromUiUtils("refresh_icon.png"), HELP_ICON = getImageFileFromUiUtils("help_icon_white.png"), CANCEL_ICON = getImageFileFromUiUtils("cancel_icon.png"), REDO_ICON = getImageFileFromUiUtils("redo_white.png"), + SWAP_ICON = getImageFileFromUiUtils("swap_icon.png"), ), ) diff --git a/vrct_gui/ui_managers/UiScalingManager.py b/vrct_gui/ui_managers/UiScalingManager.py index 9a1ad1c2..70b2fa95 100644 --- a/vrct_gui/ui_managers/UiScalingManager.py +++ b/vrct_gui/ui_managers/UiScalingManager.py @@ -302,6 +302,25 @@ class UiScalingManager(): self.config_window.ADD_AND_DELETE_ABLE_LIST__ADD_BUTTON_LEFT_PADX = (self._calculateUiSize(20), 0) self.config_window.ADD_AND_DELETE_ABLE_LIST__ADD_BUTTON_FONT_SIZE = self._calculateUiSize(14) + + self.config_window.SB__MESSAGE_FORMAT__EXAMPLE_CORNER_RADIUS = self._calculateUiSize(16) + self.config_window.SB__MESSAGE_FORMAT__EXAMPLE_IPADXY = self._calculateUiSize(10) + self.config_window.SB__MESSAGE_FORMAT__EXAMPLE_WRAP_LENGTH = self._calculateUiSize(300) + + self.config_window.SB__MESSAGE_FORMAT__ENTRY_HEIGHT = self.config_window.SB__ENTRY_HEIGHT + self.config_window.SB__MESSAGE_FORMAT__REQUIRED_TEXT_PADX = self._calculateUiSize(10) + self.config_window.SB__MESSAGE_FORMAT__REQUIRED_TEXT_FONT_SIZE = self._calculateUiSize(16) + + self.config_window.SB__MESSAGE_FORMAT__SWAP_BUTTON_ARROWS_IMG_SIZE = self.dupTuple(self._calculateUiSize(20)) + self.config_window.SB__MESSAGE_FORMAT__SWAP_BUTTON_IPADX = self._calculateUiSize(16) + self.config_window.SB__MESSAGE_FORMAT__SWAP_BUTTON_IPADY = self._calculateUiSize(6) + self.config_window.SB__MESSAGE_FORMAT__SWAP_BUTTON_FONT_SIZE = self._calculateUiSize(14) + self.config_window.SB__MESSAGE_FORMAT__SWAP_TEXT_PADX = self._calculateUiSize(10) + + self.config_window.SB__MESSAGE_FORMAT__ENTRIES_BOTTOM_PADY = (0, self._calculateUiSize(14)) + + + def _calculateUiSize(self, default_size, is_allowed_odd:bool=False, is_zero_allowed:bool=False): size = calculateUiSize(default_size, self.SCALING_FLOAT, is_allowed_odd, is_zero_allowed) return size From 72877ab98b43bc9b191eedb2df6a893725823849 Mon Sep 17 00:00:00 2001 From: Sakamoto Shiina <68018796+ShiinaSakamoto@users.noreply.github.com> Date: Sun, 5 Nov 2023 11:30:34 +0900 Subject: [PATCH 33/44] =?UTF-8?q?[Update]=20Message=20Format:=20[message]?= =?UTF-8?q?=E3=81=A8[translation]=E3=81=AF=E4=B8=80=E6=84=8F=E3=81=8B?= =?UTF-8?q?=E3=81=A4=E3=81=9D=E3=82=8C=E3=81=9E=E3=82=8C=E4=B8=80=E3=81=A4?= =?UTF-8?q?=E3=81=A0=E3=81=91=E3=81=AE=E4=BD=BF=E7=94=A8=E3=81=AB=E3=80=82?= =?UTF-8?q?=E3=81=9D=E3=82=8C=E3=81=AB=E4=BC=B4=E3=81=84=E3=82=A8=E3=83=A9?= =?UTF-8?q?=E3=83=BC=E8=A1=A8=E7=A4=BA=E3=82=84=E5=88=9D=E6=9C=9F=E5=80=A4?= =?UTF-8?q?=E3=81=AE=E6=8C=BF=E5=85=A5=E3=81=AA=E3=81=A9=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.py | 4 ++-- controller.py | 12 +++++++++--- locales/en.yml | 1 + locales/ja.yml | 1 + utils.py | 18 +++++++++++++++++- view.py | 15 ++++++++++++++- .../_SettingBoxGenerator.py | 8 ++++---- .../createSettingBox_Others.py | 1 + 8 files changed, 49 insertions(+), 11 deletions(-) diff --git a/config.py b/config.py index eeda8c1e..7dc8f759 100644 --- a/config.py +++ b/config.py @@ -8,7 +8,7 @@ from tkinter import font from languages import selectable_languages from models.translation.translation_languages import translatorEngine from models.transcription.transcription_utils import getInputDevices, getDefaultInputDevice -from utils import generatePercentageStringsList +from utils import generatePercentageStringsList, isUniqueStrings json_serializable_vars = {} def json_serializable(var_name): @@ -447,7 +447,7 @@ class Config: @MESSAGE_FORMAT.setter def MESSAGE_FORMAT(self, value): if type(value) is str: - if "[message]" not in value or "[translation]" not in value: + if isUniqueStrings(["[message]", "[translation]"], value) is False: value = "[message]([translation])" self._MESSAGE_FORMAT = value saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) diff --git a/controller.py b/controller.py index 4842196b..183dafbf 100644 --- a/controller.py +++ b/controller.py @@ -3,7 +3,7 @@ from threading import Thread from config import config from model import model from view import view -from utils import get_key_by_value +from utils import get_key_by_value, isUniqueStrings from languages import selectable_languages # Common @@ -627,8 +627,14 @@ def callbackSetEnableAutoExportMessageLogs(value): def callbackSetMessageFormat(value): print("callbackSetMessageFormat", value) if len(value) > 0: - config.MESSAGE_FORMAT = value - view.setMessageFormatEntryWidgets(config.MESSAGE_FORMAT) + if isUniqueStrings(["[message]", "[translation]"], value) is True: + config.MESSAGE_FORMAT = value + view.clearErrorMessage() + view.setMessageFormatEntryWidgets(config.MESSAGE_FORMAT) + else: + view.showErrorMessage_MessageFormat() + view.setMessageFormatEntryWidgets(config.MESSAGE_FORMAT) + def callbackSetEnableSendMessageToVrc(value): print("callbackSetEnableSendMessageToVrc", value) diff --git a/locales/en.yml b/locales/en.yml index 0a77d70d..23fd1380 100644 --- a/locales/en.yml +++ b/locales/en.yml @@ -182,6 +182,7 @@ config_window: label: Message Format 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.\nIt 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." send_message_to_vrc: label: Send Message To VRChat diff --git a/locales/ja.yml b/locales/ja.yml index a73b4e8e..9b0c8707 100644 --- a/locales/ja.yml +++ b/locales/ja.yml @@ -181,6 +181,7 @@ config_window: label: é€ä¿¡ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ãƒ•ォーマット desc: "VRChatã§ç›¸æ‰‹ã«å®Ÿéš›ã«è¦‹ãˆã‚‹ãƒ•ォーマットを変更ã§ãã¾ã™ã€‚\n[message]ãŒãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ç½®æ›ã•れã€[translation]ãŒç¿»è¨³ã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ç½®æ›ã•れã¾ã™ã€‚\n※XSOverlayã§ã®é€šçŸ¥å—ã‘å–り機能ã§ã‚‚使ã‚れã¾ã™ã€‚" example_text: ã“れã¯ä¾‹æ–‡ã§ã™ã€‚フォントや改行箇所ãªã©ã€å®Ÿéš›ã®è¡¨ç¤ºã¨ã¯ç•°ãªã‚‹å ´åˆãŒã‚りã¾ã™ã€‚ + error_message: "[message]ã¨[translation]ã¨ã„ã†æ–‡å­—ã¯ä½¿ãˆã¾ã›ã‚“。" send_message_to_vrc: label: VRChatã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡ã™ã‚‹ diff --git a/utils.py b/utils.py index 242faf15..9cb0dc94 100644 --- a/utils.py +++ b/utils.py @@ -1,3 +1,4 @@ +from typing import Union from os import path as os_path from PIL.Image import open as Image_open @@ -29,4 +30,19 @@ def generatePercentageStringsList(start=40, end=200, step=10): return strings def intToPercentageStringsFormatter(value:int): - return f"{value}%" \ No newline at end of file + return f"{value}%" + +def isUniqueStrings(unique_strings:Union[str, list], input_string:str, require=False): + import re + if isinstance(unique_strings, str): + unique_strings = [unique_strings] + patterns = [re.escape(s) for s in unique_strings] + + counts = [len(re.findall(pattern, input_string)) for pattern in patterns] + + if require is True: + # If require is True, unique_strings must appear once + return all(count == 1 for count in counts) and counts.count(1) == 2 + else: + # If require is False, check if unique strings are used exactly once + return all(count == 1 for count in counts) \ No newline at end of file diff --git a/view.py b/view.py index 09267802..7c8c005f 100644 --- a/view.py +++ b/view.py @@ -355,6 +355,7 @@ class View(): VAR_ENTRY_2_MESSAGE_FORMAT=StringVar(value=""), VAR_TEXT_REQUIRED_0_MESSAGE_FORMAT=StringVar(value="[message]"), VAR_TEXT_REQUIRED_1_MESSAGE_FORMAT=StringVar(value="[translation]"), + CALLBACK_FOCUS_OUT_MESSAGE_FORMAT=self.callbackBindFocusOut_MessageFormat, VAR_LABEL_ENABLE_SEND_MESSAGE_TO_VRC=StringVar(value=i18n.t("config_window.send_message_to_vrc.label")), @@ -1121,6 +1122,9 @@ class View(): case "SpeakerMaxPhrases": self.setGuiVariable_SpeakerMaxPhrases(config.INPUT_SPEAKER_MAX_PHRASES) + case "MessageFormat": + self.setMessageFormatEntryWidgets(config.MESSAGE_FORMAT) + case _: raise ValueError(f"No matching case for target_name: {target_name}") @@ -1270,7 +1274,9 @@ class View(): self.clearErrorMessage() - + def callbackBindFocusOut_MessageFormat(self, _e=None): + self.setLatestConfigVariable("MessageFormat") + self.clearErrorMessage() @@ -1352,6 +1358,13 @@ class View(): self._makeInvalidValueErrorMessage(i18n.t("config_window.speaker_dynamic_energy_threshold.no_device_error_message")) ) + + def showErrorMessage_MessageFormat(self): + self._showErrorMessage( + vrct_gui.config_window.sb__entry_message_format_2, + self._makeInvalidValueErrorMessage(i18n.t("config_window.message_format.error_message")) + ) + @staticmethod def _makeInvalidValueErrorMessage(error_message): return i18n.t("config_window.common_error_message.invalid_value") + "\n" + error_message 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 82693501..d9c4cebd 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 @@ -547,7 +547,7 @@ class _SettingBoxGenerator(): justify="center", font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.SB__ENTRY_FONT_SIZE, weight="normal"), ) - setattr(self.config_window, base_entry_attr_name + str(i), entry_widget) + setattr(self.config_window, base_entry_attr_name + "_" + str(i), entry_widget) @@ -588,9 +588,9 @@ class _SettingBoxGenerator(): entries_wrapper.grid_columnconfigure((0,2,4), weight=1) entries_wrapper.grid_columnconfigure((1,3), weight=0, uniform="message_format_fixed_labels") - entry_widget_0 = getattr(self.config_window, base_entry_attr_name+"0") - entry_widget_1 = getattr(self.config_window, base_entry_attr_name+"1") - entry_widget_2 = getattr(self.config_window, base_entry_attr_name+"2") + entry_widget_0 = getattr(self.config_window, base_entry_attr_name+"_0") + entry_widget_1 = getattr(self.config_window, base_entry_attr_name+"_1") + entry_widget_2 = getattr(self.config_window, base_entry_attr_name+"_2") entry_widget_0.grid(row=0, column=0, sticky="ew") entry_widget_1.grid(row=0, column=2, sticky="ew") entry_widget_2.grid(row=0, column=4, sticky="ew") 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 241d33c6..368d3edd 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 @@ -82,6 +82,7 @@ def createSettingBox_Others(setting_box_wrapper, config_window, settings, view_v textvariable_1=view_variable.VAR_TEXT_REQUIRED_1_MESSAGE_FORMAT, entry_bind__Any_KeyRelease=lambda value: entry_message_format_callback(value), # entry_textvariable=view_variable.VAR_MESSAGE_FORMAT, + entry_bind__FocusOut=view_variable.CALLBACK_FOCUS_OUT_MESSAGE_FORMAT, ) config_window.sb__message_format.grid(row=row) row+=1 From 74c8a253e8e8e2c25be68e608f2171b7ed912773 Mon Sep 17 00:00:00 2001 From: Sakamoto Shiina <68018796+ShiinaSakamoto@users.noreply.github.com> Date: Mon, 6 Nov 2023 06:21:43 +0900 Subject: [PATCH 34/44] [Update] Main Window: add feature. Swap Languages. when hover the label 'Translate Each Other', 'Swap Languages Button' appear. and It can swap 'Your language' and 'Target Language'. --- controller.py | 10 +++ locales/en.yml | 1 + locales/ja.yml | 1 + view.py | 3 + .../createSidebarLanguagesSettings.py | 69 ++++++++++++++++--- vrct_gui/ui_managers/Themes/_darkTheme.py | 3 + vrct_gui/ui_managers/UiScalingManager.py | 6 +- 7 files changed, 82 insertions(+), 11 deletions(-) diff --git a/controller.py b/controller.py index 183dafbf..5e8323c3 100644 --- a/controller.py +++ b/controller.py @@ -230,6 +230,15 @@ def setTargetLanguageAndCountry(select): config.CHOICE_TRANSLATOR = model.findTranslationEngine(config.SOURCE_LANGUAGE, config.TARGET_LANGUAGE) view.printToTextbox_selectedTargetLanguages(select) +def swapYourLanguageAndTargetLanguage(): + your_language = config.SELECTED_TAB_YOUR_LANGUAGES[config.SELECTED_TAB_NO] + target_language = config.SELECTED_TAB_TARGET_LANGUAGES[config.SELECTED_TAB_NO] + setYourLanguageAndCountry(target_language) + setTargetLanguageAndCountry(your_language) + # Update Selected Languages for UI + view.updateGuiVariableByPresetTabNo(config.SELECTED_TAB_NO) + + def callbackSelectedLanguagePresetTab(selected_tab_no): config.SELECTED_TAB_NO = selected_tab_no view.updateGuiVariableByPresetTabNo(config.SELECTED_TAB_NO) @@ -710,6 +719,7 @@ def createMainWindow(): "callback_your_language": setYourLanguageAndCountry, "callback_target_language": setTargetLanguageAndCountry, "values": model.getListLanguageAndCountry(), + "callback_swap_languages": swapYourLanguageAndTargetLanguage, "callback_selected_language_preset_tab": callbackSelectedLanguagePresetTab, "message_box_bind_Return": messageBoxPressKeyEnter, diff --git a/locales/en.yml b/locales/en.yml index 23fd1380..9bce45f3 100644 --- a/locales/en.yml +++ b/locales/en.yml @@ -7,6 +7,7 @@ main_window: language_settings: Language Settings your_language: Your Language both_direction_desc: Translate Each Other + swap_button_label: Swap Languages target_language: Target Language textbox_tab_all: All diff --git a/locales/ja.yml b/locales/ja.yml index 9b0c8707..c0e9cc11 100644 --- a/locales/ja.yml +++ b/locales/ja.yml @@ -7,6 +7,7 @@ main_window: language_settings: 言語設定 your_language: ã‚ãªãŸã®è¨€èªž both_direction_desc: åŒæ–¹å‘ã«ç¿»è¨³ + swap_button_label: 言語を入れ替㈠target_language: 相手ã®è¨€èªž textbox_tab_all: 全㦠diff --git a/view.py b/view.py index 7c8c005f..4f2d3ef5 100644 --- a/view.py +++ b/view.py @@ -140,6 +140,8 @@ class View(): 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")), + CALLBACK_SWAP_LANGUAGES=None, VAR_LABEL_TARGET_LANGUAGE=StringVar(value=i18n.t("main_window.target_language")), VAR_TARGET_LANGUAGE = StringVar(value="English\n(United States)"), @@ -418,6 +420,7 @@ class View(): self.view_variable.CALLBACK_SELECTED_YOUR_LANGUAGE = main_window_registers.get("callback_your_language", None) self.view_variable.CALLBACK_SELECTED_TARGET_LANGUAGE = main_window_registers.get("callback_target_language", None) main_window_registers.get("values", None) and self.updateList_selectableLanguages(main_window_registers["values"]) + self.view_variable.CALLBACK_SWAP_LANGUAGES = main_window_registers.get("callback_swap_languages", None) self.view_variable.CALLBACK_SELECTED_LANGUAGE_PRESET_TAB = main_window_registers.get("callback_selected_language_preset_tab", None) diff --git a/vrct_gui/main_window/widgets/_create_sidebar/createSidebarLanguagesSettings.py b/vrct_gui/main_window/widgets/_create_sidebar/createSidebarLanguagesSettings.py index 346afae5..7561e1ae 100644 --- a/vrct_gui/main_window/widgets/_create_sidebar/createSidebarLanguagesSettings.py +++ b/vrct_gui/main_window/widgets/_create_sidebar/createSidebarLanguagesSettings.py @@ -1,6 +1,6 @@ from customtkinter import CTkFont, CTkFrame, CTkLabel, CTkImage -from ....ui_utils import bindEnterAndLeaveColor, bindButtonPressColor, bindButtonReleaseFunction, switchActiveTabAndPassiveTab, switchTabsColor, createOptionMenuBox +from ....ui_utils import bindEnterAndLeaveColor, bindButtonPressColor, bindButtonReleaseFunction, switchActiveTabAndPassiveTab, switchTabsColor, createOptionMenuBox, bindButtonFunctionAndColor, bindEnterAndLeaveFunction from utils import callFunctionIfCallable @@ -226,36 +226,85 @@ def createSidebarLanguagesSettings(settings, main_window, view_variable): # Both direction arrow icon main_window.sls__arrow_direction_box = CTkFrame(main_window.sls__box_frame, corner_radius=0, fg_color=settings.ctm.SLS__BG_COLOR, width=0, height=0) - main_window.sls__arrow_direction_box.grid(row=3, column=0, pady=settings.uism.SLS__BOX_ARROWS_PADY,sticky="ew") + main_window.sls__arrow_direction_box.grid(row=3, column=0, pady=settings.uism.SLS__BOX_ARROWS_PADY, sticky="ew") - main_window.sls__arrow_direction_box.grid_columnconfigure((0,4), weight=1) + main_window.sls__arrow_direction_box.grid_columnconfigure((0,2), weight=0, minsize=settings.uism.SLS__BOX_ARROWS_SWAP_BUTTON_PADX) + main_window.sls__arrow_direction_box.grid_columnconfigure(1, weight=1) + + main_window.sls__arrow_direction_swap_box = CTkFrame(main_window.sls__arrow_direction_box, corner_radius=settings.uism.SLS__BOX_ARROWS_SWAP_BUTTON_CORNER_RADIUS, fg_color=settings.ctm.SLS__BG_COLOR, width=0, height=0, cursor="hand2") + main_window.sls__arrow_direction_swap_box.grid(row=0, column=1, ipady=settings.uism.SLS__BOX_ARROWS_SWAP_BUTTON_IPADY, sticky="ew") + + main_window.sls__arrow_direction_swap_box.grid_rowconfigure((0,2), weight=1) + main_window.sls__arrow_direction_swap_box.grid_columnconfigure(1, weight=1) main_window.sls__both_direction_up = CTkLabel( - main_window.sls__arrow_direction_box, + main_window.sls__arrow_direction_swap_box, text=None, height=0, image=CTkImage((settings.image_file.NARROW_ARROW_DOWN).rotate(180),size=settings.uism.SLS__BOX_ARROWS_IMAGE_SIZE) ) - main_window.sls__both_direction_up.grid(row=0, column=1, pady=0) + main_window.sls__both_direction_up.grid(row=1, column=0, padx=(settings.uism.SLS__BOX_ARROWS_SWAP_BUTTON_IPADX, 0), pady=0) main_window.sls__both_direction_desc = CTkLabel( - main_window.sls__arrow_direction_box, + main_window.sls__arrow_direction_swap_box, textvariable=view_variable.VAR_LABEL_BOTH_DIRECTION_DESC, height=0, font=CTkFont(family=settings.FONT_FAMILY, size=settings.uism.SLS__BOX_ARROWS_DESC_FONT_SIZE, weight="normal"), text_color=settings.ctm.SLS__BOX_ARROWS_TEXT_COLOR, ) - main_window.sls__both_direction_desc.grid(row=0, column=2, padx=settings.uism.SLS__BOX_ARROWS_DESC_PADX) + main_window.sls__both_direction_desc.grid(row=1, column=1, padx=settings.uism.SLS__BOX_ARROWS_DESC_PADX) - main_window.sls__both_direction_label_down = CTkLabel( - main_window.sls__arrow_direction_box, + main_window.sls__both_direction_down = CTkLabel( + main_window.sls__arrow_direction_swap_box, text=None, height=0, image=CTkImage((settings.image_file.NARROW_ARROW_DOWN).rotate(0),size=settings.uism.SLS__BOX_ARROWS_IMAGE_SIZE) ) - main_window.sls__both_direction_label_down.grid(row=0, column=3) + main_window.sls__both_direction_down.grid(row=1, column=2, padx=(0, settings.uism.SLS__BOX_ARROWS_SWAP_BUTTON_IPADX)) + + + + def adjustedCommand_ButtonReleased(): + callFunctionIfCallable(view_variable.CALLBACK_SWAP_LANGUAGES) + + bindButtonFunctionAndColor( + target_widgets=[ + main_window.sls__arrow_direction_swap_box, + main_window.sls__both_direction_up, + main_window.sls__both_direction_desc, + main_window.sls__both_direction_down + ], + enter_color=settings.ctm.SLS__BOX_ARROWS_SWAP_BUTTON_HOVERED_COLOR, + leave_color=settings.ctm.SLS__BG_COLOR, + clicked_color=settings.ctm.SLS__BOX_ARROWS_SWAP_BUTTON_CLICKED_COLOR, + buttonReleasedFunction=lambda _e: adjustedCommand_ButtonReleased(), + ) + + + def adjustedCommand_Entered(): + 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, + ) + + 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, + ) + + bindEnterAndLeaveFunction( + target_widgets=[ + main_window.sls__arrow_direction_swap_box, + main_window.sls__both_direction_up, + main_window.sls__both_direction_desc, + main_window.sls__both_direction_down + ], + enterFunction=lambda _e: adjustedCommand_Entered(), + leaveFunction=lambda _e: adjustedCommand_Leaved(), + ) diff --git a/vrct_gui/ui_managers/Themes/_darkTheme.py b/vrct_gui/ui_managers/Themes/_darkTheme.py index 21296d03..353cb373 100644 --- a/vrct_gui/ui_managers/Themes/_darkTheme.py +++ b/vrct_gui/ui_managers/Themes/_darkTheme.py @@ -78,6 +78,9 @@ def _darkTheme(base_color): SLS__BOX_BG_COLOR = base_color.DARK_825_COLOR, SLS__BOX_SECTION_TITLE_TEXT_COLOR = base_color.DARK_400_COLOR, SLS__BOX_ARROWS_TEXT_COLOR = base_color.DARK_500_COLOR, + SLS__BOX_ARROWS_SWAP_BUTTON_TEXT_COLOR = base_color.DARK_BASIC_TEXT_COLOR, + SLS__BOX_ARROWS_SWAP_BUTTON_HOVERED_COLOR = base_color.DARK_750_COLOR, + SLS__BOX_ARROWS_SWAP_BUTTON_CLICKED_COLOR = base_color.DARK_850_COLOR, SLS__OPTIONMENU_BG_COLOR = base_color.DARK_888_COLOR, SLS__OPTIONMENU_HOVERED_BG_COLOR = base_color.DARK_875_COLOR, diff --git a/vrct_gui/ui_managers/UiScalingManager.py b/vrct_gui/ui_managers/UiScalingManager.py index 70b2fa95..116fe9be 100644 --- a/vrct_gui/ui_managers/UiScalingManager.py +++ b/vrct_gui/ui_managers/UiScalingManager.py @@ -94,7 +94,11 @@ class UiScalingManager(): 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_WIDTH = self._calculateUiSize(200) - self.main.SLS__BOX_ARROWS_PADY = self._calculateUiSize(10) + self.main.SLS__BOX_ARROWS_PADY = self._calculateUiSize(4) + 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_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) From 5d6902c1963e307e2a2ff3bc576e300a82eea718 Mon Sep 17 00:00:00 2001 From: Sakamoto Shiina <68018796+ShiinaSakamoto@users.noreply.github.com> Date: Mon, 6 Nov 2023 12:31:49 +0900 Subject: [PATCH 35/44] [Update] Config Window: Auto Export Message Logs. add open file(logs) button. --- controller.py | 4 ++ img/folder_open_icon.png | Bin 0 -> 703 bytes view.py | 2 + .../_SettingBoxGenerator.py | 61 ++++++++++++++++++ .../createSettingBox_Others.py | 9 ++- vrct_gui/ui_managers/Themes/_darkTheme.py | 1 + 6 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 img/folder_open_icon.png diff --git a/controller.py b/controller.py index 5e8323c3..a26e7c8e 100644 --- a/controller.py +++ b/controller.py @@ -13,6 +13,9 @@ def callbackUpdateSoftware(): def callbackRestartSoftware(): model.reStartSoftware() +def callbackFilepathLogs(): + print("callbackFilepathLogs") + # func transcription send message def sendMicMessage(message): if len(message) > 0: @@ -700,6 +703,7 @@ def createMainWindow(): common_registers={ "callback_update_software": callbackUpdateSoftware, "callback_restart_software": callbackRestartSoftware, + "callback_filepath_logs": callbackFilepathLogs, }, window_action_registers={ diff --git a/img/folder_open_icon.png b/img/folder_open_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3de75dfe934739dad971921a59a60491fcc22842 GIT binary patch literal 703 zcmV;w0zmzVP)j-RdZQ*CilB@UeIrrWZ z2gu3!zoF-wHpf{&2=TPlv>xjc5OEifQa9(O1$0ZyPNBcq17Z95) znpPV?JE`@S-BXEHKnJ;iZgK(LM4m!D+gWj4@1yRJz~a-0i1s5Z;CZs9JNOcY%kF_X z00<#kt)|u0oz`cw)BnuO6(Vw!6|nm+&N1_40AtfMcXfyM>Gqt9%v>Shd%0ZNQwn&V zTLmD9=*_xSJ2CK}ydy&;tX%+vM(;OGt=qCU+}4xl(j2hP@MX1)$Unuamd zo!G~=hv%935`b}`P1 z9gVL7I73AH8;$xWrGP)Y5z%&a?bbj0VZMy0whp&Y;Fe1fH2@F`a?J#?Fuaw@r9GuU zR)#mFKvssg2!U)2Z%P4VWO$1b08-mN>RbVVEDUc-fvgN~VPa&}@y lwsq>?%!P-yoSd8>zW^Z!E4hp1?Q#GB002ovPDHLkV1hVqK>+{& literal 0 HcmV?d00001 diff --git a/view.py b/view.py index 4f2d3ef5..3979439c 100644 --- a/view.py +++ b/view.py @@ -82,6 +82,7 @@ class View(): # Common CALLBACK_RESTART_SOFTWARE=None, CALLBACK_UPDATE_SOFTWARE=None, + CALLBACK_OPEN_FILEPATH_LOGS=None, CALLBACK_QUIT_VRCT=vrct_gui._quitVRCT, @@ -400,6 +401,7 @@ class View(): if common_registers is not None: self.view_variable.CALLBACK_UPDATE_SOFTWARE=common_registers.get("callback_update_software", None) self.view_variable.CALLBACK_RESTART_SOFTWARE=common_registers.get("callback_restart_software", None) + self.view_variable.CALLBACK_OPEN_FILEPATH_LOGS=common_registers.get("callback_filepath_logs", None) if window_action_registers is not None: 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 d9c4cebd..28e99364 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 @@ -254,6 +254,67 @@ class _SettingBoxGenerator(): + def createSettingBoxAutoExportMessageLogs( + self, + for_var_label_text, for_var_desc_text, + checkbox_attr_name, + checkbox_command, + button_command, + variable, + ): + + (setting_box_frame, setting_box_item_frame) = self._createSettingBoxFrame(checkbox_attr_name, for_var_label_text, for_var_desc_text) + + + + all_wrapper = CTkFrame(setting_box_item_frame, corner_radius=0, fg_color=self.settings.ctm.SB__BG_COLOR, width=0, height=0) + all_wrapper.grid(row=1, column=0, sticky="ew") + + all_wrapper.grid_columnconfigure(1, weight=1) + + + + + button_widget = createButtonWithImage( + parent_widget=all_wrapper, + button_fg_color=self.settings.ctm.SB__ARROW_SWITCH_BUTTON_COLOR, + button_enter_color=self.settings.ctm.SB__ARROW_SWITCH_BUTTON_HOVERED_COLOR, + button_clicked_color=self.settings.ctm.SB__ARROW_SWITCH_BUTTON_CLICKED_COLOR, + button_image_file=self.settings.image_file.FOLDER_OPEN_ICON, + button_image_size=self.settings.uism.SB__ARROW_SWITCH_BUTTON_ICON_SIZE, + button_ipadxy=self.settings.uism.SB__ARROW_SWITCH_BUTTON_IPADXY, + button_command=button_command, + ) + button_widget.grid(row=0, column=0, padx=0, sticky="w") + + + + checkbox_widget = CTkCheckBox( + all_wrapper, + text=None, + width=0, + checkbox_width=self.settings.uism.SB__CHECKBOX_SIZE, + checkbox_height=self.settings.uism.SB__CHECKBOX_SIZE, + onvalue=True, + offvalue=False, + variable=variable, + command=checkbox_command, + corner_radius=self.settings.uism.SB__CHECKBOX_CORNER_RADIUS, + border_width=self.settings.uism.SB__CHECKBOX_BORDER_WIDTH, + border_color=self.settings.ctm.SB__CHECKBOX_BORDER_COLOR, + hover_color=self.settings.ctm.SB__CHECKBOX_HOVER_COLOR, + checkmark_color=self.settings.ctm.SB__CHECKBOX_CHECKMARK_COLOR, + fg_color=self.settings.ctm.SB__CHECKBOX_CHECKED_COLOR, + ) + setattr(self.config_window, checkbox_attr_name, checkbox_widget) + + checkbox_widget.grid(row=0, column=2, sticky="e") + + return setting_box_frame + + + + def createSettingBoxSlider( 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 368d3edd..161e4bfc 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 @@ -5,6 +5,7 @@ from .._SettingBoxGenerator import _SettingBoxGenerator def createSettingBox_Others(setting_box_wrapper, config_window, settings, view_variable): sbg = _SettingBoxGenerator(setting_box_wrapper, config_window, settings, view_variable) createSettingBoxCheckbox = sbg.createSettingBoxCheckbox + createSettingBoxAutoExportMessageLogs = sbg.createSettingBoxAutoExportMessageLogs createSettingBox_Labels = sbg.createSettingBox_Labels createSettingBoxMessageFormatEntries = sbg.createSettingBoxMessageFormatEntries @@ -19,6 +20,9 @@ def createSettingBox_Others(setting_box_wrapper, config_window, settings, view_v def checkbox_auto_export_message_logs_callback(checkbox_box_widget): callFunctionIfCallable(view_variable.CALLBACK_SET_ENABLE_AUTO_EXPORT_MESSAGE_LOGS, checkbox_box_widget.get()) + def button_auto_export_message_logs_callback(): + callFunctionIfCallable(view_variable.CALLBACK_OPEN_FILEPATH_LOGS) + def checkbox_enable_send_message_to_vrc_callback(checkbox_box_widget): callFunctionIfCallable(view_variable.CALLBACK_SET_ENABLE_SEND_MESSAGE_TO_VRC, checkbox_box_widget.get()) @@ -53,11 +57,12 @@ def createSettingBox_Others(setting_box_wrapper, config_window, settings, view_v row+=1 - config_window.sb__auto_export_message_logs = createSettingBoxCheckbox( + config_window.sb__auto_export_message_logs = createSettingBoxAutoExportMessageLogs( for_var_label_text=view_variable.VAR_LABEL_ENABLE_AUTO_EXPORT_MESSAGE_LOGS, for_var_desc_text=view_variable.VAR_DESC_ENABLE_AUTO_EXPORT_MESSAGE_LOGS, checkbox_attr_name="sb__checkbox_auto_export_message_logs", - command=lambda: checkbox_auto_export_message_logs_callback(config_window.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(), variable=view_variable.VAR_ENABLE_AUTO_EXPORT_MESSAGE_LOGS, ) config_window.sb__auto_export_message_logs.grid(row=row) diff --git a/vrct_gui/ui_managers/Themes/_darkTheme.py b/vrct_gui/ui_managers/Themes/_darkTheme.py index 353cb373..5ee1af0c 100644 --- a/vrct_gui/ui_managers/Themes/_darkTheme.py +++ b/vrct_gui/ui_managers/Themes/_darkTheme.py @@ -306,6 +306,7 @@ def _darkTheme(base_color): CANCEL_ICON = getImageFileFromUiUtils("cancel_icon.png"), REDO_ICON = getImageFileFromUiUtils("redo_white.png"), SWAP_ICON = getImageFileFromUiUtils("swap_icon.png"), + FOLDER_OPEN_ICON = getImageFileFromUiUtils("folder_open_icon.png"), ), ) From f21ffea568c905d5d38d56723a4649f9d8e7cecc Mon Sep 17 00:00:00 2001 From: Sakamoto Shiina <68018796+ShiinaSakamoto@users.noreply.github.com> Date: Mon, 6 Nov 2023 12:54:02 +0900 Subject: [PATCH 36/44] [Update] Config Window: Advanced Settings Tab: add Open Config File. add item open file(config.json) button. --- controller.py | 4 +++ locales/en.yml | 5 +++- locales/ja.yml | 5 +++- view.py | 5 ++++ .../_SettingBoxGenerator.py | 27 +++++++++++++++++++ .../createSettingBox_AdvancedSettings.py | 16 ++++++++++- 6 files changed, 59 insertions(+), 3 deletions(-) diff --git a/controller.py b/controller.py index a26e7c8e..421330a8 100644 --- a/controller.py +++ b/controller.py @@ -16,6 +16,9 @@ def callbackRestartSoftware(): def callbackFilepathLogs(): print("callbackFilepathLogs") +def callbackFilepathConfigFile(): + print("callbackFilepathConfigFile") + # func transcription send message def sendMicMessage(message): if len(message) > 0: @@ -704,6 +707,7 @@ def createMainWindow(): "callback_update_software": callbackUpdateSoftware, "callback_restart_software": callbackRestartSoftware, "callback_filepath_logs": callbackFilepathLogs, + "callback_filepath_config_file": callbackFilepathConfigFile, }, window_action_registers={ diff --git a/locales/en.yml b/locales/en.yml index 9bce45f3..887d3a92 100644 --- a/locales/en.yml +++ b/locales/en.yml @@ -193,4 +193,7 @@ config_window: label: OSC IP Address osc_port: - label: OSC Port \ No newline at end of file + label: OSC Port + + open_config_filepath: + label: Open Config File \ No newline at end of file diff --git a/locales/ja.yml b/locales/ja.yml index c0e9cc11..313c991f 100644 --- a/locales/ja.yml +++ b/locales/ja.yml @@ -192,4 +192,7 @@ config_window: label: OSC IP Address osc_port: - label: OSC Port \ No newline at end of file + label: OSC Port + + open_config_filepath: + label: 設定ファイルを開ã \ No newline at end of file diff --git a/view.py b/view.py index 3979439c..f7250b9f 100644 --- a/view.py +++ b/view.py @@ -83,6 +83,7 @@ class View(): CALLBACK_RESTART_SOFTWARE=None, CALLBACK_UPDATE_SOFTWARE=None, CALLBACK_OPEN_FILEPATH_LOGS=None, + CALLBACK_OPEN_FILEPATH_CONFIG_FILE=None, CALLBACK_QUIT_VRCT=vrct_gui._quitVRCT, @@ -385,6 +386,9 @@ class View(): VAR_DESC_OSC_PORT=None, CALLBACK_SET_OSC_PORT=None, VAR_OSC_PORT=StringVar(value=config.OSC_PORT), + + VAR_LABEL_OPEN_CONFIG_FILEPATH=StringVar(value=i18n.t("config_window.open_config_filepath.label")), + VAR_DESC_OPEN_CONFIG_FILEPATH=None, ) @@ -402,6 +406,7 @@ class View(): self.view_variable.CALLBACK_UPDATE_SOFTWARE=common_registers.get("callback_update_software", None) self.view_variable.CALLBACK_RESTART_SOFTWARE=common_registers.get("callback_restart_software", None) self.view_variable.CALLBACK_OPEN_FILEPATH_LOGS=common_registers.get("callback_filepath_logs", None) + self.view_variable.CALLBACK_OPEN_FILEPATH_CONFIG_FILE=common_registers.get("callback_filepath_config_file", None) if window_action_registers is not None: 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 28e99364..c08f95bc 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 @@ -740,6 +740,33 @@ class _SettingBoxGenerator(): + def createSettingBoxButtonWithImage( + self, + for_var_label_text, for_var_desc_text, + button_attr_name, + button_image, + button_command, + ): + + (setting_box_frame, setting_box_item_frame) = self._createSettingBoxFrame(button_attr_name, for_var_label_text, for_var_desc_text) + + + button_with_image_widget = createButtonWithImage( + parent_widget=setting_box_item_frame, + button_fg_color=self.settings.ctm.SB__ARROW_SWITCH_BUTTON_COLOR, + button_enter_color=self.settings.ctm.SB__ARROW_SWITCH_BUTTON_HOVERED_COLOR, + button_clicked_color=self.settings.ctm.SB__ARROW_SWITCH_BUTTON_CLICKED_COLOR, + button_image_file=button_image, + button_image_size=self.settings.uism.SB__ARROW_SWITCH_BUTTON_ICON_SIZE, + button_ipadxy=self.settings.uism.SB__ARROW_SWITCH_BUTTON_IPADXY, + button_command=button_command, + ) + button_with_image_widget.grid(row=1, column=SETTING_BOX_COLUMN, padx=self.settings.uism.SB__ARROW_SWITCH_LEFT_PADX, sticky="e") + + return setting_box_frame + + + def createSettingBoxArrowSwitch( self, 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 4c6ef337..bb305ecf 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 @@ -5,6 +5,7 @@ from .._SettingBoxGenerator import _SettingBoxGenerator def createSettingBox_AdvancedSettings(setting_box_wrapper, config_window, settings, view_variable): sbg = _SettingBoxGenerator(setting_box_wrapper, config_window, settings, view_variable) createSettingBoxEntry = sbg.createSettingBoxEntry + createSettingBoxButtonWithImage = sbg.createSettingBoxButtonWithImage def entry_ip_address_callback(value): @@ -13,6 +14,9 @@ def createSettingBox_AdvancedSettings(setting_box_wrapper, config_window, settin def entry_port_callback(value): callFunctionIfCallable(view_variable.CALLBACK_SET_OSC_PORT, value) + def open_config_filepath_callback(): + callFunctionIfCallable(view_variable.CALLBACK_OPEN_FILEPATH_CONFIG_FILE) + row=0 config_window.sb__ip_address = createSettingBoxEntry( for_var_label_text=view_variable.VAR_LABEL_OSC_IP_ADDRESS, @@ -34,5 +38,15 @@ def createSettingBox_AdvancedSettings(setting_box_wrapper, config_window, settin entry_bind__Any_KeyRelease=lambda value: entry_port_callback(value), entry_textvariable=view_variable.VAR_OSC_PORT, ) - config_window.sb__port.grid(row=row, pady=0) + config_window.sb__port.grid(row=row) row+=1 + + config_window.sb__open_config_filepath = createSettingBoxButtonWithImage( + for_var_label_text=view_variable.VAR_LABEL_OPEN_CONFIG_FILEPATH, + for_var_desc_text=view_variable.VAR_DESC_OPEN_CONFIG_FILEPATH, + button_attr_name="sb__button_open_config_filepath", + button_command=lambda _e: open_config_filepath_callback(), + button_image=settings.image_file.FOLDER_OPEN_ICON, + ) + config_window.sb__open_config_filepath.grid(row=row, pady=0) + row+=1 \ No newline at end of file From c8415d83704ca021ff8c6006ba56a1b2ea8a72bf Mon Sep 17 00:00:00 2001 From: Sakamoto Shiina <68018796+ShiinaSakamoto@users.noreply.github.com> Date: Mon, 6 Nov 2023 13:10:55 +0900 Subject: [PATCH 37/44] =?UTF-8?q?[Refactor]=20Config=20Window:=20=5FSettin?= =?UTF-8?q?gBoxGenerator=20=E3=83=9C=E3=82=BF=E3=83=B3=E7=B3=BB=E3=82=B5?= =?UTF-8?q?=E3=82=A4=E3=82=BA=E3=81=A8=E8=89=B2=E6=8C=87=E5=AE=9A=E3=81=AE?= =?UTF-8?q?=E6=B1=8E=E7=94=A8=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../_SettingBoxGenerator.py | 42 +++++++++---------- vrct_gui/ui_managers/Themes/_darkTheme.py | 9 ++-- vrct_gui/ui_managers/UiScalingManager.py | 10 +++-- 3 files changed, 31 insertions(+), 30 deletions(-) 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 c08f95bc..cb04cf8d 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 @@ -277,12 +277,12 @@ class _SettingBoxGenerator(): button_widget = createButtonWithImage( parent_widget=all_wrapper, - button_fg_color=self.settings.ctm.SB__ARROW_SWITCH_BUTTON_COLOR, - button_enter_color=self.settings.ctm.SB__ARROW_SWITCH_BUTTON_HOVERED_COLOR, - button_clicked_color=self.settings.ctm.SB__ARROW_SWITCH_BUTTON_CLICKED_COLOR, + button_fg_color=self.settings.ctm.SB__BUTTON_COLOR, + button_enter_color=self.settings.ctm.SB__BUTTON_HOVERED_COLOR, + button_clicked_color=self.settings.ctm.SB__BUTTON_CLICKED_COLOR, button_image_file=self.settings.image_file.FOLDER_OPEN_ICON, - button_image_size=self.settings.uism.SB__ARROW_SWITCH_BUTTON_ICON_SIZE, - button_ipadxy=self.settings.uism.SB__ARROW_SWITCH_BUTTON_IPADXY, + button_image_size=self.settings.uism.SB__BUTTON_ICON_SIZE, + button_ipadxy=self.settings.uism.SB__BUTTON_IPADXY, button_command=button_command, ) button_widget.grid(row=0, column=0, padx=0, sticky="w") @@ -753,15 +753,15 @@ class _SettingBoxGenerator(): button_with_image_widget = createButtonWithImage( parent_widget=setting_box_item_frame, - button_fg_color=self.settings.ctm.SB__ARROW_SWITCH_BUTTON_COLOR, - button_enter_color=self.settings.ctm.SB__ARROW_SWITCH_BUTTON_HOVERED_COLOR, - button_clicked_color=self.settings.ctm.SB__ARROW_SWITCH_BUTTON_CLICKED_COLOR, + button_fg_color=self.settings.ctm.SB__BUTTON_COLOR, + button_enter_color=self.settings.ctm.SB__BUTTON_HOVERED_COLOR, + button_clicked_color=self.settings.ctm.SB__BUTTON_CLICKED_COLOR, button_image_file=button_image, - button_image_size=self.settings.uism.SB__ARROW_SWITCH_BUTTON_ICON_SIZE, - button_ipadxy=self.settings.uism.SB__ARROW_SWITCH_BUTTON_IPADXY, + button_image_size=self.settings.uism.SB__OPEN_CONFIG_FILE_BUTTON_ICON_SIZE, + button_ipadxy=self.settings.uism.SB__OPEN_CONFIG_FILE_BUTTON_IPADXY, button_command=button_command, ) - button_with_image_widget.grid(row=1, column=SETTING_BOX_COLUMN, padx=self.settings.uism.SB__ARROW_SWITCH_LEFT_PADX, sticky="e") + button_with_image_widget.grid(row=1, column=SETTING_BOX_COLUMN, sticky="e") return setting_box_frame @@ -798,12 +798,12 @@ class _SettingBoxGenerator(): for_opening_button_wrapper = createButtonWithImage( parent_widget=setting_box_item_frame, - button_fg_color=self.settings.ctm.SB__ARROW_SWITCH_BUTTON_COLOR, - button_enter_color=self.settings.ctm.SB__ARROW_SWITCH_BUTTON_HOVERED_COLOR, - button_clicked_color=self.settings.ctm.SB__ARROW_SWITCH_BUTTON_CLICKED_COLOR, + button_fg_color=self.settings.ctm.SB__BUTTON_COLOR, + button_enter_color=self.settings.ctm.SB__BUTTON_HOVERED_COLOR, + button_clicked_color=self.settings.ctm.SB__BUTTON_CLICKED_COLOR, button_image_file=self.settings.image_file.ARROW_LEFT.rotate(270), - button_image_size=self.settings.uism.SB__ARROW_SWITCH_BUTTON_ICON_SIZE, - button_ipadxy=self.settings.uism.SB__ARROW_SWITCH_BUTTON_IPADXY, + button_image_size=self.settings.uism.SB__BUTTON_ICON_SIZE, + button_ipadxy=self.settings.uism.SB__BUTTON_IPADXY, button_command=open_command, ) for_opening_button_wrapper.grid(row=1, column=ARROW_BUTTON_COLUMN, padx=self.settings.uism.SB__ARROW_SWITCH_LEFT_PADX, sticky="e") @@ -812,12 +812,12 @@ class _SettingBoxGenerator(): for_closing_button_wrapper = createButtonWithImage( parent_widget=setting_box_item_frame, - button_fg_color=self.settings.ctm.SB__ARROW_SWITCH_BUTTON_COLOR, - button_enter_color=self.settings.ctm.SB__ARROW_SWITCH_BUTTON_HOVERED_COLOR, - button_clicked_color=self.settings.ctm.SB__ARROW_SWITCH_BUTTON_CLICKED_COLOR, + button_fg_color=self.settings.ctm.SB__BUTTON_COLOR, + button_enter_color=self.settings.ctm.SB__BUTTON_HOVERED_COLOR, + button_clicked_color=self.settings.ctm.SB__BUTTON_CLICKED_COLOR, button_image_file=self.settings.image_file.ARROW_LEFT.rotate(90), - button_image_size=self.settings.uism.SB__ARROW_SWITCH_BUTTON_ICON_SIZE, - button_ipadxy=self.settings.uism.SB__ARROW_SWITCH_BUTTON_IPADXY, + button_image_size=self.settings.uism.SB__BUTTON_ICON_SIZE, + button_ipadxy=self.settings.uism.SB__BUTTON_IPADXY, button_command=close_command, ) for_closing_button_wrapper.grid(row=1, column=ARROW_BUTTON_COLUMN, padx=self.settings.uism.SB__ARROW_SWITCH_LEFT_PADX, sticky="e") diff --git a/vrct_gui/ui_managers/Themes/_darkTheme.py b/vrct_gui/ui_managers/Themes/_darkTheme.py index 5ee1af0c..e1b42ed2 100644 --- a/vrct_gui/ui_managers/Themes/_darkTheme.py +++ b/vrct_gui/ui_managers/Themes/_darkTheme.py @@ -160,6 +160,10 @@ def _darkTheme(base_color): LABELS_TEXT_DISABLED_COLOR = base_color.DARK_600_COLOR, + SB__BUTTON_COLOR = base_color.DARK_888_COLOR, + SB__BUTTON_HOVERED_COLOR = base_color.DARK_800_COLOR, + SB__BUTTON_CLICKED_COLOR = base_color.DARK_900_COLOR, + # Top bar TOP_BAR_BG_COLOR = base_color.DARK_850_COLOR, @@ -231,11 +235,6 @@ def _darkTheme(base_color): SB__PROGRESSBAR_X_SLIDER__ACTIVE_BUTTON_HOVERED_COLOR = base_color.PRIMARY_500_COLOR, SB__PROGRESSBAR_X_SLIDER__ACTIVE_BUTTON_CLICKED_COLOR = base_color.PRIMARY_800_COLOR, - - SB__ARROW_SWITCH_BUTTON_COLOR = base_color.DARK_888_COLOR, - SB__ARROW_SWITCH_BUTTON_HOVERED_COLOR = base_color.DARK_800_COLOR, - SB__ARROW_SWITCH_BUTTON_CLICKED_COLOR = base_color.DARK_900_COLOR, - SB__ADD_AND_DELETE_ABLE_LIST__ADD_BUTTON_COLOR = base_color.PRIMARY_600_COLOR, SB__ADD_AND_DELETE_ABLE_LIST__ADD_BUTTON_HOVERED_COLOR = base_color.PRIMARY_500_COLOR, SB__ADD_AND_DELETE_ABLE_LIST__ADD_BUTTON_CLICKED_COLOR = base_color.PRIMARY_700_COLOR, diff --git a/vrct_gui/ui_managers/UiScalingManager.py b/vrct_gui/ui_managers/UiScalingManager.py index 116fe9be..b3e7f937 100644 --- a/vrct_gui/ui_managers/UiScalingManager.py +++ b/vrct_gui/ui_managers/UiScalingManager.py @@ -282,10 +282,6 @@ class UiScalingManager(): self.config_window.SB__PROGRESSBAR_X_SLIDER__BUTTON_IPADXY = self._calculateUiSize(10) self.config_window.SB__PROGRESSBAR_X_SLIDER__BUTTON_ICON_SIZE = self._calculateUiSize(20) - - - self.config_window.SB__ARROW_SWITCH_BUTTON_IPADXY = self._calculateUiSize(16) - self.config_window.SB__ARROW_SWITCH_BUTTON_ICON_SIZE = self._calculateUiSize(24) self.config_window.SB__ARROW_SWITCH_DESC_FONT_SIZE = self._calculateUiSize(16) self.config_window.SB__ARROW_SWITCH_LEFT_PADX = (self._calculateUiSize(20), 0) @@ -324,6 +320,12 @@ class UiScalingManager(): self.config_window.SB__MESSAGE_FORMAT__ENTRIES_BOTTOM_PADY = (0, self._calculateUiSize(14)) + self.config_window.SB__BUTTON_IPADXY = self._calculateUiSize(16) + self.config_window.SB__BUTTON_ICON_SIZE = self._calculateUiSize(24) + + self.config_window.SB__OPEN_CONFIG_FILE_BUTTON_IPADXY = self._calculateUiSize(10) + self.config_window.SB__OPEN_CONFIG_FILE_BUTTON_ICON_SIZE = self._calculateUiSize(20) + def _calculateUiSize(self, default_size, is_allowed_odd:bool=False, is_zero_allowed:bool=False): size = calculateUiSize(default_size, self.SCALING_FLOAT, is_allowed_odd, is_zero_allowed) From f8db9c927bfd4e7c8f9453d8a9dc7f9d4771111d Mon Sep 17 00:00:00 2001 From: Sakamoto Shiina <68018796+ShiinaSakamoto@users.noreply.github.com> Date: Mon, 6 Nov 2023 14:03:21 +0900 Subject: [PATCH 38/44] =?UTF-8?q?[bugfix]=20Config=20Window:=20Current=20A?= =?UTF-8?q?ctive=20Config=20Title=E3=81=AB=E7=B8=A61px=E3=81=AE=E7=B7=9A?= =?UTF-8?q?=E3=81=8C=E5=85=A5=E3=81=A3=E3=81=A6=E3=81=84=E3=81=9F=E3=83=90?= =?UTF-8?q?=E3=82=B0=E3=82=92=E4=BF=AE=E6=AD=A3=E3=80=82=20(1px=E3=83=90?= =?UTF-8?q?=E3=82=B0=E4=BF=AE=E6=AD=A3=E3=81=8C=E3=83=90=E3=82=B0=E3=82=92?= =?UTF-8?q?=E7=94=9F=E3=82=93=E3=81=A7=E3=81=84=E3=81=BE=E3=81=97=E3=81=9F?= =?UTF-8?q?=E3=80=82=E6=B6=88=E3=81=97=E3=81=9F=E5=88=86=E3=80=81=E4=BB=A3?= =?UTF-8?q?=E3=82=8F=E3=82=8A=E3=81=AB=E7=AB=AF=E3=81=A3=E3=81=931px?= =?UTF-8?q?=E3=83=90=E3=82=B0=E7=99=BA=E7=94=9F=E3=81=97=E3=81=9D=E3=81=86?= =?UTF-8?q?=E3=81=AA=E6=B0=97=E3=81=AF=E3=81=99=E3=82=8B=E3=81=91=E3=81=A9?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../createSettingBoxTopBar/_createSettingBoxTitle.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/vrct_gui/config_window/widgets/createSettingBoxTopBar/_createSettingBoxTitle.py b/vrct_gui/config_window/widgets/createSettingBoxTopBar/_createSettingBoxTitle.py index 7c0ec386..199a12fb 100644 --- a/vrct_gui/config_window/widgets/createSettingBoxTopBar/_createSettingBoxTitle.py +++ b/vrct_gui/config_window/widgets/createSettingBoxTopBar/_createSettingBoxTitle.py @@ -16,9 +16,4 @@ def _createSettingBoxTitle(parent_widget, config_window, settings, view_variable font=CTkFont(family=settings.FONT_FAMILY, size=settings.uism.TOP_BAR_MAIN__TITLE_FONT_SIZE, weight="bold"), text_color=settings.ctm.LABELS_TEXT_COLOR ) - config_window.main_current_active_config_title.grid(row=0, column=0, padx=0, pady=settings.uism.TOP_BAR__IPADY) - - - # for fixing 1px bug - sls__box_optionmenu_wrapper_fix_1px_bug = CTkFrame(config_window.main_current_active_config_title, corner_radius=0, width=0, height=0) - sls__box_optionmenu_wrapper_fix_1px_bug.grid(row=0, column=column_num, sticky="ns") \ No newline at end of file + config_window.main_current_active_config_title.grid(row=0, column=0, padx=0, pady=settings.uism.TOP_BAR__IPADY) \ No newline at end of file From 9905a4f2d0b703dd76ee810cd25bfb690e568197 Mon Sep 17 00:00:00 2001 From: Sakamoto Shiina <68018796+ShiinaSakamoto@users.noreply.github.com> Date: Wed, 8 Nov 2023 15:52:43 +0900 Subject: [PATCH 39/44] [Update] Add Light Theme --- img/arrow_left_black.png | Bin 0 -> 1063 bytes img/configuration_icon_black.png | Bin 0 -> 2514 bytes img/folder_open_icon_black.png | Bin 0 -> 714 bytes ...en_icon.png => folder_open_icon_white.png} | Bin img/foreground_icon_black.png | Bin 0 -> 233 bytes img/headphones_icon_black.png | Bin 0 -> 1392 bytes img/help_icon_black.png | Bin 0 -> 1764 bytes img/mic_icon_black.png | Bin 0 -> 1207 bytes img/narrow_arrow_down_black.png | Bin 0 -> 5433 bytes ...w_down.png => narrow_arrow_down_white.png} | Bin img/redo_icon_black.png | Bin 0 -> 1486 bytes img/{redo_white.png => redo_icon_white.png} | Bin img/swap_icon_black.png | Bin 0 -> 13079 bytes img/{swap_icon.png => swap_icon_white.png} | Bin img/translation_icon_black.png | Bin 0 -> 1514 bytes view.py | 16 +- vrct_gui/_CreateWindowCover.py | 4 +- .../_SettingBoxGenerator.py | 2 +- .../main_window/createMainWindowWidgets.py | 12 +- vrct_gui/ui_managers/ColorThemeManager.py | 52 ++-- vrct_gui/ui_managers/Themes/_darkTheme.py | 10 +- vrct_gui/ui_managers/Themes/_lightTheme.py | 287 +++++++++++++++++- 22 files changed, 321 insertions(+), 62 deletions(-) create mode 100644 img/arrow_left_black.png create mode 100644 img/configuration_icon_black.png create mode 100644 img/folder_open_icon_black.png rename img/{folder_open_icon.png => folder_open_icon_white.png} (100%) create mode 100644 img/foreground_icon_black.png create mode 100644 img/headphones_icon_black.png create mode 100644 img/help_icon_black.png create mode 100644 img/mic_icon_black.png create mode 100644 img/narrow_arrow_down_black.png rename img/{narrow_arrow_down.png => narrow_arrow_down_white.png} (100%) create mode 100644 img/redo_icon_black.png rename img/{redo_white.png => redo_icon_white.png} (100%) create mode 100644 img/swap_icon_black.png rename img/{swap_icon.png => swap_icon_white.png} (100%) create mode 100644 img/translation_icon_black.png diff --git a/img/arrow_left_black.png b/img/arrow_left_black.png new file mode 100644 index 0000000000000000000000000000000000000000..5e3f8dfbe5c3a77e2187300043168fb96c2345cb GIT binary patch literal 1063 zcmV+?1laqDP)}I`Cbnq9&%6=Mf@jb(ld*Ytdn&@Oo9d@ zA|8TB_jI~N58^>V@Zdo_=i3)XhUuz$3a0${K{Uh6uR4x7+G)*SOZs^=W%vgW@k;=>T`3ip zN~K1p^;RN@Tc!xV_iuOr0A}93xw&~NeD=9rN!FRl4){UzAR?XwfZP5Bq*PpToJOZD zJ5Ced0Y8ZL{TDod-HENOQ^zCOPE1t552A-|2LDfq?d|Oog%a?C=l~*q4gj|b!mlZ% zUY4vok>7wHL?oh@T*$u#$vBMlB}Kk4){TII05{IF{Uns&t1R|q9cfSLISUp zx?+r}_q(mLNpj?Ng!~|S3=uyB03(23*ILi@yRGv{^W-An2hkIV_4bpT=>id{2+QN0sN|kznCUxW&(Z?9Ye(TBx@?AR_w94ls0cB0)7xZ zgNW}4;g{_5dN&=IQ4FOJ~#M80$wwGiHKeo!jCNcMxO9u0k0XpLPW0# z;bX^f=DO|qt9iqV1pvTFu;w-Z&?MjignwjbM#Hbm6_=TLRuFz45!I`;nU9C@;Lkz` zSc%i+io3FfR*^R zTyd{6b3+h*H!<&btF=!?!@=)`5U>*8l`HNq%)DO^eit)8Y$bjxgn*U!zFcvCX66He z@H?6Lpj)kdIvNhH7ec^F#N~?nla<)1zP^K*54qLaXQScZ*Q^9GDeC=Z=%M_zdfC3* ztrkWA0KgBTrxEdOp~Q+YdbZbTtrSMUN*qg2TCUo!NJ@oHsv^|Vsz h{!+;~JkE8SzX18e+%!fQ^dtZP002ovPDHLkV1hNP?|}dS literal 0 HcmV?d00001 diff --git a/img/configuration_icon_black.png b/img/configuration_icon_black.png new file mode 100644 index 0000000000000000000000000000000000000000..c97dfefec4e51a972e163064be4f5c75ab5e906b GIT binary patch literal 2514 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 literal 0 HcmV?d00001 diff --git a/img/folder_open_icon.png b/img/folder_open_icon_white.png similarity index 100% rename from img/folder_open_icon.png rename to img/folder_open_icon_white.png diff --git a/img/foreground_icon_black.png b/img/foreground_icon_black.png new file mode 100644 index 0000000000000000000000000000000000000000..ff3594c250806ac8427b918dae82b158449cc750 GIT binary patch literal 233 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC&H|6fVg?4jBOuH;Rhv&5C^*~G z#W5t~-rF0FTrCCytQSu{2o!ntZ@J(Xy#KZ_|keOwgr+6X$(<6 zzC5)n*u3yN>laC@de#@wopBJQ8TG#%wuNfevhp}c-@EtN6e`NLpim?4+FKT6xC Ua_R?fpfedfUHx3vIVCg!0EP2c`2YX_ literal 0 HcmV?d00001 diff --git a/img/headphones_icon_black.png b/img/headphones_icon_black.png new file mode 100644 index 0000000000000000000000000000000000000000..2cb97ec2fc8827f1b49f740839e742d361da29ef GIT binary patch literal 1392 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 Pl*LfjM5p|=Q}llWi%qS6 literal 0 HcmV?d00001 diff --git a/img/narrow_arrow_down.png b/img/narrow_arrow_down_white.png similarity index 100% rename from img/narrow_arrow_down.png rename to img/narrow_arrow_down_white.png diff --git a/img/redo_icon_black.png b/img/redo_icon_black.png new file mode 100644 index 0000000000000000000000000000000000000000..989581a3a350e7557aeed8d6a43ec48ec7103611 GIT binary patch literal 1486 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 QZ2$lO07*qoM6N<$f Date: Wed, 8 Nov 2023 16:14:39 +0900 Subject: [PATCH 40/44] =?UTF-8?q?[Refactor]=20=E4=BD=BF=E3=81=A3=E3=81=A6?= =?UTF-8?q?=E3=81=AA=E3=81=84image=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB?= =?UTF-8?q?=E3=81=AE=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- img/app.ico | Bin 67646 -> 0 bytes img/config-icon-white.png | Bin 5490 -> 0 bytes img/help_icon_disabled.png | Bin 1715 -> 0 bytes img/info-icon-white.png | Bin 4945 -> 0 bytes img/save-icon.png | Bin 4461 -> 0 bytes img/xsoverlay.png | Bin 1209 -> 0 bytes 6 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 img/app.ico delete mode 100644 img/config-icon-white.png delete mode 100644 img/help_icon_disabled.png delete mode 100644 img/info-icon-white.png delete mode 100644 img/save-icon.png delete mode 100644 img/xsoverlay.png diff --git a/img/app.ico b/img/app.ico deleted file mode 100644 index eca32ce73e86bb5d9cf41456997c2c74c77c7c1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67646 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 diff --git a/img/help_icon_disabled.png b/img/help_icon_disabled.png deleted file mode 100644 index 03e1c086e9c7d467dc98d0a09e2f10550370da4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1715 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 diff --git a/img/save-icon.png b/img/save-icon.png deleted file mode 100644 index b74423f80f3bfe8ede41ff8bccac12b76bfa4cc8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4461 zcmeHKeNYo;8V?8}C@t2uqK&c*v=(u*n@tGGnuw4DlEcslsY30XY<4$fg?yMSByeJ> z;wN)0g(*@$4=UHWqTC^PO05GT*4myPSG9_s)LJ}5MYQ!Q7Dn&g1Q6#sbHmK_KQgn~ z-S_=Hzvp>=@AJH~?-oO9a%jlx5FU>gs?(~|z#ZeRDU-qf-1yB6;MQJf%wW?9H{@{I z%}g#0u>}qqqCJe6$MamW8df}W9GW)R^ZY{pW8dZRFJVmF#e3TpZ@sjt(visjFziCh zo>t0>9<;)w;AH^-D{32R#c_B|Z3bMPk`=O|IXj9C*~2`c>A(S2I5g z|KLhVpU^0M`~!Mm(;sH^hHaX4zUcRg0BpUq<$5~&@aGNt2N!;+NDVIVAQe5k8gu(M zr>UpR2|%XZv0-poUr?@!$>iHa7!yDsP0 zvG-1Vvc9yj{+ar9(172yo7eW<5WMmTiEi3_@9N=*{yWM$U4DsmpBu$tLB`Vr=$GK6-6|v~yNMQh ztPW6kJf0%n;~>Z!nuSbsHe*u?`j4~-Acj&3mdEN*y+cJ?7;T}GPA^O~l7%^>oD#$@ z3Q>4)Kwza=0`gdMZ7$rS6nJ@Y@XQS(0>}$tbCiM%y#Z3$oirp7N`xq^@i6(AU{MI9 za8hPGO`SAM0p64X3(Goi1aZ6FLbq6GcV;6Zxm=E*7=mFiK)|j78%ua#n=6u|@NuYV z7wKdiEMvDp94BG2=dntG0L()p@mU>u{V2W7HLL>A1Mv_JL?lEJs}&h*;bJxUfMhtJ zU$k%;L7O6Jw9B67Bxy}PZDS+HQc&cmy(7<=>rICu5jvN)0;mgk6+PuLS*JIQT5u9% zGggP!3W)s_l4Z^qa-S& z<472dm1D3(Y{pIMM@0cDni5IlP%#PbU~H7#?Rqk0WUO>LOK^IMq_S8ECKAges6-Si^11RdE~A|;P>UR^2o;JYUUP0? zaF7m=mf$KC5O~KyHn_@36Rh27wA*u)0*(UWEJvsHprI&&CDa5<15y+d<7g}{MvWpd zE|%h$BnFk^=oq}6V$22q3(d6;r0^}emT>|91>PZFPo>kVeQ&5aewOoFIKE zxQKk(x8i`yH$_?qTQ&{$kKuwH8E1Z>803_kkfEd;Ceb)4EFozMCJ0Ifqaw;oV;G8> zNS{cf>@K^RbrViHAsgrjv;qa{)e3rTc&Vbjs*U2^7MfcJAQ>n)c#LEMWH?!b+c8G6 zRUrSRhr$aOv&8^A-x%1sz)pyaZiT~o0pGvoZ+IPkO&1U};bdI;PRKPO*SHiI7kHw& zCgd8I0^&}1(C)AH_>)BiYabz{kbiu>wr@i!|p#irKuqJ`$1U5WM^@5nUq z59b_exqo?Ct>$1(uwXOvqi4>!%E8u6CO<_@km6absBK$wpT7=!ujCAjhXqbohb06| zSC=&>+(zV|Su8*E8~^;ptsmzV3B_sG(|RY#lh4E)-FqVcr+?UsCmG6D{w6D8XxqV> bHOyMSH;&2v-Rk;aCa0=Sld7&y%v$#!LqK2^ diff --git a/img/xsoverlay.png b/img/xsoverlay.png deleted file mode 100644 index 35c793eaed87c7b132f6b5400b732341c3e74660..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1209 zcmV;q1V;ObP)EX>4Tx04UFukvmAkP!xv$rWPMm9PFUt5TQERMMWG-6pLV?v=v%)FuCaqnlvOS zE{=k0!NJF3)xpJCR|i)?5PX2Rx;QDiNQvhrg%+WL7Y_I1zxV$+_gp}zmzidDMFCB> z&16gxGuc(K`xOBUQ;nflW|k38EvC_Neci*y_qzzs!v9vknzI<-6N#hDFm2)u;@M5x z;Ji;9VntacJ|~_usX^jLt}7nDaW1$l@XU~zPRr|tNVF__0AVNVEC6r+!Lc30ig(RIz9sDD%KS3^qTqQ7a zET94nvg-%`gWt2Y^3zjZQcwZ{FOKsu4s`DVjhf?pA3ILt1n@rtS9;4|sRMJLq}N(n z_y`!-1}?5!nz9F6?f^qihHT2NMD1tTjqx>_{=000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}0007zNklKpZw0w%6M~B1PFzS{!IeUb z+V%4@9U}oh&A@9A_IkbZXf*oE zXf%?!H7SZ>jK||Ayq2Zq9vzd-W>@@Wt!%?er9#_8FHRR= z$IMom%_jM><^!qSZcmu4bUK|eV&al7*X#9jW?#JxGnov_PznZ#^mKA(#|pO4dg z96Op!Ci?lyO90lFVo8$3YPHHW8Vzo-Sja4_3%*pV)kd_oSfT|B>!KKWbPQdKg;i~o zz&3Sw7cA?Lz}^#}g7OMHbGclTSS)r&jcy>P( Date: Wed, 8 Nov 2023 17:35:50 +0900 Subject: [PATCH 41/44] =?UTF-8?q?=F0=9F=93=9D[Refactor]=20ruff=E3=82=92?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E3=81=97=E3=82=B3=E3=83=BC=E3=83=89=E6=A4=9C?= =?UTF-8?q?=E8=A8=BC=E4=BF=AE=E6=AD=A3=E3=82=92=E8=A1=8C=E3=81=A3=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.py | 72 +++++++++---------- controller.py | 54 ++++++++------ main.py | 2 +- model.py | 26 +++---- models/osc/osc_tools.py | 3 +- .../transcription_transcriber.py | 2 +- models/translation/translation_translator.py | 6 +- models/xsoverlay/notification.py | 2 +- utils.py | 3 +- vrct_gui/_CreateConfirmationModal.py | 3 +- vrct_gui/_CreateDropdownMenuWindow.py | 3 +- vrct_gui/_CreateErrorWindow.py | 3 +- vrct_gui/_CreateSelectableLanguagesWindow.py | 3 +- .../_SettingBoxGenerator.py | 5 +- .../_create_sidebar/createSidebarFeatures.py | 2 +- vrct_gui/ui_utils/ui_utils.py | 6 +- vrct_gui/vrct_gui.py | 2 +- 17 files changed, 107 insertions(+), 90 deletions(-) diff --git a/config.py b/config.py index 7dc8f759..ccf9ad6d 100644 --- a/config.py +++ b/config.py @@ -70,7 +70,7 @@ class Config: @ENABLE_TRANSLATION.setter def ENABLE_TRANSLATION(self, value): - if type(value) is bool: + if isinstance(value, bool): self._ENABLE_TRANSLATION = value @property @@ -79,7 +79,7 @@ class Config: @ENABLE_TRANSCRIPTION_SEND.setter def ENABLE_TRANSCRIPTION_SEND(self, value): - if type(value) is bool: + if isinstance(value, bool): self._ENABLE_TRANSCRIPTION_SEND = value @property @@ -88,7 +88,7 @@ class Config: @ENABLE_TRANSCRIPTION_RECEIVE.setter def ENABLE_TRANSCRIPTION_RECEIVE(self, value): - if type(value) is bool: + if isinstance(value, bool): self._ENABLE_TRANSCRIPTION_RECEIVE = value @property @@ -97,7 +97,7 @@ class Config: @ENABLE_FOREGROUND.setter def ENABLE_FOREGROUND(self, value): - if type(value) is bool: + if isinstance(value, bool): self._ENABLE_FOREGROUND = value @property @@ -106,7 +106,7 @@ class Config: @SOURCE_COUNTRY.setter def SOURCE_COUNTRY(self, value): - if type(value) is str: + if isinstance(value, str): self._SOURCE_COUNTRY = value @property @@ -115,7 +115,7 @@ class Config: @SOURCE_LANGUAGE.setter def SOURCE_LANGUAGE(self, value): - if type(value) is str: + if isinstance(value, str): self._SOURCE_LANGUAGE = value @property @@ -124,7 +124,7 @@ class Config: @TARGET_COUNTRY.setter def TARGET_COUNTRY(self, value): - if type(value) is str: + if isinstance(value, str): self._TARGET_COUNTRY = value @property @@ -133,7 +133,7 @@ class Config: @TARGET_LANGUAGE.setter def TARGET_LANGUAGE(self, value): - if type(value) is str: + if isinstance(value, str): self._TARGET_LANGUAGE = value @property @@ -154,7 +154,7 @@ class Config: @SELECTED_TAB_NO.setter def SELECTED_TAB_NO(self, value): - if type(value) is str: + if isinstance(value, str): self._SELECTED_TAB_NO = value saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @@ -165,7 +165,7 @@ class Config: @SELECTED_TAB_YOUR_LANGUAGES.setter def SELECTED_TAB_YOUR_LANGUAGES(self, value): - if type(value) is dict: + if isinstance(value, dict): self._SELECTED_TAB_YOUR_LANGUAGES = value saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @@ -176,7 +176,7 @@ class Config: @SELECTED_TAB_TARGET_LANGUAGES.setter def SELECTED_TAB_TARGET_LANGUAGES(self, value): - if type(value) is dict: + if isinstance(value, dict): self._SELECTED_TAB_TARGET_LANGUAGES = value saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @@ -187,7 +187,7 @@ class Config: @IS_MAIN_WINDOW_SIDEBAR_COMPACT_MODE.setter def IS_MAIN_WINDOW_SIDEBAR_COMPACT_MODE(self, value): - if type(value) is bool: + if isinstance(value, bool): self._IS_MAIN_WINDOW_SIDEBAR_COMPACT_MODE = value saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @@ -199,7 +199,7 @@ class Config: @TRANSPARENCY.setter def TRANSPARENCY(self, value): - if type(value) is int and 0 <= value <= 100: + if isinstance(value, int) and 0 <= value <= 100: self._TRANSPARENCY = value saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @@ -232,7 +232,7 @@ class Config: @TEXTBOX_UI_SCALING.setter def TEXTBOX_UI_SCALING(self, value): - if type(value) is int and 50 <= value <= 200: + if isinstance(value, int) and 50 <= value <= 200: self._TEXTBOX_UI_SCALING = value saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @@ -290,7 +290,7 @@ class Config: @INPUT_MIC_ENERGY_THRESHOLD.setter def INPUT_MIC_ENERGY_THRESHOLD(self, value): - if type(value) is int: + if isinstance(value, int): self._INPUT_MIC_ENERGY_THRESHOLD = value saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @@ -301,7 +301,7 @@ class Config: @INPUT_MIC_DYNAMIC_ENERGY_THRESHOLD.setter def INPUT_MIC_DYNAMIC_ENERGY_THRESHOLD(self, value): - if type(value) is bool: + if isinstance(value, bool): self._INPUT_MIC_DYNAMIC_ENERGY_THRESHOLD = value saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @@ -312,7 +312,7 @@ class Config: @INPUT_MIC_RECORD_TIMEOUT.setter def INPUT_MIC_RECORD_TIMEOUT(self, value): - if type(value) is int: + if isinstance(value, int): self._INPUT_MIC_RECORD_TIMEOUT = value saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @@ -323,7 +323,7 @@ class Config: @INPUT_MIC_PHRASE_TIMEOUT.setter def INPUT_MIC_PHRASE_TIMEOUT(self, value): - if type(value) is int: + if isinstance(value, int): self._INPUT_MIC_PHRASE_TIMEOUT = value saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @@ -334,7 +334,7 @@ class Config: @INPUT_MIC_MAX_PHRASES.setter def INPUT_MIC_MAX_PHRASES(self, value): - if type(value) is int: + if isinstance(value, int): self._INPUT_MIC_MAX_PHRASES = value saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @@ -345,7 +345,7 @@ class Config: @INPUT_MIC_WORD_FILTER.setter def INPUT_MIC_WORD_FILTER(self, value): - if type(value) is list: + if isinstance(value, list): self._INPUT_MIC_WORD_FILTER = sorted(set(value), key=value.index) saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @@ -356,7 +356,7 @@ class Config: @INPUT_SPEAKER_ENERGY_THRESHOLD.setter def INPUT_SPEAKER_ENERGY_THRESHOLD(self, value): - if type(value) is int: + if isinstance(value, int): self._INPUT_SPEAKER_ENERGY_THRESHOLD = value saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @@ -367,7 +367,7 @@ class Config: @INPUT_SPEAKER_DYNAMIC_ENERGY_THRESHOLD.setter def INPUT_SPEAKER_DYNAMIC_ENERGY_THRESHOLD(self, value): - if type(value) is bool: + if isinstance(value, bool): self._INPUT_SPEAKER_DYNAMIC_ENERGY_THRESHOLD = value saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @@ -378,7 +378,7 @@ class Config: @INPUT_SPEAKER_RECORD_TIMEOUT.setter def INPUT_SPEAKER_RECORD_TIMEOUT(self, value): - if type(value) is int: + if isinstance(value, int): self._INPUT_SPEAKER_RECORD_TIMEOUT = value saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @@ -389,7 +389,7 @@ class Config: @INPUT_SPEAKER_PHRASE_TIMEOUT.setter def INPUT_SPEAKER_PHRASE_TIMEOUT(self, value): - if type(value) is int: + if isinstance(value, int): self._INPUT_SPEAKER_PHRASE_TIMEOUT = value saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @@ -400,7 +400,7 @@ class Config: @INPUT_SPEAKER_MAX_PHRASES.setter def INPUT_SPEAKER_MAX_PHRASES(self, value): - if type(value) is int: + if isinstance(value, int): self._INPUT_SPEAKER_MAX_PHRASES = value saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @@ -411,7 +411,7 @@ class Config: @OSC_IP_ADDRESS.setter def OSC_IP_ADDRESS(self, value): - if type(value) is str: + if isinstance(value, str): self._OSC_IP_ADDRESS = value saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @@ -422,7 +422,7 @@ class Config: @OSC_PORT.setter def OSC_PORT(self, value): - if type(value) is int: + if isinstance(value, int): self._OSC_PORT = value saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @@ -433,9 +433,9 @@ class Config: @AUTH_KEYS.setter def AUTH_KEYS(self, value): - if type(value) is dict and set(value.keys()) == set(self.AUTH_KEYS.keys()): + if isinstance(value, dict) and set(value.keys()) == set(self.AUTH_KEYS.keys()): for key, value in value.items(): - if type(value) is str: + if isinstance(value, str): self._AUTH_KEYS[key] = value saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, self.AUTH_KEYS) @@ -446,7 +446,7 @@ class Config: @MESSAGE_FORMAT.setter def MESSAGE_FORMAT(self, value): - if type(value) is str: + if isinstance(value, str): if isUniqueStrings(["[message]", "[translation]"], value) is False: value = "[message]([translation])" self._MESSAGE_FORMAT = value @@ -459,7 +459,7 @@ class Config: @ENABLE_AUTO_CLEAR_MESSAGE_BOX.setter def ENABLE_AUTO_CLEAR_MESSAGE_BOX(self, value): - if type(value) is bool: + if isinstance(value, bool): self._ENABLE_AUTO_CLEAR_MESSAGE_BOX = value saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @@ -470,7 +470,7 @@ class Config: @ENABLE_NOTICE_XSOVERLAY.setter def ENABLE_NOTICE_XSOVERLAY(self, value): - if type(value) is bool: + if isinstance(value, bool): self._ENABLE_NOTICE_XSOVERLAY = value saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @@ -481,7 +481,7 @@ class Config: @ENABLE_SEND_MESSAGE_TO_VRC.setter def ENABLE_SEND_MESSAGE_TO_VRC(self, value): - if type(value) is bool: + if isinstance(value, bool): self._ENABLE_SEND_MESSAGE_TO_VRC = value saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @@ -493,7 +493,7 @@ class Config: # @STARTUP_OSC_ENABLED_CHECK.setter # def STARTUP_OSC_ENABLED_CHECK(self, value): - # if type(value) is bool: + # if isinstance(value, bool): # self._STARTUP_OSC_ENABLED_CHECK = value # saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @@ -504,7 +504,7 @@ class Config: @ENABLE_LOGGER.setter def ENABLE_LOGGER(self, value): - if type(value) is bool: + if isinstance(value, bool): self._ENABLE_LOGGER = value saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @@ -515,7 +515,7 @@ class Config: @IS_CONFIG_WINDOW_COMPACT_MODE.setter def IS_CONFIG_WINDOW_COMPACT_MODE(self, value): - if type(value) is bool: + if isinstance(value, bool): self._IS_CONFIG_WINDOW_COMPACT_MODE = value saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) diff --git a/controller.py b/controller.py index 421330a8..19743805 100644 --- a/controller.py +++ b/controller.py @@ -30,7 +30,7 @@ def sendMicMessage(message): pass else: translation = model.getInputTranslate(message) - if translation == False: + if translation is False: config.ENABLE_TRANSLATION = False translation = "" view.translationEngineLimitErrorProcess() @@ -94,7 +94,7 @@ def receiveSpeakerMessage(message): pass else: translation = model.getOutputTranslate(message) - if translation == False: + if translation is False: config.ENABLE_TRANSLATION = False translation = "" view.translationEngineLimitErrorProcess() @@ -160,7 +160,7 @@ def sendChatMessage(message): pass else: translation = model.getInputTranslate(message) - if translation == False: + if translation is False: config.ENABLE_TRANSLATION = False translation = "" view.translationEngineLimitErrorProcess() @@ -426,7 +426,8 @@ def callbackSetMicDevice(value): def callbackSetMicEnergyThreshold(value): print("callbackSetMicEnergyThreshold", value) - if value == "": return + if value == "": + return try: value = int(value) if 0 <= value and value <= config.MAX_MIC_ENERGY_THRESHOLD: @@ -435,7 +436,7 @@ def callbackSetMicEnergyThreshold(value): view.setGuiVariable_MicEnergyThreshold(config.INPUT_MIC_ENERGY_THRESHOLD) else: raise ValueError() - except: + except Exception: view.showErrorMessage_MicEnergyThreshold() def callbackSetMicDynamicEnergyThreshold(value): @@ -462,7 +463,8 @@ def callbackCheckMicThreshold(is_turned_on): def callbackSetMicRecordTimeout(value): print("callbackSetMicRecordTimeout", value) - if value == "": return + if value == "": + return try: value = int(value) if 0 <= value and value <= config.INPUT_MIC_PHRASE_TIMEOUT: @@ -471,12 +473,13 @@ def callbackSetMicRecordTimeout(value): view.setGuiVariable_MicRecordTimeout(config.INPUT_MIC_RECORD_TIMEOUT) else: raise ValueError() - except: + except Exception: view.showErrorMessage_MicRecordTimeout() def callbackSetMicPhraseTimeout(value): print("callbackSetMicPhraseTimeout", value) - if value == "": return + if value == "": + return try: value = int(value) if 0 <= value and value >= config.INPUT_MIC_RECORD_TIMEOUT: @@ -485,12 +488,13 @@ def callbackSetMicPhraseTimeout(value): view.setGuiVariable_MicPhraseTimeout(config.INPUT_MIC_PHRASE_TIMEOUT) else: raise ValueError() - except: + except Exception: view.showErrorMessage_MicPhraseTimeout() def callbackSetMicMaxPhrases(value): print("callbackSetMicMaxPhrases", value) - if value == "": return + if value == "": + return try: value = int(value) if 0 <= value: @@ -499,7 +503,7 @@ def callbackSetMicMaxPhrases(value): view.setGuiVariable_MicMaxPhrases(config.INPUT_MIC_MAX_PHRASES) else: raise ValueError() - except: + except Exception: view.showErrorMessage_MicMaxPhrases() def callbackSetMicWordFilter(values): @@ -532,13 +536,14 @@ def callbackDeleteMicWordFilter(value): new_input_mic_word_filter_list.remove(str(value)) config.INPUT_MIC_WORD_FILTER = new_input_mic_word_filter_list view.setLatestConfigVariable("MicMicWordFilter") - except: + except Exception: print("There was no the target word in config.INPUT_MIC_WORD_FILTER") def callbackSetSpeakerEnergyThreshold(value): print("callbackSetSpeakerEnergyThreshold", value) - if value == "": return + if value == "": + return try: value = int(value) if 0 <= value and value <= config.MAX_SPEAKER_ENERGY_THRESHOLD: @@ -547,7 +552,7 @@ def callbackSetSpeakerEnergyThreshold(value): view.setGuiVariable_SpeakerEnergyThreshold(config.INPUT_SPEAKER_ENERGY_THRESHOLD) else: raise ValueError() - except: + except Exception: view.showErrorMessage_SpeakerEnergyThreshold() def callbackSetSpeakerDynamicEnergyThreshold(value): @@ -580,7 +585,8 @@ def callbackCheckSpeakerThreshold(is_turned_on): def callbackSetSpeakerRecordTimeout(value): print("callbackSetSpeakerRecordTimeout", value) - if value == "": return + if value == "": + return try: value = int(value) if 0 <= value and value <= config.INPUT_SPEAKER_PHRASE_TIMEOUT: @@ -589,12 +595,13 @@ def callbackSetSpeakerRecordTimeout(value): view.setGuiVariable_SpeakerRecordTimeout(config.INPUT_SPEAKER_RECORD_TIMEOUT) else: raise ValueError() - except: + except Exception: view.showErrorMessage_SpeakerRecordTimeout() def callbackSetSpeakerPhraseTimeout(value): print("callbackSetSpeakerPhraseTimeout", value) - if value == "": return + if value == "": + return try: value = int(value) if 0 <= value and value >= config.INPUT_SPEAKER_RECORD_TIMEOUT: @@ -603,12 +610,13 @@ def callbackSetSpeakerPhraseTimeout(value): view.setGuiVariable_SpeakerPhraseTimeout(config.INPUT_SPEAKER_PHRASE_TIMEOUT) else: raise ValueError() - except: + except Exception: view.showErrorMessage_SpeakerPhraseTimeout() def callbackSetSpeakerMaxPhrases(value): print("callbackSetSpeakerMaxPhrases", value) - if value == "": return + if value == "": + return try: value = int(value) if 0 <= value: @@ -617,7 +625,7 @@ def callbackSetSpeakerMaxPhrases(value): view.setGuiVariable_SpeakerMaxPhrases(config.INPUT_SPEAKER_MAX_PHRASES) else: raise ValueError() - except: + except Exception: view.showErrorMessage_SpeakerMaxPhrases() @@ -662,12 +670,14 @@ def callbackSetEnableSendMessageToVrc(value): # Advanced Settings Tab def callbackSetOscIpAddress(value): - if value == "": return + if value == "": + return print("callbackSetOscIpAddress", str(value)) config.OSC_IP_ADDRESS = str(value) def callbackSetOscPort(value): - if value == "": return + if value == "": + return print("callbackSetOscPort", int(value)) config.OSC_PORT = int(value) diff --git a/main.py b/main.py index 5db42c69..def1cb0b 100644 --- a/main.py +++ b/main.py @@ -12,7 +12,7 @@ if __name__ == "__main__": splash.destroySplash() controller.showMainWindow() - except Exception as e: + except Exception: import traceback with open('error.log', 'a') as f: traceback.print_exc(file=f) \ No newline at end of file diff --git a/model.py b/model.py index 51a881dd..c4e2f30b 100644 --- a/model.py +++ b/model.py @@ -82,9 +82,9 @@ class Model: self.keyword_processor = KeywordProcessor() def authenticationTranslator(self, choice_translator=None, auth_key=None): - if choice_translator == None: + if choice_translator is None: choice_translator = config.CHOICE_TRANSLATOR - if auth_key == None: + if auth_key is None: auth_key = config.AUTH_KEYS[choice_translator] result = self.translator.authentication(choice_translator, auth_key) @@ -130,10 +130,10 @@ class Model: compatible_engines.append(engine) engine_name = compatible_engines[0] - if engine_name == "DeepL" and config.AUTH_KEYS["DeepL_API"] != None: + 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"] == None: + elif engine_name == "DeepL_API" and config.AUTH_KEYS["DeepL_API"] is None: engine_name = "DeepL" return engine_name @@ -288,7 +288,7 @@ class Model: rmtree(os_path.join(current_directory, tmp_directory_name)) command = [os_path.join(program_directory, "batch", batch_name), program_name, temporary_name, str(restart)] Popen(command) - except: + except Exception: webbrowser.open(config.BOOTH_URL, new=2, autoraise=True) @staticmethod @@ -319,7 +319,7 @@ class Model: if config.CHOICE_MIC_HOST == "NoHost" or config.CHOICE_MIC_DEVICE == "NoDevice": try: error_fnc() - except: + except Exception: pass return @@ -348,7 +348,7 @@ class Model: message = mic_transcriber.getTranscript() try: fnc(message) - except: + except Exception: pass self.mic_print_transcript = threadFnc(sendMicTranscript) @@ -367,7 +367,7 @@ class Model: if config.CHOICE_MIC_HOST == "NoHost" or config.CHOICE_MIC_DEVICE == "NoDevice": try: error_fnc() - except: + except Exception: pass return @@ -376,7 +376,7 @@ class Model: energy = mic_energy_queue.get() try: fnc(energy) - except: + except Exception: pass sleep(0.01) @@ -401,7 +401,7 @@ class Model: if speaker_device["name"] == "NoDevice": try: error_fnc() - except: + except Exception: pass return @@ -429,7 +429,7 @@ class Model: message = speaker_transcriber.getTranscript() try: fnc(message) - except: + except Exception: pass self.speaker_print_transcript = threadFnc(sendSpeakerTranscript) @@ -449,7 +449,7 @@ class Model: if speaker_device["name"] == "NoDevice": try: error_fnc() - except: + except Exception: pass return @@ -458,7 +458,7 @@ class Model: energy = speaker_energy_queue.get() try: fnc(energy) - except: + except Exception: pass sleep(0.01) diff --git a/models/osc/osc_tools.py b/models/osc/osc_tools.py index 7cb926c2..80f2b785 100644 --- a/models/osc/osc_tools.py +++ b/models/osc/osc_tools.py @@ -1,5 +1,4 @@ from time import sleep -from typing import List from pythonosc import osc_message_builder from pythonosc import udp_client from pythonosc import dispatcher @@ -15,7 +14,7 @@ def sendTyping(flag=False, ip_address="127.0.0.1", port=9000): # send OSC message def sendMessage(message=None, ip_address="127.0.0.1", port=9000): - if message != None: + if message is not None: msg = osc_message_builder.OscMessageBuilder(address="/chatbox/input") msg.add_arg(f"{message}") msg.add_arg(True) diff --git a/models/transcription/transcription_transcriber.py b/models/transcription/transcription_transcriber.py index b058f4ec..bf78566e 100644 --- a/models/transcription/transcription_transcriber.py +++ b/models/transcription/transcription_transcriber.py @@ -38,7 +38,7 @@ class AudioTranscriber: # os.close(fd) audio_data = self.audio_sources["process_data_func"]() text = self.audio_recognizer.recognize_google(audio_data, language=transcription_lang[language][country]) - except Exception as e: + except Exception: pass finally: pass diff --git a/models/translation/translation_translator.py b/models/translation/translation_translator.py index 18d2c394..c3a5682b 100644 --- a/models/translation/translation_translator.py +++ b/models/translation/translation_translator.py @@ -1,7 +1,7 @@ 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 translatorEngine, translation_lang +from .translation_languages import translation_lang # Translator class Translator(): @@ -16,7 +16,7 @@ class Translator(): try: self.deepl_client = deepl_Translator(authkey) self.deepl_client.translate_text(" ", target_lang="EN-US") - except: + except Exception: result = False return result @@ -52,7 +52,7 @@ class Translator(): from_language=source_language, to_language=target_language, ) - except Exception as e: + except Exception: import traceback with open('error.log', 'a') as f: traceback.print_exc(file=f) diff --git a/models/xsoverlay/notification.py b/models/xsoverlay/notification.py index 7c179f5a..cb2c03b5 100644 --- a/models/xsoverlay/notification.py +++ b/models/xsoverlay/notification.py @@ -33,7 +33,7 @@ def XSOverlay( with open(icon, "rb") as f: icon_data_bytes = f.read() icon_data = base64.b64encode(icon_data_bytes).decode("utf-8") - except: + except Exception: icon_data = "default" else: icon_data = icon diff --git a/utils.py b/utils.py index 9cb0dc94..a5e38fda 100644 --- a/utils.py +++ b/utils.py @@ -13,7 +13,8 @@ def get_key_by_value(dictionary, value): return None def callFunctionIfCallable(function, *args): - if callable(function) is True: function(*args) + if callable(function) is True: + function(*args) def isEven(number): return number % 2 == 0 diff --git a/vrct_gui/_CreateConfirmationModal.py b/vrct_gui/_CreateConfirmationModal.py index 1d7a5de4..935f0447 100644 --- a/vrct_gui/_CreateConfirmationModal.py +++ b/vrct_gui/_CreateConfirmationModal.py @@ -233,7 +233,8 @@ class _CreateConfirmationModal(CTkToplevel): self.grab_release() def focusOutFunction(self, e): - if str(e.widget) != ".!_createconfirmationmodal": return + if str(e.widget) != ".!_createconfirmationmodal": + return callFunctionIfCallable(self._view_variable.CALLBACK_HIDE_CONFIRMATION_MODAL) def _grab_set(self): diff --git a/vrct_gui/_CreateDropdownMenuWindow.py b/vrct_gui/_CreateDropdownMenuWindow.py index 948e00e1..b0f459dd 100644 --- a/vrct_gui/_CreateDropdownMenuWindow.py +++ b/vrct_gui/_CreateDropdownMenuWindow.py @@ -262,7 +262,8 @@ class _CreateDropdownMenuWindow(CTkToplevel): def show(self, dropdown_menu_widget_id): - if self.hide is False: return + if self.hide is False: + return self.wm_attributes("-alpha", 0) diff --git a/vrct_gui/_CreateErrorWindow.py b/vrct_gui/_CreateErrorWindow.py index 4b00047a..ef7ff5fb 100644 --- a/vrct_gui/_CreateErrorWindow.py +++ b/vrct_gui/_CreateErrorWindow.py @@ -80,7 +80,8 @@ class _CreateErrorWindow(CTkToplevel): def show(self, target_widget): - if self.hide is False: return + if self.hide is False: + return self.attach_widget = target_widget diff --git a/vrct_gui/_CreateSelectableLanguagesWindow.py b/vrct_gui/_CreateSelectableLanguagesWindow.py index daa369c0..8c666a20 100644 --- a/vrct_gui/_CreateSelectableLanguagesWindow.py +++ b/vrct_gui/_CreateSelectableLanguagesWindow.py @@ -178,5 +178,6 @@ class _CreateSelectableLanguagesWindow(CTkToplevel): def focusOutFunction(self, e): - if str(e.widget) != ".!_createselectablelanguageswindow": return + if str(e.widget) != ".!_createselectablelanguageswindow": + return self.vrct_gui._closeSelectableLanguagesWindow() \ 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 099c40ae..d8b31a39 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 @@ -2,7 +2,7 @@ from functools import partial from types import SimpleNamespace from typing import Union -from customtkinter import CTkOptionMenu, CTkFont, CTkFrame, CTkLabel, CTkRadioButton, CTkEntry, CTkSlider, CTkSwitch, CTkCheckBox, CTkProgressBar, CTkImage +from customtkinter import CTkFont, CTkFrame, CTkLabel, CTkEntry, CTkSlider, CTkSwitch, CTkCheckBox, CTkProgressBar, CTkImage from CTkToolTip import * from vrct_gui.ui_utils import createButtonWithImage, getLatestWidth, createOptionMenuBox, getLatestHeight, bindButtonFunctionAndColor @@ -1068,7 +1068,8 @@ class _SettingBoxGenerator(): items[i] = item_data is_replaced = True break - if is_replaced is False: items.append(item_data) + if is_replaced is False: + items.append(item_data) return mic_word_filter_item_wrapper diff --git a/vrct_gui/main_window/widgets/_create_sidebar/createSidebarFeatures.py b/vrct_gui/main_window/widgets/_create_sidebar/createSidebarFeatures.py index b46ab3cc..bce4113f 100644 --- a/vrct_gui/main_window/widgets/_create_sidebar/createSidebarFeatures.py +++ b/vrct_gui/main_window/widgets/_create_sidebar/createSidebarFeatures.py @@ -2,7 +2,7 @@ from functools import partial from customtkinter import CTkFont, CTkFrame, CTkLabel, CTkSwitch, CTkImage -from ....ui_utils import openImageKeepAspectRatio, retag, getLatestHeight, bindEnterAndLeaveFunction, bindButtonReleaseFunction, bindButtonPressAndReleaseFunction +from ....ui_utils import openImageKeepAspectRatio, retag, bindEnterAndLeaveFunction, bindButtonReleaseFunction, bindButtonPressAndReleaseFunction from utils import callFunctionIfCallable diff --git a/vrct_gui/ui_utils/ui_utils.py b/vrct_gui/ui_utils/ui_utils.py index 5138fb5c..bd6e5a9c 100644 --- a/vrct_gui/ui_utils/ui_utils.py +++ b/vrct_gui/ui_utils/ui_utils.py @@ -162,10 +162,12 @@ def createOptionMenuBox(parent_widget, optionmenu_bg_color, optionmenu_hovered_b option_menu_box = CTkFrame(parent_widget, corner_radius=6, fg_color=optionmenu_bg_color, cursor="hand2") option_menu_box.grid_rowconfigure(0, weight=1) - if optionmenu_min_height is not None: option_menu_box.grid_rowconfigure(0, minsize=optionmenu_min_height) + if optionmenu_min_height is not None: + option_menu_box.grid_rowconfigure(0, minsize=optionmenu_min_height) option_menu_box.grid_columnconfigure(0, weight=1) - if optionmenu_min_width is not None: option_menu_box.grid_columnconfigure(0, minsize=optionmenu_min_width) + if optionmenu_min_width is not None: + option_menu_box.grid_columnconfigure(0, minsize=optionmenu_min_width) optionmenu_label_wrapper = CTkFrame(option_menu_box, corner_radius=0, fg_color=optionmenu_bg_color) optionmenu_label_wrapper.grid(row=0, column=0, padx=(optionmenu_ipadx[0],0), pady=optionmenu_ipady, sticky="ew") diff --git a/vrct_gui/vrct_gui.py b/vrct_gui/vrct_gui.py index da9939dd..a0926150 100644 --- a/vrct_gui/vrct_gui.py +++ b/vrct_gui/vrct_gui.py @@ -269,7 +269,7 @@ class VRCT_GUI(CTk): def _clearErrorMessage(self): try: self.error_message_window._withdraw() - except: + except Exception: pass From 5e1a293e9ffbd18b3195fdcdcaf22966b3ed22d7 Mon Sep 17 00:00:00 2001 From: misyaguziya Date: Wed, 8 Nov 2023 17:40:14 +0900 Subject: [PATCH 42/44] =?UTF-8?q?=F0=9F=93=9D[Refactor]=20ruff=E3=82=92?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E3=81=97=E3=82=B3=E3=83=BC=E3=83=89=E6=A4=9C?= =?UTF-8?q?=E8=A8=BC=E4=BF=AE=E6=AD=A3=E3=82=92=E8=A1=8C=E3=81=A3=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.py | 2 -- model.py | 5 ++--- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/config.py b/config.py index 592a7d2a..fd603c87 100644 --- a/config.py +++ b/config.py @@ -1,8 +1,6 @@ import sys import inspect from os import path as os_path -from os import getenv as os_getenv -from os import makedirs as os_makedirs from json import load as json_load from json import dump as json_dump import tkinter as tk diff --git a/model.py b/model.py index 538b8bb1..25a7951f 100644 --- a/model.py +++ b/model.py @@ -1,10 +1,9 @@ -import sys from zipfile import ZipFile -from subprocess import Popen, PIPE +from subprocess import Popen from os import makedirs as os_makedirs from os import path as os_path from os import remove as os_remove -from shutil import rmtree, move +from shutil import move from datetime import datetime from logging import getLogger, FileHandler, Formatter, INFO from time import sleep From cbd717666abe125989f9bbe4de0e5f212a25f148 Mon Sep 17 00:00:00 2001 From: misyaguziya Date: Wed, 8 Nov 2023 22:00:31 +0900 Subject: [PATCH 43/44] =?UTF-8?q?=F0=9F=91=8D[Update]=20Controller=20:=20c?= =?UTF-8?q?onfig=20file=E3=81=A8logs=20folder=E3=81=AE=E3=83=AA=E3=83=B3?= =?UTF-8?q?=E3=82=AF=E3=81=8C=E9=96=8B=E3=81=8F=E6=98=A8=E6=97=A5=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.py | 3 ++- controller.py | 7 +++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/config.py b/config.py index fd603c87..8ed25736 100644 --- a/config.py +++ b/config.py @@ -1,6 +1,6 @@ import sys import inspect -from os import path as os_path +from os import path as os_path, makedirs as os_makedirs from json import load as json_load from json import dump as json_dump import tkinter as tk @@ -533,6 +533,7 @@ class Config: 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") + 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/" self._DOCUMENTS_URL = "https://mzsoftware.notion.site/VRCT-Documents-be79b7a165f64442ad8f326d86c22246" diff --git a/controller.py b/controller.py index 19743805..d7bdc414 100644 --- a/controller.py +++ b/controller.py @@ -1,4 +1,5 @@ from time import sleep +from subprocess import Popen from threading import Thread from config import config from model import model @@ -14,10 +15,12 @@ def callbackRestartSoftware(): model.reStartSoftware() def callbackFilepathLogs(): - print("callbackFilepathLogs") + print("callbackFilepathLogs", config.PATH_LOGS.replace('/', '\\')) + Popen(['explorer', config.PATH_LOGS.replace('/', '\\')], shell=True) def callbackFilepathConfigFile(): - print("callbackFilepathConfigFile") + print("callbackFilepathConfigFile", config.LOCAL_PATH.replace('/', '\\')) + Popen(['explorer', config.LOCAL_PATH.replace('/', '\\')], shell=True) # func transcription send message def sendMicMessage(message): From 37cc3f63d2453f36322dc2609d965db63bb59856 Mon Sep 17 00:00:00 2001 From: misyaguziya Date: Wed, 8 Nov 2023 22:11:48 +0900 Subject: [PATCH 44/44] =?UTF-8?q?=F0=9F=91=8D[Update]=20Config=20:=20versi?= =?UTF-8?q?on=202.0.0=20->=202.0.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.py b/config.py index 8ed25736..b594a1b0 100644 --- a/config.py +++ b/config.py @@ -529,7 +529,7 @@ class Config: def init_config(self): # Read Only - self._VERSION = "2.0.0" + self._VERSION = "2.0.1" 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")