From c8b1b4fccf61af40df075af995709860d06c176c Mon Sep 17 00:00:00 2001 From: Olaf Wintermann Date: Sun, 26 Apr 2026 13:13:45 +0200 Subject: [PATCH] add toolbar --- application/src/main.rs | 12 ++++++++ ui-rs/src/ui/mod.rs | 2 ++ ui/common/args.c | 10 +++++++ ui/common/args.h | 2 ++ ui/gtk/button.c | 27 ++++++++++++++++-- ui/gtk/button.h | 2 ++ ui/gtk/headerbar.c | 2 +- ui/gtk/toolbar.c | 8 +++++- ui/gtk/toolbar.h | 62 ----------------------------------------- ui/gtk/toolkit.h | 1 + 10 files changed, 61 insertions(+), 67 deletions(-) diff --git a/application/src/main.rs b/application/src/main.rs index eb9801f..7eed863 100644 --- a/application/src/main.rs +++ b/application/src/main.rs @@ -48,6 +48,18 @@ impl Application for App { // menu.item("Open").create(); //}); + create_toolbar(app); + create_window(app); } } + +fn create_toolbar(app: &AppContext) { + app.toolbar_item("go_back").icon("go-previous").action("go_back").create(); + app.toolbar_item("go_forward").icon("go-next").action("go_forward").create(); + app.toolbar_item("new_note").icon("document-new").action("new_note").create(); + + app.toolbar_add_default("go_back", ToolbarItemPosition::Left); + app.toolbar_add_default("go_forward", ToolbarItemPosition::Left); + app.toolbar_add_default("new_note", ToolbarItemPosition::Left); +} \ No newline at end of file diff --git a/ui-rs/src/ui/mod.rs b/ui-rs/src/ui/mod.rs index d912af0..39035ff 100644 --- a/ui-rs/src/ui/mod.rs +++ b/ui-rs/src/ui/mod.rs @@ -47,3 +47,5 @@ pub use window::*; pub use button::*; pub use text::*; pub use list::*; +pub use toolbar::*; +pub use menu::*; diff --git a/ui/common/args.c b/ui/common/args.c index 07cbb2b..54ce54c 100644 --- a/ui/common/args.c +++ b/ui/common/args.c @@ -328,6 +328,10 @@ void ui_toolbar_item_args_set_tooltip(UiToolbarItemArgs *args, const char *toolt args->tooltip = strdup(tooltip); } +void ui_toolbar_item_args_set_action(UiToolbarItemArgs *args, const char *action) { + args->action = strdup(action); +} + void ui_toolbar_item_args_set_onclick(UiToolbarItemArgs *args, ui_callback callback) { args->onclick = callback; } @@ -345,6 +349,7 @@ void ui_toolbar_item_args_free(UiToolbarItemArgs *args) { free((void*)args->label); free((void*)args->icon); free((void*)args->tooltip); + free((void*)args->action); free((void*)args->states); free(args); } @@ -373,6 +378,10 @@ void ui_toolbar_toggleitem_args_set_varname(UiToolbarToggleItemArgs *args, const args->varname = strdup(varname); } +void ui_toolbar_toggleitem_args_set_action(UiToolbarToggleItemArgs *args, const char *action) { + args->action = strdup(action); +} + void ui_toolbar_toggleitem_args_set_onchange(UiToolbarToggleItemArgs *args, ui_callback callback) { args->onchange = callback; } @@ -392,6 +401,7 @@ void ui_toolbar_toggleitem_args_free(UiToolbarToggleItemArgs *args) { free((void*)args->icon); free((void*)args->tooltip); free((void*)args->varname); + free((void*)args->action); free((void*)args->states); free(args); } diff --git a/ui/common/args.h b/ui/common/args.h index f7c73a8..726dca1 100644 --- a/ui/common/args.h +++ b/ui/common/args.h @@ -109,6 +109,7 @@ UIEXPORT UiToolbarItemArgs* ui_toolbar_item_args_new(void); UIEXPORT void ui_toolbar_item_args_set_label(UiToolbarItemArgs *args, const char *label); UIEXPORT void ui_toolbar_item_args_set_icon(UiToolbarItemArgs *args, const char *icon); UIEXPORT void ui_toolbar_item_args_set_tooltip(UiToolbarItemArgs *args, const char *tooltip); +UIEXPORT void ui_toolbar_item_args_set_action(UiToolbarItemArgs *args, const char *action); UIEXPORT void ui_toolbar_item_args_set_onclick(UiToolbarItemArgs *args, ui_callback callback); UIEXPORT void ui_toolbar_item_args_set_onclickdata(UiToolbarItemArgs *args, void *onclickdata); UIEXPORT void ui_toolbar_item_args_set_states(UiToolbarItemArgs *args, int *states, int numstates); @@ -119,6 +120,7 @@ UIEXPORT void ui_toolbar_toggleitem_args_set_label(UiToolbarToggleItemArgs *args UIEXPORT void ui_toolbar_toggleitem_args_set_icon(UiToolbarToggleItemArgs *args, const char *icon); UIEXPORT void ui_toolbar_toggleitem_args_set_tooltip(UiToolbarToggleItemArgs *args, const char *tooltip); UIEXPORT void ui_toolbar_toggleitem_args_set_varname(UiToolbarToggleItemArgs *args, const char *varname); +UIEXPORT void ui_toolbar_toggleitem_args_set_action(UiToolbarToggleItemArgs *args, const char *action); UIEXPORT void ui_toolbar_toggleitem_args_set_onchange(UiToolbarToggleItemArgs *args, ui_callback callback); UIEXPORT void ui_toolbar_toggleitem_args_set_onchangedata(UiToolbarToggleItemArgs *args, void *onchangedata); UIEXPORT void ui_toolbar_toggleitem_args_set_states(UiToolbarToggleItemArgs *args, int *states, int numstates); diff --git a/ui/gtk/button.c b/ui/gtk/button.c index 00ad370..e72f7a7 100644 --- a/ui/gtk/button.c +++ b/ui/gtk/button.c @@ -188,7 +188,14 @@ static void ui_toggled_callback(GtkToggleButton *widget, UiEventData *event) { e.eventdatatype = 0; e.intval = gtk_toggle_button_get_active(widget); e.set = ui_get_setop(); - event->callback(&e, event->userdata); + + if(event->callback) { + event->callback(&e, event->userdata); + } + + if(event->action) { + uic_action_callback(&e, event->action); + } } static void ui_togglebutton_enable_state_callback(GtkToggleButton *widget, UiEventData *event) { @@ -209,6 +216,7 @@ void ui_setup_togglebutton( UiInteger *value, ui_callback onchange, void *onchangedata, + const char *action, int enable_state) { if(label) { @@ -219,6 +227,14 @@ void ui_setup_togglebutton( gtk_widget_set_tooltip_text(togglebutton, tooltip); } + if(action) { + uic_bind_action(obj->ctx, action, togglebutton, (ui_enablefunc)ui_set_enabled); + UiAction *ui_action = uic_resolve_action(obj->ctx, action); + if(!ui_action) { + ui_set_enabled(togglebutton, FALSE); + } + } + ui_bind_togglebutton( obj, togglebutton, @@ -229,6 +245,7 @@ void ui_setup_togglebutton( (ui_toggled_func)ui_toggled_callback, onchange, onchangedata, + action, (ui_toggled_func)ui_togglebutton_enable_state_callback, enable_state ); @@ -244,6 +261,7 @@ void ui_bind_togglebutton( void (*toggled_callback)(void*, void*), ui_callback onchange, void *onchangedata, + const char *action, void (*enable_state_func)(void*, void*), int enable_state) { @@ -280,6 +298,7 @@ void ui_bind_togglebutton( event->obj = obj; event->userdata = onchangedata; event->callback = onchange; + event->action = action ? strdup(action) : NULL, event->value = 0; event->customdata = NULL; event->customint = 0; @@ -292,10 +311,10 @@ void ui_bind_togglebutton( g_signal_connect( widget, "destroy", - G_CALLBACK(ui_destroy_userdata), + G_CALLBACK(ui_destroy_eventdata), event); } - + if(enable_state > 0) { UiEventData *event = malloc(sizeof(UiEventData)); event->obj = obj; @@ -329,6 +348,7 @@ static UIWIDGET togglebutton_create(UiObject *obj, GtkWidget *widget, UiToggleAr args->value, args->onchange, args->onchangedata, + args->action, args->enable_state); ui_set_name_and_style(widget, args->name, args->style_class); ui_set_widget_states(obj->ctx, widget, args->states); @@ -391,6 +411,7 @@ UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs *args) { (ui_toggled_func)ui_checkbox_callback, args->onchange, args->onchangedata, + args->action, (ui_toggled_func)ui_checkbox_enable_state, args->enable_state); diff --git a/ui/gtk/button.h b/ui/gtk/button.h index 9197b8f..1c4355b 100644 --- a/ui/gtk/button.h +++ b/ui/gtk/button.h @@ -72,6 +72,7 @@ void ui_setup_togglebutton( UiInteger *value, ui_callback onchange, void *onchangedata, + const char *action, int enable_state); void ui_bind_togglebutton( @@ -84,6 +85,7 @@ void ui_bind_togglebutton( void (*toggled_callback)(void*, void*), ui_callback onchange, void *onchangedata, + const char *action, void (*enable_state_func)(void*, void*), int enable_state); diff --git a/ui/gtk/headerbar.c b/ui/gtk/headerbar.c index 97e57e6..d2554a0 100644 --- a/ui/gtk/headerbar.c +++ b/ui/gtk/headerbar.c @@ -181,7 +181,7 @@ void ui_add_headerbar_toggleitem( ui_set_widget_states(obj->ctx, button, item->args.states); ui_set_widget_visibility_states(obj->ctx, button, item->args.visibility_states); WIDGET_ADD_CSS_CLASS(button, "flat"); - ui_setup_togglebutton(obj, button, item->args.label, item->args.icon, item->args.tooltip, item->args.varname, NULL, item->args.onchange, item->args.onchangedata, 0); + ui_setup_togglebutton(obj, button, item->args.label, item->args.icon, item->args.tooltip, item->args.varname, NULL, item->args.onchange, item->args.onchangedata, item->args.action, 0); headerbar_add(headerbar, box, button, pos); } diff --git a/ui/gtk/toolbar.c b/ui/gtk/toolbar.c index 33efbcd..1f6cc19 100644 --- a/ui/gtk/toolbar.c +++ b/ui/gtk/toolbar.c @@ -140,13 +140,14 @@ void add_toolitem_widget(GtkToolbar *tb, UiToolbarItem *item, UiObject *obj) { ui_set_widget_nstates(obj->ctx, GTK_WIDGET(button), item->args.states, item->nstates); - if(item->args.onclick) { + if(item->args.onclick || item->args.action) { UiEventData *event = cxMalloc( obj->ctx->allocator, sizeof(UiEventData)); event->obj = obj; event->callback = item->args.onclick; event->userdata = item->args.onclickdata; + event->action = item->args.action ? ui_strdup(obj->ctx, item->args.action) : NULL; event->customdata = NULL; event->customint = 0; event->value = 0; @@ -202,6 +203,7 @@ void add_toolitem_toggle_widget(GtkToolbar *tb, UiToolbarToggleItem *item, UiObj event->obj = obj; event->callback = item->args.onchange; event->userdata = item->args.onchangedata; + event->action = item->args.action ? ui_strdup(obj->ctx, item->args.action) : NULL;; event->var = var; g_signal_connect( @@ -239,6 +241,10 @@ void ui_tool_button_toggled(GtkToggleToolButton *widget, UiVarEventData *event) if(i) { ui_notify_evt(i->observers, &e); } + + if(event->action) { + uic_action_callback(&e, event->action); + } } int64_t ui_tool_toggle_button_get(UiInteger *integer) { diff --git a/ui/gtk/toolbar.h b/ui/gtk/toolbar.h index 7534c63..659e9cb 100644 --- a/ui/gtk/toolbar.h +++ b/ui/gtk/toolbar.h @@ -42,68 +42,6 @@ extern "C" { #if UI_GTK2 || UI_GTK3 -typedef struct UiToolItemI UiToolItemI; -typedef struct UiToolItem UiToolItem; -typedef struct UiStToolItem UiStToolItem; -typedef struct UiToggleToolItem UiToggleToolItem; - -typedef struct UiToolbarComboBox UiToolbarComboBox; -typedef struct UiToolbarComboBoxNV UiToolbarComboBoxNV; - -typedef void(*ui_toolbar_add_f)(GtkToolbar*, UiToolItemI*, UiObject*); - -struct UiToolItemI { - ui_toolbar_add_f add_to; -}; - -struct UiToolItem { - UiToolItemI item; - const char *label; - const char *image; - ui_callback callback; - void *userdata; - const char *varname; - CxList *groups; - int isimportant; -}; - -struct UiStToolItem { - UiToolItemI item; - const char *stockid; - ui_callback callback; - void *userdata; - const char *varname; - CxList *groups; - int isimportant; -}; - -struct UiToggleToolItem { - UiToolItemI item; - const char *label; - const char *image; - const char *stockid; - UiInteger *value; - const char *var; - CxList *groups; - int isimportant; -}; - -struct UiToolbarComboBox { - UiToolItemI item; - UiVar *var; - ui_getvaluefunc getvalue; - ui_callback callback; - void *userdata; -}; - -struct UiToolbarComboBoxNV { - UiToolItemI item; - char *listname; - ui_getvaluefunc getvalue; - ui_callback callback; - void *userdata; -}; - void ui_toolitem_vstgr( char *name, diff --git a/ui/gtk/toolkit.h b/ui/gtk/toolkit.h index 25a48f5..432bebb 100644 --- a/ui/gtk/toolkit.h +++ b/ui/gtk/toolkit.h @@ -173,6 +173,7 @@ typedef struct UiVarEventData { UiVar *var; UiObserver **observers; ui_callback callback; + char *action; void *userdata; int customint1; int customint2; -- 2.47.3