some refractoring and dataholder

This commit is contained in:
2024-11-25 14:30:59 +01:00
parent f8fd990c67
commit 0266c26d34
7 changed files with 116 additions and 184 deletions
+50 -97
View File
@@ -9,7 +9,7 @@
/// let frame = create_frame(50, 10);
/// render_to_frame(crate::State::Normal, 50, &mut frame, &text_element);
/// ```
use crate::{Element, Value};
use crate::Element;
use lazy_static::lazy_static;
use regex::Regex;
use std::{
@@ -99,60 +99,60 @@ impl Frame {
}
}
pub fn render(&mut self, focused: bool, element: &Element) {
// let data = element.get_data();
let output = element.render(focused);
let x;
let mut y = 0;
match output.1.y {
crate::ui::Number::Px(_y) => {
y = _y;
}
crate::ui::Number::Pe(p) => y = (self.frame.len() * p) / 100,
crate::ui::Number::Center => {
y = (self.frame.len() - output.0.matches('\n').count() + 1) / 2
}
crate::ui::Number::Auto => {
for (i, n) in self.used.iter().enumerate() {
if *n == 0 {
y = i;
break;
if let Some(output) = element.render(focused) {
let x;
let mut y = 0;
match output.1.y {
crate::ui::Number::Px(_y) => {
y = _y;
}
crate::ui::Number::Pe(p) => y = (self.frame.len() * p) / 100,
crate::ui::Number::Center => {
y = (self.frame.len() - output.0.matches('\n').count() + 1) / 2
}
crate::ui::Number::Auto => {
for (i, n) in self.used.iter().enumerate() {
if *n == 0 {
y = i;
break;
}
}
}
crate::ui::Number::Default => {
for (i, n) in self.used.iter().enumerate() {
if *n == 0 {
y = i;
break;
}
}
}
}
crate::ui::Number::Default => {
for (i, n) in self.used.iter().enumerate() {
if *n == 0 {
y = i;
break;
}
match output.1.x {
crate::ui::Number::Px(_x) => {
x = _x;
}
crate::ui::Number::Pe(p) => x = (self.width * p) / 100,
crate::ui::Number::Center => {
x = (self.width
- ANSI
.replace_all(&output.0.lines().next().unwrap_or(""), "")
.len())
/ 2;
}
crate::ui::Number::Auto => {
x = *self.used.get(y).unwrap();
}
crate::ui::Number::Default => {
x = 0;
}
}
}
match output.1.x {
crate::ui::Number::Px(_x) => {
x = _x;
}
crate::ui::Number::Pe(p) => x = (self.width * p) / 100,
crate::ui::Number::Center => {
x = (self.width
- ANSI
.replace_all(&output.0.lines().next().unwrap_or(""), "")
.len())
/ 2;
}
crate::ui::Number::Auto => {
x = *self.used.get(y).unwrap();
}
crate::ui::Number::Default => {
x = 0;
}
}
for (i, line) in output.0.split('\n').enumerate() {
if self.frame.len() > y + i {
let frame_line = self.frame.get_mut(y + i).unwrap();
let merged = merge_line(&frame_line, line, x);
*frame_line = merged.0;
*self.used.get_mut(y + i).unwrap() += merged.1.len() - 1;
for (i, line) in output.0.split('\n').enumerate() {
if self.frame.len() > y + i {
let frame_line = self.frame.get_mut(y + i).unwrap();
let merged = merge_line(&frame_line, line, x);
*frame_line = merged.0;
*self.used.get_mut(y + i).unwrap() += merged.1.len() - 1;
}
}
}
}
@@ -183,53 +183,6 @@ pub fn flush() {
stdout().flush().unwrap();
}
#[derive(Debug, Clone)]
pub enum Direction {
Left,
Right,
Up,
Down,
}
pub fn closest_component(
components: &[Element],
current_index: usize,
direction: Direction,
) -> usize {
let current = &components[current_index].get_data();
components
.iter()
.enumerate()
.filter(|(i, comp_)| {
let comp = comp_.get_data();
match direction {
Direction::Left => match comp.0 {
Value::Custom(_) => {
comp.0.get_value() < current.0.get_value() && comp.1 == current.1
}
Value::Default(_) => *i < current_index,
}, // Left
Direction::Right => match comp.0 {
Value::Custom(_) => {
comp.0.get_value() > current.0.get_value() && comp.1 == current.1
}
Value::Default(_) => *i > current_index,
}, // Right
Direction::Up => comp.1 < current.1 && comp.0.get_value() == current.0.get_value(), // Up
Direction::Down => {
comp.1 > current.1 && comp.0.get_value() == current.0.get_value()
} // Down
}
})
.min_by_key(|(_, comp_)| {
let comp = comp_.get_data();
current.0.get_value().abs_diff(comp.0.get_value()) + current.1.abs_diff(comp.1)
}) // Find the closest component
.map(|(index, _)| index) // Return the index of the closest component
.unwrap_or(current_index) // If no component is found, return the current index
}
pub fn get_term_size() -> (usize, usize) {
let (width, height) = crossterm::terminal::size().unwrap();
(width as usize, height as usize)