diff --git a/src/elements/mod.rs b/src/elements/mod.rs new file mode 100644 index 0000000..39a450e --- /dev/null +++ b/src/elements/mod.rs @@ -0,0 +1,9 @@ +use crate::widget::Element; + +pub struct Rect; + +impl Element for Rect { + fn render(&mut self, scope: &mut crate::render::RenderScope) { + scope.draw_rect(); + } +} diff --git a/src/lib.rs b/src/lib.rs index 6f87071..6a1b612 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,12 +1,28 @@ +pub mod elements; +pub mod render; +pub mod widget; + +use std::sync::{Arc, Mutex}; + use minifb::Window; +use crate::{render::RenderScope, widget::Element}; + pub struct App { window: Window, + elements: Vec>>>, } impl App { pub fn new(win: Window) -> Self { - Self { window: win } + Self { + window: win, + elements: Vec::new(), + } + } + + pub fn element(&mut self, e: E) { + self.elements.push(Arc::new(Mutex::new(Box::new(e)))); } pub fn run(&mut self) { @@ -17,13 +33,14 @@ impl App { fn render(&mut self) { let (w, h) = self.window.get_size(); - let mut buffer = vec![0; w * h]; - for y in 100..200 { - for x in 150..300 { - buffer[y * h + x] = 0xFF00FF; - } + let mut scope = RenderScope::new(w, h); + + for e in &self.elements { + e.lock().unwrap().render(&mut scope); } - self.window.update_with_buffer(&buffer, w, h).unwrap(); + self.window + .update_with_buffer(&scope.get_buffer(), w, h) + .unwrap(); } } diff --git a/src/main.rs b/src/main.rs index d756f7d..28fdba6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,10 +1,12 @@ use minifb::{Window, WindowOptions}; -use osgui::App; +use osgui::{elements::Rect, App}; fn main() { let window = Window::new("minifb example", 500, 500, WindowOptions::default()).unwrap(); let mut app = App::new(window); + app.element(Rect); + app.run(); } diff --git a/src/render.rs b/src/render.rs new file mode 100644 index 0000000..d9b71da --- /dev/null +++ b/src/render.rs @@ -0,0 +1,27 @@ +pub struct RenderScope { + buffer: Vec, + width: usize, + height: usize, +} + +impl RenderScope { + pub fn new(w: usize, h: usize) -> Self { + Self { + buffer: vec![0; w * h], + width: w, + height: h, + } + } + + pub fn draw_rect(&mut self) { + for y in 0..200 { + for x in 0..200 { + self.buffer[y * self.height + x] = 0xFF00FF; + } + } + } + + pub fn get_buffer(&self) -> Vec { + self.buffer.clone() + } +} diff --git a/src/widget.rs b/src/widget.rs new file mode 100644 index 0000000..f9c9618 --- /dev/null +++ b/src/widget.rs @@ -0,0 +1,5 @@ +use crate::render::RenderScope; + +pub trait Element { + fn render(&mut self, scope: &mut RenderScope); +}