From e0def0d91a10e5291b2c7b888ee1a9a353fb907c Mon Sep 17 00:00:00 2001 From: hodasemi Date: Sun, 24 Mar 2024 19:19:08 +0100 Subject: [PATCH] Start ui element at runtime creator --- src/element_creator/mod.rs | 111 +++++++++++++++++++++++++++++++++++++ src/lib.rs | 1 + src/prelude.rs | 1 + 3 files changed, 113 insertions(+) create mode 100644 src/element_creator/mod.rs diff --git a/src/element_creator/mod.rs b/src/element_creator/mod.rs new file mode 100644 index 0000000..4522cdb --- /dev/null +++ b/src/element_creator/mod.rs @@ -0,0 +1,111 @@ +use std::{ + collections::HashMap, + sync::{Arc, Mutex}, +}; + +use anyhow::Result; +use utilities::color::Color; +use vulkan_rs::prelude::*; + +#[derive(Debug, Clone, Copy)] +pub enum ElementBorderThickness { + Pixel(u32), + Ratio(f32), +} + +impl From for ElementBorderThickness { + fn from(value: u32) -> Self { + Self::Pixel(value) + } +} + +impl From for ElementBorderThickness { + fn from(value: f32) -> Self { + Self::Ratio(value) + } +} + +#[derive(Debug, Clone, Copy)] +pub struct ElementDescriptor { + pub background_color: Color, + pub border_color: Color, + + pub border_thickness: ElementBorderThickness, +} + +impl ElementDescriptor { + pub fn new( + background_color: impl Into, + border_color: impl Into, + border_thickness: impl Into, + ) -> Self { + Self { + background_color: background_color.into(), + border_color: border_color.into(), + border_thickness: border_thickness.into(), + } + } +} + +#[derive(Debug, Hash, Clone, Copy, PartialEq, Eq)] +struct ElementDefinition { + width: u32, + height: u32, + + background_color: Color, + border_color: Color, + border_thickness: u32, +} + +pub struct ElementCreator { + device: Arc, + queue: Arc>, + + elements: HashMap>, +} + +impl ElementCreator { + pub fn new(device: Arc, queue: Arc>) -> Self { + Self { + device, + queue, + elements: HashMap::new(), + } + } + + pub fn get( + &mut self, + width: u32, + height: u32, + descriptor: ElementDescriptor, + ) -> Result> { + let definition = ElementDefinition { + width, + height, + + background_color: descriptor.background_color, + border_color: descriptor.border_color, + + border_thickness: match descriptor.border_thickness { + ElementBorderThickness::Pixel(pixel) => pixel, + ElementBorderThickness::Ratio(ratio) => { + (width.min(height) as f32 * ratio).round() as u32 + } + }, + }; + + match self.elements.get(&definition) { + Some(element) => Ok(element.clone()), + None => { + let element = self.create_element(definition)?; + self.elements.insert(definition, element.clone()); + + Ok(element) + } + } + } + + fn create_element(&self, definition: ElementDefinition) -> Result> { + todo!() + } +} diff --git a/src/lib.rs b/src/lib.rs index 869e6be..18124ca 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -9,6 +9,7 @@ pub mod tab_control; mod context_interface; mod controller_button; +mod element_creator; mod guidirection; mod mousebutton; pub mod prelude; diff --git a/src/prelude.rs b/src/prelude.rs index 6334377..288a3b5 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -1,6 +1,7 @@ pub use super::builder::{builder::GuiBuilder, snippet::GuiSnippet}; pub use super::context_interface::{ContextInterface, TargetMode, Unfold}; pub use super::controller_button::ControllerButton; +pub use super::element_creator::*; pub use super::elements::prelude::*; pub use super::guidirection::GuiDirection; pub use super::guihandler::prelude::*;