double width chars

This commit is contained in:
daa 2018-03-25 16:29:59 +03:00
parent f8bce73ac0
commit adec73ab81
5 changed files with 33 additions and 6 deletions

7
Cargo.lock generated
View File

@ -394,6 +394,7 @@ dependencies = [
"serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_json 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)",
"toml 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
"unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
@ -681,6 +682,11 @@ dependencies = [
"serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "unicode-width"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "unicode-xid"
version = "0.0.4"
@ -811,6 +817,7 @@ dependencies = [
"checksum thread_local 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "279ef31c19ededf577bfd12dfae728040a21f635b06a24cd670ff510edd38963"
"checksum time 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "a15375f1df02096fb3317256ce2cee6a1f42fc84ea5ad5fc8c421cfe40c73098"
"checksum toml 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "a7540f4ffc193e0d3c94121edb19b055670d369f77d5804db11ae053a45b6e7e"
"checksum unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "bf3a113775714a22dcb774d8ea3655c53a32debae63a063acc00a91cc586245f"
"checksum unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc"
"checksum unix_socket 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6aa2700417c405c38f5e6902d699345241c28c0b7ade4abaad71e35a87eb1564"
"checksum unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56"

View File

@ -35,6 +35,7 @@ rmpv = "0.4"
percent-encoding = "1.0"
regex = "0.2"
lazy_static = "1.0"
unicode-width = "0.1.4"
serde = "1.0"
serde_derive = "1.0"

View File

@ -24,7 +24,6 @@ pub struct Level {
}
impl Level {
//TODO: double width chars render, also note in text wrapping
//TODO: im
pub fn insert(&mut self, c: &str, shift: bool, render_state: &shell::RenderState) {

View File

@ -23,6 +23,7 @@ extern crate percent_encoding;
extern crate phf;
extern crate rmpv;
extern crate regex;
extern crate unicode_width;
extern crate serde;
#[macro_use]

View File

@ -1,5 +1,7 @@
use std::cmp::max;
use unicode_width::UnicodeWidthChar;
use ui_model::{Attrs, UiModel};
pub struct ModelLayout {
@ -116,19 +118,24 @@ impl ModelLayout {
for content in lines {
for &(ref attr, ref ch_list) in content {
for ch in ch_list {
if col_idx >= self.model.columns {
let ch_width = ch.width().unwrap_or(1);
if col_idx + ch_width > self.model.columns {
col_idx = 0;
row_idx += 1;
}
self.model.set_cursor(row_idx, col_idx as usize);
self.model.put(*ch, false, attr.as_ref());
if max_col_idx < col_idx {
max_col_idx = col_idx;
if ch_width > 1 {
self.model.put(' ', true, attr.as_ref());
}
col_idx += 1;
if max_col_idx < col_idx {
max_col_idx = col_idx + ch_width - 1;
}
col_idx += ch_width;
}
if col_idx < self.model.columns {
@ -229,4 +236,16 @@ mod tests {
assert_eq!(3, cols);
assert_eq!('b', model.model.model()[0].line[1].ch);
}
#[test]
fn test_double_width() {
let lines = vec![vec![(None, vec!['あ'; 3])]; 1];
let mut model = ModelLayout::new(7);
model.layout(lines);
model.set_cursor(1);
let (cols, rows) = model.size();
assert_eq!(1, rows);
assert_eq!(6, cols);
}
}