Refactoring, ext_cmdline window
This commit is contained in:
parent
56bc8f32de
commit
932b7d98b4
23
src/cmd_line.rs
Normal file
23
src/cmd_line.rs
Normal file
@ -0,0 +1,23 @@
|
||||
use gtk;
|
||||
use gtk::prelude::*;
|
||||
|
||||
pub struct CmdLine {
|
||||
dlg: gtk::Dialog,
|
||||
}
|
||||
|
||||
impl CmdLine {
|
||||
pub fn new() -> Self {
|
||||
let dlg = gtk::Dialog::new();
|
||||
dlg.set_modal(true);
|
||||
dlg.set_destroy_with_parent(true);
|
||||
|
||||
CmdLine {
|
||||
dlg,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn show<W: gtk::IsA<gtk::Window>>(&self, parent: &W) {
|
||||
self.dlg.set_transient_for(parent);
|
||||
self.dlg.show();
|
||||
}
|
||||
}
|
@ -43,6 +43,7 @@ mod shell;
|
||||
mod input;
|
||||
mod settings;
|
||||
mod cursor;
|
||||
mod cmd_line;
|
||||
mod shell_dlg;
|
||||
mod popup_menu;
|
||||
mod project;
|
||||
|
@ -1,30 +0,0 @@
|
||||
use ui_model;
|
||||
|
||||
pub struct CmdLine {
|
||||
content: Vec<(ui_model::Attrs, String)>,
|
||||
pos: u64,
|
||||
firstc: String,
|
||||
prompt: String,
|
||||
indent: u64,
|
||||
level: u64,
|
||||
}
|
||||
|
||||
impl CmdLine {
|
||||
pub fn new(
|
||||
content: Vec<(ui_model::Attrs, String)>,
|
||||
pos: u64,
|
||||
firstc: String,
|
||||
prompt: String,
|
||||
indent: u64,
|
||||
level: u64,
|
||||
) -> Self {
|
||||
CmdLine {
|
||||
content,
|
||||
pos,
|
||||
firstc,
|
||||
prompt,
|
||||
indent,
|
||||
level,
|
||||
}
|
||||
}
|
||||
}
|
@ -4,13 +4,11 @@ mod handler;
|
||||
mod mode_info;
|
||||
mod redraw_handler;
|
||||
mod repaint_mode;
|
||||
mod cmd_line;
|
||||
|
||||
pub use self::redraw_handler::{RedrawEvents, GuiApi};
|
||||
pub use self::repaint_mode::RepaintMode;
|
||||
pub use self::client::{NeovimClient, NeovimClientAsync, NeovimRef};
|
||||
pub use self::mode_info::{ModeInfo, CursorShape};
|
||||
pub use self::cmd_line::{CmdLine};
|
||||
|
||||
use std::error;
|
||||
use std::fmt;
|
||||
|
@ -37,7 +37,7 @@ pub trait RedrawEvents {
|
||||
|
||||
fn on_update_sp(&mut self, sp: i64) -> RepaintMode;
|
||||
|
||||
fn on_mode_change(&mut self, mode: &str, idx: u64) -> RepaintMode;
|
||||
fn on_mode_change(&mut self, mode: String, idx: u64) -> RepaintMode;
|
||||
|
||||
fn on_mouse(&mut self, on: bool) -> RepaintMode;
|
||||
|
||||
@ -45,7 +45,7 @@ pub trait RedrawEvents {
|
||||
|
||||
fn popupmenu_show(
|
||||
&mut self,
|
||||
menu: &[Vec<&str>],
|
||||
menu: Vec<Vec<String>>,
|
||||
selected: i64,
|
||||
row: u64,
|
||||
col: u64,
|
||||
@ -118,6 +118,7 @@ macro_rules! map_array {
|
||||
macro_rules! try_arg {
|
||||
($value:expr, bool) => (try_bool!($value));
|
||||
($value:expr, uint) => (try_uint!($value));
|
||||
($value:expr, int) => (try_int!($value));
|
||||
($value:expr, str) => (
|
||||
match $value {
|
||||
Value::String(s) => {
|
||||
@ -198,31 +199,18 @@ pub fn call(
|
||||
call!(ui->on_set_scroll_region(args: uint, uint, uint, uint));
|
||||
RepaintMode::Nothing
|
||||
}
|
||||
"scroll" => ui.on_scroll(try_int!(args[0])),
|
||||
"update_bg" => ui.on_update_bg(try_int!(args[0])),
|
||||
"update_fg" => ui.on_update_fg(try_int!(args[0])),
|
||||
"update_sp" => ui.on_update_sp(try_int!(args[0])),
|
||||
"mode_change" => ui.on_mode_change(try_str!(args[0]), try_uint!(args[1])),
|
||||
"scroll" => call!(ui->on_scroll(args: int)),
|
||||
"update_bg" => call!(ui->on_update_bg(args: int)),
|
||||
"update_fg" => call!(ui->on_update_fg(args: int)),
|
||||
"update_sp" => call!(ui->on_update_sp(args: int)),
|
||||
"mode_change" => call!(ui->on_mode_change(args: str, uint)),
|
||||
"mouse_on" => ui.on_mouse(true),
|
||||
"mouse_off" => ui.on_mouse(false),
|
||||
"busy_start" => ui.on_busy(true),
|
||||
"busy_stop" => ui.on_busy(false),
|
||||
"popupmenu_show" => {
|
||||
let menu_items = map_array!(args[0], "Error get menu list array", |item| {
|
||||
map_array!(item, "Error get menu item array", |col| {
|
||||
col.as_str().ok_or("Error get menu column")
|
||||
})
|
||||
})?;
|
||||
|
||||
ui.popupmenu_show(
|
||||
&menu_items,
|
||||
try_int!(args[1]),
|
||||
try_uint!(args[2]),
|
||||
try_uint!(args[3]),
|
||||
)
|
||||
}
|
||||
"popupmenu_show" => call!(ui->popupmenu_show(args: ext, int, uint, uint)),
|
||||
"popupmenu_hide" => ui.popupmenu_hide(),
|
||||
"popupmenu_select" => ui.popupmenu_select(try_int!(args[0])),
|
||||
"popupmenu_select" => call!(ui->popupmenu_select(args: int)),
|
||||
"tabline_update" => {
|
||||
let tabs_out = map_array!(args[1], "Error get tabline list".to_owned(), |tab| {
|
||||
tab.as_map()
|
||||
|
@ -10,9 +10,10 @@ use gdk::{EventButton, EventType};
|
||||
use neovim_lib::{Neovim, NeovimApi};
|
||||
|
||||
use color::ColorModel;
|
||||
use nvim::{self, ErrorReport};
|
||||
use nvim::{self, ErrorReport, NeovimClient};
|
||||
use shell;
|
||||
use input;
|
||||
use render;
|
||||
|
||||
const MAX_VISIBLE_ROWS: i32 = 10;
|
||||
|
||||
@ -41,25 +42,25 @@ impl State {
|
||||
}
|
||||
}
|
||||
|
||||
fn before_show(&mut self, shell: &shell::State, menu_items: &[Vec<&str>], selected: i64) {
|
||||
fn before_show(&mut self, ctx: PopupMenuContext) {
|
||||
if self.nvim.is_none() {
|
||||
self.nvim = Some(shell.nvim_clone());
|
||||
self.nvim = Some(ctx.nvim.clone());
|
||||
}
|
||||
|
||||
self.update_tree(menu_items, shell);
|
||||
self.select(selected);
|
||||
self.update_tree(&ctx);
|
||||
self.select(ctx.selected);
|
||||
}
|
||||
|
||||
fn update_tree(&self, menu: &[Vec<&str>], shell: &shell::State) {
|
||||
if menu.is_empty() {
|
||||
fn update_tree(&self, ctx: &PopupMenuContext) {
|
||||
if ctx.menu_items.is_empty() {
|
||||
return;
|
||||
}
|
||||
|
||||
self.renderer.set_property_font(
|
||||
Some(&shell.get_font_desc().to_string()),
|
||||
);
|
||||
self.renderer.set_property_font(Some(
|
||||
&ctx.font_ctx.font_description().to_string(),
|
||||
));
|
||||
|
||||
let color_model = &shell.color_model;
|
||||
let color_model = &ctx.color_model;
|
||||
self.renderer.set_property_foreground_rgba(
|
||||
Some(&color_model.pmenu_fg().into()),
|
||||
);
|
||||
@ -69,7 +70,7 @@ impl State {
|
||||
|
||||
self.update_css(color_model);
|
||||
|
||||
let col_count = menu[0].len();
|
||||
let col_count = ctx.menu_items[0].len();
|
||||
let columns = self.tree.get_columns();
|
||||
|
||||
if columns.len() != col_count {
|
||||
@ -85,7 +86,7 @@ impl State {
|
||||
let list_store = gtk::ListStore::new(&vec![gtk::Type::String; col_count]);
|
||||
let all_column_ids: Vec<u32> = (0..col_count).map(|i| i as u32).collect();
|
||||
|
||||
for line in menu {
|
||||
for line in ctx.menu_items {
|
||||
let line_array: Vec<&glib::ToValue> =
|
||||
line.iter().map(|v| v as &glib::ToValue).collect();
|
||||
list_store.insert_with_values(None, &all_column_ids, &line_array[..]);
|
||||
@ -215,30 +216,17 @@ impl PopupMenu {
|
||||
self.open
|
||||
}
|
||||
|
||||
pub fn show(
|
||||
&mut self,
|
||||
shell: &shell::State,
|
||||
menu_items: &[Vec<&str>],
|
||||
selected: i64,
|
||||
x: i32,
|
||||
y: i32,
|
||||
width: i32,
|
||||
height: i32,
|
||||
) {
|
||||
pub fn show(&mut self, ctx: PopupMenuContext) {
|
||||
|
||||
self.open = true;
|
||||
|
||||
self.popover.set_pointing_to(>k::Rectangle {
|
||||
x,
|
||||
y,
|
||||
width,
|
||||
height,
|
||||
x: ctx.x,
|
||||
y: ctx.y,
|
||||
width: ctx.width,
|
||||
height: ctx.height,
|
||||
});
|
||||
self.state.borrow_mut().before_show(
|
||||
shell,
|
||||
menu_items,
|
||||
selected,
|
||||
);
|
||||
self.state.borrow_mut().before_show(ctx);
|
||||
self.popover.popup()
|
||||
}
|
||||
|
||||
@ -255,6 +243,17 @@ impl PopupMenu {
|
||||
}
|
||||
}
|
||||
|
||||
pub struct PopupMenuContext<'a> {
|
||||
pub nvim: &'a Rc<NeovimClient>,
|
||||
pub color_model: &'a ColorModel,
|
||||
pub font_ctx: &'a render::Context,
|
||||
pub menu_items: &'a [Vec<String>],
|
||||
pub selected: i64,
|
||||
pub x: i32,
|
||||
pub y: i32,
|
||||
pub width: i32,
|
||||
pub height: i32,
|
||||
}
|
||||
|
||||
fn tree_button_press(tree: >k::TreeView, ev: &EventButton, nvim: &mut Neovim) -> Inhibit {
|
||||
if ev.get_event_type() != EventType::ButtonPress {
|
||||
|
55
src/shell.rs
55
src/shell.rs
@ -23,14 +23,14 @@ use ui_model::{UiModel, Attrs, ModelRect};
|
||||
use color::{ColorModel, Color, COLOR_BLACK, COLOR_WHITE, COLOR_RED};
|
||||
|
||||
use nvim::{self, RedrawEvents, GuiApi, RepaintMode, ErrorReport, NeovimClient, NeovimRef,
|
||||
NeovimClientAsync, CmdLine};
|
||||
NeovimClientAsync};
|
||||
|
||||
use input;
|
||||
use input::keyval_to_input_string;
|
||||
use input::{self, keyval_to_input_string};
|
||||
use cursor::Cursor;
|
||||
use ui::UiMutex;
|
||||
use popup_menu::PopupMenu;
|
||||
use popup_menu::{self, PopupMenu};
|
||||
use tabline::Tabline;
|
||||
use cmd_line::CmdLine;
|
||||
use error;
|
||||
use mode;
|
||||
use render;
|
||||
@ -66,7 +66,8 @@ pub struct State {
|
||||
nvim: Rc<NeovimClient>,
|
||||
pub font_ctx: render::Context,
|
||||
cursor: Option<Cursor>,
|
||||
popup_menu: RefCell<PopupMenu>,
|
||||
popup_menu: PopupMenu,
|
||||
cmd_line: CmdLine,
|
||||
settings: Rc<RefCell<Settings>>,
|
||||
|
||||
pub mode: mode::Mode,
|
||||
@ -88,7 +89,7 @@ pub struct State {
|
||||
impl State {
|
||||
pub fn new(settings: Rc<RefCell<Settings>>, options: ShellOptions) -> State {
|
||||
let drawing_area = gtk::DrawingArea::new();
|
||||
let popup_menu = RefCell::new(PopupMenu::new(&drawing_area));
|
||||
let popup_menu = PopupMenu::new(&drawing_area);
|
||||
let font_ctx = render::Context::new(FontDescription::from_string(DEFAULT_FONT_NAME));
|
||||
|
||||
State {
|
||||
@ -100,6 +101,7 @@ impl State {
|
||||
font_ctx,
|
||||
cursor: None,
|
||||
popup_menu,
|
||||
cmd_line: CmdLine::new(),
|
||||
settings,
|
||||
|
||||
mode: mode::Mode::new(),
|
||||
@ -183,7 +185,7 @@ impl State {
|
||||
}
|
||||
|
||||
fn close_popup_menu(&self) {
|
||||
if self.popup_menu.borrow().is_open() {
|
||||
if self.popup_menu.is_open() {
|
||||
if let Some(mut nvim) = self.nvim() {
|
||||
nvim.input("<Esc>").report_err(&mut *nvim);
|
||||
}
|
||||
@ -306,6 +308,14 @@ impl State {
|
||||
|
||||
}
|
||||
|
||||
fn get_window(&self) -> gtk::Window {
|
||||
self.drawing_area
|
||||
.get_toplevel()
|
||||
.unwrap()
|
||||
.downcast()
|
||||
.unwrap()
|
||||
}
|
||||
|
||||
fn resize_main_window(&mut self) {
|
||||
let &CellMetrics {
|
||||
line_height,
|
||||
@ -319,11 +329,7 @@ impl State {
|
||||
let request_width = (self.model.columns as f64 * char_width) as i32;
|
||||
|
||||
if width != request_width || height != request_height {
|
||||
let window: gtk::Window = self.drawing_area
|
||||
.get_toplevel()
|
||||
.unwrap()
|
||||
.downcast()
|
||||
.unwrap();
|
||||
let window = self.get_window();
|
||||
let (win_width, win_height) = window.get_size();
|
||||
let h_border = win_width - width;
|
||||
let v_border = win_height - height;
|
||||
@ -998,8 +1004,8 @@ impl RedrawEvents for State {
|
||||
RepaintMode::Nothing
|
||||
}
|
||||
|
||||
fn on_mode_change(&mut self, mode: &str, idx: u64) -> RepaintMode {
|
||||
self.mode.update(mode, idx as usize);
|
||||
fn on_mode_change(&mut self, mode: String, idx: u64) -> RepaintMode {
|
||||
self.mode.update(&mode, idx as usize);
|
||||
RepaintMode::Area(self.model.cur_point())
|
||||
}
|
||||
|
||||
@ -1019,7 +1025,7 @@ impl RedrawEvents for State {
|
||||
|
||||
fn popupmenu_show(
|
||||
&mut self,
|
||||
menu: &[Vec<&str>],
|
||||
menu: Vec<Vec<String>>,
|
||||
selected: i64,
|
||||
row: u64,
|
||||
col: u64,
|
||||
@ -1027,26 +1033,30 @@ impl RedrawEvents for State {
|
||||
let point = ModelRect::point(col as usize, row as usize);
|
||||
let (x, y, width, height) = point.to_area(self.font_ctx.cell_metrics());
|
||||
|
||||
self.popup_menu.borrow_mut().show(
|
||||
self,
|
||||
menu,
|
||||
let context = popup_menu::PopupMenuContext {
|
||||
nvim: &self.nvim,
|
||||
color_model: &self.color_model,
|
||||
font_ctx: &self.font_ctx,
|
||||
menu_items: &menu,
|
||||
selected,
|
||||
x,
|
||||
y,
|
||||
width,
|
||||
height,
|
||||
);
|
||||
height
|
||||
};
|
||||
|
||||
self.popup_menu.show(context);
|
||||
|
||||
RepaintMode::Nothing
|
||||
}
|
||||
|
||||
fn popupmenu_hide(&mut self) -> RepaintMode {
|
||||
self.popup_menu.borrow_mut().hide();
|
||||
self.popup_menu.hide();
|
||||
RepaintMode::Nothing
|
||||
}
|
||||
|
||||
fn popupmenu_select(&mut self, selected: i64) -> RepaintMode {
|
||||
self.popup_menu.borrow().select(selected);
|
||||
self.popup_menu.select(selected);
|
||||
RepaintMode::Nothing
|
||||
}
|
||||
|
||||
@ -1079,6 +1089,7 @@ impl RedrawEvents for State {
|
||||
indent: u64,
|
||||
level: u64,
|
||||
) -> RepaintMode {
|
||||
self.cmd_line.show(&self.get_window());
|
||||
// TODO: implement
|
||||
RepaintMode::Nothing
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user