From 143107b7f9a015d224df09872ca6e40e35532764 Mon Sep 17 00:00:00 2001 From: misygauziya Date: Wed, 24 Apr 2024 16:09:24 +0900 Subject: [PATCH] =?UTF-8?q?=F0=9F=91=8D=EF=B8=8F[Update]=20Model=20:=20ove?= =?UTF-8?q?rlay=E3=81=AEUI=E3=81=AE=E5=8B=95=E4=BD=9C=E3=81=AB=E9=80=A3?= =?UTF-8?q?=E5=8B=95=E3=81=99=E3=82=8B=E3=82=88=E3=81=86=E3=81=ABCallback?= =?UTF-8?q?=E3=82=92=E8=A8=AD=E5=AE=9A=EF=BC=88=E6=9C=AA=E6=A4=9C=E8=A8=BC?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controller.py | 27 ++++++------- model.py | 67 +++++++++++++++++++++++++++++++-- models/overlay/overlay.py | 40 +++++++++++++++----- models/overlay/overlay_image.py | 33 ++++++++-------- 4 files changed, 123 insertions(+), 44 deletions(-) diff --git a/controller.py b/controller.py index c549a795..729a589e 100644 --- a/controller.py +++ b/controller.py @@ -103,9 +103,9 @@ def sendMicMessage(message): # if config.ENABLE_OVERLAY_SMALL_LOG is True: # overlay_image = model.createOverlayImageShort(message, translation) - # model.setOverlayImage(overlay_image) + # model.updateOverlay(overlay_image) # overlay_image = model.createOverlayImageLong("send", message, translation) - # model.setOverlayImage(overlay_image) + # model.updateOverlay(overlay_image) def startTranscriptionSendMessage(): model.startMicTranscript(sendMicMessage, view.printToTextbox_TranscriptionSendNoDeviceError) @@ -166,9 +166,9 @@ def receiveSpeakerMessage(message): if config.ENABLE_OVERLAY_SMALL_LOG is True: overlay_image = model.createOverlayImageShort(message, translation) - model.setOverlayImage(overlay_image) + model.updateOverlay(overlay_image) # overlay_image = model.createOverlayImageLong("receive", message, translation) - # model.setOverlayImage(overlay_image) + # model.updateOverlay(overlay_image) # ------------Speaker2Chatbox------------ if config.ENABLE_SPEAKER2CHATBOX is True: @@ -247,9 +247,9 @@ def sendChatMessage(message): # if config.ENABLE_OVERLAY_SMALL_LOG is True: # overlay_image = model.createOverlayImageShort(message, translation) - # model.setOverlayImage(overlay_image) + # model.updateOverlay(overlay_image) # overlay_image = model.createOverlayImageLong("send", message, translation) - # model.setOverlayImage(overlay_image) + # model.updateOverlay(overlay_image) # update textbox message log (Sent) view.printToTextbox_SentMessage(message, translation) @@ -866,11 +866,9 @@ def callbackSetOverlaySettings(value, set_type:str): config.OVERLAY_SETTINGS = pre_settings match (set_type): case "opacity": - pass - # update? + model.updateOverlayImageOpacity() case "ui_scaling": - pass - # update? + model.updateOverlayImageUiScaling() def callbackSetEnableOverlaySmallLog(value): print("callbackSetEnableOverlaySmallLog", value) @@ -887,14 +885,11 @@ def callbackSetOverlaySmallLogSettings(value, set_type:str): case "y_pos": model.updateOverlayPosition() case "depth": - pass - # update? + model.updateOverlayPosition() case "display_duration": - pass - # update? + model.updateOverlayTimes() case "fadeout_duration": - pass - # update? + model.updateOverlayTimes() # Others Tab def callbackSetEnableAutoClearMessageBox(value): diff --git a/model.py b/model.py index 1a4fc247..13ad6827 100644 --- a/model.py +++ b/model.py @@ -72,8 +72,18 @@ class Model: self.previous_receive_message = "" self.translator = Translator() self.keyword_processor = KeywordProcessor() - self.overlay = Overlay() - self.overlay_image = OverlayImage() + self.overlay = Overlay( + config.OVERLAY_SMALL_LOG_SETTINGS["x_pos"], + config.OVERLAY_SMALL_LOG_SETTINGS["y_pos"], + config.OVERLAY_SMALL_LOG_SETTINGS["depth"], + config.OVERLAY_SMALL_LOG_SETTINGS["display_duration"], + config.OVERLAY_SMALL_LOG_SETTINGS["fadeout_duration"], + ) + self.overlay_image = OverlayImage( + config.OVERLAY_SETTINGS["opacity"], + config.OVERLAY_SETTINGS["ui_scaling"], + ) + self.pre_overlay_message = None self.th_overlay = None def checkCTranslatorCTranslate2ModelWeight(self): @@ -563,6 +573,13 @@ class Model: your_language = config.TARGET_LANGUAGE target_language = config.SOURCE_LANGUAGE ui_type = config.OVERLAY_UI_TYPE + self.pre_overlay_message = { + "message" : message, + "your_language" : your_language, + "translation" : translation, + "target_language" : target_language, + "ui_type" : ui_type, + } return self.overlay_image.createOverlayImageShort(message, your_language, translation, target_language, ui_type) # def createOverlayImageLong(self, message_type, message, translation): @@ -571,6 +588,10 @@ class Model: # return self.overlay_image.create_overlay_image_long(message_type, message, your_language, translation, target_language) def setOverlayImage(self, img): + if self.overlay.initFlag is True: + self.overlay.uiManager.setImage(img) + + def updateOverlay(self, img): if self.overlay.initFlag is True: self.overlay.uiManager.uiUpdate(img) @@ -588,8 +609,46 @@ class Model: self.th_overlay = None def updateOverlayPosition(self): - pos = (config.OVERLAY_SMALL_LOG_SETTINGS["x_pos"], config.OVERLAY_SMALL_LOG_SETTINGS["y_pos"]) if self.overlay.initFlag is True: - self.overlay.uiManager.posUpdate(pos) + pos = (config.OVERLAY_SMALL_LOG_SETTINGS["x_pos"], config.OVERLAY_SMALL_LOG_SETTINGS["y_pos"]) + self.overlay.uiManager.setPosition(pos) + depth = config.OVERLAY_SMALL_LOG_SETTINGS["depth"] + self.overlay.uiManager.setDepth(depth) + self.overlay.uiManager.posUpdate() + def updateOverlayTimes(self): + if self.overlay.initFlag is True: + display_duration = config.OVERLAY_SMALL_LOG_SETTINGS["display_duration"] + self.overlay.uiManager.setFadeTime(display_duration) + fadeout_duration = config.OVERLAY_SMALL_LOG_SETTINGS["fadeout_duration"] + self.overlay.uiManager.setFadeInterval(fadeout_duration) + self.overlay.uiManager.update() + + def updateOverlayImageOpacity(self): + if self.overlay.initFlag is True: + opacity = config.OVERLAY_SETTINGS["opacity"] + self.overlay_image.setOpacity(opacity) + if self.pre_overlay_message is not None: + img = self.overlay_image.createOverlayImageShort( + self.pre_overlay_message["message"], + self.pre_overlay_message["your_language"], + self.pre_overlay_message["translation"], + self.pre_overlay_message["target_language"], + self.pre_overlay_message["ui_type"] + ) + self.overlay.uiManager.setImage(img) + + def updateOverlayImageUiScaling(self): + if self.overlay.initFlag is True: + ui_scaling = config.OVERLAY_SETTINGS["ui_scaling"] + self.overlay_image.setUiScaling(ui_scaling) + if self.pre_overlay_message is not None: + img = self.overlay_image.createOverlayImageShort( + self.pre_overlay_message["message"], + self.pre_overlay_message["your_language"], + self.pre_overlay_message["translation"], + self.pre_overlay_message["target_language"], + self.pre_overlay_message["ui_type"] + ) + self.overlay.uiManager.setImage(img) model = Model() \ No newline at end of file diff --git a/models/overlay/overlay.py b/models/overlay/overlay.py index fa8f6c98..dbd6aca4 100644 --- a/models/overlay/overlay.py +++ b/models/overlay/overlay.py @@ -59,7 +59,7 @@ class UIElement: def setTransparency(self, a): self.overlay.setOverlayAlpha(self.handle, a) - def setPosition(self, pos): + def updatePosition(self, pos): """ pos is a 2-tuple representing normalized (x, y) """ @@ -76,6 +76,13 @@ class UIElement: self.transform ) + def setPosition(self, pos): + self.settings["Normalized_icon_X_position"] = pos[0] + self.settings["Normalized_icon_Y_position"] = pos[1] + + def setDepth(self, depth): + self.settings["Icon_plane_depth"] = depth + class UIManager: def __init__(self, overlay_key, overlay_name, settings): self.overlay = openvr.IVROverlay() @@ -93,8 +100,11 @@ class UIManager: if self.settings['Fade_interval'] != 0: self.evaluateTransparencyFade(self.overlayUI, self.lastUpdate, currTime) - def uiUpdate(self, img): + def setImage(self, img): self.overlayUI.setImage(img) + + def uiUpdate(self, img): + self.setImage(img) self.overlayUI.setTransparency(self.settings['Transparency']) self.lastUpdate = time.monotonic() @@ -107,21 +117,33 @@ class UIManager: ui.setTransparency(fadeRatio * self.settings['Transparency']) - def posUpdate(self, pos): + def posUpdate(self): + self.overlayUI.updatePosition() + + def setPosition(self, pos): self.overlayUI.setPosition(pos) + def setDepth(self, depth): + self.overlayUI.setDepth(depth) + + def setFadeTime(self, fade_time): + self.settings["Fade_time"] = fade_time + + def setFadeInterval(self, fade_interval): + self.settings["Fade_interval"] = fade_interval + class Overlay: - def __init__(self): + def __init__(self, x, y , depth, fade_time, fade_interval): self.initFlag = False settings = { "Color": [1, 1, 1], "Transparency": 1, - "Normalized_icon_X_position": 0.0, - "Normalized_icon_Y_position": -0.41, - "Icon_plane_depth": 1, + "Normalized_icon_X_position": x, + "Normalized_icon_Y_position": y, + "Icon_plane_depth": depth, "Normalized_icon_width": 1, - "Fade_time": 5, - "Fade_interval": 2, + "Fade_time": fade_time, + "Fade_interval": fade_interval, } self.settings = settings diff --git a/models/overlay/overlay_image.py b/models/overlay/overlay_image.py index 1a489698..cb13b5bc 100644 --- a/models/overlay/overlay_image.py +++ b/models/overlay/overlay_image.py @@ -4,10 +4,6 @@ from typing import Tuple from PIL import Image, ImageDraw, ImageFont class OverlayImage: - WIDTH = 1920//2 - HEIGHT = 46//2 - FONT_SIZE_SHORT = HEIGHT - # TEXT_COLOR_LARGE = (223, 223, 223) # TEXT_COLOR_SMALL = (190, 190, 190) # TEXT_COLOR_SEND = (70, 161, 146) @@ -22,8 +18,9 @@ class OverlayImage: "Chinese Traditional": "NotoSansTC-Regular", } - def __init__(self): - self.log_data = [] + def __init__(self, opacity, ui_scaling): + self.opacity = int(opacity*255) + self.ui_scaling = ui_scaling @staticmethod def concatenateImagesVertically(img1: Image, img2: Image) -> Image: @@ -142,23 +139,29 @@ class OverlayImage: # img = Image.alpha_composite(background, img) # return img + def setOpacity(self, opacity): + self.opacity = int(opacity*255) + + def setUiScaling(self, ui_scaling): + self.ui_scaling = ui_scaling + def getUiSize(self): return { - "width": 960, - "height": 23, - "font_size": 23, + "width": int(960*self.ui_scaling), + "height": int(23*self.ui_scaling), + "font_size": int(23*self.ui_scaling), } def getUiColors(self, ui_type): match ui_type: case "default": - background_color = (41, 42, 45, 240) - background_outline_color = (41, 42, 45, 240) - text_color = (223, 223, 223) + background_color = (41, 42, 45, self.opacity) + background_outline_color = (41, 42, 45, self.opacity) + text_color = (223, 223, 223, self.opacity) case "sakura": - background_color = (225, 40, 30, 80) - background_outline_color = (255, 255, 255, 200) - text_color = (223, 223, 223) + background_color = (225, 40, 30, self.opacity) + background_outline_color = (255, 255, 255, self.opacity) + text_color = (223, 223, 223, self.opacity) return { "background_color": background_color, "background_outline_color": background_outline_color,