[Update] 使用ディスプレイサイズの大きさ(高さ)より、VRCT起動時のウィンドウの方が大きい場合の対応。UI Scalingを20%下げて再起動するかどうかの確認モーダルを表示。
それにともない確認モーダルの汎用化。 さらにそれに伴い計算の都合上UI Scalingが40%から200%で10%刻みに対応(選択できるように)しました。
This commit is contained in:
@@ -8,6 +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
|
||||
|
||||
json_serializable_vars = {}
|
||||
def json_serializable(var_name):
|
||||
@@ -220,7 +221,7 @@ class Config:
|
||||
|
||||
@UI_SCALING.setter
|
||||
def UI_SCALING(self, value):
|
||||
if value in ["40%", "60%", "80%", "90%", "100%", "110%", "120%", "150%", "200%"]:
|
||||
if value in generatePercentageStringsList(start=40,end=200, step=10):
|
||||
self._UI_SCALING = value
|
||||
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
|
||||
|
||||
|
||||
@@ -50,6 +50,9 @@ main_window:
|
||||
accept_update_software: Update and Restart
|
||||
updating: Now updating...
|
||||
|
||||
detected_over_ui_size: "Current UI Size: %{current_ui_size}\nVRCT's window size may be larger than your display size.\n* Depending on your display size, you may need to adjust it multiple times."
|
||||
deny_adjust_ui_size: "Keep it at this size"
|
||||
accept_adjust_ui_size: "Set it smaller and restart"
|
||||
|
||||
|
||||
selectable_language_window:
|
||||
|
||||
@@ -50,6 +50,10 @@ main_window:
|
||||
accept_update_software: アップデートして再起動
|
||||
updating: アップデート中...
|
||||
|
||||
detected_over_ui_size: "現在のUI サイズ: %{current_ui_size}\nVRCTのウィンドウサイズが、お使いのディスプレイサイズより大きい可能性があります。\n※ディスプレイサイズによっては、何度か再設定が必要な場合があります。"
|
||||
deny_adjust_ui_size: このサイズのままで良い
|
||||
accept_adjust_ui_size: 小さく設定して再起動
|
||||
|
||||
|
||||
|
||||
selectable_language_window:
|
||||
|
||||
8
utils.py
8
utils.py
@@ -20,4 +20,10 @@ def isEven(number):
|
||||
def makeEven(number, minus:bool=False):
|
||||
if minus is True:
|
||||
return number if isEven(number) else number - 1
|
||||
return number if isEven(number) else number + 1
|
||||
return number if isEven(number) else number + 1
|
||||
|
||||
def generatePercentageStringsList(start=40, end=200, step=10):
|
||||
strings = []
|
||||
for percent in range(start, end + 1, step):
|
||||
strings.append(f"{percent}%")
|
||||
return strings
|
||||
75
view.py
75
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
|
||||
from utils import callFunctionIfCallable, generatePercentageStringsList
|
||||
|
||||
from config import config
|
||||
|
||||
@@ -83,7 +83,17 @@ class View():
|
||||
self.view_variable = SimpleNamespace(
|
||||
# Common
|
||||
CALLBACK_RESTART_SOFTWARE=None,
|
||||
CALLBACK_UPDATE_SOFTWARE=None,
|
||||
|
||||
CALLBACK_WHEN_DETECT_WINDOW_OVERED_SIZE=self._showDisplayOverUiSizeConfirmationModal,
|
||||
|
||||
# Confirmation Modal
|
||||
CALLBACK_HIDE_CONFIRMATION_MODAL=None,
|
||||
CALLBACK_ACCEPTED_CONFIRMATION_MODAL=None,
|
||||
CALLBACK_DENIED_CONFIRMATION_MODAL=None,
|
||||
VAR_MESSAGE_CONFIRMATION_MODAL=StringVar(value=""),
|
||||
VAR_LABEL_CONFIRMATION_MODAL_DENY_BUTTON=StringVar(value=""),
|
||||
VAR_LABEL_CONFIRMATION_MODAL_ACCEPT_BUTTON=StringVar(value=""),
|
||||
|
||||
# Open Config Window
|
||||
CALLBACK_CLICKED_OPEN_CONFIG_WINDOW_BUTTON=self._openConfigWindow,
|
||||
@@ -94,17 +104,9 @@ class View():
|
||||
# Open Help and Information Page
|
||||
CALLBACK_CLICKED_HELP_AND_INFO=self.openWebPage_VrctDocuments,
|
||||
|
||||
# For Update Software
|
||||
# Open Update Confirmation Modal
|
||||
CALLBACK_CLICKED_UPDATE_AVAILABLE=self._showUpdateSoftwareConfirmationModal,
|
||||
|
||||
CALLBACK_UPDATE_SOFTWARE=None,
|
||||
CALLBACK_ACCEPT_UPDATE=self._startUpdateSoftware,
|
||||
CALLBACK_DENY_UPDATE=self._deniedUpdateSoftware,
|
||||
CALLBACK_HIDE_UPDATE_CONFIRMATION_MODAL=self._hideUpdateSoftwareConfirmationModal,
|
||||
VAR_MESSAGE_CONFIRMATION_MODAL=StringVar(value=""),
|
||||
VAR_LABEL_CONFIRMATION_MODAL_DENY_BUTTON=StringVar(value=""),
|
||||
VAR_LABEL_CONFIRMATION_MODAL_ACCEPT_BUTTON=StringVar(value=""),
|
||||
|
||||
|
||||
# Main Window
|
||||
@@ -203,7 +205,7 @@ class View():
|
||||
|
||||
VAR_LABEL_UI_SCALING=StringVar(value=i18n.t("config_window.ui_size.label")),
|
||||
VAR_DESC_UI_SCALING=None,
|
||||
LIST_UI_SCALING=["40%", "60%", "80%", "90%", "100%", "110%", "120%", "150%", "200%"],
|
||||
LIST_UI_SCALING=generatePercentageStringsList(start=40,end=200, step=10),
|
||||
CALLBACK_SET_UI_SCALING=None,
|
||||
VAR_UI_SCALING=StringVar(value=config.UI_SCALING),
|
||||
|
||||
@@ -566,24 +568,64 @@ class View():
|
||||
def foregroundOff():
|
||||
vrct_gui.attributes("-topmost", False)
|
||||
|
||||
def _showUpdateSoftwareConfirmationModal(self):
|
||||
|
||||
def _showDisplayOverUiSizeConfirmationModal(self):
|
||||
self.foregroundOffIfForegroundEnabled()
|
||||
|
||||
|
||||
self.view_variable.VAR_LABEL_MAIN_WINDOW_COVER_MESSAGE.set("")
|
||||
vrct_gui.main_window_cover.show()
|
||||
|
||||
self.view_variable.CALLBACK_HIDE_CONFIRMATION_MODAL=self._hideConfirmationModal
|
||||
self.view_variable.CALLBACK_ACCEPTED_CONFIRMATION_MODAL=self._adjustUiSizeAndRestart
|
||||
self.view_variable.CALLBACK_DENIED_CONFIRMATION_MODAL=self._hideConfirmationModal
|
||||
|
||||
self.view_variable.VAR_MESSAGE_CONFIRMATION_MODAL.set(i18n.t("main_window.confirmation_message.detected_over_ui_size", current_ui_size=config.UI_SCALING))
|
||||
self.view_variable.VAR_LABEL_CONFIRMATION_MODAL_DENY_BUTTON.set(i18n.t("main_window.confirmation_message.deny_adjust_ui_size"))
|
||||
self.view_variable.VAR_LABEL_CONFIRMATION_MODAL_ACCEPT_BUTTON.set(i18n.t("main_window.confirmation_message.accept_adjust_ui_size"))
|
||||
|
||||
vrct_gui.update_confirmation_modal.show(hide_title_bar=False, close_when_focusout=False)
|
||||
|
||||
|
||||
def _adjustUiSizeAndRestart(self):
|
||||
current_percentage = int(config.UI_SCALING.replace("%",""))
|
||||
target_percentage = current_percentage - 20
|
||||
if target_percentage >= 40 and str(target_percentage) + "%" in self.view_variable.LIST_UI_SCALING:
|
||||
index = self.view_variable.LIST_UI_SCALING.index(str(target_percentage) + "%")
|
||||
callFunctionIfCallable(self.view_variable.CALLBACK_SET_UI_SCALING, self.view_variable.LIST_UI_SCALING[index])
|
||||
callFunctionIfCallable(self.view_variable.CALLBACK_RESTART_SOFTWARE)
|
||||
|
||||
# ※Below 40% of the UI size is not supported, and we cannot handle it at this time.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
def _showUpdateSoftwareConfirmationModal(self):
|
||||
self.foregroundOffIfForegroundEnabled()
|
||||
|
||||
self.view_variable.VAR_LABEL_MAIN_WINDOW_COVER_MESSAGE.set("")
|
||||
vrct_gui.main_window_cover.show()
|
||||
|
||||
self.view_variable.CALLBACK_HIDE_CONFIRMATION_MODAL=self._hideConfirmationModal
|
||||
self.view_variable.CALLBACK_ACCEPTED_CONFIRMATION_MODAL=self._startUpdateSoftware
|
||||
self.view_variable.CALLBACK_DENIED_CONFIRMATION_MODAL=self._hideConfirmationModal
|
||||
|
||||
self.view_variable.VAR_MESSAGE_CONFIRMATION_MODAL.set(i18n.t("main_window.confirmation_message.update_software"))
|
||||
self.view_variable.VAR_LABEL_CONFIRMATION_MODAL_DENY_BUTTON.set(i18n.t("main_window.confirmation_message.deny_update_software"))
|
||||
self.view_variable.VAR_LABEL_CONFIRMATION_MODAL_ACCEPT_BUTTON.set(i18n.t("main_window.confirmation_message.accept_update_software"))
|
||||
vrct_gui.update_confirmation_modal.show()
|
||||
vrct_gui.update_confirmation_modal.focus_set()
|
||||
|
||||
def _hideUpdateSoftwareConfirmationModal(self):
|
||||
self._deniedUpdateSoftware()
|
||||
def _hideConfirmationModal(self):
|
||||
vrct_gui.update_confirmation_modal.hide()
|
||||
vrct_gui.main_window_cover.hide()
|
||||
self.foregroundOnIfForegroundEnabled()
|
||||
|
||||
# def _deniedUpdateSoftware(self):
|
||||
# self._hideConfirmationModal()
|
||||
|
||||
def _startUpdateSoftware(self):
|
||||
self.view_variable.VAR_MESSAGE_CONFIRMATION_MODAL.set(i18n.t("main_window.confirmation_message.updating"))
|
||||
@@ -592,9 +634,6 @@ class View():
|
||||
vrct_gui.update_confirmation_modal.update()
|
||||
callFunctionIfCallable(self.view_variable.CALLBACK_UPDATE_SOFTWARE)
|
||||
|
||||
def _deniedUpdateSoftware(self):
|
||||
vrct_gui.update_confirmation_modal.hide()
|
||||
vrct_gui.main_window_cover.hide()
|
||||
|
||||
|
||||
def _openConfigWindow(self):
|
||||
|
||||
@@ -12,9 +12,11 @@ class _CreateConfirmationModal(CTkToplevel):
|
||||
|
||||
self.title("")
|
||||
self.overrideredirect(True)
|
||||
|
||||
self.wm_attributes("-toolwindow", True)
|
||||
|
||||
self.BIND_FOCUS_OUT_FUNC_ID=None
|
||||
|
||||
|
||||
self.attach_window = attach_window
|
||||
self.settings = settings
|
||||
self._view_variable = view_variable
|
||||
@@ -22,13 +24,8 @@ class _CreateConfirmationModal(CTkToplevel):
|
||||
|
||||
# self.configure(fg_color="#ff7f50")
|
||||
self.configure(fg_color=self.settings.ctm.FAKE_BORDER_COLOR)
|
||||
self.protocol("WM_DELETE_WINDOW", lambda _e: callFunctionIfCallable(self._view_variable.CALLBACK_HIDE_UPDATE_CONFIRMATION_MODAL))
|
||||
self.protocol("WM_DELETE_WINDOW", lambda: callFunctionIfCallable(self._view_variable.CALLBACK_HIDE_CONFIRMATION_MODAL))
|
||||
|
||||
def fucusOutFunction(e):
|
||||
if str(e.widget) != ".!_createconfirmationmodal": return
|
||||
callFunctionIfCallable(self._view_variable.CALLBACK_HIDE_UPDATE_CONFIRMATION_MODAL)
|
||||
|
||||
self.bind("<FocusOut>", fucusOutFunction, "+")
|
||||
|
||||
|
||||
self.grid_rowconfigure(0,weight=1)
|
||||
@@ -114,7 +111,7 @@ class _CreateConfirmationModal(CTkToplevel):
|
||||
enter_color=settings.ctm.DENY_BUTTON_HOVERED_BG_COLOR,
|
||||
leave_color=settings.ctm.DENY_BUTTON_BG_COLOR,
|
||||
clicked_color=settings.ctm.DENY_BUTTON_CLICKED_BG_COLOR,
|
||||
buttonReleasedFunction=lambda _e: callFunctionIfCallable(view_variable.CALLBACK_DENY_UPDATE),
|
||||
buttonReleasedFunction=lambda _e: callFunctionIfCallable(self._view_variable.CALLBACK_DENIED_CONFIRMATION_MODAL),
|
||||
)
|
||||
|
||||
|
||||
@@ -150,7 +147,7 @@ class _CreateConfirmationModal(CTkToplevel):
|
||||
enter_color=settings.ctm.ACCEPT_BUTTON_HOVERED_BG_COLOR,
|
||||
leave_color=settings.ctm.ACCEPT_BUTTON_BG_COLOR,
|
||||
clicked_color=settings.ctm.ACCEPT_BUTTON_CLICKED_BG_COLOR,
|
||||
buttonReleasedFunction=lambda _e: callFunctionIfCallable(view_variable.CALLBACK_ACCEPT_UPDATE),
|
||||
buttonReleasedFunction=lambda _e: callFunctionIfCallable(self._view_variable.CALLBACK_ACCEPTED_CONFIRMATION_MODAL),
|
||||
)
|
||||
|
||||
|
||||
@@ -158,16 +155,39 @@ class _CreateConfirmationModal(CTkToplevel):
|
||||
self.modal_buttons_wrapper.grid_remove()
|
||||
|
||||
|
||||
def show(self):
|
||||
def show(self, hide_title_bar:bool=True, close_when_focusout:bool=True):
|
||||
if hide_title_bar is False:
|
||||
self.overrideredirect(False)
|
||||
else:
|
||||
self.overrideredirect(True)
|
||||
|
||||
self.close_when_focusout = close_when_focusout
|
||||
if self.close_when_focusout is True:
|
||||
self.BIND_FOCUS_OUT_FUNC_ID = self.bind("<FocusOut>", self.focusOutFunction, "+")
|
||||
else:
|
||||
self._grab_set()
|
||||
|
||||
|
||||
self.attributes("-alpha", 0)
|
||||
self.deiconify()
|
||||
self.focus_set()
|
||||
setGeometryToCenterOfTheWidget(
|
||||
attach_widget=self.attach_window,
|
||||
target_widget=self
|
||||
)
|
||||
fadeInAnimation(self, steps=5, interval=0.005, max_alpha=1)
|
||||
self.focus_set()
|
||||
|
||||
|
||||
def hide(self):
|
||||
if self.BIND_FOCUS_OUT_FUNC_ID is not None:
|
||||
self.unbind("<FocusOut>", self.BIND_FOCUS_OUT_FUNC_ID)
|
||||
|
||||
self.withdraw()
|
||||
self.grab_release()
|
||||
|
||||
def focusOutFunction(self, e):
|
||||
if str(e.widget) != ".!_createconfirmationmodal": return
|
||||
callFunctionIfCallable(self._view_variable.CALLBACK_HIDE_CONFIRMATION_MODAL)
|
||||
|
||||
def _grab_set(self):
|
||||
self.grab_set()
|
||||
|
||||
@@ -17,7 +17,7 @@ class _CreateWindowCover(CTkToplevel):
|
||||
|
||||
|
||||
self.configure(fg_color="#ff7f50")
|
||||
self.protocol("WM_DELETE_WINDOW", lambda e: self.withdraw())
|
||||
self.protocol("WM_DELETE_WINDOW", lambda: self.withdraw())
|
||||
|
||||
self.settings = settings
|
||||
self._view_variable = view_variable
|
||||
|
||||
@@ -226,7 +226,7 @@ def setGeometryToCenterOfScreen(root_widget):
|
||||
|
||||
|
||||
def setGeometryToCenterOfTheWidget(attach_widget, target_widget):
|
||||
target_widget.update()
|
||||
attach_widget.update()
|
||||
target_widget.update()
|
||||
current_window_x = attach_widget.winfo_rootx()
|
||||
current_window_y = attach_widget.winfo_rooty()
|
||||
|
||||
@@ -54,6 +54,11 @@ class VRCT_GUI(CTk):
|
||||
self._enableMainWindowSidebarCompactMode()
|
||||
fadeInAnimation(self, steps=5, interval=0.008)
|
||||
|
||||
|
||||
if self._isOverWindowSizeCheck() is True:
|
||||
callFunctionIfCallable(self._view_variable.CALLBACK_WHEN_DETECT_WINDOW_OVERED_SIZE)
|
||||
|
||||
|
||||
def _createGUI(self, settings, view_variable):
|
||||
self.settings = settings
|
||||
self._view_variable = view_variable
|
||||
@@ -282,4 +287,14 @@ class VRCT_GUI(CTk):
|
||||
pass
|
||||
|
||||
|
||||
def _isOverWindowSizeCheck(self):
|
||||
self.update()
|
||||
screen_height = self.winfo_screenheight()
|
||||
window_height = self.winfo_height()
|
||||
print(screen_height, window_height)
|
||||
if screen_height < window_height:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
vrct_gui = VRCT_GUI()
|
||||
Reference in New Issue
Block a user