Improve code action picker by displaying it inline

pull/1608/head
Blaž Hrastnik 2 years ago
parent 4c996f43df
commit f7f55143a1

@ -3482,12 +3482,17 @@ pub fn code_action(cx: &mut Context) {
cx.callback( cx.callback(
future, future,
move |_editor: &mut Editor, move |editor: &mut Editor,
compositor: &mut Compositor, compositor: &mut Compositor,
response: Option<lsp::CodeActionResponse>| { response: Option<lsp::CodeActionResponse>| {
if let Some(actions) = response { if let Some(actions) = response {
if actions.is_empty() {
editor.set_status("No code actions available".to_owned());
return;
}
let picker = Picker::new( let picker = Picker::new(
true, false,
actions, actions,
|action| match action { |action| match action {
lsp::CodeActionOrCommand::CodeAction(action) => { lsp::CodeActionOrCommand::CodeAction(action) => {
@ -3515,7 +3520,8 @@ pub fn code_action(cx: &mut Context) {
} }
}, },
); );
compositor.push(Box::new(picker)) let popup = Popup::new("code-action", picker);
compositor.push(Box::new(popup))
} }
}, },
) )

@ -393,6 +393,16 @@ fn inner_rect(area: Rect) -> Rect {
} }
impl<T: 'static> Component for Picker<T> { impl<T: 'static> Component for Picker<T> {
fn required_size(&mut self, viewport: (u16, u16)) -> Option<(u16, u16)> {
let max_width = 50.min(viewport.0);
let max_height = 10.min(viewport.1.saturating_sub(2)); // add some spacing in the viewport
let height = (self.options.len() as u16 + 4) // add some spacing for input + padding
.min(max_height);
let width = max_width;
Some((width, height))
}
fn handle_event(&mut self, event: Event, cx: &mut Context) -> EventResult { fn handle_event(&mut self, event: Event, cx: &mut Context) -> EventResult {
let key_event = match event { let key_event = match event {
Event::Key(event) => event, Event::Key(event) => event,

Loading…
Cancel
Save