diff options
-rw-r--r-- | src/main.rs | 1 | ||||
-rw-r--r-- | src/nvim_bridge/mod.rs | 28 | ||||
-rw-r--r-- | src/ui/cmdline.rs | 6 | ||||
-rw-r--r-- | src/ui/state.rs | 94 | ||||
-rw-r--r-- | src/ui/ui.rs | 1 | ||||
-rw-r--r-- | src/ui/wildmenu.rs | 5 |
6 files changed, 52 insertions, 83 deletions
diff --git a/src/main.rs b/src/main.rs index 25c940a..864619b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -178,7 +178,6 @@ async fn build(app: >k::Application, opts: &Options) -> Result<(), Error> { ui_opts.set_tabline_external(!opts.disable_ext_tabline); ui_opts.set_cmdline_external(!opts.disable_ext_cmdline); - ui_opts.set_wildmenu_external(true); nvim.ui_attach(80, 30, &ui_opts) .await .map_err(Error::from)?; diff --git a/src/nvim_bridge/mod.rs b/src/nvim_bridge/mod.rs index dad99e7..693d057 100644 --- a/src/nvim_bridge/mod.rs +++ b/src/nvim_bridge/mod.rs @@ -741,20 +741,6 @@ impl From<Value> for CmdlineBlockShow { } #[derive(Debug, PartialEq)] -pub struct WildmenuShow(pub Vec<String>); - -impl From<Value> for WildmenuShow { - fn from(args: Value) -> Self { - Self( - unwrap_array!(args[0]) - .iter() - .map(|v| unwrap_str!(v).to_string()) - .collect(), - ) - } -} - -#[derive(Debug, PartialEq)] pub struct WindowPos { pub grid: i64, pub win: Value, @@ -911,10 +897,6 @@ pub enum RedrawEvent { CmdlineBlockAppend(Vec<CmdlineBlockAppend>), CmdlineBlockHide(), - WildmenuShow(Vec<WildmenuShow>), - WildmenuHide(), - WildmenuSelect(Vec<i64>), - WindowPos(Vec<WindowPos>), WindowFloatPos(Vec<WindowFloatPos>), WindowExternalPos(Vec<WindowExternalPos>), @@ -965,9 +947,6 @@ impl fmt::Display for RedrawEvent { RedrawEvent::CmdlineBlockHide(..) => { write!(fmt, "CmdlineBlockHide") } - RedrawEvent::WildmenuShow(..) => write!(fmt, "WildmenuShow"), - RedrawEvent::WildmenuHide(..) => write!(fmt, "WildmenuHide"), - RedrawEvent::WildmenuSelect(..) => write!(fmt, "WildmenuSelect"), RedrawEvent::WindowPos(..) => write!(fmt, "WindowPos"), RedrawEvent::WindowFloatPos(..) => write!(fmt, "WindowFloatPos"), @@ -1190,13 +1169,6 @@ fn parse_single_redraw_event(cmd: &str, args: Vec<Value>) -> RedrawEvent { args.into_iter().map(CmdlineBlockAppend::from).collect(), ), "cmdline_block_hide" => RedrawEvent::CmdlineBlockHide(), - "wildmenu_show" => RedrawEvent::WildmenuShow( - args.into_iter().map(WildmenuShow::from).collect(), - ), - "wildmenu_hide" => RedrawEvent::WildmenuHide(), - "wildmenu_select" => RedrawEvent::WildmenuSelect( - args.into_iter().map(|v| unwrap_i64!(v[0])).collect(), - ), "win_pos" => RedrawEvent::WindowPos( args.into_iter().map(WindowPos::from).collect(), ), diff --git a/src/ui/cmdline.rs b/src/ui/cmdline.rs index 2123266..e3b6b19 100644 --- a/src/ui/cmdline.rs +++ b/src/ui/cmdline.rs @@ -624,7 +624,7 @@ impl Cmdline { self.block.append(line, &hl_defs); } - pub fn wildmenu_show(&mut self, items: &Vec<String>) { + pub fn wildmenu_show(&mut self, items: &Vec<nvim_bridge::CompletionItem>) { self.show_wildmenu = true; self.wildmenu.set_items(items); self.wildmenu.show(); @@ -640,8 +640,8 @@ impl Cmdline { self.fixed.check_resize(); } - pub fn wildmenu_select(&mut self, item_num: i64) { - self.wildmenu.select(item_num as i32); + pub fn wildmenu_select(&mut self, item_num: i32) { + self.wildmenu.select(item_num); } pub fn wildmenu_set_colors(&self, hl_defs: &HlDefs) { diff --git a/src/ui/state.rs b/src/ui/state.rs index 8ac6c0d..2a333d1 100644 --- a/src/ui/state.rs +++ b/src/ui/state.rs @@ -14,7 +14,7 @@ use crate::nvim_bridge::{ CmdlineSpecialChar, DefaultColorsSet, GnvimEvent, GridCursorGoto, GridLineSegment, GridResize, GridScroll, HlAttrDefine, HlGroupSet, ModeChange, ModeInfo, ModeInfoSet, MsgSetPos, Notify, OptionSet, - PopupmenuShow, RedrawEvent, TablineUpdate, WildmenuShow, WindowExternalPos, + PopupmenuShow, RedrawEvent, TablineUpdate, WindowExternalPos, WindowFloatPos, WindowPos, }; use crate::nvim_gio::GioNeovim; @@ -67,6 +67,8 @@ pub(crate) struct UIState { #[cfg(feature = "libwebkit2gtk")] pub cursor_tooltip: CursorTooltip, + pub wildmenu_shown: bool, + /// Overlay contains our grid(s) and popupmenu. #[allow(unused)] pub overlay: gtk::Overlay, @@ -421,51 +423,64 @@ impl UIState { } fn popupmenu_show(&mut self, popupmenu: PopupmenuShow) { - self.popupmenu.set_items(popupmenu.items, &self.hl_defs); + if popupmenu.grid == -1 { + self.wildmenu_shown = true; + self.cmdline.wildmenu_show(&popupmenu.items) + } else { + self.popupmenu.set_items(popupmenu.items, &self.hl_defs); - let grid = self.grids.get(&self.current_grid).unwrap(); - let mut rect = grid.get_rect_for_cell(popupmenu.row, popupmenu.col); + let grid = self.grids.get(&self.current_grid).unwrap(); + let mut rect = grid.get_rect_for_cell(popupmenu.row, popupmenu.col); - let window = self.windows.get(&popupmenu.grid).unwrap(); - rect.x += window.x as i32; - rect.y += window.y as i32; + let window = self.windows.get(&popupmenu.grid).unwrap(); + rect.x += window.x as i32; + rect.y += window.y as i32; - self.popupmenu.set_anchor(rect); - self.popupmenu - .select(popupmenu.selected as i32, &self.hl_defs); + self.popupmenu.set_anchor(rect); + self.popupmenu + .select(popupmenu.selected as i32, &self.hl_defs); - self.popupmenu.show(); + self.popupmenu.show(); - // If the cursor tooltip is visible at the same time, move - // it out of our way. - #[cfg(feature = "libwebkit2gtk")] - { - if self.cursor_tooltip.is_visible() { - if self.popupmenu.is_above_anchor() { - self.cursor_tooltip.force_gravity(Some(Gravity::Down)); - } else { - self.cursor_tooltip.force_gravity(Some(Gravity::Up)); - } + // If the cursor tooltip is visible at the same time, move + // it out of our way. + #[cfg(feature = "libwebkit2gtk")] + { + if self.cursor_tooltip.is_visible() { + if self.popupmenu.is_above_anchor() { + self.cursor_tooltip.force_gravity(Some(Gravity::Down)); + } else { + self.cursor_tooltip.force_gravity(Some(Gravity::Up)); + } - self.cursor_tooltip.refresh_position(); + self.cursor_tooltip.refresh_position(); + } } } } fn popupmenu_hide(&mut self) { - self.popupmenu.hide(); + if self.wildmenu_shown { + self.cmdline.wildmenu_hide(); + } else { + self.popupmenu.hide(); - // Undo any force positioning of cursor tool tip that might - // have occured on popupmenu show. - #[cfg(feature = "libwebkit2gtk")] - { - self.cursor_tooltip.force_gravity(None); - self.cursor_tooltip.refresh_position(); + // Undo any force positioning of cursor tool tip that might + // have occured on popupmenu show. + #[cfg(feature = "libwebkit2gtk")] + { + self.cursor_tooltip.force_gravity(None); + self.cursor_tooltip.refresh_position(); + } } } fn popupmenu_select(&mut self, selected: i64) { - self.popupmenu.select(selected as i32, &self.hl_defs); + if self.wildmenu_shown { + self.cmdline.wildmenu_select(selected as i32); + } else { + self.popupmenu.select(selected as i32, &self.hl_defs); + } } fn tabline_update( @@ -510,18 +525,6 @@ impl UIState { self.cmdline.hide_block(); } - fn wildmenu_show(&mut self, items: WildmenuShow) { - self.cmdline.wildmenu_show(&items.0); - } - - fn wildmenu_hide(&mut self) { - self.cmdline.wildmenu_hide(); - } - - fn wildmenu_select(&mut self, item: i64) { - self.cmdline.wildmenu_select(item); - } - fn window_pos( &mut self, evt: WindowPos, @@ -767,13 +770,6 @@ impl UIState { evt.into_iter().for_each(|e| self.cmdline_block_append(e)); } RedrawEvent::CmdlineBlockHide() => self.cmdline_block_hide(), - RedrawEvent::WildmenuShow(evt) => { - evt.into_iter().for_each(|e| self.wildmenu_show(e)); - } - RedrawEvent::WildmenuHide() => self.wildmenu_hide(), - RedrawEvent::WildmenuSelect(evt) => { - evt.into_iter().for_each(|e| self.wildmenu_select(e)); - } RedrawEvent::WindowPos(evt) => { evt.into_iter() .for_each(|e| self.window_pos(e, window, nvim)); diff --git a/src/ui/ui.rs b/src/ui/ui.rs index 003e62f..0a3d492 100644 --- a/src/ui/ui.rs +++ b/src/ui/ui.rs @@ -228,6 +228,7 @@ impl UI { grids, mode_infos: vec![], current_grid: 1, + wildmenu_shown: false, popupmenu: Popupmenu::new(&overlay, nvim.clone()), cmdline, overlay, diff --git a/src/ui/wildmenu.rs b/src/ui/wildmenu.rs index 44d31a2..a865f8a 100644 --- a/src/ui/wildmenu.rs +++ b/src/ui/wildmenu.rs @@ -3,6 +3,7 @@ use gtk::prelude::*; use std::cell::RefCell; use std::rc::Rc; +use crate::nvim_bridge; use crate::nvim_gio::GioNeovim; use crate::ui::color::{Color, HlDefs, HlGroup}; use crate::ui::common::spawn_local; @@ -111,11 +112,11 @@ impl Wildmenu { } } - pub fn set_items(&mut self, items: &Vec<String>) { + pub fn set_items(&mut self, items: &Vec<nvim_bridge::CompletionItem>) { self.clear(); for item in items { - let label = gtk::Label::new(Some(item.as_str())); + let label = gtk::Label::new(Some(item.word.as_str())); label.set_halign(gtk::Align::Start); let row = gtk::ListBoxRow::new(); |