Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix inconsistent popup's bottom margins #1568

Merged
merged 4 commits into from
Feb 5, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 7 additions & 14 deletions plugin/completion.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
import mdpopups
import sublime
import sublime_plugin
import webbrowser
from .core.css import css
from .core.logging import debug
from .core.edit import parse_text_edit
from .core.protocol import Request, InsertTextFormat, Range
from .core.registry import LspTextCommand
from .core.typing import Any, List, Dict, Optional, Generator, Union
from .core.views import FORMAT_STRING, FORMAT_MARKUP_CONTENT, minihtml
from .core.views import range_to_region
from .core.views import show_lsp_popup
from .core.views import update_lsp_popup


class LspResolveDocsCommand(LspTextCommand):
Expand Down Expand Up @@ -40,20 +40,18 @@ def get_content(self, documentation: str, detail: str) -> str:
if detail and not self.is_detail_shown:
content += "<div class='highlight'>{}</div>".format(detail)
if documentation:
content += "<div>{}</div>".format(documentation)
content += documentation
return content

def show_popup(self, minihtml_content: str) -> None:
viewport_width = self.view.viewport_extent()[0]
mdpopups.show_popup(
show_lsp_popup(
self.view,
minihtml_content,
flags=sublime.COOPERATE_WITH_AUTO_COMPLETE,
css=css().popups,
wrapper_class=css().popups_classname,
md=True,
max_width=viewport_width,
on_navigate=self.on_navigate
)
on_navigate=self.on_navigate)

def on_navigate(self, url: str) -> None:
webbrowser.open(url)
Expand All @@ -72,12 +70,7 @@ def handle_resolve_response(self, item: Optional[dict]) -> None:
sublime.set_timeout(lambda: show(minihtml_content))

def update_popup(self, minihtml_content: str) -> None:
mdpopups.update_popup(
self.view,
minihtml_content,
css=css().popups,
wrapper_class=css().popups_classname,
)
update_lsp_popup(self.view, minihtml_content, md=True)


class LspCompleteCommand(sublime_plugin.TextCommand):
Expand Down
11 changes: 3 additions & 8 deletions plugin/core/message_request_handler.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from .protocol import Response
from .sessions import Session
from .typing import Any, List, Callable
import mdpopups
from .views import show_lsp_popup
import sublime


