From a616876ace36999aaff8ca27f65aaab56eca1f44 Mon Sep 17 00:00:00 2001 From: dw-0 Date: Sat, 26 Oct 2024 20:41:34 +0200 Subject: [PATCH] feat: implement message service Signed-off-by: Dominik Willner --- .../webui_client/menus/client_install_menu.py | 18 +++--- kiauh/core/menus/base_menu.py | 6 ++ kiauh/core/services/__init__.py | 0 kiauh/core/services/message_service.py | 57 +++++++++++++++++++ 4 files changed, 70 insertions(+), 11 deletions(-) create mode 100644 kiauh/core/services/__init__.py create mode 100644 kiauh/core/services/message_service.py diff --git a/kiauh/components/webui_client/menus/client_install_menu.py b/kiauh/components/webui_client/menus/client_install_menu.py index d2dcce1..951baa8 100644 --- a/kiauh/components/webui_client/menus/client_install_menu.py +++ b/kiauh/components/webui_client/menus/client_install_menu.py @@ -18,9 +18,10 @@ from components.webui_client.client_utils import ( get_nginx_listen_port, set_listen_port, ) -from core.logger import DialogType, Logger +from core.logger import Logger from core.menus import Option from core.menus.base_menu import BaseMenu +from core.services.message_service import Message from core.settings.kiauh_settings import KiauhSettings, WebUiSettings from core.types.color import Color from utils.sys_utils import cmd_sysctl_service, get_ipv4_addr @@ -85,16 +86,15 @@ class ClientInstallMenu(BaseMenu): cmd_sysctl_service("nginx", "start") # noinspection HttpUrlsUsage - Logger.print_dialog( - DialogType.CUSTOM, - custom_title="Port reconfiguration complete!", - custom_color=Color.GREEN, - center_content=True, - content=[ + message = Message( + title="Port reconfiguration complete!", + text=[ f"Open {self.client.display_name} now on: " f"http://{get_ipv4_addr()}:{new_port}", ], + color=Color.GREEN, ) + self.message_service.set_message(message) def _get_current_port(self) -> int: curr_port = get_nginx_listen_port(self.client.nginx_config) @@ -103,7 +103,3 @@ class ClientInstallMenu(BaseMenu): # the default port from the kiauh settings as fallback return int(self.client_settings.port) return curr_port - - def _go_back(self, **kwargs) -> None: - if self.previous_menu is not None: - self.previous_menu().run() diff --git a/kiauh/core/menus/base_menu.py b/kiauh/core/menus/base_menu.py index 97817e9..47690f7 100644 --- a/kiauh/core/menus/base_menu.py +++ b/kiauh/core/menus/base_menu.py @@ -19,6 +19,7 @@ from typing import Dict, Type from core.logger import Logger from core.menus import FooterType, Option +from core.services.message_service import MessageService from core.spinner import Spinner from core.types.color import Color from utils.input_utils import get_selection_input @@ -123,6 +124,8 @@ class BaseMenu(metaclass=PostInitCaller): help_menu: Type[BaseMenu] | None = None footer_type: FooterType = FooterType.BACK + message_service = MessageService() + def __init__(self, **kwargs) -> None: if type(self) is BaseMenu: raise NotImplementedError("BaseMenu cannot be instantiated directly.") @@ -207,8 +210,11 @@ class BaseMenu(metaclass=PostInitCaller): raise NotImplementedError("FooterType not correctly implemented!") def __display_menu(self) -> None: + self.message_service.display_message() + if self.header: print_header() + self.__print_menu_title() self.print_menu() self.__print_footer() diff --git a/kiauh/core/services/__init__.py b/kiauh/core/services/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/kiauh/core/services/message_service.py b/kiauh/core/services/message_service.py new file mode 100644 index 0000000..b7bb15c --- /dev/null +++ b/kiauh/core/services/message_service.py @@ -0,0 +1,57 @@ +# ======================================================================= # +# Copyright (C) 2020 - 2024 Dominik Willner # +# # +# This file is part of KIAUH - Klipper Installation And Update Helper # +# https://github.com/dw-0/kiauh # +# # +# This file may be distributed under the terms of the GNU GPLv3 license # +# ======================================================================= # + +from dataclasses import dataclass +from typing import List + +from core.logger import DialogType, Logger +from core.types.color import Color + + +@dataclass() +class Message: + title: str + text: List[str] + color: Color + + +class MessageService: + _instance = None + + def __new__(cls) -> "MessageService": + if cls._instance is None: + cls._instance = super(MessageService, cls).__new__(cls) + return cls._instance + + def __init__(self) -> None: + if not hasattr(self, "__initialized"): + self.__initialized = False + if self.__initialized: + return + self.__initialized = True + self.message = None + + def set_message(self, message: Message) -> None: + self.message = message + + def display_message(self) -> None: + if self.message is None: + return + + Logger.print_dialog( + title=DialogType.CUSTOM, + content=self.message.text, + custom_title=self.message.title, + custom_color=self.message.color, + ) + + self.__clear_message() + + def __clear_message(self) -> None: + self.message = None