another refactor :3

This commit is contained in:
griffi-gh 2024-02-20 17:49:44 +01:00
parent 27080e80e7
commit af892698b5
8 changed files with 108 additions and 111 deletions

View file

@ -1,5 +1,5 @@
use std::num::NonZeroU16; use std::num::NonZeroU16;
use crate::Corners; use crate::rectangle::Corners;
fn point_count(corners: Corners<f32>) -> NonZeroU16 { fn point_count(corners: Corners<f32>) -> NonZeroU16 {
//Increase for higher quality //Increase for higher quality

View file

@ -4,7 +4,7 @@ use crate::{
measure::Response, measure::Response,
state::StateRepo, state::StateRepo,
text::TextMeasure, text::TextMeasure,
LayoutInfo layout::LayoutInfo
}; };
mod builtin; mod builtin;

View file

@ -3,7 +3,7 @@ use crate::{
draw::UiDrawCommand, draw::UiDrawCommand,
element::{MeasureContext, ProcessContext, UiElement}, element::{MeasureContext, ProcessContext, UiElement},
measure::Response, measure::Response,
UiSize layout::UiSize
}; };
#[derive(Debug, Clone, Copy)] #[derive(Debug, Clone, Copy)]

View file

@ -3,7 +3,7 @@ use crate::{
draw::UiDrawCommand, draw::UiDrawCommand,
element::{MeasureContext, ProcessContext, UiElement}, element::{MeasureContext, ProcessContext, UiElement},
measure::Response, measure::Response,
UiSize layout::UiSize
}; };
pub struct Rect { pub struct Rect {

View file

@ -2,7 +2,7 @@ use glam::vec2;
use crate::{ use crate::{
element::{MeasureContext, ProcessContext, UiElement}, element::{MeasureContext, ProcessContext, UiElement},
measure::Response, measure::Response,
UiDirection layout::UiDirection
}; };
pub struct Spacer(pub f32); pub struct Spacer(pub f32);

View file

@ -5,7 +5,7 @@ use crate::{
element::{MeasureContext, ProcessContext, UiElement}, element::{MeasureContext, ProcessContext, UiElement},
measure::Response, measure::Response,
text::{FontHandle, BUILTIN_FONT}, text::{FontHandle, BUILTIN_FONT},
UiSize layout::UiSize
}; };
pub enum TextSize { pub enum TextSize {

97
hui/src/instance.rs Normal file
View file

@ -0,0 +1,97 @@
use std::collections::VecDeque;
use glam::Vec2;
use crate:: {
layout::{UiDirection, LayoutInfo},
element::{MeasureContext, ProcessContext, UiElement},
event::UiEvent,
state::StateRepo,
draw::{UiDrawCommandList, UiDrawPlan},
text::{TextRenderer, FontTextureInfo, FontHandle},
};
pub struct UiInstance {
//mouse_position: Vec2,
stateful_state: StateRepo,
//event_queue: VecDeque<UiEvent>,
prev_draw_commands: UiDrawCommandList,
draw_commands: UiDrawCommandList,
draw_plan: UiDrawPlan,
draw_plan_modified: bool,
text_renderer: TextRenderer,
events: VecDeque<UiEvent>,
}
impl UiInstance {
pub fn new() -> Self {
UiInstance {
//mouse_position: Vec2::ZERO,
stateful_state: StateRepo::default(),
//event_queue: VecDeque::new(),
// root_elements: Vec::new(),
prev_draw_commands: UiDrawCommandList::default(),
draw_commands: UiDrawCommandList::default(),
draw_plan: UiDrawPlan::default(),
draw_plan_modified: false,
// ftm: FontTextureManager::default(),
text_renderer: TextRenderer::new(),
events: VecDeque::new(),
}
}
pub fn add_font_from_bytes(&mut self, font: &[u8]) -> FontHandle {
self.text_renderer.add_font_from_bytes(font)
}
pub fn add<T: UiElement>(&mut self, element: T, max_size: Vec2) {
let layout = LayoutInfo {
position: Vec2::ZERO,
max_size,
direction: UiDirection::Vertical,
};
let measure = element.measure(MeasureContext {
state: &self.stateful_state,
layout: &layout,
text_measure: self.text_renderer.to_measure(),
});
element.process(ProcessContext {
measure: &measure,
state: &mut self.stateful_state,
layout: &layout,
draw: &mut self.draw_commands,
text_measure: self.text_renderer.to_measure(),
});
}
pub fn begin(&mut self) {
std::mem::swap(&mut self.prev_draw_commands, &mut self.draw_commands);
self.draw_plan_modified = false;
self.draw_commands.commands.clear();
self.text_renderer.reset_frame();
}
pub fn end(&mut self) {
if self.draw_commands.commands == self.prev_draw_commands.commands {
return
}
self.draw_plan = UiDrawPlan::build(&self.draw_commands, &mut self.text_renderer);
self.draw_plan_modified = true;
}
pub fn draw_plan(&self) -> (bool, &UiDrawPlan) {
(self.draw_plan_modified, &self.draw_plan)
}
pub fn font_texture(&self) -> FontTextureInfo {
self.text_renderer.font_texture()
}
pub fn push_event(&mut self, event: UiEvent) {
self.events.push_back(event);
}
}
impl Default for UiInstance {
fn default() -> Self {
Self::new()
}
}

View file

@ -8,8 +8,7 @@
#![forbid(unsafe_code)] #![forbid(unsafe_code)]
#![forbid(unsafe_op_in_unsafe_fn)] #![forbid(unsafe_op_in_unsafe_fn)]
use std::collections::VecDeque; mod instance;
pub mod layout; pub mod layout;
pub mod rectangle; pub mod rectangle;
pub mod element; pub mod element;
@ -20,126 +19,27 @@ pub mod measure;
pub mod state; pub mod state;
pub mod text; pub mod text;
use layout::{UiDirection, UiSize, LayoutInfo}; pub use instance::UiInstance;
use rectangle::{Corners, Sides};
use element::{MeasureContext, ProcessContext, UiElement};
use event::UiEvent;
use state::StateRepo;
use draw::{UiDrawCommandList, UiDrawPlan};
use text::{TextRenderer, FontTextureInfo, FontHandle};
use glam::Vec2;
// pub struct ElementContext<'a> {
// pub state: &'a mut StateRepo,
// pub draw: &'a mut UiDrawCommands,
// pub text: &'a mut TextRenderer,
// }
pub trait IfModified<T> { pub trait IfModified<T> {
fn if_modified(&self) -> Option<&T>; fn if_modified(&self) -> Option<&T>;
} }
pub struct UiInstance {
//mouse_position: Vec2,
stateful_state: StateRepo,
//event_queue: VecDeque<UiEvent>,
prev_draw_commands: UiDrawCommandList,
draw_commands: UiDrawCommandList,
draw_plan: UiDrawPlan,
draw_plan_modified: bool,
text_renderer: TextRenderer,
events: VecDeque<UiEvent>,
}
impl UiInstance {
pub fn new() -> Self {
UiInstance {
//mouse_position: Vec2::ZERO,
stateful_state: StateRepo::default(),
//event_queue: VecDeque::new(),
// root_elements: Vec::new(),
prev_draw_commands: UiDrawCommandList::default(),
draw_commands: UiDrawCommandList::default(),
draw_plan: UiDrawPlan::default(),
draw_plan_modified: false,
// ftm: FontTextureManager::default(),
text_renderer: TextRenderer::new(),
events: VecDeque::new(),
}
}
pub fn add_font_from_bytes(&mut self, font: &[u8]) -> FontHandle {
self.text_renderer.add_font_from_bytes(font)
}
pub fn add<T: UiElement>(&mut self, element: T, max_size: Vec2) {
let layout = LayoutInfo {
position: Vec2::ZERO,
max_size,
direction: UiDirection::Vertical,
};
let measure = element.measure(MeasureContext {
state: &self.stateful_state,
layout: &layout,
text_measure: self.text_renderer.to_measure(),
});
element.process(ProcessContext {
measure: &measure,
state: &mut self.stateful_state,
layout: &layout,
draw: &mut self.draw_commands,
text_measure: self.text_renderer.to_measure(),
});
}
pub fn begin(&mut self) {
std::mem::swap(&mut self.prev_draw_commands, &mut self.draw_commands);
self.draw_plan_modified = false;
self.draw_commands.commands.clear();
self.text_renderer.reset_frame();
}
pub fn end(&mut self) {
if self.draw_commands.commands == self.prev_draw_commands.commands {
return
}
self.draw_plan = UiDrawPlan::build(&self.draw_commands, &mut self.text_renderer);
self.draw_plan_modified = true;
}
pub fn draw_plan(&self) -> (bool, &UiDrawPlan) {
(self.draw_plan_modified, &self.draw_plan)
}
pub fn font_texture(&self) -> FontTextureInfo {
self.text_renderer.font_texture()
}
pub fn push_event(&mut self, event: UiEvent) {
self.events.push_back(event);
}
}
impl Default for UiInstance {
fn default() -> Self {
Self::new()
}
}
#[allow(deprecated)] #[allow(deprecated)]
#[deprecated(since = "0.1.0-alpha.3", note = "will be removed in the next release")] #[deprecated(since = "0.1.0-alpha.3", note = "will be removed in the next release")]
pub struct ElementList(Vec<Box<dyn UiElement>>); pub struct ElementList(Vec<Box<dyn element::UiElement>>);
#[allow(deprecated)] #[allow(deprecated)]
#[deprecated(since = "0.1.0-alpha.3", note = "will be removed in the next release")] #[deprecated(since = "0.1.0-alpha.3", note = "will be removed in the next release")]
impl ElementList { impl ElementList {
pub fn add(&mut self, element: impl UiElement + 'static) { pub fn add(&mut self, element: impl element::UiElement + 'static) {
self.0.push(Box::new(element)); self.0.push(Box::new(element));
} }
} }
#[allow(deprecated)] #[allow(deprecated)]
#[deprecated(since = "0.1.0-alpha.3", note = "will be removed in the next release")] #[deprecated(since = "0.1.0-alpha.3", note = "will be removed in the next release")]
pub fn elements(f: impl FnOnce(&mut ElementList)) -> Vec<Box<dyn UiElement>> { pub fn elements(f: impl FnOnce(&mut ElementList)) -> Vec<Box<dyn element::UiElement>> {
let mut elements = ElementList(Vec::new()); let mut elements = ElementList(Vec::new());
f(&mut elements); f(&mut elements);
elements.0 elements.0