Expand Down Expand Up @@ -66,15 +66,10 @@ def show_notification(view: sublime.View, source: str, message_type: int, messag
on_navigate: Callable, on_hide: Callable) -> None:
stylesheet = sublime.load_resource("Packages/LSP/notification.css")
contents = message_content(source, message_type, message, titles)
mdpopups.show_popup(
show_lsp_popup(
view,
contents,
css=stylesheet,
md=False,
location=-1,
wrapper_class='notification',
max_width=800,
max_height=800,
on_navigate=on_navigate,
on_hide=on_hide
)
on_hide=on_hide)
35 changes: 34 additions & 1 deletion plugin/core/views.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from .css import css as lsp_css
from .protocol import CompletionItemTag
from .protocol import Diagnostic
from .protocol import DiagnosticRelatedInformation
Expand All @@ -9,7 +10,7 @@
from .protocol import Point
from .protocol import Range
from .protocol import Request
from .typing import Optional, Dict, Any, Iterable, List, Union, Tuple, Sequence, cast
from .typing import Callable, Optional, Dict, Any, Iterable, List, Union, Tuple, Sequence, cast
from .url import filename_to_uri
from .url import uri_to_filename
import html
Expand Down Expand Up @@ -353,6 +354,38 @@ def text_document_code_action_params(
return params


# Workaround for a limited margin-collapsing capabilities of the minihtml.
LSP_POPUP_SPACER_HTML = '<div class="lsp_popup--spacer"></div>'


def show_lsp_popup(view: sublime.View, contents: str, location: int = -1, md: bool = False, flags: int = 0,
max_width: int = 800, max_height: int = 800,
css: Optional[str] = None, wrapper_class: Optional[str] = None,
on_navigate: Optional[Callable] = None, on_hide: Optional[Callable] = 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
mdpopups.show_popup(
view,
contents,
css=css,
md=md,
flags=flags,
location=location,
wrapper_class=wrapper_class,
max_width=max_width,
max_height=max_height,
on_navigate=on_navigate)


def update_lsp_popup(view: sublime.View, contents: str, md: bool = False, css: Optional[str] = None,
wrapper_class: Optional[str] = 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
mdpopups.update_popup(view, contents, css=css, md=md, wrapper_class=wrapper_class)


FORMAT_STRING = 0x1
FORMAT_MARKED_STRING = 0x2
FORMAT_MARKUP_CONTENT = 0x4
Expand Down
30 changes: 10 additions & 20 deletions plugin/documents.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
from .code_actions import actions_manager
from .code_actions import CodeActionsByConfigName
from .completion import LspResolveDocsCommand
from .core.css import css
from .core.logging import debug
from .core.protocol import CodeLens
from .core.protocol import Command
Expand All @@ -27,8 +26,10 @@
from .core.views import lsp_color_to_phantom
from .core.views import make_command_link
from .core.views import range_to_region
from .core.views import show_lsp_popup
from .core.views import text_document_identifier
from .core.views import text_document_position_params
from .core.views import update_lsp_popup
from .core.windows import AbstractViewListener
from .core.windows import WindowManager
from .session_buffer import SessionBuffer
Expand All @@ -37,7 +38,6 @@
from weakref import WeakSet
from weakref import WeakValueDictionary
import functools
import mdpopups
import sublime
import sublime_plugin
import webbrowser
Expand Down Expand Up @@ -417,27 +417,17 @@ def _show_sighelp_popup(self, content: str, point: int) -> None:
# TODO: There are a bunch of places in the code where we assume we have exclusive access to a popup. The reality
# is that there is really only one popup per view. Refactor everything that interacts with the popup to a common
# class.
flags = 0
flags |= sublime.HIDE_ON_MOUSE_MOVE_AWAY
flags |= sublime.COOPERATE_WITH_AUTO_COMPLETE
mdpopups.show_popup(self.view,
content,
css=css().popups,
md=False,
flags=flags,
location=point,
wrapper_class=css().popups_classname,
max_width=800,
on_hide=self._on_sighelp_hide,
on_navigate=self._on_sighelp_navigate)
show_lsp_popup(
self.view,
content,
flags=sublime.HIDE_ON_MOUSE_MOVE_AWAY | sublime.COOPERATE_WITH_AUTO_COMPLETE,
location=point,
on_hide=self._on_sighelp_hide,
on_navigate=self._on_sighelp_navigate)
self._visible = True

def _update_sighelp_popup(self, content: str) -> None:
mdpopups.update_popup(self.view,
content,
css=css().popups,
md=False,
wrapper_class=css().popups_classname)
update_lsp_popup(self.view, content)

def _on_sighelp_hide(self) -> None:
self._visible = False
Expand Down
18 changes: 4 additions & 14 deletions plugin/hover.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
from .code_actions import actions_manager
from .code_actions import CodeActionOrCommand
from .core.css import css
from .core.logging import debug
from .core.protocol import Diagnostic
from .core.protocol import Request
Expand All @@ -9,13 +8,13 @@
from .core.sessions import SessionBufferProtocol
from .core.settings import userprefs
from .core.typing import List, Optional, Any, Dict, Tuple, Sequence
from .core.views import diagnostic_severity
from .core.views import diagnostic_severity, update_lsp_popup
from .core.views import format_diagnostic_for_html
from .core.views import FORMAT_MARKED_STRING, FORMAT_MARKUP_CONTENT, minihtml
from .core.views import make_command_link
from .core.views import make_link
from .core.views import show_lsp_popup
from .core.views import text_document_position_params
import mdpopups
import sublime
import webbrowser

Expand Down Expand Up @@ -159,22 +158,13 @@ def _show_hover(self, point: int, only_diagnostics: bool) -> None:

if contents:
if self.view.is_popup_visible():
mdpopups.update_popup(
self.view,
contents,
css=css().popups,
md=False,
wrapper_class=css().popups_classname)
update_lsp_popup(self.view, contents)
else:
mdpopups.show_popup(
show_lsp_popup(
self.view,
contents,
css=css().popups,
md=False,
flags=sublime.HIDE_ON_MOUSE_MOVE_AWAY,
location=point,
wrapper_class=css().popups_classname,
max_width=800,
on_navigate=lambda href: self._on_navigate(href, point))

def _on_navigate(self, href: str, point: int) -> None:
Expand Down
7 changes: 5 additions & 2 deletions popups.css
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
.lsp_popup {
margin: 0.5rem;
margin: 0.5rem 0.5rem 0 0.5rem;
font-family: system;
}
.lsp_popup--spacer {
margin-top: 0.5rem;
}
.lsp_popup hr {
border-color: color(var(--foreground) alpha(0.10));
border-color: color(var(--foreground) alpha(0.10));
}
.highlight {
border-width: 0;
Expand Down