summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVille Hakulinen <ville.hakulinen@gmail.com>2019-06-15 19:18:14 +0300
committerVille Hakulinen <ville.hakulinen@gmail.com>2020-07-15 12:26:59 +0300
commit96ea866d018589b5bff9cc0a55218c3f33db843a (patch)
tree1b49b8c16810103caed86bab8940857463ca31d8
parent4dcf993222086ddf278e355e42d7c182e46eaccd (diff)
Wildmenu -> pmenu events MVP
-rw-r--r--src/main.rs1
-rw-r--r--src/nvim_bridge/mod.rs28
-rw-r--r--src/ui/cmdline.rs6
-rw-r--r--src/ui/state.rs94
-rw-r--r--src/ui/ui.rs1
-rw-r--r--src/ui/wildmenu.rs5
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: &gtk::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();