e
e
This commit is contained in:
@@ -1,7 +1,12 @@
|
|||||||
|
use crate::kernel::render::{BUFFER_HEIGHT, BUFFER_WIDTH, RENDERER};
|
||||||
use crate::std::io::Frame;
|
use crate::std::io::Frame;
|
||||||
use alloc::{vec::Vec, vec, boxed::Box, string::ToString};
|
use crate::{print, println};
|
||||||
use crate::kernel::render::{BUFFER_WIDTH, BUFFER_HEIGHT, RENDERER};
|
use alloc::{
|
||||||
use crate::{println, print};
|
boxed::Box,
|
||||||
|
string::{String, ToString},
|
||||||
|
vec,
|
||||||
|
vec::Vec,
|
||||||
|
};
|
||||||
/*
|
/*
|
||||||
|
|
||||||
- this library will provide useful structures for creating simple
|
- this library will provide useful structures for creating simple
|
||||||
@@ -9,25 +14,23 @@ use crate::{println, print};
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// all interface elements must implement this trait in order to be
|
/// all interface elements must implement this trait in order to be
|
||||||
/// rendered on the screen
|
/// rendered on the screen
|
||||||
trait Element { // default behaviour for all elements
|
pub trait Element {
|
||||||
|
// default behaviour for all elements
|
||||||
|
|
||||||
fn render(&self) -> (Vec<Vec<char>>, (usize, usize)) { // recursive method for rendering the
|
fn render(&self) -> (Vec<Vec<char>>, (usize, usize)) {
|
||||||
// specified frame to the screen
|
// recursive method for rendering the
|
||||||
|
// specified frame to the screen
|
||||||
// insert rendering code for specific frame here
|
// insert rendering code for specific frame here
|
||||||
// this should also render all children of the element
|
// this should also render all children of the element
|
||||||
(Vec::<Vec<char>>::new(), (0, 0))
|
(Vec::<Vec<char>>::new(), (0, 0))
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub struct Container {
|
||||||
|
// a simple container objects for grouping
|
||||||
pub struct Container { // a simple container objects for grouping
|
// other containers together
|
||||||
// other containers together
|
|
||||||
frame: Vec<Vec<char>>,
|
frame: Vec<Vec<char>>,
|
||||||
elements: Vec<Box<dyn Element>>,
|
elements: Vec<Box<dyn Element>>,
|
||||||
position: (usize, usize), // x,y
|
position: (usize, usize), // x,y
|
||||||
@@ -37,7 +40,6 @@ pub struct Container { // a simple container objects for grouping
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Container {
|
impl Container {
|
||||||
|
|
||||||
fn new(position: (usize, usize), dimensions: (usize, usize), outlined: bool) -> Container {
|
fn new(position: (usize, usize), dimensions: (usize, usize), outlined: bool) -> Container {
|
||||||
Self {
|
Self {
|
||||||
frame: vec![vec![' '; dimensions.0 as usize]; dimensions.1 as usize],
|
frame: vec![vec![' '; dimensions.0 as usize]; dimensions.1 as usize],
|
||||||
@@ -48,14 +50,13 @@ impl Container {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
fn place(&self, element: Vec<Vec<char>>) {
|
fn place(&self, element: Vec<Vec<char>>) {
|
||||||
return // unimplemented
|
return; // unimplemented
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Element for Container {
|
impl Element for Container {
|
||||||
|
fn render(&self) -> (Vec<Vec<char>>, (usize, usize)) {
|
||||||
fn render(&self) -> (Vec<Vec<char>>, (usize, usize)) { // returns all elements as a single frame
|
// returns all elements as a single frame
|
||||||
|
|
||||||
let mut charmap = Vec::<Vec<char>>::new();
|
let mut charmap = Vec::<Vec<char>>::new();
|
||||||
|
|
||||||
@@ -63,27 +64,24 @@ impl Element for Container {
|
|||||||
let mut midlines: Vec<char>;
|
let mut midlines: Vec<char>;
|
||||||
let mut lastline: Vec<char>;
|
let mut lastline: Vec<char>;
|
||||||
|
|
||||||
|
|
||||||
if self.outlined {
|
if self.outlined {
|
||||||
frstline = vec!['┌'];
|
frstline = vec!['┌'];
|
||||||
midlines = vec!['│'];
|
midlines = vec!['│'];
|
||||||
lastline = vec!['└'];
|
lastline = vec!['└'];
|
||||||
|
|
||||||
frstline.append(&mut vec!['─'; self.dimensions.0 -2]);
|
frstline.append(&mut vec!['─'; self.dimensions.0 - 2]);
|
||||||
midlines.append(&mut vec![' '; self.dimensions.0 -2]);
|
midlines.append(&mut vec![' '; self.dimensions.0 - 2]);
|
||||||
lastline.append(&mut vec!['─'; self.dimensions.0 -2]);
|
lastline.append(&mut vec!['─'; self.dimensions.0 - 2]);
|
||||||
|
|
||||||
frstline.append(&mut vec!['┐']);
|
frstline.append(&mut vec!['┐']);
|
||||||
midlines.append(&mut vec!['│']);
|
midlines.append(&mut vec!['│']);
|
||||||
lastline.append(&mut vec!['┘']);
|
lastline.append(&mut vec!['┘']);
|
||||||
|
|
||||||
|
|
||||||
charmap.push(frstline);
|
charmap.push(frstline);
|
||||||
for _ in 0..self.dimensions.1 -2 {
|
for _ in 0..self.dimensions.1 - 2 {
|
||||||
charmap.push(midlines.clone());
|
charmap.push(midlines.clone());
|
||||||
}
|
}
|
||||||
charmap.push(lastline);
|
charmap.push(lastline);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// render child elements
|
// render child elements
|
||||||
@@ -93,25 +91,21 @@ impl Element for Container {
|
|||||||
|
|
||||||
// rendering code for child elements goes here
|
// rendering code for child elements goes here
|
||||||
|
|
||||||
|
|
||||||
// code to render the object at the position marked by offset within the container
|
// code to render the object at the position marked by offset within the container
|
||||||
|
|
||||||
|
|
||||||
for (i, row) in r.0.iter().enumerate() {
|
for (i, row) in r.0.iter().enumerate() {
|
||||||
for (j, chr) in row.iter().enumerate() { // r.0 is the rendered element
|
for (j, chr) in row.iter().enumerate() {
|
||||||
// r.1.0 is the x offset
|
// r.0 is the rendered element
|
||||||
charmap[i + r.1.1][j + r.1.0] = *chr; // r.1.1 is the y offset
|
// r.1.0 is the x offset
|
||||||
|
charmap[i + r.1 .1][j + r.1 .0] = *chr; // r.1.1 is the y offset
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return (charmap, self.position);
|
return (charmap, self.position);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
pub struct IndicatorBar {
|
pub struct IndicatorBar {
|
||||||
length: usize,
|
length: usize,
|
||||||
filled: usize,
|
filled: usize,
|
||||||
@@ -121,9 +115,15 @@ pub struct IndicatorBar {
|
|||||||
|
|
||||||
impl IndicatorBar {
|
impl IndicatorBar {
|
||||||
fn new(position: (usize, usize), length: usize) -> IndicatorBar {
|
fn new(position: (usize, usize), length: usize) -> IndicatorBar {
|
||||||
IndicatorBar { position, length, abs: 0, filled: 0 }
|
IndicatorBar {
|
||||||
|
position,
|
||||||
|
length,
|
||||||
|
abs: 0,
|
||||||
|
filled: 0,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
fn set_value(&mut self, value: usize) { // takes a value from 1-100%
|
fn set_value(&mut self, value: usize) {
|
||||||
|
// takes a value from 1-100%
|
||||||
// and turns it into a corresponding length filled
|
// and turns it into a corresponding length filled
|
||||||
self.filled = value
|
self.filled = value
|
||||||
}
|
}
|
||||||
@@ -137,25 +137,17 @@ impl Element for IndicatorBar {
|
|||||||
let mut line = Vec::<char>::new();
|
let mut line = Vec::<char>::new();
|
||||||
line.append(&mut (self.abs.to_string().chars().collect()));
|
line.append(&mut (self.abs.to_string().chars().collect()));
|
||||||
line.append(&mut vec!['▓'; relfilled]);
|
line.append(&mut vec!['▓'; relfilled]);
|
||||||
line.append(&mut vec!['░'; self.length-numlen-relfilled]);
|
line.append(&mut vec!['░'; self.length - numlen - relfilled]);
|
||||||
|
|
||||||
|
|
||||||
let mut rendered = Vec::new();
|
let mut rendered = Vec::new();
|
||||||
rendered.push(line);
|
rendered.push(line);
|
||||||
|
|
||||||
|
|
||||||
println!("RENDERED: {:?}", rendered);
|
println!("RENDERED: {:?}", rendered);
|
||||||
|
|
||||||
return (rendered, (self.position))
|
return (rendered, (self.position));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// functions that deal with the rendering and interaction between objects being
|
// functions that deal with the rendering and interaction between objects being
|
||||||
// rendered.
|
// rendered.
|
||||||
|
|
||||||
@@ -163,19 +155,17 @@ pub fn render_frame(elements: Vec<Container>) {
|
|||||||
let mut buffer: Frame = [[' '; BUFFER_WIDTH]; BUFFER_HEIGHT];
|
let mut buffer: Frame = [[' '; BUFFER_WIDTH]; BUFFER_HEIGHT];
|
||||||
|
|
||||||
for frame in elements.iter() {
|
for frame in elements.iter() {
|
||||||
|
|
||||||
let f = frame.render();
|
let f = frame.render();
|
||||||
|
|
||||||
for (i, row) in f.0.iter().enumerate() {
|
for (i, row) in f.0.iter().enumerate() {
|
||||||
for (j, chr) in row.iter().enumerate() {
|
for (j, chr) in row.iter().enumerate() {
|
||||||
let mut current = &buffer[i + f.1.1][j + f.1.0];
|
let mut current = &buffer[i + f.1 .1][j + f.1 .0];
|
||||||
let newchar = overlap_check(*current, *chr);
|
let newchar = overlap_check(*current, *chr);
|
||||||
buffer[i + f.1.1][j + f.1.0] = newchar;
|
buffer[i + f.1 .1][j + f.1 .0] = newchar;
|
||||||
|
|
||||||
//print!("{}", buffer[i+frame.position.1][j+frame.position.0]);
|
//print!("{}", buffer[i+frame.position.1][j+frame.position.0]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//println!("{:?}", buffer);
|
//println!("{:?}", buffer);
|
||||||
@@ -186,52 +176,40 @@ pub fn render_frame(elements: Vec<Container>) {
|
|||||||
pub fn overlap_check(oldchar: char, newchar: char) -> char {
|
pub fn overlap_check(oldchar: char, newchar: char) -> char {
|
||||||
match (oldchar, newchar) {
|
match (oldchar, newchar) {
|
||||||
//┌│└ ┐┘─
|
//┌│└ ┐┘─
|
||||||
('│', '─')|('┌', '┘')|('└', '┐') => '┼',
|
('│', '─') | ('┌', '┘') | ('└', '┐') => '┼',
|
||||||
('┌', '└') => '├',
|
('┌', '└') => '├',
|
||||||
('┐', '┐') => '┤',
|
('┐', '┐') => '┤',
|
||||||
|
|
||||||
(_, _) => newchar
|
(_, _) => newchar,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// function to return a charmap of the outline of an object
|
// function to return a charmap of the outline of an object
|
||||||
|
|
||||||
fn gen_outline(dimensions: (usize, usize)) -> Vec<Vec<char>> {
|
pub fn gen_outline(dimensions: (usize, usize)) -> Vec<Vec<char>> {
|
||||||
let mut charmap = Vec::<Vec<char>>::new();
|
let mut charmap = Vec::<Vec<char>>::new();
|
||||||
|
|
||||||
let mut frstline = vec!['┌'];
|
let mut frstline = vec!['┌'];
|
||||||
let mut midlines = vec!['│'];
|
let mut midlines = vec!['│'];
|
||||||
let mut lastline = vec!['└'];
|
let mut lastline = vec!['└'];
|
||||||
|
|
||||||
frstline.append(&mut vec!['─'; dimensions.0 -2]);
|
frstline.append(&mut vec!['─'; dimensions.0 - 2]);
|
||||||
midlines.append(&mut vec![' '; dimensions.0 -2]);
|
midlines.append(&mut vec![' '; dimensions.0 - 2]);
|
||||||
lastline.append(&mut vec!['─'; dimensions.0 -2]);
|
lastline.append(&mut vec!['─'; dimensions.0 - 2]);
|
||||||
|
|
||||||
frstline.append(&mut vec!['┐']);
|
frstline.append(&mut vec!['┐']);
|
||||||
midlines.append(&mut vec!['│']);
|
midlines.append(&mut vec!['│']);
|
||||||
lastline.append(&mut vec!['┘']);
|
lastline.append(&mut vec!['┘']);
|
||||||
|
|
||||||
|
|
||||||
charmap.push(frstline);
|
charmap.push(frstline);
|
||||||
for _ in 0..dimensions.1 -2 {
|
for _ in 0..dimensions.1 - 2 {
|
||||||
charmap.push(midlines.clone());
|
charmap.push(midlines.clone());
|
||||||
}
|
}
|
||||||
charmap.push(lastline);
|
charmap.push(lastline);
|
||||||
|
|
||||||
return charmap
|
return charmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// testing functions
|
// testing functions
|
||||||
|
|
||||||
pub fn test_elements() {
|
pub fn test_elements() {
|
||||||
@@ -246,20 +224,30 @@ pub fn test_elements() {
|
|||||||
containers.push(Container::new((5, 5), (15, 5), true));
|
containers.push(Container::new((5, 5), (15, 5), true));
|
||||||
containers.push(Container::new((10, 3), (50, 15), true));
|
containers.push(Container::new((10, 3), (50, 15), true));
|
||||||
|
|
||||||
let mut bar = IndicatorBar::new((10, 10), 12);
|
let mut bar = IndicatorBar::new((10, 6), 12);
|
||||||
let mut bar2 = IndicatorBar::new((10, 11), 12);
|
let mut bar2 = IndicatorBar::new((10, 7), 12);
|
||||||
|
|
||||||
|
|
||||||
bar.set_value(43);
|
bar.set_value(43);
|
||||||
bar.abs = 101;
|
bar.abs = 101;
|
||||||
bar2.set_value(14);
|
bar2.set_value(14);
|
||||||
bar2.abs= 15;
|
bar2.abs = 15;
|
||||||
containers[1].elements.push(Box::new(bar));
|
containers[1].elements.push(Box::new(bar));
|
||||||
containers[1].elements.push(Box::new(bar2));
|
containers[1].elements.push(Box::new(bar2));
|
||||||
|
|
||||||
|
use super::libgui_elements;
|
||||||
|
let tbox = libgui_elements::TextBox::new(
|
||||||
|
String::from("title"),
|
||||||
|
String::from("text"),
|
||||||
|
(10, 10),
|
||||||
|
(10, 8),
|
||||||
|
true,
|
||||||
|
);
|
||||||
|
|
||||||
|
containers[1].elements.push(Box::new(tbox));
|
||||||
|
|
||||||
render_frame(containers);
|
render_frame(containers);
|
||||||
return
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// function to generate a box in a random location on the screen.
|
// function to generate a box in a random location on the screen.
|
||||||
|
|||||||
@@ -1,4 +1,10 @@
|
|||||||
use super::libgui_core;
|
use super::libgui_core;
|
||||||
|
use alloc::{
|
||||||
|
string::{String, ToString},
|
||||||
|
vec::Vec,
|
||||||
|
};
|
||||||
|
|
||||||
|
// TEXT BOX
|
||||||
|
|
||||||
pub struct TextBox {
|
pub struct TextBox {
|
||||||
dimensions: (usize, usize),
|
dimensions: (usize, usize),
|
||||||
@@ -8,30 +14,45 @@ pub struct TextBox {
|
|||||||
outlined: bool,
|
outlined: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Element for TextBox {
|
impl libgui_core::Element for TextBox {
|
||||||
fn render(&self) -> (Vec<Vec<char>>, (usize, usize)) {
|
fn render(&self) -> (Vec<Vec<char>>, (usize, usize)) {
|
||||||
|
|
||||||
let mut charmap = Vec::<Vec<char>>::new();
|
let mut charmap = Vec::<Vec<char>>::new();
|
||||||
|
|
||||||
if self.outlined {
|
if self.outlined {
|
||||||
charmap = libgui_core::gen_outline(self.dimensions);
|
charmap = libgui_core::gen_outline(self.dimensions);
|
||||||
}
|
}
|
||||||
|
|
||||||
let inner_dims = (self.dimensions.0 -2, self.dimensions.1 -2);
|
let inner_dims = (self.dimensions.0 - 2, self.dimensions.1 - 2);
|
||||||
|
|
||||||
let mut titlechars = title.chars().collect::<Vec<char>>();
|
let mut titlechars = self.title.chars().collect::<Vec<char>>();
|
||||||
// render title
|
// render title
|
||||||
|
|
||||||
for (i, char) in titlechars.enumerate() {
|
for (i, char) in titlechars.iter().enumerate() {}
|
||||||
|
|
||||||
|
let mut idx = 0;
|
||||||
|
|
||||||
|
while idx < self.content.len() {
|
||||||
|
()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return (charmap, self.position);
|
||||||
let mut idx = 0
|
}
|
||||||
|
}
|
||||||
while idx < content.len()
|
|
||||||
|
impl TextBox {
|
||||||
|
pub fn new(
|
||||||
return (charmap, self.position)
|
title: String,
|
||||||
|
content: String,
|
||||||
|
dimensions: (usize, usize),
|
||||||
|
position: (usize, usize),
|
||||||
|
outlined: bool,
|
||||||
|
) -> TextBox {
|
||||||
|
TextBox {
|
||||||
|
dimensions,
|
||||||
|
position,
|
||||||
|
content,
|
||||||
|
title,
|
||||||
|
outlined,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user