diff --git a/Cargo.lock b/Cargo.lock index 5f01af9..184518c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1715,6 +1715,7 @@ dependencies = [ "element_bridge", "futures", "glam", + "indexmap", "log", "makepad-widgets", "mp_core", diff --git a/mp/Cargo.toml b/mp/Cargo.toml index e0c9037..dfe3ad3 100644 --- a/mp/Cargo.toml +++ b/mp/Cargo.toml @@ -20,3 +20,4 @@ element_bridge = { path = "../element_bridge", version = "*" } futures = "0.3.31" async-trait = "0.1.83" thiserror = "2.0.3" +indexmap = "2.6.0" diff --git a/mp/src/app.rs b/mp/src/app.rs index b32f8ed..9a0f073 100644 --- a/mp/src/app.rs +++ b/mp/src/app.rs @@ -1,6 +1,10 @@ use crate::file::*; use crate::menu::{handle_menu, spawn_background}; use crate::widgets::area::TAreaWidgetRefExt; +use crate::widgets::selector::{ + ItemKey, ItemValue, SelectorListWidgetRefExt, SelectorWidgetRefExt, +}; + use crate::windows_manager::WM; use crate::{render_task::RenderTasks, PLUGIN_MANAGER, RUNTIME}; use ::log::info; @@ -16,7 +20,6 @@ live_design! { import makepad_widgets::base::*; import makepad_widgets::theme_desktop_dark::*; import crate::app_ui::MainView; - import crate::widgets::selector_modal::SelectorModal; HELLO = "Hello, World!"; @@ -87,8 +90,6 @@ live_design! { } } - selector = {} - {} } window_menu = { @@ -177,8 +178,8 @@ impl LiveRegister for App { crate::app_ui::live_design(_cx); crate::widgets::area::live_design(_cx); crate::widgets::renderer::live_design(_cx); - crate::widgets::selector_modal::live_design(_cx); crate::widgets::background_text::live_design(_cx); + crate::widgets::selector::live_design(_cx); } } @@ -200,6 +201,71 @@ impl MatchEvent for App { let render_task = render_tasks.lock().await; render_task.render().await; }); + + let items = vec![ + ( + ItemKey { + path: "path".to_string(), + category: "category".to_string(), + description: "description_1".to_string(), + }, + vec![ + ItemValue { + name: "Item 1".to_string(), + }, + ItemValue { + name: "Item 2".to_string(), + }, + ], + ), + ( + ItemKey { + path: "path".to_string(), + category: "category".to_string(), + description: "description_1".to_string(), + }, + vec![ + ItemValue { + name: "Item 1".to_string(), + }, + ItemValue { + name: "Item 2".to_string(), + }, + ], + ), + ( + ItemKey { + path: "path".to_string(), + category: "category".to_string(), + description: "description_2".to_string(), + }, + vec![ + ItemValue { + name: "Item 1".to_string(), + }, + ItemValue { + name: "Item 2".to_string(), + }, + ], + ), + ( + ItemKey { + path: "path".to_string(), + category: "category".to_string(), + description: "description_1".to_string(), + }, + vec![ + ItemValue { + name: "Item 1".to_string(), + }, + ItemValue { + name: "Item 3".to_string(), + }, + ], + ), + ]; + + ui.selector(id!(a)).set_items(cx, items); } fn handle_signal(&mut self, cx: &mut Cx) { diff --git a/mp/src/app_ui.rs b/mp/src/app_ui.rs index a07bc11..6154238 100644 --- a/mp/src/app_ui.rs +++ b/mp/src/app_ui.rs @@ -1,4 +1,3 @@ -use makepad_widgets::Dock; use makepad_widgets::*; live_design! { import makepad_widgets::base::*; @@ -7,8 +6,9 @@ live_design! { import crate::widgets::renderer::IRenderer; import makepad_draw::shader::std::*; - import crate::widgets::selector_modal::SelectorItem; + import crate::widgets::selector_modal::*; import crate::widgets::background_text::BackgroundLabel; + import crate::widgets::selector::*; HELLO = "Hello, World!"; @@ -62,8 +62,16 @@ live_design! { x: 0.5, y: 0.5 }, - quad = { - id: "Primary" + + { + width: 600 + height: 500 + align: { + x: 0.5, + y: 0.5 + } + + a = {} } } @@ -130,6 +138,7 @@ live_design! {

{ text: "Input"} + { flow: Right width: Fill @@ -146,10 +155,9 @@ live_design! { { text: "Holy Shit", } + } - - { { diff --git a/mp/src/widgets/mod.rs b/mp/src/widgets/mod.rs index 9daaafe..a659804 100644 --- a/mp/src/widgets/mod.rs +++ b/mp/src/widgets/mod.rs @@ -1,4 +1,4 @@ pub mod area; pub mod background_text; pub mod renderer; -pub mod selector_modal; +pub mod selector; diff --git a/mp/src/widgets/selector.rs b/mp/src/widgets/selector.rs new file mode 100644 index 0000000..a1ccce1 --- /dev/null +++ b/mp/src/widgets/selector.rs @@ -0,0 +1,550 @@ +use std::collections::HashMap; + +use indexmap::IndexSet; +use makepad_widgets::*; + +live_design! { + import makepad_widgets::base::*; + import makepad_widgets::theme_desktop_dark::*; + import makepad_draw::shader::std::*; + + ICO_SEARCH = dep("crate://self/resources/icons/Icon_Search.svg") + + RView = { + show_bg: true, + draw_bg: { + instance border_width: 0.0 + instance border_color: #0000 + instance inset: vec4(0.0, 0.0, 0.0, 0.0) + + fn get_color(self) -> vec4 { + return self.color + } + + fn get_border_color(self) -> vec4 { + return self.border_color + } + + fn pixel(self) -> vec4 { + let sdf = Sdf2d::viewport(self.pos * self.rect_size); + sdf.rect( + self.inset.x + self.border_width, + self.inset.y + self.border_width, + self.rect_size.x - (self.inset.x + self.inset.z + self.border_width * 2.0), + self.rect_size.y - (self.inset.y + self.inset.w + self.border_width * 2.0) + ) + sdf.fill_keep(self.get_color()) + if self.border_width > 0.0 { + sdf.stroke(self.get_border_color(), self.border_width) + } + return sdf.result + } + } + } + + TitleBar = { + height: 24 + width: Fill + align: { + y:0.5 + } + + padding: { + left:10 + } + + draw_bg: { + color: #3c3c3c + border_color: #fff + border_width: 0.5 + } + + class_title =