some refractoring and dataholder
This commit is contained in:
+50
-97
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user