Starting point on conversion cmdline input to UiModel

This commit is contained in:
daa 2017-11-19 12:44:28 +03:00
parent 333c28e066
commit f58e398c48
3 changed files with 50 additions and 9 deletions

View File

@ -1,9 +1,46 @@
use std::collections::HashMap;
use gtk;
use gtk::prelude::*;
//TODO: levels
use neovim_lib::Value;
use ui_model::{UiModel, Attrs};
pub struct Level {
model: UiModel,
}
impl Level {
const COLUMNS_STEP: u64 = 50;
pub fn from(
content: Vec<(HashMap<String, Value>, String)>,
pos: u64,
firstc: String,
prompt: String,
indent: u64,
level: u64,
) -> Self {
//TODO: double width chars
//TODO: multiline prompt
let content: Vec<(Attrs, Vec<char>)> = content
.iter()
.map(|c| (Attrs::from_value_map(&c.0), c.1.chars().collect()))
.collect();
let width = content.iter().map(|c| c.1.len()).count() as u64 + indent + 1/*firstc*/;
let columns = ((width / Level::COLUMNS_STEP) + 1) * Level::COLUMNS_STEP;
let model = UiModel::new(1, columns);
Level { model }
}
}
pub struct CmdLine {
popover: gtk::Popover,
levels: Vec<Level>,
}
impl CmdLine {
@ -19,11 +56,13 @@ impl CmdLine {
popover.add(&edit_frame);
CmdLine {
levels: Vec::new(),
popover,
}
}
pub fn show(&self) {
pub fn show_level(&mut self, level: Level) {
self.levels.push(level);
self.popover.popup();
}
}

View File

@ -30,7 +30,7 @@ use cursor::Cursor;
use ui::UiMutex;
use popup_menu::{self, PopupMenu};
use tabline::Tabline;
use cmd_line::CmdLine;
use cmd_line::{self, CmdLine};
use error;
use mode;
use render;
@ -915,7 +915,9 @@ impl RedrawEvents for State {
}
fn on_put(&mut self, text: String) -> RepaintMode {
RepaintMode::Area(self.model.put(&text, self.cur_attrs.as_ref()))
let ch = text.chars().last().unwrap_or(' ');
let double_width = text.is_empty();
RepaintMode::Area(self.model.put(ch, double_width, self.cur_attrs.as_ref()))
}
fn on_clear(&mut self) -> RepaintMode {
@ -1090,8 +1092,8 @@ impl RedrawEvents for State {
indent: u64,
level: u64,
) -> RepaintMode {
self.cmd_line.show();
// TODO: implement
let level = cmd_line::Level::from(content, pos, firstc, prompt, indent, level);
self.cmd_line.show_level(level);
RepaintMode::Nothing
}
}

View File

@ -91,16 +91,16 @@ impl UiModel {
(self.cur_row, self.cur_col)
}
pub fn put(&mut self, text: &str, attrs: Option<&Attrs>) -> ModelRect {
pub fn put(&mut self, ch: char, double_width: bool, attrs: Option<&Attrs>) -> ModelRect {
let mut changed_region = self.cur_point();
let line = &mut self.model[self.cur_row];
line.dirty_line = true;
let cell = &mut line[self.cur_col];
cell.ch = text.chars().last().unwrap_or(' ');
cell.ch = ch;
cell.attrs = attrs.map(Attrs::clone).unwrap_or_else(Attrs::new);
cell.attrs.double_width = text.is_empty();
cell.attrs.double_width = double_width;
cell.dirty = true;
self.cur_col += 1;
if self.cur_col >= self.columns {