on master help sign in
Prevent multiple code action popups
5995568Gokul Soumya
helix-term/src/commands.rs+3−11
@@ -2792,11 +2792,7 @@ pub mod cmd {
2792 Box::new(move |editor: &mut Editor, compositor: &mut Compositor| {
2792 Box::new(move |editor: &mut Editor, compositor: &mut Compositor| {
2793 let contents = ui::Markdown::new(contents, editor.syn_loader.clone());
2793 let contents = ui::Markdown::new(contents, editor.syn_loader.clone());
2794 let popup = Popup::new("hover", contents);
2794 let popup = Popup::new("hover", contents);
2795− if let Some(doc_popup) = compositor.find_id("hover") {
2795+ compositor.replace_or_push("hover", Box::new(popup));
2796− *doc_popup = popup;
2797− } else {
2798− compositor.push(Box::new(popup));
2799− }
2800 });
2796 });
2801 Ok(call)
2797 Ok(call)
2802 };
2798 };
@@ -3537,7 +3533,7 @@ pub fn code_action(cx: &mut Context) {
3537 vertical: 1,
3533 vertical: 1,
3538 horizontal: 1,
3534 horizontal: 1,
3539 });
3535 });
3540− compositor.push(Box::new(popup))
3536+ compositor.replace_or_push("code-action", Box::new(popup));
3541 },
3537 },
3542 )
3538 )
3543}
3539}
@@ -5465,11 +5461,7 @@ fn hover(cx: &mut Context) {
5465 let contents =
5461 let contents =
5466 ui::Markdown::new(contents, editor.syn_loader.clone()).style_group("hover");
5462 ui::Markdown::new(contents, editor.syn_loader.clone()).style_group("hover");
5467 let popup = Popup::new("hover", contents);
5463 let popup = Popup::new("hover", contents);
5468− if let Some(doc_popup) = compositor.find_id("hover") {
5464+ compositor.replace_or_push("hover", Box::new(popup));
5469− *doc_popup = popup;
5470− } else {
5471− compositor.push(Box::new(popup));
5472− }
5473 }
5465 }
5474 },
5466 },
5475 );
5467 );
helix-term/src/compositor.rs+10
@@ -126,6 +126,16 @@ impl Compositor {
126 self.layers.push(layer);
126 self.layers.push(layer);
127 }
127 }
128
128
129+ /// Replace a component that has the given `id` with the new layer and if
130+ /// no component is found, push the layer normally.
131+ pub fn replace_or_push(&mut self, id: &'static str, layer: Box<dyn Component>) {
132+ if let Some(component) = self.find_id(id) {
133+ *component = layer;
134+ } else {
135+ self.push(layer)
136+ }
137+ }
138+
129 pub fn pop(&mut self) -> Option<Box<dyn Component>> {
139 pub fn pop(&mut self) -> Option<Box<dyn Component>> {
130 self.layers.pop()
140 self.layers.pop()
131 }
141 }