groups: Default::default(),
};
- parent.dialogwindow_builder()
+ parent.dialogwindow()
.title("Add Notebook")
.modal(true)
.show_closebutton(false)
// it is suppressed
obj.ctx.set_state(AppStates::NoteEnableNew as i32);
- obj.sidebar_builder().create(|obj|{
+ obj.sidebar().create(|obj|{
sourcelist!(obj,
fill = true, value = &data.notebooks,
getvalue = |elm,_row,item|{
);
});
- obj.left_panel_builder().create(|obj|{
+ obj.left_panel().create(|obj|{
let mut model = TableModel::new();
model.add_column("Name", ColumnType::String, -1);
model.add_column("Last Modified", ColumnType::String, 0);
onactivate_action = "note_activated");
});
- obj.right_panel_builder().create(|obj|{
+ obj.right_panel().create(|obj|{
tabview!(obj, fill = true, tabview_type = TabViewType::Invisible, varname = "note_type", |tabview|{
tabview.tab("empty", |_obj| {});
use std::ffi::{c_char, c_int, c_void, CString};
use std::marker::PhantomData;
use ui_rs_derive::UiModel;
+use crate::dialog;
use crate::ui::ffi::{UiCallback, UiEvent};
use crate::ui::{call_mainthread, dialog, toolkit, ui_call_mainthread, ui_global_context, UiActions, UiContext, UiModel};
impl<'a> Application<NoAppData> for ErrApp<'a> {
fn on_startup(&mut self, _app: &AppContext<NoAppData>) {
- dialog(|d| {
- d.title(self.title);
- d.content(self.message);
- d.button1_label("OK");
- });
+ dialog!(title = self.title, content = self.message, button1_label = "OK");
}
}
#[macro_export]
macro_rules! button {
($parent:expr, $($tt:tt)*) => {
- $crate::widget!($parent, button_builder, $($tt)*)
+ $crate::widget!($parent, button, $($tt)*)
};
}
#[macro_export]
macro_rules! togglebutton {
($parent:expr, $($tt:tt)*) => {
- $crate::widget!($parent, togglebutton_builder, $($tt)*)
+ $crate::widget!($parent, togglebutton, $($tt)*)
};
}
#[macro_export]
macro_rules! checkbox {
($parent:expr, $($tt:tt)*) => {
- $crate::widget!($parent, checkbox_builder, $($tt)*)
+ $crate::widget!($parent, checkbox, $($tt)*)
};
}
#[macro_export]
macro_rules! switch {
($parent:expr, $($tt:tt)*) => {
- $crate::widget!($parent, switch_builder, $($tt)*)
+ $crate::widget!($parent, switch, $($tt)*)
};
}
#[macro_export]
macro_rules! radiobutton {
($parent:expr, $($tt:tt)*) => {
- $crate::widget!($parent, radiobutton_builder, $($tt)*)
+ $crate::widget!($parent, radiobutton, $($tt)*)
+ };
+}
+
+#[macro_export]
+macro_rules! linkbutton {
+ ($parent:expr, $($tt:tt)*) => {
+ $crate::widget!($parent, linkbutton, $($tt)*)
};
}
pub type ToggleButtonCreate = fn(*const UiObject, *const UiToggleArgs) -> *mut c_void;
impl<T> toolkit::UiObject<T> {
- pub fn button_builder<'a>(&'a mut self) -> ButtonBuilder<'a, T> {
+ pub fn button<'a>(&'a mut self) -> ButtonBuilder<'a, T> {
unsafe {
let args = ui_button_args_new();
ButtonBuilder { args: args, obj: self }
}
}
- pub fn togglebutton_builder<'a>(&'a mut self) -> ToggleBuilder<'a, T> {
+ pub fn togglebutton<'a>(&'a mut self) -> ToggleBuilder<'a, T> {
unsafe {
let args = ui_toggle_args_new();
ToggleBuilder { args: args, obj: self, create: togglebutton_create }
- pub fn checkbox_builder<'a>(&'a mut self) -> ToggleBuilder<'a, T> {
+ pub fn checkbox<'a>(&'a mut self) -> ToggleBuilder<'a, T> {
unsafe {
let args = ui_toggle_args_new();
ToggleBuilder { args: args, obj: self, create: checkbox_create }
}
}
- pub fn switch_builder<'a>(&'a mut self) -> ToggleBuilder<'a, T> {
+ pub fn switch<'a>(&'a mut self) -> ToggleBuilder<'a, T> {
unsafe {
let args = ui_toggle_args_new();
ToggleBuilder { args: args, obj: self, create: switch_create }
}
}
- pub fn radiobutton_builder<'a>(&'a mut self) -> ToggleBuilder<'a, T> {
+ pub fn radiobutton<'a>(&'a mut self) -> ToggleBuilder<'a, T> {
unsafe {
let args = ui_toggle_args_new();
ToggleBuilder { args: args, obj: self, create: radiobutton_create }
}
}
+
+ pub fn linkbutton<'a>(&'a mut self) -> LinkButtonBuilder<'a, T> {
+ unsafe {
+ let args = ui_linkbutton_args_new();
+ LinkButtonBuilder { args: args, obj: self }
+ }
+ }
}
fn togglebutton_create<'a>(obj: *const UiObject, args: *const UiToggleArgs) -> *mut c_void {
,
|$child:ident| $body:block
) => {{
- $parent.hbox_builder()
+ $parent.hbox()
$(.$name($value))*
.create(|$child| $body)
}};
,
|$child:ident| $body:block
) => {{
- $parent.hbox_builder()
+ $parent.hbox()
$(.$name($value))*
.create(|$child| $body)
}};
,
|$child:ident| $body:block
) => {{
- $parent.grid_builder()
+ $parent.grid()
$(.$name($value))*
.create(|$child| $body)
}};
,
|$child:ident| $body:block
) => {{
- $parent.frame_builder()
+ $parent.frame()
$(.$name($value))*
.create(|$child| $body)
}};
,
|$child:ident| $body:block
) => {{
- $parent.expander_builder()
+ $parent.expander()
$(.$name($value))*
.create(|$child| $body)
}};
,
|$child:ident| $body:block
) => {{
- $parent.scrolledwindow_builder()
+ $parent.scrolledwindow()
$(.$name($value))*
.create(|$child| $body)
}};
,
|$child:ident| $body:block
) => {{
- $parent.hsplitpane_builder()
+ $parent.hsplitpane()
$(.$name($value))*
.create(|$child| $body)
}};
,
|$child:ident| $body:block
) => {{
- $parent.vsplitpane_builder()
+ $parent.vsplitpane()
$(.$name($value))*
.create(|$child| $body)
}};
,
|$child:ident| $body:block
) => {{
- $parent.sidebar_builder()
+ $parent.sidebar()
$(.$name($value))*
.create(|$child| $body)
}};
,
|$child:ident| $body:block
) => {{
- $parent.left_panel_builder()
+ $parent.left_panel()
$(.$name($value))*
.create(|$child| $body)
}};
,
|$child:ident| $body:block
) => {{
- $parent.right_panel_builder()
+ $parent.right_panel()
$(.$name($value))*
.create(|$child| $body)
}};
,
|$child:ident| $body:block
) => {{
- $parent.tabview_builder()
+ $parent.tabview()
$(.$name($value))*
.create(|$child| $body)
}};
-macro_rules! container_fn {
- ($fn_name:ident, $builder_fn:ident, $builder_ty:ident) => {
- pub fn $fn_name<F, U>(&mut self, build: F, ui: U)
- where
- F: Fn(&mut $builder_ty<'_, T>),
- U: FnOnce(&mut toolkit::UiObject<T>)
- {
- let mut builder = self.$builder_fn();
- build(&mut builder);
- builder.create(ui);
- }
- };
-}
-
pub enum SubContainer {
VBox = 0,
HBox = 1,
}
impl<T> toolkit::UiObject<T> {
- container_fn!(vbox, vbox_builder, ContainerBuilder);
- container_fn!(hbox, hbox_builder, ContainerBuilder);
- container_fn!(grid, grid_builder, ContainerBuilder);
-
- pub fn vbox_builder(&mut self) -> ContainerBuilder<'_, T>
+ pub fn vbox(&mut self) -> ContainerBuilder<'_, T>
{
unsafe {
let args = ui_container_args_new();
}
}
- pub fn hbox_builder(&mut self) -> ContainerBuilder<'_, T>
+ pub fn hbox(&mut self) -> ContainerBuilder<'_, T>
{
unsafe {
let args = ui_container_args_new();
}
}
- pub fn grid_builder(&mut self) -> ContainerBuilder<'_, T>
+ pub fn grid(&mut self) -> ContainerBuilder<'_, T>
{
unsafe {
let args = ui_container_args_new();
}
impl<T> toolkit::UiObject<T> {
- container_fn!(frame, frame_builder, FrameBuilder);
- container_fn!(expander, expander_builder, FrameBuilder);
- container_fn!(scrolledwindow, scrolledwindow_builder, FrameBuilder);
-
- pub fn frame_builder(&mut self) -> FrameBuilder<'_, T>
+ pub fn frame(&mut self) -> FrameBuilder<'_, T>
{
unsafe {
let args = ui_frame_args_new();
}
}
- pub fn expander_builder(&mut self) -> FrameBuilder<'_, T>
+ pub fn expander(&mut self) -> FrameBuilder<'_, T>
{
unsafe {
let args = ui_frame_args_new();
}
}
- pub fn scrolledwindow_builder(&mut self) -> FrameBuilder<'_, T>
+ pub fn scrolledwindow(&mut self) -> FrameBuilder<'_, T>
{
unsafe {
let args = ui_frame_args_new();
impl<T> toolkit::UiObject<T> {
- container_fn!(hsplitpane, hsplitpane_builder, SplitPaneBuilder);
- container_fn!(vsplitpane, vsplitpane_builder, SplitPaneBuilder);
-
- pub fn hsplitpane_builder(&mut self) -> SplitPaneBuilder<'_, T>
+ pub fn hsplitpane(&mut self) -> SplitPaneBuilder<'_, T>
{
unsafe {
let args = ui_splitpane_args_new();
}
}
- pub fn vsplitpane_builder(&mut self) -> SplitPaneBuilder<'_, T>
+ pub fn vsplitpane(&mut self) -> SplitPaneBuilder<'_, T>
{
unsafe {
let args = ui_splitpane_args_new();
impl<T> toolkit::UiObject<T> {
- container_fn!(sidebar, sidebar_builder, SidebarBuilder);
-
- pub fn sidebar_builder(&mut self) -> SidebarBuilder<'_, T>
+ pub fn sidebar(&mut self) -> SidebarBuilder<'_, T>
{
unsafe {
let args = ui_sidebar_args_new();
}
}
- pub fn left_panel_builder(&mut self) -> SidebarBuilder<'_, T>
+ pub fn left_panel(&mut self) -> SidebarBuilder<'_, T>
{
unsafe {
let args = ui_sidebar_args_new();
}
}
- pub fn right_panel_builder(&mut self) -> SidebarBuilder<'_, T>
+ pub fn right_panel(&mut self) -> SidebarBuilder<'_, T>
{
unsafe {
let args = ui_sidebar_args_new();
}
impl<T> toolkit::UiObject<T> {
- pub fn tabview<F, U>(&mut self, build: F, ui: U)
- where
- F: Fn(&mut TabViewBuilder<T>),
- U: FnOnce(&mut TabBuilder<T>) {
- let mut builder = self.tabview_builder();
- build(&mut builder);
- builder.create(ui);
- }
-
- pub fn tabview_builder(&mut self) -> TabViewBuilder<'_, T>
+ pub fn tabview(&mut self) -> TabViewBuilder<'_, T>
{
unsafe {
let args = ui_tabview_args_new();
#[macro_export]
macro_rules! label {
($parent:expr, $($tt:tt)*) => {
- $crate::widget!($parent, label_builder, $($tt)*)
+ $crate::widget!($parent, label, $($tt)*)
};
}
#[macro_export]
macro_rules! llabel {
($parent:expr, $($tt:tt)*) => {
- $crate::widget!($parent, llabel_builder, $($tt)*)
+ $crate::widget!($parent, llabel, $($tt)*)
};
}
#[macro_export]
macro_rules! rlabel {
($parent:expr, $($tt:tt)*) => {
- $crate::widget!($parent, rlabel_builder, $($tt)*)
+ $crate::widget!($parent, rlabel, $($tt)*)
};
}
}
impl<T> toolkit::UiObject<T> {
- pub fn label_builder<'a>(&'a mut self) -> LabelBuilder<'a, T> {
+ pub fn label<'a>(&'a mut self) -> LabelBuilder<'a, T> {
unsafe {
let args = ui_label_args_new();
LabelBuilder { args: args, obj: self, create: label_create }
}
}
- pub fn llabel_builder<'a>(&'a mut self) -> LabelBuilder<'a, T> {
+ pub fn llabel<'a>(&'a mut self) -> LabelBuilder<'a, T> {
unsafe {
let args = ui_label_args_new();
LabelBuilder { args: args, obj: self, create: llabel_create }
}
}
- pub fn rlabel_builder<'a>(&'a mut self) -> LabelBuilder<'a, T> {
+ pub fn rlabel<'a>(&'a mut self) -> LabelBuilder<'a, T> {
unsafe {
let args = ui_label_args_new();
LabelBuilder { args: args, obj: self, create: rlabel_create }
#[macro_export]
macro_rules! listview {
($parent:expr, $($tt:tt)*) => {
- $crate::widget!($parent, listview_builder, $($tt)*)
+ $crate::widget!($parent, listview, $($tt)*)
};
}
#[macro_export]
macro_rules! dropdown {
($parent:expr, $($tt:tt)*) => {
- $crate::widget!($parent, dropdown_builder, $($tt)*)
+ $crate::widget!($parent, dropdown, $($tt)*)
};
}
#[macro_export]
macro_rules! tableview {
($parent:expr, $($tt:tt)*) => {
- $crate::widget!($parent, tableview_builder, $($tt)*)
+ $crate::widget!($parent, tableview, $($tt)*)
};
}
#[macro_export]
macro_rules! sourcelist {
($parent:expr, $($tt:tt)*) => {
- $crate::widget!($parent, sourcelist_builder, $($tt)*)
+ $crate::widget!($parent, sourcelist, $($tt)*)
};
}
pub type ListBuilderCreate = fn(*const UiObject, *const UiListArgs) -> ListView;
impl<T> toolkit::UiObject<T> {
- pub fn listview_builder<'a, E>(&'a mut self) -> ListViewBuilder<'a, T, E> {
+ pub fn listview<'a, E>(&'a mut self) -> ListViewBuilder<'a, T, E> {
unsafe {
let args = ui_list_args_new();
ListViewBuilder { args: args, obj: self, create: list_create, has_getvalue_func: false, _marker: PhantomData }
}
}
- pub fn dropdown_builder<'a, E>(&'a mut self) -> ListViewBuilder<'a, T, E> {
+ pub fn dropdown<'a, E>(&'a mut self) -> ListViewBuilder<'a, T, E> {
unsafe {
let args = ui_list_args_new();
ListViewBuilder { args: args, obj: self, create: dropdown_create, has_getvalue_func: false, _marker: PhantomData }
}
}
- pub fn tableview_builder<'a, E>(&'a mut self) -> TableViewBuilder<'a, T, E> {
+ pub fn tableview<'a, E>(&'a mut self) -> TableViewBuilder<'a, T, E> {
unsafe {
let args = ui_list_args_new();
TableViewBuilder { args: args, obj: self, create: tableview_create, model: std::ptr::null_mut(), has_getvalue_func: false, _marker: PhantomData }
}
}
- pub fn sourcelist_builder<'a, E>(&'a mut self) -> SourceListBuilder<'a, T, E> {
+ pub fn sourcelist<'a, E>(&'a mut self) -> SourceListBuilder<'a, T, E> {
unsafe {
let args = ui_sourcelist_args_new();
SourceListBuilder { args: args, obj: self, _marker: PhantomData }
#[macro_export]
macro_rules! textarea {
($parent:expr, $($tt:tt)*) => {
- $crate::widget!($parent, textarea_builder, $($tt)*)
+ $crate::widget!($parent, textarea, $($tt)*)
};
}
#[macro_export]
macro_rules! textfield {
($parent:expr, $($tt:tt)*) => {
- $crate::widget!($parent, textfield_builder, $($tt)*)
+ $crate::widget!($parent, textfield, $($tt)*)
};
}
#[macro_export]
macro_rules! passwordfield {
($parent:expr, $($tt:tt)*) => {
- $crate::widget!($parent, passwordfield_builder, $($tt)*)
+ $crate::widget!($parent, passwordfield, $($tt)*)
};
}
#[macro_export]
macro_rules! frameless_textfield {
($parent:expr, $($tt:tt)*) => {
- $crate::widget!($parent, frameless_textfield_builder, $($tt)*)
+ $crate::widget!($parent, frameless_textfield, $($tt)*)
};
}
}
impl<T> toolkit::UiObject<T> {
- pub fn textarea_builder<'a>(&'a mut self) -> TextAreaBuilder<'a, T> {
+ pub fn textarea<'a>(&'a mut self) -> TextAreaBuilder<'a, T> {
unsafe {
let args = ui_textarea_args_new();
TextAreaBuilder { args: args, obj: self }
}
impl<T> toolkit::UiObject<T> {
- pub fn textfield_builder<'a>(&'a mut self) -> TextFieldBuilder<'a, T> {
+ pub fn textfield<'a>(&'a mut self) -> TextFieldBuilder<'a, T> {
unsafe {
let args = ui_textfield_args_new();
TextFieldBuilder { args: args, obj: self, create: textfield_create }
}
}
- pub fn passwordfield_builder<'a>(&'a mut self) -> TextFieldBuilder<'a, T> {
+ pub fn passwordfield<'a>(&'a mut self) -> TextFieldBuilder<'a, T> {
unsafe {
let args = ui_textfield_args_new();
TextFieldBuilder { args: args, obj: self, create: passwordfield_create }
}
}
- pub fn frameless_textfield_builder<'a>(&'a mut self) -> TextFieldBuilder<'a, T> {
+ pub fn frameless_textfield<'a>(&'a mut self) -> TextFieldBuilder<'a, T> {
unsafe {
let args = ui_textfield_args_new();
TextFieldBuilder { args: args, obj: self, create: frameless_textfield_create }
use crate::ui::{destroy_boxed, event, event_wrapper_oneshot, ffi, toolkit, ui_object_ref, ui_update_action_bindings, AppContext, EventWrapper, NoAppData, UiActions, UiModel};
use crate::ui::ffi::{UiButtonArgs, UiCallback, UiContext, UiDestructor, UiDialogArgs, UiDialogWindowArgs, UiObject};
+
+#[macro_export]
+macro_rules! dialog {
+ (
+ $($name:ident = $value:expr),* $(,)?
+ ) => {{
+ dialog()
+ $(.$name($value))*
+ .create()
+ }};
+}
+
+#[macro_export]
+macro_rules! child_dialog {
+ (
+ $parent:expr,
+ $(, $name:ident = $value:expr )*
+ $(,)?
+ ) => {{
+ parent_dialog();
+ $(.$name($value))*
+ .create()
+ }};
+}
+
impl<T> toolkit::UiObject<T> {
pub fn show(&self) {
unsafe {
impl<T> toolkit::UiObject<T> {
- pub fn dialog_builder(&self) -> DialogBuilder<T> {
+ pub fn dialog(&self) -> DialogBuilder<T> {
DialogBuilder {
args: unsafe { ui_dialog_args_new() },
parent: self.ptr,
}
}
- pub fn dialog<F>(&mut self, build: F)
- where
- F: Fn(&mut DialogBuilder<T>),
- {
- let mut builder = self.dialog_builder();
- build(&mut builder);
- builder.create();
- }
-
- pub fn dialogwindow_builder<D>(&self) -> DialogWindowBuilder<D> {
+ pub fn dialogwindow<D>(&self) -> DialogWindowBuilder<D> {
unsafe {
DialogWindowBuilder {
args: ui_dialogwindow_args_new(),
}
}
-pub fn dialog_builder() -> DialogBuilder<NoAppData> {
+pub fn dialog() -> DialogBuilder<NoAppData> {
DialogBuilder {
args: unsafe { ui_dialog_args_new() },
parent: std::ptr::null_mut(),
}
}
-pub fn dialog<F>(build: F)
-where
- F: Fn(&mut DialogBuilder<NoAppData>),
-{
- let mut builder = dialog_builder();
- build(&mut builder);
- builder.create();
-}
-
fn openfile_dialog<T, F>(obj: &toolkit::UiObject<T>, mode: c_uint, f: F)
where F: FnMut(&mut event::Event<T>) + 'static {
let b: Box<EventWrapper<T>> = Box::new(EventWrapper { callback: Box::new(f) });