background
This commit is contained in:
+2
-4
@@ -6,7 +6,6 @@ use crate::{
|
|||||||
};
|
};
|
||||||
|
|
||||||
pub struct Div {
|
pub struct Div {
|
||||||
color: u32,
|
|
||||||
children: Mutex<Vec<Arc<Widget>>>,
|
children: Mutex<Vec<Arc<Widget>>>,
|
||||||
size: (u16, u16),
|
size: (u16, u16),
|
||||||
}
|
}
|
||||||
@@ -14,7 +13,7 @@ pub struct Div {
|
|||||||
impl Element for Div {
|
impl Element for Div {
|
||||||
fn render(&mut self, scope: &mut crate::render_scope::RenderScope) {
|
fn render(&mut self, scope: &mut crate::render_scope::RenderScope) {
|
||||||
let (width, height) = scope.get_size_or(self.size.0, self.size.1);
|
let (width, height) = scope.get_size_or(self.size.0, self.size.1);
|
||||||
scope.draw_rect(width, height, self.color);
|
scope.draw_background(width, height);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn after_render(&mut self, scope: &mut crate::render_scope::RenderScope) {
|
fn after_render(&mut self, scope: &mut crate::render_scope::RenderScope) {
|
||||||
@@ -60,9 +59,8 @@ impl Element for Div {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Div {
|
impl Div {
|
||||||
pub fn new(color: u32) -> Self {
|
pub fn new() -> Self {
|
||||||
Div {
|
Div {
|
||||||
color,
|
|
||||||
children: Mutex::new(Vec::new()),
|
children: Mutex::new(Vec::new()),
|
||||||
size: (0, 0),
|
size: (0, 0),
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,16 +1,17 @@
|
|||||||
use std::sync::{Arc, Mutex};
|
use std::sync::{Arc, Mutex};
|
||||||
|
|
||||||
use crate::{widget::{Element, Widget}, NoRender};
|
use crate::{
|
||||||
|
widget::{Element, Widget},
|
||||||
|
NoRender,
|
||||||
|
};
|
||||||
|
|
||||||
pub struct FlexRow {
|
pub struct FlexRow {
|
||||||
color: u32,
|
|
||||||
gap: u16,
|
gap: u16,
|
||||||
children: Mutex<Vec<Arc<Widget>>>,
|
children: Mutex<Vec<Arc<Widget>>>,
|
||||||
size: (u16, u16),
|
size: (u16, u16),
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct FlexCol {
|
pub struct FlexCol {
|
||||||
color: u32,
|
|
||||||
gap: u16,
|
gap: u16,
|
||||||
children: Mutex<Vec<Arc<Widget>>>,
|
children: Mutex<Vec<Arc<Widget>>>,
|
||||||
size: (u16, u16),
|
size: (u16, u16),
|
||||||
@@ -19,7 +20,7 @@ pub struct FlexCol {
|
|||||||
impl Element for FlexRow {
|
impl Element for FlexRow {
|
||||||
fn render(&mut self, scope: &mut crate::render_scope::RenderScope) {
|
fn render(&mut self, scope: &mut crate::render_scope::RenderScope) {
|
||||||
let (width, height) = scope.get_size_or(self.size.0, self.size.1);
|
let (width, height) = scope.get_size_or(self.size.0, self.size.1);
|
||||||
scope.draw_rect(width, height, self.color);
|
scope.draw_background(width, height);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn after_render(&mut self, scope: &mut crate::render_scope::RenderScope) {
|
fn after_render(&mut self, scope: &mut crate::render_scope::RenderScope) {
|
||||||
@@ -68,11 +69,10 @@ impl Element for FlexRow {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl FlexRow {
|
impl FlexRow {
|
||||||
pub fn new(color: u32, gap: u16) -> Self {
|
pub fn new(gap: u16) -> Self {
|
||||||
Self {
|
Self {
|
||||||
children: Mutex::new(Vec::new()),
|
children: Mutex::new(Vec::new()),
|
||||||
size: (0, 0),
|
size: (0, 0),
|
||||||
color,
|
|
||||||
gap,
|
gap,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -81,7 +81,7 @@ impl FlexRow {
|
|||||||
impl Element for FlexCol {
|
impl Element for FlexCol {
|
||||||
fn render(&mut self, scope: &mut crate::render_scope::RenderScope) {
|
fn render(&mut self, scope: &mut crate::render_scope::RenderScope) {
|
||||||
let (width, height) = scope.get_size_or(self.size.0, self.size.1);
|
let (width, height) = scope.get_size_or(self.size.0, self.size.1);
|
||||||
scope.draw_rect(width, height, self.color);
|
scope.draw_background(width, height);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn after_render(&mut self, scope: &mut crate::render_scope::RenderScope) {
|
fn after_render(&mut self, scope: &mut crate::render_scope::RenderScope) {
|
||||||
@@ -130,11 +130,10 @@ impl Element for FlexCol {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl FlexCol {
|
impl FlexCol {
|
||||||
pub fn new(color: u32, gap: u16) -> Self {
|
pub fn new(gap: u16) -> Self {
|
||||||
Self {
|
Self {
|
||||||
children: Mutex::new(Vec::new()),
|
children: Mutex::new(Vec::new()),
|
||||||
size: (0, 0),
|
size: (0, 0),
|
||||||
color,
|
|
||||||
gap,
|
gap,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+8
-1
@@ -22,7 +22,10 @@ pub mod prelude {
|
|||||||
widget::*, *,
|
widget::*, *,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub use crate::style::{Dimension::{Full, Content}, Position::{Center, End}};
|
pub use crate::style::{
|
||||||
|
Dimension::{Content, Full},
|
||||||
|
Position::{Center, End},
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct Screen {
|
pub struct Screen {
|
||||||
@@ -107,6 +110,10 @@ impl Screen {
|
|||||||
wrapper.call(elem, &RenderWrapperEvent(&mut scope));
|
wrapper.call(elem, &RenderWrapperEvent(&mut scope));
|
||||||
} else {
|
} else {
|
||||||
scope.clear();
|
scope.clear();
|
||||||
|
|
||||||
|
if let Some(style) = elem.get() {
|
||||||
|
scope.set_style(style);
|
||||||
|
}
|
||||||
if let Some(t) = elem.get() {
|
if let Some(t) = elem.get() {
|
||||||
scope.set_transform(&t);
|
scope.set_transform(&t);
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-14
@@ -10,19 +10,8 @@ fn main() -> std::io::Result<()> {
|
|||||||
|
|
||||||
fn app() -> Rsx {
|
fn app() -> Rsx {
|
||||||
rsx! {
|
rsx! {
|
||||||
@transform! {
|
@Transform::new();
|
||||||
width: Full,
|
@Style { background: Background::RoundedOutline(0xff0000), foreground: None };
|
||||||
height: Full,
|
Div { @Transform::center(); "Hello, World!" }
|
||||||
};
|
|
||||||
Div {
|
|
||||||
@transform! {
|
|
||||||
width: Full,
|
|
||||||
height: Full,
|
|
||||||
};
|
|
||||||
RoundedOutline {}
|
|
||||||
|
|
||||||
@Transform::center();
|
|
||||||
"Welcome To OSUI!"
|
|
||||||
} (0x000000)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+51
-6
@@ -1,7 +1,7 @@
|
|||||||
use std::fmt::Debug;
|
use std::fmt::Debug;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
style::{RawTransform, Transform},
|
style::{RawTransform, Style, Transform},
|
||||||
utils::{self, hex_ansi_bg},
|
utils::{self, hex_ansi_bg},
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -18,6 +18,7 @@ pub struct RenderScope {
|
|||||||
render_stack: Vec<RenderMethod>,
|
render_stack: Vec<RenderMethod>,
|
||||||
parent_width: u16,
|
parent_width: u16,
|
||||||
parent_height: u16,
|
parent_height: u16,
|
||||||
|
style: Style,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl RenderScope {
|
impl RenderScope {
|
||||||
@@ -27,6 +28,7 @@ impl RenderScope {
|
|||||||
render_stack: Vec::new(),
|
render_stack: Vec::new(),
|
||||||
parent_width: 0,
|
parent_width: 0,
|
||||||
parent_height: 0,
|
parent_height: 0,
|
||||||
|
style: Style::new(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -61,17 +63,52 @@ impl RenderScope {
|
|||||||
self.transform.height = self.transform.height.max(height);
|
self.transform.height = self.transform.height.max(height);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn draw_outline_rounded(&mut self, w: u16, h: u16, color: u32) {
|
||||||
|
if w > 1 && h > 1 {
|
||||||
|
let d = "─".repeat(w as usize - 2);
|
||||||
|
self.draw_text_colored(
|
||||||
|
&format!(
|
||||||
|
"╭{d}╮{}\n╰{d}╯",
|
||||||
|
format!("\n│{}│", " ".repeat(w as usize - 2)).repeat(h as usize - 2),
|
||||||
|
),
|
||||||
|
color,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn draw_outline(&mut self, w: u16, h: u16, color: u32) {
|
||||||
|
if w > 1 && h > 1 {
|
||||||
|
let d = "─".repeat(w as usize - 2);
|
||||||
|
self.draw_text_colored(
|
||||||
|
&format!(
|
||||||
|
"┌{d}┐{}\n└{d}┘",
|
||||||
|
format!("\n│{}│", " ".repeat(w as usize - 2)).repeat(h as usize - 2),
|
||||||
|
),
|
||||||
|
color,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn draw_background(&mut self, width: u16, height: u16) {
|
||||||
|
match self.style.background {
|
||||||
|
crate::style::Background::NoBackground => {}
|
||||||
|
crate::style::Background::Outline(c) => self.draw_outline(width, height, c),
|
||||||
|
crate::style::Background::RoundedOutline(c) => {
|
||||||
|
self.draw_outline_rounded(width, height, c)
|
||||||
|
}
|
||||||
|
crate::style::Background::Solid(c) => self.draw_rect(width, height, c),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn draw(&self) {
|
pub fn draw(&self) {
|
||||||
for m in &self.render_stack {
|
for m in &self.render_stack {
|
||||||
match m {
|
match m {
|
||||||
RenderMethod::Text(t) => {
|
RenderMethod::Text(t) => {
|
||||||
utils::print(self.transform.x, self.transform.y, t);
|
utils::print(self.transform.x, self.transform.y, t);
|
||||||
}
|
}
|
||||||
RenderMethod::TextColored(t, c) => utils::print(
|
RenderMethod::TextColored(t, c) => {
|
||||||
self.transform.x,
|
utils::print_liner(self.transform.x, self.transform.y, &utils::hex_ansi(*c), t)
|
||||||
self.transform.y,
|
}
|
||||||
&(utils::hex_ansi(*c) + t),
|
|
||||||
),
|
|
||||||
RenderMethod::Rectangle(width, height, color) => {
|
RenderMethod::Rectangle(width, height, color) => {
|
||||||
utils::print_liner(
|
utils::print_liner(
|
||||||
self.transform.x,
|
self.transform.x,
|
||||||
@@ -145,6 +182,14 @@ impl RenderScope {
|
|||||||
pub fn get_transform(&self) -> &RawTransform {
|
pub fn get_transform(&self) -> &RawTransform {
|
||||||
&self.transform
|
&self.transform
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn set_style(&mut self, style: Style) {
|
||||||
|
self.style = style;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_style(&mut self) -> &mut Style {
|
||||||
|
&mut self.style
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Debug for RenderScope {
|
impl Debug for RenderScope {
|
||||||
|
|||||||
@@ -22,6 +22,14 @@ pub enum Dimension {
|
|||||||
Const(u16),
|
Const(u16),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub enum Background {
|
||||||
|
NoBackground,
|
||||||
|
Outline(u32),
|
||||||
|
RoundedOutline(u32),
|
||||||
|
Solid(u32),
|
||||||
|
}
|
||||||
|
|
||||||
component!(Transform {
|
component!(Transform {
|
||||||
pub x: Position,
|
pub x: Position,
|
||||||
pub y: Position,
|
pub y: Position,
|
||||||
@@ -31,6 +39,20 @@ component!(Transform {
|
|||||||
pub height: Dimension,
|
pub height: Dimension,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
component!(Style {
|
||||||
|
pub background: Background,
|
||||||
|
pub foreground: Option<u32>,
|
||||||
|
});
|
||||||
|
|
||||||
|
impl Style {
|
||||||
|
pub fn new() -> Self {
|
||||||
|
Self {
|
||||||
|
background: Background::NoBackground,
|
||||||
|
foreground: None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Transform {
|
impl Transform {
|
||||||
pub fn new() -> Transform {
|
pub fn new() -> Transform {
|
||||||
Transform {
|
Transform {
|
||||||
|
|||||||
Reference in New Issue
Block a user