Text editing lol
This commit is contained in:
parent
fab9c9464b
commit
d64583a8f4
1 changed files with 64 additions and 22 deletions
|
|
@ -162,7 +162,7 @@ struct FontMatches<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> FontMatches<'a> {
|
impl<'a> FontMatches<'a> {
|
||||||
fn shape_span(&self, string: &'a str, start_span: usize, end_span: usize) -> FontShapeSpan {
|
fn shape_span(&self, string: &str, start_span: usize, end_span: usize) -> FontShapeSpan {
|
||||||
let span = &string[start_span..end_span];
|
let span = &string[start_span..end_span];
|
||||||
|
|
||||||
let mut spans_by_font = Vec::with_capacity(self.fonts.len());
|
let mut spans_by_font = Vec::with_capacity(self.fonts.len());
|
||||||
|
|
@ -264,7 +264,7 @@ impl<'a> FontMatches<'a> {
|
||||||
spans_by_font.remove(least_misses_i).1
|
spans_by_font.remove(least_misses_i).1
|
||||||
}
|
}
|
||||||
|
|
||||||
fn shape_line(&self, string: &'a str, start_line: usize, end_line: usize) -> FontShapeLine {
|
fn shape_line(&self, string: &str, start_line: usize, end_line: usize) -> FontShapeLine {
|
||||||
use unicode_script::{Script, UnicodeScript};
|
use unicode_script::{Script, UnicodeScript};
|
||||||
|
|
||||||
let line = &string[start_line..end_line];
|
let line = &string[start_line..end_line];
|
||||||
|
|
@ -306,7 +306,7 @@ impl<'a> FontMatches<'a> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn shape(&self, string: &'a str) -> Vec<FontShapeLine> {
|
pub fn shape(&self, string: &str) -> Vec<FontShapeLine> {
|
||||||
let mut lines = Vec::new();
|
let mut lines = Vec::new();
|
||||||
|
|
||||||
let mut start = 0;
|
let mut start = 0;
|
||||||
|
|
@ -413,7 +413,7 @@ fn main() {
|
||||||
#[cfg(not(feature = "mono"))]
|
#[cfg(not(feature = "mono"))]
|
||||||
let default_text = include_str!("../res/proportional.txt");
|
let default_text = include_str!("../res/proportional.txt");
|
||||||
|
|
||||||
let text = if let Some(arg) = env::args().nth(1) {
|
let mut text = if let Some(arg) = env::args().nth(1) {
|
||||||
fs::read_to_string(&arg).expect("failed to open file")
|
fs::read_to_string(&arg).expect("failed to open file")
|
||||||
} else {
|
} else {
|
||||||
default_text.to_string()
|
default_text.to_string()
|
||||||
|
|
@ -456,31 +456,34 @@ fn main() {
|
||||||
|
|
||||||
let font_matches = font_system.matches(font_pattern).unwrap();
|
let font_matches = font_system.matches(font_pattern).unwrap();
|
||||||
|
|
||||||
let shape_lines = {
|
let mut shape_lines = Vec::new();
|
||||||
let instant = Instant::now();
|
let mut layout_lines = Vec::new();
|
||||||
|
|
||||||
let shape_lines = font_matches.shape(&text);
|
|
||||||
|
|
||||||
let duration = instant.elapsed();
|
|
||||||
println!("reshape: {:?}", duration);
|
|
||||||
|
|
||||||
shape_lines
|
|
||||||
};
|
|
||||||
|
|
||||||
let mut cursor_line = 0;
|
let mut cursor_line = 0;
|
||||||
let mut cursor_glyph = 0;
|
let mut cursor_glyph = 0;
|
||||||
let mut layout_lines = Vec::new();
|
|
||||||
let mut mouse_x = -1;
|
let mut mouse_x = -1;
|
||||||
let mut mouse_y = -1;
|
let mut mouse_y = -1;
|
||||||
let mut mouse_left = false;
|
let mut mouse_left = false;
|
||||||
let mut redraw = true;
|
let mut redraw = true;
|
||||||
let mut relayout = true;
|
let mut relayout = true;
|
||||||
|
let mut reshape = true;
|
||||||
let mut scroll = 0;
|
let mut scroll = 0;
|
||||||
loop {
|
loop {
|
||||||
let (mut font_size, mut line_height) = font_sizes[font_size_i];
|
let (mut font_size, mut line_height) = font_sizes[font_size_i];
|
||||||
font_size *= display_scale;
|
font_size *= display_scale;
|
||||||
line_height *= display_scale;
|
line_height *= display_scale;
|
||||||
|
|
||||||
|
if reshape {
|
||||||
|
let instant = Instant::now();
|
||||||
|
|
||||||
|
shape_lines = font_matches.shape(&text);
|
||||||
|
|
||||||
|
reshape = false;
|
||||||
|
relayout = true;
|
||||||
|
|
||||||
|
let duration = instant.elapsed();
|
||||||
|
println!("reshape: {:?}", duration);
|
||||||
|
}
|
||||||
|
|
||||||
if relayout {
|
if relayout {
|
||||||
let instant = Instant::now();
|
let instant = Instant::now();
|
||||||
|
|
||||||
|
|
@ -490,8 +493,8 @@ fn main() {
|
||||||
line.layout(font_size, line_width, &mut layout_lines);
|
line.layout(font_size, line_width, &mut layout_lines);
|
||||||
}
|
}
|
||||||
|
|
||||||
redraw = true;
|
|
||||||
relayout = false;
|
relayout = false;
|
||||||
|
redraw = true;
|
||||||
|
|
||||||
let duration = instant.elapsed();
|
let duration = instant.elapsed();
|
||||||
println!("relayout: {:?}", duration);
|
println!("relayout: {:?}", duration);
|
||||||
|
|
@ -591,8 +594,9 @@ fn main() {
|
||||||
redraw = true;
|
redraw = true;
|
||||||
},
|
},
|
||||||
orbclient::K_LEFT => {
|
orbclient::K_LEFT => {
|
||||||
if cursor_glyph > layout_lines[cursor_line].glyphs.len() {
|
let line = &layout_lines[cursor_line];
|
||||||
cursor_glyph = layout_lines[cursor_line].glyphs.len();
|
if cursor_glyph > line.glyphs.len() {
|
||||||
|
cursor_glyph = line.glyphs.len();
|
||||||
redraw = true;
|
redraw = true;
|
||||||
}
|
}
|
||||||
if cursor_glyph > 0 {
|
if cursor_glyph > 0 {
|
||||||
|
|
@ -601,15 +605,35 @@ fn main() {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
orbclient::K_RIGHT => {
|
orbclient::K_RIGHT => {
|
||||||
if cursor_glyph > layout_lines[cursor_line].glyphs.len() {
|
let line = &layout_lines[cursor_line];
|
||||||
cursor_glyph = layout_lines[cursor_line].glyphs.len();
|
if cursor_glyph > line.glyphs.len() {
|
||||||
|
cursor_glyph = line.glyphs.len();
|
||||||
redraw = true;
|
redraw = true;
|
||||||
}
|
}
|
||||||
if cursor_glyph < layout_lines[cursor_line].glyphs.len() {
|
if cursor_glyph < line.glyphs.len() {
|
||||||
cursor_glyph += 1;
|
cursor_glyph += 1;
|
||||||
redraw = true;
|
redraw = true;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
orbclient::K_BKSP => {
|
||||||
|
let line = &layout_lines[cursor_line];
|
||||||
|
if cursor_glyph > line.glyphs.len() {
|
||||||
|
cursor_glyph = line.glyphs.len();
|
||||||
|
redraw = true;
|
||||||
|
}
|
||||||
|
if cursor_glyph > 0 {
|
||||||
|
cursor_glyph -= 1;
|
||||||
|
text.remove(line.glyphs[cursor_glyph].start);
|
||||||
|
reshape = true;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
orbclient::K_DEL => {
|
||||||
|
let line = &layout_lines[cursor_line];
|
||||||
|
if cursor_glyph < line.glyphs.len() {
|
||||||
|
text.remove(line.glyphs[cursor_glyph].start);
|
||||||
|
reshape = true;
|
||||||
|
}
|
||||||
|
},
|
||||||
orbclient::K_0 => {
|
orbclient::K_0 => {
|
||||||
font_size_i = font_size_default;
|
font_size_i = font_size_default;
|
||||||
relayout = true;
|
relayout = true;
|
||||||
|
|
@ -625,6 +649,24 @@ fn main() {
|
||||||
_ => (),
|
_ => (),
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
EventOption::TextInput(event) => {
|
||||||
|
let line = &layout_lines[cursor_line];
|
||||||
|
if cursor_glyph >= line.glyphs.len() {
|
||||||
|
match line.glyphs.last() {
|
||||||
|
Some(glyph) => {
|
||||||
|
text.insert(glyph.end, event.character);
|
||||||
|
cursor_glyph += 1;
|
||||||
|
reshape = true;
|
||||||
|
},
|
||||||
|
None => () // TODO
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
let glyph = &line.glyphs[cursor_glyph];
|
||||||
|
text.insert(glyph.start, event.character);
|
||||||
|
cursor_glyph += 1;
|
||||||
|
reshape = true;
|
||||||
|
}
|
||||||
|
},
|
||||||
EventOption::Mouse(event) => {
|
EventOption::Mouse(event) => {
|
||||||
mouse_x = event.x;
|
mouse_x = event.x;
|
||||||
mouse_y = event.y;
|
mouse_y = event.y;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue