From: Olaf Wintermann Date: Sun, 17 May 2026 09:06:06 +0000 (+0200) Subject: add functions for calling actions X-Git-Url: https://uap-core.de/gitweb/?a=commitdiff_plain;h=a315347c0add670a80422ee2d45f4ef6640fab40;p=note.git add functions for calling actions --- diff --git a/entity/src/collection.rs b/entity/src/collection.rs index 656d145..a596011 100644 --- a/entity/src/collection.rs +++ b/entity/src/collection.rs @@ -1,6 +1,5 @@ use std::collections::HashMap; use sea_orm::entity::prelude::*; -use crate::collection; #[derive(Clone, Debug, PartialEq, DeriveEntityModel)] #[sea_orm(table_name = "collection")] diff --git a/ui-rs/src/ui/toolkit.rs b/ui-rs/src/ui/toolkit.rs index 3edc5ff..d701ced 100644 --- a/ui-rs/src/ui/toolkit.rs +++ b/ui-rs/src/ui/toolkit.rs @@ -206,6 +206,13 @@ impl UiObject { }); }); } + + pub fn call_action(&self, action: &str) { + let cstr = CString::new(action).unwrap(); + unsafe { + ui_call_action(self.ctx.ptr, cstr.as_ptr()); + } + } } pub trait UiModel { @@ -742,6 +749,14 @@ where F: FnOnce() { 0 } +pub fn broadcast_action(action: &str) { + let cstr = CString::new(action).unwrap(); + unsafe { + ui_mainthread_broadcast(cstr.as_ptr()); + } +} + + /* ----------------------------------- Config ---------------------------------- */ pub fn app_configdir() -> String { @@ -866,4 +881,7 @@ extern "C" { fn ui_text_selection(text: *const ffi::UiText, begin: *mut c_int, end: *mut c_int); fn ui_text_length(text: *const ffi::UiText) -> c_int; fn ui_text_remove(text: *mut ffi::UiText, begin: c_int, end: c_int); + + fn ui_call_action(ctx: *mut ffi::UiContext, action: *const c_char); + fn ui_mainthread_broadcast(action: *const c_char); } diff --git a/ui/common/action.c b/ui/common/action.c index 19f5faa..7c99361 100644 --- a/ui/common/action.c +++ b/ui/common/action.c @@ -28,6 +28,7 @@ #include "action.h" #include "context.h" +#include "object.h" #include @@ -141,3 +142,62 @@ void uic_action_callback(UiEvent *event, const char *action_name) { } } } + +void ui_call_action(UiContext *ctx, const char *action_name) { + ui_call_action2(ctx, action_name, NULL, 0); +} + +void ui_call_action2(UiContext *ctx, const char *action_name, void *eventdata, int intval) { + UiAction *action = uic_resolve_action(ctx, action_name); + if(action && action->callback) { + UiEvent event; + memset(&event, 0, sizeof(UiEvent)); + event.obj = ctx->obj; + event.window = event.obj ? event.obj->window : NULL; + event.document = ctx->self_doc ? ctx->self_doc : ctx->document; + if(eventdata) { + event.eventdata = eventdata; + event.eventdatatype = UI_EVENT_DATA_POINTER; + } + event.intval = intval; + action->callback(&event, action->userdata); + } +} + +void ui_broadcast_action(const char *action_name) { + ui_broadcast_action2(action_name, NULL, 0); +} + +void ui_broadcast_action2(const char *action_name, void *eventdata, int intval) { + CxList *objects = uic_object_list(); + CxIterator i = cxListIterator(objects); + cx_foreach(UiObject*, obj, i) { + ui_call_action2(obj->ctx, action_name, eventdata, intval); + } +} + +typedef struct UiActionBroadcast { + char *action; + void *eventdata; + int intval; +} UiActionBroadcast; + +void ui_mainthread_broadcast(const char *action_name) { + ui_mainthread_broadcast2(action_name, NULL, 0); +} + +static int mainthread_action_broadcast(void *data) { + UiActionBroadcast *broadcast = data; + ui_broadcast_action2(broadcast->action, broadcast->eventdata, broadcast->intval); + free(broadcast->action); + free(broadcast); + return 0; +} + +void ui_mainthread_broadcast2(const char *action_name, void *eventdata, int intval) { + UiActionBroadcast *broadcast = malloc(sizeof(UiActionBroadcast)); + broadcast->action = strdup(action_name); + broadcast->eventdata = eventdata; + broadcast->intval = intval; + ui_call_mainthread(mainthread_action_broadcast, broadcast); +} diff --git a/ui/common/object.c b/ui/common/object.c index 4cbd4d9..213a834 100644 --- a/ui/common/object.c +++ b/ui/common/object.c @@ -39,6 +39,8 @@ static CxList *creation_callbacks; static CxList *destruction_callbacks; +static CxList *objects; + typedef struct objcallback { ui_object_callback func; void *userdata; @@ -67,6 +69,11 @@ UiObject* ui_dummy_object(void) { } void uic_object_created(UiObject *obj) { + if(!objects) { + objects = cxLinkedListCreate(NULL, CX_STORE_POINTERS); + } + cxListAdd(objects, obj); + CxIterator i = cxListIterator(creation_callbacks); cx_foreach(objcallback *, cb, i) { cb->func(obj, cb->userdata); @@ -74,12 +81,20 @@ void uic_object_created(UiObject *obj) { } void uic_object_destroyed(UiObject *obj) { + if(objects) { + cxListFindRemove(objects, obj); + } + CxIterator i = cxListIterator(destruction_callbacks); cx_foreach(objcallback *, cb, i) { cb->func(obj, cb->userdata); } } +CxList* uic_object_list(void) { + return objects ? objects : cxEmptyList; +} + void ui_object_ref(UiObject *obj) { obj->ref++; } diff --git a/ui/common/object.h b/ui/common/object.h index c809c82..7ef1e12 100644 --- a/ui/common/object.h +++ b/ui/common/object.h @@ -50,6 +50,8 @@ void uic_object_created(UiObject *obj); void uic_object_destroyed(UiObject *obj); void uic_object_destroy(UiObject *obj); + +CxList* uic_object_list(void); UiObject* uic_object_new_toplevel(void); UiObject* uic_object_new(UiObject *toplevel, UIWIDGET widget); diff --git a/ui/ui/toolkit.h b/ui/ui/toolkit.h index 9cc79af..cd3fb44 100644 --- a/ui/ui/toolkit.h +++ b/ui/ui/toolkit.h @@ -575,6 +575,12 @@ UIEXPORT void ui_add_action_with_accelerator( const char *accelerator, const char *accelerator_text); UIEXPORT void ui_update_action_bindings(UiContext *ctx); +UIEXPORT void ui_call_action(UiContext *ctx, const char *action_name); +UIEXPORT void ui_call_action2(UiContext *ctx, const char *action_name, void *eventdata, int intval); +UIEXPORT void ui_broadcast_action(const char *action_name); +UIEXPORT void ui_broadcast_action2(const char *action_name, void *eventdata, int intval); +UIEXPORT void ui_mainthread_broadcast(const char *action_name); +UIEXPORT void ui_mainthread_broadcast2(const char *action_name, void *eventdata, int intval); UIEXPORT void ui_set_state(UiContext *ctx, int state); UIEXPORT void ui_unset_state(UiContext *ctx, int state);