From 77042eeb81ca74b1c8f720918e4045bc6fcaf6a2 Mon Sep 17 00:00:00 2001 From: Olaf Wintermann Date: Fri, 24 Jul 2026 20:27:38 +0200 Subject: [PATCH] add new macros for creating widgets --- application/note/src/window.rs | 7 ++----- ui-rs/src/ui/button.rs | 37 ++++++++++++++++++++++++++++++++++ ui-rs/src/ui/label.rs | 22 ++++++++++++++++++++ ui-rs/src/ui/list.rs | 28 +++++++++++++++++++++++++ ui-rs/src/ui/text.rs | 29 ++++++++++++++++++++++++++ ui-rs/src/ui/widget.rs | 17 ++++++++++++++++ 6 files changed, 135 insertions(+), 5 deletions(-) diff --git a/application/note/src/window.rs b/application/note/src/window.rs index 2b5b019..0c6aac4 100644 --- a/application/note/src/window.rs +++ b/application/note/src/window.rs @@ -28,7 +28,7 @@ use std::any::Any; use backend::backend::{BackendHandle, BroadcastMessage, NoteId}; -use ui_rs::{action, ui_actions, UiModel}; +use ui_rs::{action, button, ui_actions, UiModel}; use ui_rs::ui::*; use crate::{App, AppStates}; use entity::collection::{Model as Collection, Node}; @@ -305,10 +305,7 @@ pub fn create_window(app: &App, ctx: &AppContext) -> UiObject { + $crate::widget!($parent, button_builder, $($tt)*) + }; +} + +#[macro_export] +macro_rules! togglebutton { + ($parent:expr, $($tt:tt)*) => { + $crate::widget!($parent, togglebutton_builder, $($tt)*) + }; +} + +#[macro_export] +macro_rules! checkbox { + ($parent:expr, $($tt:tt)*) => { + $crate::widget!($parent, checkbox_builder, $($tt)*) + }; +} + +#[macro_export] +macro_rules! switch { + ($parent:expr, $($tt:tt)*) => { + $crate::widget!($parent, switch_builder, $($tt)*) + }; +} + +#[macro_export] +macro_rules! radiobutton { + ($parent:expr, $($tt:tt)*) => { + $crate::widget!($parent, radiobutton_builder, $($tt)*) + }; +} + + pub struct Button { ptr: *mut c_void } diff --git a/ui-rs/src/ui/label.rs b/ui-rs/src/ui/label.rs index 501ba0c..dc0c107 100644 --- a/ui-rs/src/ui/label.rs +++ b/ui-rs/src/ui/label.rs @@ -3,6 +3,28 @@ use crate::ui::{ffi, toolkit, Button, ButtonBuilder}; use crate::ui::ffi::{UiButtonArgs, UiLabelArgs, UiObject, UiString, UiToggleArgs}; use crate::ui::widget::{widget_fn, Widget}; + +#[macro_export] +macro_rules! label { + ($parent:expr, $($tt:tt)*) => { + $crate::widget!($parent, label_builder, $($tt)*) + }; +} + +#[macro_export] +macro_rules! llabel { + ($parent:expr, $($tt:tt)*) => { + $crate::widget!($parent, llabel_builder, $($tt)*) + }; +} + +#[macro_export] +macro_rules! rlabel { + ($parent:expr, $($tt:tt)*) => { + $crate::widget!($parent, rlabel_builder, $($tt)*) + }; +} + pub struct Label { ptr: *mut c_void } diff --git a/ui-rs/src/ui/list.rs b/ui-rs/src/ui/list.rs index 0a732d6..37c1f3a 100644 --- a/ui-rs/src/ui/list.rs +++ b/ui-rs/src/ui/list.rs @@ -36,6 +36,34 @@ use std::marker::PhantomData; use std::mem; use crate::ui::widget::{widget_typed_fn, Widget}; +#[macro_export] +macro_rules! listview { + ($parent:expr, $($tt:tt)*) => { + $crate::widget!($parent, listview_builder, $($tt)*) + }; +} + +#[macro_export] +macro_rules! dropdown { + ($parent:expr, $($tt:tt)*) => { + $crate::widget!($parent, dropdown_builder, $($tt)*) + }; +} + +#[macro_export] +macro_rules! tableview { + ($parent:expr, $($tt:tt)*) => { + $crate::widget!($parent, tableview_builder, $($tt)*) + }; +} + +#[macro_export] +macro_rules! sourcelist { + ($parent:expr, $($tt:tt)*) => { + $crate::widget!($parent, sourcelist_builder, $($tt)*) + }; +} + pub struct ListView { ptr: *mut c_void diff --git a/ui-rs/src/ui/text.rs b/ui-rs/src/ui/text.rs index 3064de0..31d7827 100644 --- a/ui-rs/src/ui/text.rs +++ b/ui-rs/src/ui/text.rs @@ -35,6 +35,35 @@ use crate::ui::ffi::*; use crate::ui::widget::{widget_fn, Widget}; +#[macro_export] +macro_rules! textarea { + ($parent:expr, $($tt:tt)*) => { + $crate::widget!($parent, textarea_builder, $($tt)*) + }; +} + +#[macro_export] +macro_rules! textfield { + ($parent:expr, $($tt:tt)*) => { + $crate::widget!($parent, textfield_builder, $($tt)*) + }; +} + +#[macro_export] +macro_rules! passwordfield { + ($parent:expr, $($tt:tt)*) => { + $crate::widget!($parent, passwordfield_builder, $($tt)*) + }; +} + +#[macro_export] +macro_rules! frameless_textfield { + ($parent:expr, $($tt:tt)*) => { + $crate::widget!($parent, frameless_textfield_builder, $($tt)*) + }; +} + + /* -------------------------------- TextArea -------------------------------- */ pub struct TextArea { diff --git a/ui-rs/src/ui/widget.rs b/ui-rs/src/ui/widget.rs index bf0f7e8..b4d9bf9 100644 --- a/ui-rs/src/ui/widget.rs +++ b/ui-rs/src/ui/widget.rs @@ -57,6 +57,23 @@ pub trait Widget { } +#[macro_export] +macro_rules! widget { + ( + $parent:expr, + $widget:ident + $(, $name:ident = $value:expr )* + $(,)? + ) => {{ + let mut builder = $parent.$widget(); + let builder = builder + $(.$name($value))*; + builder.create() + }}; +} + + + /* ------------------------------ C functions ----------------------------- */ unsafe extern "C" { -- 2.52.0