[Update] Main Window: (WIP UI) CTranslate2、内部翻訳機能などの追加により、メイン画面にUI追加。デザインは確定ではなく、UI Scaling未対応などテスト状態です。
This commit is contained in:
@@ -1,9 +1,10 @@
|
||||
from typing import Union
|
||||
from types import SimpleNamespace
|
||||
|
||||
from customtkinter import CTkToplevel, CTkFrame, CTkLabel, CTkFont
|
||||
from time import sleep
|
||||
|
||||
from .ui_utils import bindButtonReleaseFunction, bindEnterAndLeaveColor, bindButtonPressColor, getLatestHeight, applyUiScalingAndFixTheBugScrollBar, getLatestWidth, getLongestText, CustomizedCTkScrollableFrame
|
||||
from .ui_utils import bindButtonReleaseFunction, bindEnterAndLeaveColor, bindButtonPressColor, getLatestHeight, applyUiScalingAndFixTheBugScrollBar, getLatestWidth, getLongestText, getLongestText_Dict, CustomizedCTkScrollableFrame
|
||||
from functools import partial
|
||||
|
||||
from utils import isEven, makeEven
|
||||
@@ -90,7 +91,7 @@ class _CreateDropdownMenuWindow(CTkToplevel):
|
||||
|
||||
|
||||
|
||||
def updateDropdownMenuValues(self, dropdown_menu_widget_id, dropdown_menu_values):
|
||||
def updateDropdownMenuValues(self, dropdown_menu_widget_id, dropdown_menu_values:Union[dict, list],):
|
||||
self.dropdown_menu_widgets[dropdown_menu_widget_id].widget.destroy()
|
||||
self.createDropdownMenuBox(
|
||||
dropdown_menu_widget_id=dropdown_menu_widget_id,
|
||||
@@ -105,7 +106,7 @@ class _CreateDropdownMenuWindow(CTkToplevel):
|
||||
)
|
||||
|
||||
|
||||
def createDropdownMenuBox(self, dropdown_menu_widget_id, dropdown_menu_values, command, wrapper_widget, attach_widget, dropdown_menu_min_width=None, dropdown_menu_height=None, max_display_length=None):
|
||||
def createDropdownMenuBox(self, dropdown_menu_widget_id, dropdown_menu_values:Union[dict, list], command, wrapper_widget, attach_widget, dropdown_menu_min_width=None, dropdown_menu_height=None, max_display_length=None):
|
||||
|
||||
self.attach_widget = attach_widget
|
||||
self.wrapper_widget = wrapper_widget
|
||||
@@ -166,9 +167,12 @@ class _CreateDropdownMenuWindow(CTkToplevel):
|
||||
self.dropdown_menu_container.grid_remove()
|
||||
|
||||
|
||||
def _createDropdownMenuValues(self, dropdown_menu_widget_id, dropdown_menu_values, command):
|
||||
def _createDropdownMenuValues(self, dropdown_menu_widget_id, dropdown_menu_values:Union[dict, list], command):
|
||||
if isinstance(dropdown_menu_values, list):
|
||||
longest_text = getLongestText(dropdown_menu_values)
|
||||
elif isinstance(dropdown_menu_values, dict):
|
||||
longest_text = getLongestText_Dict(dropdown_menu_values)
|
||||
|
||||
longest_text = getLongestText(dropdown_menu_values)
|
||||
self.dropdown_menu_values_wrapper = CTkFrame(self.scroll_frame_container, corner_radius=0, fg_color=self.window_bg_color)
|
||||
self.dropdown_menu_values_wrapper.grid(row=0, column=0, sticky="nsew")
|
||||
self.dropdown_menu_values_wrapper.grid_columnconfigure(0, weight=1)
|
||||
@@ -220,19 +224,31 @@ class _CreateDropdownMenuWindow(CTkToplevel):
|
||||
|
||||
|
||||
|
||||
row=0
|
||||
for dropdown_menu_value in dropdown_menu_values:
|
||||
IS_LIST_TYPE = False
|
||||
if isinstance(dropdown_menu_values, list):
|
||||
for_in_values = dropdown_menu_values
|
||||
IS_LIST_TYPE = True
|
||||
elif isinstance(dropdown_menu_values, dict):
|
||||
for_in_values = dropdown_menu_values.keys()
|
||||
IS_LIST_TYPE = False
|
||||
|
||||
row=0
|
||||
for dropdown_menu_value in for_in_values:
|
||||
dropdown_menu_value_wrapper = CTkFrame(self.dropdown_menu_values_wrapper, corner_radius=0, fg_color=self.values_bg_color, width=0, height=0, cursor="hand2")
|
||||
dropdown_menu_value_wrapper.grid(row=row, column=0, pady=self.value_pady, sticky="nsew")
|
||||
setattr(self, f"{dropdown_menu_widget_id}__{row}", dropdown_menu_value_wrapper)
|
||||
|
||||
|
||||
|
||||
if IS_LIST_TYPE is True:
|
||||
dropdown_menu_value_text = dropdown_menu_value
|
||||
else:
|
||||
dropdown_menu_value_text = dropdown_menu_values[dropdown_menu_value]
|
||||
|
||||
dropdown_menu_value_wrapper.grid_rowconfigure((0,2), weight=1)
|
||||
label_widget = CTkLabel(
|
||||
dropdown_menu_value_wrapper,
|
||||
text=dropdown_menu_value,
|
||||
text=dropdown_menu_value_text,
|
||||
height=0,
|
||||
corner_radius=0,
|
||||
font=CTkFont(family=self.settings.FONT_FAMILY, size=self.value_font_size, weight="normal"),
|
||||
@@ -252,7 +268,11 @@ class _CreateDropdownMenuWindow(CTkToplevel):
|
||||
command(value)
|
||||
self._withdraw()
|
||||
|
||||
callback = partial(optimizedCommand, dropdown_menu_value)
|
||||
if IS_LIST_TYPE is True:
|
||||
callback = partial(optimizedCommand, dropdown_menu_value_text)
|
||||
else:
|
||||
callback = partial(optimizedCommand, dropdown_menu_value)
|
||||
|
||||
bindButtonReleaseFunction([dropdown_menu_value_wrapper, label_widget], callback)
|
||||
|
||||
row+=1
|
||||
@@ -267,7 +287,10 @@ class _CreateDropdownMenuWindow(CTkToplevel):
|
||||
|
||||
|
||||
if self.active_dropdown_menu_widget is not None:
|
||||
self.active_dropdown_menu_widget.grid_remove()
|
||||
try:
|
||||
self.active_dropdown_menu_widget.grid_remove()
|
||||
except:
|
||||
pass
|
||||
|
||||
target_data = self.dropdown_menu_widgets[dropdown_menu_widget_id]
|
||||
self.attach_widget = target_data.attach_widget
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
from customtkinter import CTkFont, CTkFrame, CTkLabel, CTkImage
|
||||
|
||||
from ...._CreateDropdownMenuWindow import _CreateDropdownMenuWindow
|
||||
|
||||
from ....ui_utils import bindEnterAndLeaveColor, bindButtonPressColor, bindButtonReleaseFunction, switchActiveTabAndPassiveTab, switchTabsColor, createOptionMenuBox, bindButtonFunctionAndColor, bindEnterAndLeaveFunction
|
||||
|
||||
from utils import callFunctionIfCallable
|
||||
@@ -336,4 +338,106 @@ def createSidebarLanguagesSettings(settings, main_window, view_variable):
|
||||
height=0,
|
||||
corner_radius=0,
|
||||
image=CTkImage(settings.image_file.HEADPHONES_ICON_DISABLED, size=settings.uism.SLS__BOX_TRANSCRIPTION_STATUS_IMAGE_SIZE),
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
sls__box_translation_optionmenu_wrapper = CTkFrame(main_window.sls__box_frame, corner_radius=0, fg_color=settings.ctm.SLS__BG_COLOR, width=0, height=0)
|
||||
sls__box_translation_optionmenu_wrapper.grid(row=5, column=0, sticky="ew")
|
||||
|
||||
sls__box_translation_optionmenu_wrapper.grid_columnconfigure((0,2), weight=1, minsize=settings.uism.SLS__BOX_ARROWS_SWAP_BUTTON_PADX)
|
||||
sls__box_translation_optionmenu_wrapper.grid_columnconfigure(1, weight=1)
|
||||
|
||||
|
||||
|
||||
main_window.translation_engine_dropdown_menu_window = _CreateDropdownMenuWindow(
|
||||
settings=settings,
|
||||
view_variable=main_window._view_variable,
|
||||
|
||||
window_additional_y_pos=4,
|
||||
window_border_width=1,
|
||||
scrollbar_ipadx=(2,2),
|
||||
scrollbar_width=16,
|
||||
value_ipadx=(8,0),
|
||||
value_ipady=(6,6),
|
||||
value_pady=0,
|
||||
value_font_size=14,
|
||||
dropdown_menu_default_min_width=200,
|
||||
|
||||
window_bg_color="#1f2022",
|
||||
window_border_color="#7f8084",
|
||||
values_bg_color="#323336",
|
||||
values_hovered_bg_color="#4b4c4f",
|
||||
values_clicked_bg_color="#292a2d",
|
||||
values_text_color=settings.ctm.BASIC_TEXT_COLOR,
|
||||
)
|
||||
|
||||
# main_window.translation_engine_dropdown_menu_window = _CreateDropdownMenuWindow(
|
||||
# settings=settings.config_window,
|
||||
# view_variable=main_window._view_variable,
|
||||
|
||||
# window_additional_y_pos=settings.config_window.uism.SB__DROPDOWN_MENU_WINDOW_ADDITIONAL_Y_POS,
|
||||
# window_border_width=settings.config_window.uism.SB__DROPDOWN_MENU_WINDOW_BORDER_WIDTH,
|
||||
# scrollbar_ipadx=settings.config_window.uism.SB__DROPDOWN_MENU_SCROLLBAR_IPADX,
|
||||
# scrollbar_width=settings.config_window.uism.SB__DROPDOWN_MENU_SCROLLBAR_WIDTH,
|
||||
# value_ipadx=settings.config_window.uism.SB__DROPDOWN_MENU_VALUE_IPADX,
|
||||
# value_ipady=settings.config_window.uism.SB__DROPDOWN_MENU_VALUE_IPADY,
|
||||
# value_pady=settings.config_window.uism.SB__DROPDOWN_MENU_VALUE_PADY,
|
||||
# value_font_size=settings.config_window.uism.SB__DROPDOWN_MENU_VALUE_FONT_SIZE,
|
||||
# dropdown_menu_default_min_width=settings.config_window.uism.SB__DROPDOWN_MENU_VALUE_DEFAULT_MIN_WIDTH,
|
||||
|
||||
# window_bg_color=settings.config_window.ctm.SB__DROPDOWN_MENU_WINDOW_BG_COLOR,
|
||||
# window_border_color=settings.config_window.ctm.SB__DROPDOWN_MENU_WINDOW_BORDER_COLOR,
|
||||
# values_bg_color=settings.config_window.ctm.SB__DROPDOWN_MENU_BG_COLOR,
|
||||
# values_hovered_bg_color=settings.config_window.ctm.SB__DROPDOWN_MENU_HOVERED_BG_COLOR,
|
||||
# values_clicked_bg_color=settings.config_window.ctm.SB__DROPDOWN_MENU_CLICKED_BG_COLOR,
|
||||
# values_text_color=settings.config_window.ctm.BASIC_TEXT_COLOR,
|
||||
# )
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
def adjustedCommand(value):
|
||||
callFunctionIfCallable(view_variable.CALLBACK_SELECTED_TRANSLATION_ENGINE, value)
|
||||
|
||||
main_window.translation_engine_dropdown_menu_window.createDropdownMenuBox(
|
||||
dropdown_menu_widget_id="translation_engine_dropdown_menu",
|
||||
dropdown_menu_values=[],
|
||||
command=adjustedCommand,
|
||||
wrapper_widget=main_window,
|
||||
attach_widget=sls__box_translation_optionmenu_wrapper,
|
||||
dropdown_menu_min_width=200,
|
||||
)
|
||||
|
||||
|
||||
|
||||
|
||||
(sls__selected_translation_engine_box, optionmenu_label_widget, optionmenu_img_widget) = createOptionMenuBox(
|
||||
parent_widget=sls__box_translation_optionmenu_wrapper,
|
||||
optionmenu_bg_color=settings.ctm.SLS__BG_COLOR,
|
||||
optionmenu_hovered_bg_color=settings.ctm.SLS__OPTIONMENU_HOVERED_BG_COLOR,
|
||||
optionmenu_clicked_bg_color=settings.ctm.SLS__OPTIONMENU_CLICKED_BG_COLOR,
|
||||
optionmenu_ipadx=(0,10),
|
||||
optionmenu_ipady=6,
|
||||
variable=view_variable.VAR_SELECTED_TRANSLATION_ENGINE,
|
||||
font_family=settings.FONT_FAMILY,
|
||||
font_size=12,
|
||||
text_color=settings.ctm.LABELS_TEXT_COLOR,
|
||||
image_file=settings.image_file.REFRESH_ICON.rotate(45),
|
||||
image_size=(14,14),
|
||||
# image_size=settings.uism.SLS__BOX_OPTION_MENU_ARROW_IMAGE_SIZE,
|
||||
optionmenu_clicked_command=lambda _e: main_window.translation_engine_dropdown_menu_window.show(
|
||||
dropdown_menu_widget_id="translation_engine_dropdown_menu"
|
||||
),
|
||||
|
||||
optionmenu_position="center",
|
||||
setattr_widget=main_window,
|
||||
image_widget_attr_name="sls__arrow_img_select",
|
||||
)
|
||||
sls__selected_translation_engine_box.grid(row=0, column=1, sticky="ew")
|
||||
optionmenu_img_widget.grid_remove()
|
||||
|
||||
|
||||
@@ -66,7 +66,7 @@ class UiScalingManager():
|
||||
# Sidebar
|
||||
# Sidebar Features
|
||||
self.main.SF__LOGO_MAX_SIZE = self._calculateUiSize(120)
|
||||
self.main.SF__LOGO_PADY = (self._calculateUiSize(12),self._calculateUiSize(8))
|
||||
self.main.SF__LOGO_PADY = (self._calculateUiSize(10),self._calculateUiSize(6))
|
||||
self.main.SF__LOGO_HEIGHT_FOR_ADJUSTMENT = (self._calculateUiSize(6))
|
||||
|
||||
self.main.SF__LABELS_IPADY = self._calculateUiSize(16)
|
||||
@@ -84,34 +84,34 @@ class UiScalingManager():
|
||||
|
||||
|
||||
# Sidebar Quick Language Settings, SQLS
|
||||
self.main.SLS__TITLE_FONT_SIZE = self._calculateUiSize(16)
|
||||
self.main.SLS__TITLE_PADY = (self._calculateUiSize(12), self._calculateUiSize(6))
|
||||
self.main.SLS__TITLE_FONT_SIZE = self._calculateUiSize(14)
|
||||
self.main.SLS__TITLE_PADY = (self._calculateUiSize(10), self._calculateUiSize(4))
|
||||
|
||||
self.main.SLS__PRESET_TAB_NUMBER_FONT_SIZE = self._calculateUiSize(16)
|
||||
self.main.SLS__PRESET_TAB_NUMBER_HEIGHT = self._calculateUiSize(30)
|
||||
self.main.SLS__PRESET_TAB_NUMBER_CORNER_RADIUS = self._calculateUiSize(6)
|
||||
self.main.SLS__PRESET_TAB_NUMBER_ADJUSTED_HEIGHT = self._calculateUiSize(36)
|
||||
|
||||
self.main.SLS__BOX_TRANSCRIPTION_STATUS_IMAGE_SIZE = self.dupTuple(self._calculateUiSize(14))
|
||||
self.main.SLS__BOX_TOP_PADY = self._calculateUiSize(12)
|
||||
|
||||
self.main.SLS__BOX_TRANSCRIPTION_STATUS_IMAGE_SIZE = self.dupTuple(self._calculateUiSize(14))
|
||||
|
||||
self.main.SLS__BOX_SECTION_TITLE_FONT_SIZE = self._calculateUiSize(16)
|
||||
self.main.SLS__BOX_SECTION_TITLE_BOTTOM_PADY = self._calculateUiSize(10)
|
||||
self.main.SLS__BOX_IPADX = self._calculateUiSize(10)
|
||||
self.main.SLS__BOX_IPADY = (self._calculateUiSize(8),self._calculateUiSize(18))
|
||||
self.main.SLS__BOX_IPADY = (self._calculateUiSize(8),self._calculateUiSize(14))
|
||||
self.main.SLS__BOX_OPTION_MENU_FONT_SIZE = self._calculateUiSize(14)
|
||||
self.main.SLS__BOX_OPTION_MENU_IPADY = self._calculateUiSize(2)
|
||||
self.main.SLS__BOX_OPTION_MENU_ARROW_IMAGE_SIZE = (self._calculateUiSize(20), self._calculateUiSize(20))
|
||||
self.main.SLS__BOX_OPTION_MENU_ARROW_IMAGE_SIZE = self.dupTuple(self._calculateUiSize(20))
|
||||
# self.main.SLS__BOX_OPTION_MENU_WIDTH = self._calculateUiSize(200)
|
||||
self.main.SLS__BOX_ARROWS_PADY = self._calculateUiSize(4)
|
||||
self.main.SLS__BOX_ARROWS_PADY = self._calculateUiSize(6)
|
||||
self.main.SLS__BOX_ARROWS_SWAP_BUTTON_CORNER_RADIUS = self._calculateUiSize(6)
|
||||
self.main.SLS__BOX_ARROWS_SWAP_BUTTON_PADX = self._calculateUiSize(20)
|
||||
self.main.SLS__BOX_ARROWS_SWAP_BUTTON_IPADX = self._calculateUiSize(8)
|
||||
self.main.SLS__BOX_ARROWS_SWAP_BUTTON_IPADY = self._calculateUiSize(6)
|
||||
self.main.SLS__BOX_ARROWS_SWAP_BUTTON_IPADY = self._calculateUiSize(4)
|
||||
self.main.SLS__BOX_ARROWS_IMAGE_SIZE = self.dupTuple(self._calculateUiSize(16))
|
||||
self.main.SLS__BOX_ARROWS_DESC_FONT_SIZE = self._calculateUiSize(12)
|
||||
self.main.SLS__BOX_ARROWS_DESC_PADX = self._calculateUiSize(6)
|
||||
self.main.SLS__BOX_TOP_PADY = self._calculateUiSize(16)
|
||||
|
||||
self.main.SIDEBAR_CONFIG_BUTTON_CORNER_RADIUS = self._calculateUiSize(6)
|
||||
self.main.SIDEBAR_CONFIG_BUTTON_IMAGE_SIZE = self.main.SF__COMPACT_MODE_IMAGE_SIZE
|
||||
|
||||
@@ -42,6 +42,17 @@ def getLongestText(text_list:list):
|
||||
longest_text = text
|
||||
return longest_text
|
||||
|
||||
def getLongestText_Dict(text_dict:dict):
|
||||
max_length = 0
|
||||
longest_text = ""
|
||||
|
||||
for key, text in text_dict.items():
|
||||
if len(text) > max_length:
|
||||
max_length = len(text)
|
||||
longest_text = text
|
||||
|
||||
return longest_text
|
||||
|
||||
def calculateUiSize(default_size, scaling_float, is_allowed_odd:bool=False, is_zero_allowed:bool=False):
|
||||
size = int(default_size * scaling_float)
|
||||
size += 1 if not is_allowed_odd and size % 2 != 0 else 0
|
||||
|
||||
Reference in New Issue
Block a user