]> uap-core.de Git - note.git/commitdiff
add functions for calling actions
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Sun, 17 May 2026 09:06:06 +0000 (11:06 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Sun, 17 May 2026 09:06:06 +0000 (11:06 +0200)
entity/src/collection.rs
ui-rs/src/ui/toolkit.rs
ui/common/action.c
ui/common/object.c
ui/common/object.h
ui/ui/toolkit.h

index 656d1451f574f79ceba3efe90a104dc4013cd603..a5960115a4289c1eb07b6d4964f05901596bde2a 100644 (file)
@@ -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")]
index 3edc5ff07a61601767f683bf67da34e91c991930..d701ced45a720f55351da9add730b474a718af00 100644 (file)
@@ -206,6 +206,13 @@ impl<T> UiObject<T> {
             });
         });
     }
+
+    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);
 }
index 19f5faa5f04e5d05e45ae2b82b211f44416aa707..7c99361451d7423604cc7df6c9e0a1ca3a5c249a 100644 (file)
@@ -28,6 +28,7 @@
 
 #include "action.h"
 #include "context.h"
+#include "object.h"
 
 #include <cx/string.h>
 
@@ -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);
+}
index 4cbd4d9797b06585c900ed11b3ad98810495ceae..213a83481e13e1fcd466ebb6b9dade19eddc0f0c 100644 (file)
@@ -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++;
 }
index c809c822d1583b658dc7853c5faf3fb0919dc213..7ef1e1232af0269b722d7a7c5249cf38bfe88c26 100644 (file)
@@ -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);
index 9cc79aff571ae2163472413fc8ff70ef8e64cb5b..cd3fb441bfd03e8f1e9c52a7556c7c88b980e402 100644 (file)
@@ -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);