major ui restructure, wip interactable api

This commit is contained in:
griffi-gh 2023-11-28 20:13:14 +01:00
parent a9eba8cc29
commit 2e7cdceec7
15 changed files with 118 additions and 43 deletions

49
Cargo.lock generated
View file

@ -543,12 +543,12 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
[[package]] [[package]]
name = "fontdue" name = "fontdue"
version = "0.7.3" version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0793f5137567643cf65ea42043a538804ff0fbf288649e2141442b602d81f9bc" checksum = "9099a2f86b8e674b75d03ff154b3fe4c5208ed249ced8d69cc313a9fa40bb488"
dependencies = [ dependencies = [
"hashbrown 0.13.2", "hashbrown",
"ttf-parser 0.15.2", "ttf-parser",
] ]
[[package]] [[package]]
@ -766,15 +766,6 @@ dependencies = [
"byteorder", "byteorder",
] ]
[[package]]
name = "hashbrown"
version = "0.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e"
dependencies = [
"ahash",
]
[[package]] [[package]]
name = "hashbrown" name = "hashbrown"
version = "0.14.2" version = "0.14.2"
@ -850,7 +841,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f"
dependencies = [ dependencies = [
"equivalent", "equivalent",
"hashbrown 0.14.2", "hashbrown",
] ]
[[package]] [[package]]
@ -958,11 +949,12 @@ dependencies = [
"glium", "glium",
"glutin", "glutin",
"glutin-winit", "glutin-winit",
"hashbrown 0.14.2", "hashbrown",
"image", "image",
"kubi-logging", "kubi-logging",
"kubi-shared", "kubi-shared",
"kubi-ui", "kubi-ui",
"kubi-ui-glium",
"log", "log",
"lz4_flex", "lz4_flex",
"ndk", "ndk",
@ -1000,7 +992,7 @@ dependencies = [
"anyhow", "anyhow",
"flume", "flume",
"glam", "glam",
"hashbrown 0.14.2", "hashbrown",
"kubi-logging", "kubi-logging",
"kubi-shared", "kubi-shared",
"log", "log",
@ -1023,7 +1015,7 @@ dependencies = [
"bincode", "bincode",
"bracket-noise", "bracket-noise",
"glam", "glam",
"hashbrown 0.14.2", "hashbrown",
"nohash-hasher", "nohash-hasher",
"num_enum", "num_enum",
"nz", "nz",
@ -1043,14 +1035,25 @@ dependencies = [
"fontdue", "fontdue",
"glam", "glam",
"glium", "glium",
"hashbrown 0.14.2", "hashbrown",
"kubi-logging", "kubi-logging",
"kubi-ui-glium",
"log", "log",
"nohash-hasher", "nohash-hasher",
"rect_packer", "rect_packer",
"winit", "winit",
] ]
[[package]]
name = "kubi-ui-glium"
version = "0.1.0"
dependencies = [
"glam",
"glium",
"kubi-ui",
"log",
]
[[package]] [[package]]
name = "lazy_static" name = "lazy_static"
version = "1.4.0" version = "1.4.0"
@ -1384,7 +1387,7 @@ version = "0.20.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d4586edfe4c648c71797a74c84bacb32b52b212eff5dfe2bb9f2c599844023e7" checksum = "d4586edfe4c648c71797a74c84bacb32b52b212eff5dfe2bb9f2c599844023e7"
dependencies = [ dependencies = [
"ttf-parser 0.20.0", "ttf-parser",
] ]
[[package]] [[package]]
@ -1766,7 +1769,7 @@ name = "shipyard"
version = "0.6.0" version = "0.6.0"
source = "git+https://github.com/leudz/shipyard?rev=8ef90ea6c4d1eb6c9cb0988f0d2f873f75044d49#8ef90ea6c4d1eb6c9cb0988f0d2f873f75044d49" source = "git+https://github.com/leudz/shipyard?rev=8ef90ea6c4d1eb6c9cb0988f0d2f873f75044d49#8ef90ea6c4d1eb6c9cb0988f0d2f873f75044d49"
dependencies = [ dependencies = [
"hashbrown 0.14.2", "hashbrown",
"lock_api", "lock_api",
"rayon", "rayon",
"serde", "serde",
@ -2035,12 +2038,6 @@ version = "0.1.32"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54"
[[package]]
name = "ttf-parser"
version = "0.15.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7b3e06c9b9d80ed6b745c7159c40b311ad2916abb34a49e9be2653b90db0d8dd"
[[package]] [[package]]
name = "ttf-parser" name = "ttf-parser"
version = "0.20.0" version = "0.20.0"

View file

@ -1,5 +1,5 @@
[workspace] [workspace]
members = ["kubi", "kubi-server", "kubi-shared", "kubi-logging", "kubi-pool", "kubi-ui"] members = ["kubi", "kubi-server", "kubi-shared", "kubi-logging", "kubi-pool", "kubi-ui", "kubi-ui-glium"]
default-members = ["kubi"] default-members = ["kubi"]
resolver = "2" resolver = "2"

View file

@ -124,6 +124,7 @@ name = "Kubi Server" # server name
- [`kubi-ui`](kubi-ui): semi-imm.mode backend-agnostic ui system\ - [`kubi-ui`](kubi-ui): semi-imm.mode backend-agnostic ui system\
mostly ready to use, it has already replaced the Kubi legacy ui mostly ready to use, it has already replaced the Kubi legacy ui
- [`kubi-ui-glium`](kubi-ui-backend-glium) Glium-based backend for `kubi-ui`
- [`kubi-pool`](kubi-pool): very early work-in-progress work-stealing threadpool system\ - [`kubi-pool`](kubi-pool): very early work-in-progress work-stealing threadpool system\
aiming to replace `rayon` threadpool that's currently used inside the kubi client (for more control over task priority) aiming to replace `rayon` threadpool that's currently used inside the kubi client (for more control over task priority)
- [`kubi-logging`](kubi-logging) fancy-ass custom formatter for `env-logger` - [`kubi-logging`](kubi-logging) fancy-ass custom formatter for `env-logger`

11
kubi-ui-glium/Cargo.toml Normal file
View file

@ -0,0 +1,11 @@
[package]
name = "kubi-ui-glium"
version = "0.1.0"
edition = "2021"
publish = false
[dependencies]
glium = { git = "https://github.com/glium/glium", rev = "968fc92378caf" }
kubi-ui = { path = "../kubi-ui", no-default-features = true }
glam = "0.24"
log = "0.4"

View file

@ -6,11 +6,10 @@ use glium::{
index::PrimitiveType, index::PrimitiveType,
implement_vertex, uniform, implement_vertex, uniform,
}; };
use kubi_ui::draw::{UiDrawPlan, UiVertex};
use crate::draw::{UiDrawPlan, UiVertex}; const VERTEX_SHADER: &str = include_str!("../shaders/vertex.vert");
const FRAGMENT_SHADER: &str = include_str!("../shaders/fragment.frag");
const VERTEX_SHADER: &str = include_str!("../../shaders/vertex.vert");
const FRAGMENT_SHADER: &str = include_str!("../../shaders/fragment.frag");
#[derive(Clone, Copy)] #[derive(Clone, Copy)]
#[repr(C)] #[repr(C)]

View file

@ -8,19 +8,18 @@ publish = false
hashbrown = "0.14" hashbrown = "0.14"
nohash-hasher = "0.2" nohash-hasher = "0.2"
glam = "0.24" glam = "0.24"
glium = { git = "https://github.com/glium/glium", rev = "968fc92378caf", optional = true } fontdue = "0.8"
fontdue = "0.7"
rect_packer = "0.2" rect_packer = "0.2"
log = "0.4" log = "0.4"
[dev-dependencies] [dev-dependencies]
kubi-logging = { path = "../kubi-logging" } kubi-logging = { path = "../kubi-logging" }
kubi-ui-glium = { path = "../kubi-ui-glium" }
glium = { git = "https://github.com/glium/glium", rev = "968fc92378caf" } glium = { git = "https://github.com/glium/glium", rev = "968fc92378caf" }
winit = "0.29" winit = "0.29"
[features] [features]
default = ["builtin_elements", "builtin_font", "backend_glium"] default = ["builtin_elements", "builtin_font"]
backend_glium = ["dep:glium"]
builtin_font = [] builtin_font = []
builtin_elements = [] builtin_elements = []
#parallel = ["dep:rayon", "fontdue/parallel"] #parallel = ["dep:rayon", "fontdue/parallel"]

View file

@ -7,8 +7,14 @@ use winit::{
}; };
use kubi_ui::{ use kubi_ui::{
KubiUi, KubiUi,
backend::glium::GliumUiRenderer, element::{progress_bar::ProgressBar, container::{Container, Sides}, UiElement}, UiSize element::{
UiElement,
progress_bar::ProgressBar,
container::{Container, Sides}
},
UiSize
}; };
use kubi_ui_glium::GliumUiRenderer;
fn main() { fn main() {
kubi_logging::init(); kubi_logging::init();

View file

@ -1,5 +1,5 @@
use std::time::Instant; use std::time::Instant;
use glam::{Vec2, IVec2, UVec2, vec4}; use glam::{UVec2, vec4};
use glium::{backend::glutin::SimpleWindowBuilder, Surface}; use glium::{backend::glutin::SimpleWindowBuilder, Surface};
use winit::{ use winit::{
event::{Event, WindowEvent}, event::{Event, WindowEvent},
@ -7,8 +7,17 @@ use winit::{
}; };
use kubi_ui::{ use kubi_ui::{
KubiUi, KubiUi,
backend::glium::GliumUiRenderer, element::{progress_bar::ProgressBar, container::{Container, Sides, Alignment}, UiElement, rect::Rect}, UiSize, UiDirection element::{
UiElement,
progress_bar::ProgressBar,
container::{Container, Sides, Alignment},
rect::Rect
},
interaction::IntoInteractable,
UiSize,
UiDirection,
}; };
use kubi_ui_glium::GliumUiRenderer;
fn main() { fn main() {
kubi_logging::init(); kubi_logging::init();
@ -109,7 +118,9 @@ fn main() {
Box::new(Rect { Box::new(Rect {
size: (UiSize::Pixels(50.), UiSize::Pixels(50.)), size: (UiSize::Pixels(50.), UiSize::Pixels(50.)),
color: Some(vec4(1., 1., 1., 0.75)) color: Some(vec4(1., 1., 1., 0.75))
}) }.into_interactable().on_click(|| {
println!("clicked");
}))
], ],
..Default::default() ..Default::default()
}) })

View file

@ -1,2 +0,0 @@
#[cfg(feature = "backend_glium")]
pub mod glium;

View file

@ -0,0 +1,51 @@
use crate::element::UiElement;
pub struct Interactable<T: UiElement> {
pub element: T,
pub hovered: Option<Box<dyn FnOnce()>>,
pub clicked: Option<Box<dyn FnOnce()>>,
}
impl<T: UiElement> Interactable<T> {
pub fn new(element: T) -> Self {
Self {
element,
hovered: None,
clicked: None,
}
}
pub fn on_click(self, clicked: impl FnOnce() + 'static) -> Self {
Self {
clicked: Some(Box::new(clicked)),
..self
}
}
pub fn on_hover(self, clicked: impl FnOnce() + 'static) -> Self {
Self {
clicked: Some(Box::new(clicked)),
..self
}
}
}
impl<T: UiElement> UiElement for Interactable<T> {
fn measure(&self, state: &crate::state::StateRepo, layout: &crate::LayoutInfo) -> crate::measure::Response {
self.element.measure(state, layout)
}
fn process(&self, measure: &crate::measure::Response, state: &mut crate::state::StateRepo, layout: &crate::LayoutInfo, draw: &mut Vec<crate::draw::UiDrawCommand>) {
self.element.process(measure, state, layout, draw)
}
}
pub trait IntoInteractable<T: UiElement>: UiElement {
fn into_interactable(self) -> Interactable<T>;
}
impl<T: UiElement> IntoInteractable<T> for T {
fn into_interactable(self) -> Interactable<Self> {
Interactable::new(self)
}
}

View file

@ -4,10 +4,10 @@ use glam::Vec2;
pub mod element; pub mod element;
pub mod event; pub mod event;
pub mod draw; pub mod draw;
pub mod backend;
pub mod measure; pub mod measure;
pub mod state; pub mod state;
pub mod text; pub mod text;
pub mod interaction;
use element::UiElement; use element::UiElement;
use state::StateRepo; use state::StateRepo;

View file

@ -12,6 +12,7 @@ crate-type = ["lib", "cdylib"]
kubi-shared = { path = "../kubi-shared" } kubi-shared = { path = "../kubi-shared" }
kubi-logging = { path = "../kubi-logging" } kubi-logging = { path = "../kubi-logging" }
kubi-ui = { path = "../kubi-ui" } kubi-ui = { path = "../kubi-ui" }
kubi-ui-glium = { path = "../kubi-ui-glium" }
log = "0.4" log = "0.4"
glium = { git = "https://github.com/glium/glium", rev = "968fc92378caf" } glium = { git = "https://github.com/glium/glium", rev = "968fc92378caf" }
glutin = "0.31" glutin = "0.31"

View file

@ -1,4 +1,5 @@
use kubi_ui::{KubiUi, backend::glium::GliumUiRenderer}; use kubi_ui::KubiUi;
use kubi_ui_glium::GliumUiRenderer;
use shipyard::{AllStoragesView, Unique, UniqueView, NonSendSync, UniqueViewMut}; use shipyard::{AllStoragesView, Unique, UniqueView, NonSendSync, UniqueViewMut};
use crate::rendering::{Renderer, RenderTarget, WindowSize}; use crate::rendering::{Renderer, RenderTarget, WindowSize};