From 257d7689684cf9c26673dc027881153a6d337383 Mon Sep 17 00:00:00 2001 From: Rafal Chlodnicki Date: Mon, 16 Oct 2023 22:32:37 +0200 Subject: [PATCH 1/4] minor visual tweaks to ShowMessageRequest popup --- notification.css | 11 ++--- plugin/core/message_request_handler.py | 62 ++++++++++++++------------ plugin/core/views.py | 14 ++++-- 3 files changed, 51 insertions(+), 36 deletions(-) diff --git a/notification.css b/notification.css index 0c6ac9bcc..4d2883489 100644 --- a/notification.css +++ b/notification.css @@ -2,14 +2,15 @@ margin: 0.5rem; padding: 1rem; } -.notification .message { - margin-top: 1rem; - margin-bottom: 3rem; + +.notification h2 { + margin-bottom: 1rem; } .notification .actions a { - text-decoration: none; - padding: 0.5rem; border: 2px solid color(var(--foreground) alpha(0.25)); color: var(--foreground); + margin-top: 3rem; + padding: 0.5rem; + text-decoration: none; } diff --git a/plugin/core/message_request_handler.py b/plugin/core/message_request_handler.py index 1329860b9..75d34665e 100644 --- a/plugin/core/message_request_handler.py +++ b/plugin/core/message_request_handler.py @@ -1,19 +1,23 @@ from .protocol import Response +from .protocol import ShowMessageRequestParams from .sessions import Session from .typing import Any, List, Callable from .views import show_lsp_popup +from .views import text2html import sublime class MessageRequestHandler(): - def __init__(self, view: sublime.View, session: Session, request_id: Any, params: dict, source: str) -> None: + def __init__( + self, view: sublime.View, session: Session, request_id: Any, params: ShowMessageRequestParams, source: str + ) -> None: self.session = session self.request_id = request_id self.request_sent = False self.view = view self.actions = params.get("actions", []) self.titles = list(action.get("title") for action in self.actions) - self.message = params.get('message', '') + self.message = text2html(params['message']) self.message_type = params.get('type', 4) self.source = source @@ -21,11 +25,8 @@ def _send_user_choice(self, href: int = -1) -> None: if not self.request_sent: self.request_sent = True self.view.hide_popup() - # when noop; nothing was selected e.g. the user pressed escape - param = None index = int(href) - if index != -1: - param = self.actions[index] + param = self.actions[index] if index != -1 else None response = Response(self.request_id, param) self.session.send_response(response) @@ -41,8 +42,28 @@ def show(self) -> None: ) +def show_notification( + view: sublime.View, + source: str, + message_type: int, + message: str, + titles: List[str], + on_navigate: Callable[[int], None], + on_hide: Callable[[int], None] +) -> None: + stylesheet = sublime.load_resource("Packages/LSP/notification.css") + contents = message_content(source, message_type, message, titles) + show_lsp_popup( + view, + contents, + css=stylesheet, + wrapper_class='notification', + on_navigate=on_navigate, + on_hide=on_hide) + + def message_content(source: str, message_type: int, message: str, titles: List[str]) -> str: - formatted = [] + formatted = [] # type: List[str] icons = { 1: '❗', 2: '⚠️', @@ -51,25 +72,10 @@ def message_content(source: str, message_type: int, message: str, titles: List[s } icon = icons.get(message_type, '') formatted.append("

{}

".format(source)) - formatted.append("

{} {}

".format(icon, message)) - - buttons = [] - for idx, title in enumerate(titles): - buttons.append("{}".format(idx, title)) - - formatted.append("

" + " ".join(buttons) + "

") - + formatted.append("
{} {}
".format(icon, message)) + if titles: + buttons = [] # type: List[str] + for idx, title in enumerate(titles): + buttons.append("{}".format(idx, title)) + formatted.append("
" + " ".join(buttons) + "
") return "".join(formatted) - - -def show_notification(view: sublime.View, source: str, message_type: int, message: str, titles: List[str], - on_navigate: Callable, on_hide: Callable) -> None: - stylesheet = sublime.load_resource("Packages/LSP/notification.css") - contents = message_content(source, message_type, message, titles) - show_lsp_popup( - view, - contents, - css=stylesheet, - wrapper_class='notification', - on_navigate=on_navigate, - on_hide=on_hide) diff --git a/plugin/core/views.py b/plugin/core/views.py index 5221f0fbf..b9534b3a2 100644 --- a/plugin/core/views.py +++ b/plugin/core/views.py @@ -610,9 +610,17 @@ def text_document_code_action_params( LSP_POPUP_SPACER_HTML = '
' -def show_lsp_popup(view: sublime.View, contents: str, location: int = -1, md: bool = False, flags: int = 0, - css: Optional[str] = None, wrapper_class: Optional[str] = None, - on_navigate: Optional[Callable] = None, on_hide: Optional[Callable] = None) -> None: +def show_lsp_popup( + view: sublime.View, + contents: str, + location: int = -1, + md: bool = False, + flags: int = 0, + css: Optional[str] = None, + wrapper_class: Optional[str] = None, + on_navigate: Optional[Callable[[int], None]] = None, + on_hide: Optional[Callable[[int], None]] = None +) -> None: css = css if css is not None else lsp_css().popups wrapper_class = wrapper_class if wrapper_class is not None else lsp_css().popups_classname contents += LSP_POPUP_SPACER_HTML From 9804aa158aa5981bf878cb7cb0daca91876f7a30 Mon Sep 17 00:00:00 2001 From: Rafal Chlodnicki Date: Mon, 16 Oct 2023 22:49:50 +0200 Subject: [PATCH 2/4] lint --- plugin/core/views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugin/core/views.py b/plugin/core/views.py index b9534b3a2..a55d1a239 100644 --- a/plugin/core/views.py +++ b/plugin/core/views.py @@ -618,8 +618,8 @@ def show_lsp_popup( flags: int = 0, css: Optional[str] = None, wrapper_class: Optional[str] = None, - on_navigate: Optional[Callable[[int], None]] = None, - on_hide: Optional[Callable[[int], None]] = None + on_navigate: Optional[Callable[..., None]] = None, + on_hide: Optional[Callable[..., None]] = None ) -> None: css = css if css is not None else lsp_css().popups wrapper_class = wrapper_class if wrapper_class is not None else lsp_css().popups_classname From cdd19b708ecd316d14a86c39ecd26c618cf346a8 Mon Sep 17 00:00:00 2001 From: Rafal Chlodnicki Date: Mon, 16 Oct 2023 23:01:27 +0200 Subject: [PATCH 3/4] more refactoring --- plugin/core/message_request_handler.py | 92 ++++++++++---------------- 1 file changed, 35 insertions(+), 57 deletions(-) diff --git a/plugin/core/message_request_handler.py b/plugin/core/message_request_handler.py index 75d34665e..fca778c30 100644 --- a/plugin/core/message_request_handler.py +++ b/plugin/core/message_request_handler.py @@ -1,12 +1,21 @@ +from .protocol import MessageType from .protocol import Response from .protocol import ShowMessageRequestParams from .sessions import Session -from .typing import Any, List, Callable +from .typing import Any, Dict, List from .views import show_lsp_popup from .views import text2html import sublime +ICONS = { + MessageType.Error: '❗', + MessageType.Warning: '⚠️', + MessageType.Info: 'ℹ️', + MessageType.Log: '📝' +} # type: Dict[MessageType, str] + + class MessageRequestHandler(): def __init__( self, view: sublime.View, session: Session, request_id: Any, params: ShowMessageRequestParams, source: str @@ -16,66 +25,35 @@ def __init__( self.request_sent = False self.view = view self.actions = params.get("actions", []) - self.titles = list(action.get("title") for action in self.actions) + self.action_titles = list(action.get("title") for action in self.actions) self.message = text2html(params['message']) self.message_type = params.get('type', 4) self.source = source - def _send_user_choice(self, href: int = -1) -> None: - if not self.request_sent: - self.request_sent = True - self.view.hide_popup() - index = int(href) - param = self.actions[index] if index != -1 else None - response = Response(self.request_id, param) - self.session.send_response(response) - def show(self) -> None: - show_notification( + formatted = [] # type: List[str] + formatted.append("

{}

".format(self.source)) + icon = ICONS.get(self.message_type, '') + formatted.append("
{} {}
".format(icon, self.message)) + if self.action_titles: + buttons = [] # type: List[str] + for idx, title in enumerate(self.action_titles): + buttons.append("{}".format(idx, title)) + formatted.append("
" + " ".join(buttons) + "
") + show_lsp_popup( self.view, - self.source, - self.message_type, - self.message, - self.titles, - self._send_user_choice, - self._send_user_choice - ) + "".join(formatted), + css=sublime.load_resource("Packages/LSP/notification.css"), + wrapper_class='notification', + on_navigate=self._send_user_choice, + on_hide=self._send_user_choice) - -def show_notification( - view: sublime.View, - source: str, - message_type: int, - message: str, - titles: List[str], - on_navigate: Callable[[int], None], - on_hide: Callable[[int], None] -) -> None: - stylesheet = sublime.load_resource("Packages/LSP/notification.css") - contents = message_content(source, message_type, message, titles) - show_lsp_popup( - view, - contents, - css=stylesheet, - wrapper_class='notification', - on_navigate=on_navigate, - on_hide=on_hide) - - -def message_content(source: str, message_type: int, message: str, titles: List[str]) -> str: - formatted = [] # type: List[str] - icons = { - 1: '❗', - 2: '⚠️', - 3: 'ℹ️', - 4: '📝' - } - icon = icons.get(message_type, '') - formatted.append("

{}

".format(source)) - formatted.append("
{} {}
".format(icon, message)) - if titles: - buttons = [] # type: List[str] - for idx, title in enumerate(titles): - buttons.append("{}".format(idx, title)) - formatted.append("
" + " ".join(buttons) + "
") - return "".join(formatted) + def _send_user_choice(self, href: int = -1) -> None: + if self.request_sent: + return + self.request_sent = True + self.view.hide_popup() + index = int(href) + param = self.actions[index] if index != -1 else None + response = Response(self.request_id, param) + self.session.send_response(response) From 9157320be5ced907ebf3eeb92f6a95eecdbb2441 Mon Sep 17 00:00:00 2001 From: Rafal Chlodnicki Date: Mon, 16 Oct 2023 23:12:41 +0200 Subject: [PATCH 4/4] escape just in case --- plugin/core/message_request_handler.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugin/core/message_request_handler.py b/plugin/core/message_request_handler.py index fca778c30..8c6fb1677 100644 --- a/plugin/core/message_request_handler.py +++ b/plugin/core/message_request_handler.py @@ -26,7 +26,7 @@ def __init__( self.view = view self.actions = params.get("actions", []) self.action_titles = list(action.get("title") for action in self.actions) - self.message = text2html(params['message']) + self.message = params['message'] self.message_type = params.get('type', 4) self.source = source @@ -34,11 +34,11 @@ def show(self) -> None: formatted = [] # type: List[str] formatted.append("

{}

".format(self.source)) icon = ICONS.get(self.message_type, '') - formatted.append("
{} {}
".format(icon, self.message)) + formatted.append("
{} {}
".format(icon, text2html(self.message))) if self.action_titles: buttons = [] # type: List[str] for idx, title in enumerate(self.action_titles): - buttons.append("{}".format(idx, title)) + buttons.append("{}".format(idx, text2html(title))) formatted.append("
" + " ".join(buttons) + "
") show_lsp_popup( self.view,