This commit is contained in:
2025-01-11 23:42:09 +01:00
parent 4d759e6444
commit d4d4108714
6 changed files with 122 additions and 104 deletions
+75 -51
View File
@@ -34,62 +34,61 @@ impl<'a> Frame<'a> {
}
}
if style_element.visible.1 {
let y = style_element.y.1.as_position(
style_element.outline.1,
&{
let mut y = 0;
while y < self.used.len() && self.used[y] != 0 {
y += 1;
}
y as u16
},
self.writer.size.1,
);
if let Some(y_) = self.used.get(y as usize) {
let x =
style_element
.x
.1
.as_position(style_element.outline.1, y_, self.writer.size.0);
let mut writer = crate::Writer {
focused,
style: style_element.clone(),
pos: (x, y),
size: self.writer.size,
css,
parent: Some(self.writer),
written: (0, 0),
};
element.render(&mut writer);
let (mut width, mut height) = writer.get_size_root();
if style_element.outline.1 {
width += 2;
height += 2;
}
{
let (mut x, mut y) = (x, y);
if style_element.outline.1 {
x -= 1;
y -= 1;
}
let height = if style_element.outline.1 {
height + 1
} else {
height
};
if !style_element.visible.1 {
return;
}
for i in y..y + height {
if let Some(o) = self.used.get_mut(i as usize) {
if style_element.x.1 != crate::ui::Number::Auto {
*o += x;
}
*o += width + 1;
let y = style_element.y.1.as_position(
style_element.outline.1,
&{
let mut y = 0;
while y < self.used.len() && self.used[y] != 0 {
y += 1;
}
y as u16
},
self.writer.size.1,
);
if let Some(y_) = self.used.get(y as usize) {
let x = style_element
.x
.1
.as_position(style_element.outline.1, y_, self.writer.size.0);
let mut writer = crate::Writer {
focused,
style: style_element.clone(),
pos: (x, y),
size: self.writer.size,
css,
parent: Some(self.writer),
written: (0, 0),
};
element.render(&mut writer);
let (width, height) = writer.get_size_root();
{
let (mut x, mut y) = (x, y);
if style_element.outline.1 {
x -= 1;
y -= 1;
}
let height = if style_element.outline.1 {
height + 1
} else {
height
};
for i in y..y + height {
if let Some(o) = self.used.get_mut(i as usize) {
if style_element.x.1 != crate::ui::Number::Auto {
*o += x;
}
*o += width;
}
}
writer.after_render(width, height);
}
writer.after_render(width, height);
}
}
}
@@ -112,3 +111,28 @@ pub fn show_cursor() {
pub fn flush() {
stdout().flush().unwrap();
}
pub trait VisibleLength {
fn visible_len(&self) -> usize;
}
impl VisibleLength for String {
fn visible_len(&self) -> usize {
let mut length = 0;
let mut in_escape = false;
for c in self.chars() {
if c == '\x1b' {
in_escape = true;
} else if in_escape {
if c.is_ascii_alphabetic() {
in_escape = false;
}
} else {
length += 1;
}
}
length
}
}