Start ui element at runtime creator
This commit is contained in:
parent
d131ad36bc
commit
e0def0d91a
3 changed files with 113 additions and 0 deletions
111
src/element_creator/mod.rs
Normal file
111
src/element_creator/mod.rs
Normal file
|
@ -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<u32> for ElementBorderThickness {
|
||||||
|
fn from(value: u32) -> Self {
|
||||||
|
Self::Pixel(value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<f32> 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<Color>,
|
||||||
|
border_color: impl Into<Color>,
|
||||||
|
border_thickness: impl Into<ElementBorderThickness>,
|
||||||
|
) -> 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<Device>,
|
||||||
|
queue: Arc<Mutex<Queue>>,
|
||||||
|
|
||||||
|
elements: HashMap<ElementDefinition, Arc<Image>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ElementCreator {
|
||||||
|
pub fn new(device: Arc<Device>, queue: Arc<Mutex<Queue>>) -> Self {
|
||||||
|
Self {
|
||||||
|
device,
|
||||||
|
queue,
|
||||||
|
elements: HashMap::new(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get(
|
||||||
|
&mut self,
|
||||||
|
width: u32,
|
||||||
|
height: u32,
|
||||||
|
descriptor: ElementDescriptor,
|
||||||
|
) -> Result<Arc<Image>> {
|
||||||
|
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<Arc<Image>> {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
}
|
|
@ -9,6 +9,7 @@ pub mod tab_control;
|
||||||
|
|
||||||
mod context_interface;
|
mod context_interface;
|
||||||
mod controller_button;
|
mod controller_button;
|
||||||
|
mod element_creator;
|
||||||
mod guidirection;
|
mod guidirection;
|
||||||
mod mousebutton;
|
mod mousebutton;
|
||||||
pub mod prelude;
|
pub mod prelude;
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
pub use super::builder::{builder::GuiBuilder, snippet::GuiSnippet};
|
pub use super::builder::{builder::GuiBuilder, snippet::GuiSnippet};
|
||||||
pub use super::context_interface::{ContextInterface, TargetMode, Unfold};
|
pub use super::context_interface::{ContextInterface, TargetMode, Unfold};
|
||||||
pub use super::controller_button::ControllerButton;
|
pub use super::controller_button::ControllerButton;
|
||||||
|
pub use super::element_creator::*;
|
||||||
pub use super::elements::prelude::*;
|
pub use super::elements::prelude::*;
|
||||||
pub use super::guidirection::GuiDirection;
|
pub use super::guidirection::GuiDirection;
|
||||||
pub use super::guihandler::prelude::*;
|
pub use super::guihandler::prelude::*;
|
||||||
|
|
Loading…
Reference in a new issue