]> uap-core.de Git - note.git/commitdiff
add support for actions for imageviewer events main
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Wed, 2 Sep 2026 15:00:20 +0000 (17:00 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Wed, 2 Sep 2026 15:00:20 +0000 (17:00 +0200)
ui-rs/src/ui/image.rs
ui/common/args.c
ui/common/args.h
ui/gtk/image.c
ui/gtk/image.h
ui/ui/image.h

index 35fe5345348dcb6432eb07a060e64e903378545f..0ca2b5575439297733d2be73f4182ba771adc0f5 100644 (file)
@@ -349,6 +349,14 @@ impl<'a, T> ImageViewerBuilder<'a, T> {
         self
     }
 
+    pub fn onbuttonpress_action(&mut self, action: &str) -> &mut Self {
+        let cstr = CString::new(action).unwrap();
+        unsafe {
+            ui_imageviewer_args_set_onbuttonpress_action(self.args, cstr.as_ptr());
+        }
+        self
+    }
+
     pub fn onbuttonrelease<F>(&mut self, f: F) -> &mut Self
     where F: FnMut(&mut event::Event<T>) + 'static {
         let wrapper = Box::new(EventWrapper::new(f) );
@@ -360,6 +368,14 @@ impl<'a, T> ImageViewerBuilder<'a, T> {
         self
     }
 
+    pub fn onbuttonrelease_action(&mut self, action: &str) -> &mut Self {
+        let cstr = CString::new(action).unwrap();
+        unsafe {
+            ui_imageviewer_args_set_onbuttonrelease_action(self.args, cstr.as_ptr());
+        }
+        self
+    }
+
     pub fn visibility_states<S: Copy + Into<i32>>(&mut self, states: &[S]) -> &mut Self {
         let states: Vec<i32> = states.iter().copied().map(Into::into).collect();
         unsafe {
@@ -428,8 +444,10 @@ unsafe extern "C" {
     fn ui_imageviewer_args_set_image_padding_bottom(args: *mut UiImageViewerArgs, value: c_int);
     fn ui_imageviewer_args_set_onbuttonpress(args: *mut UiImageViewerArgs, callback: UiCallback);
     fn ui_imageviewer_args_set_onbuttonpressdata(args: *mut UiImageViewerArgs, data: *const c_void);
+    fn ui_imageviewer_args_set_onbuttonpress_action(args: *mut UiImageViewerArgs, action: *const c_char);
     fn ui_imageviewer_args_set_onbuttonrelease(args: *mut UiImageViewerArgs, callback: UiCallback);
     fn ui_imageviewer_args_set_onbuttonreleasedata(args: *mut UiImageViewerArgs, data: *const c_void);
+    fn ui_imageviewer_args_set_onbuttonrelease_action(args: *mut UiImageViewerArgs, action: *const c_char);
     fn ui_imageviewer_args_set_visibility_states(args: *mut UiImageViewerArgs, states: *const c_int, numstates: c_int);
     fn ui_imageviewer_args_free(args: *mut UiImageViewerArgs);
 
index 8053d82d58f99c3a1ad6fa7db33376c83ad17346..8f1f1fe4546ade7ff69fff9b10ca5137ebe36c70 100644 (file)
@@ -191,6 +191,98 @@ void ui_dialogwindow_args_free(UiDialogWindowArgs *args) {
 }
 
 
+/* ---------------------------- UiHeaderbarArgs ---------------------------- */
+
+UiHeaderbarArgs* ui_headerbar_args_new(void) {
+    UiHeaderbarArgs *args = malloc(sizeof(UiHeaderbarArgs));
+    memset(args, 0, sizeof(UiHeaderbarArgs));
+    return args;
+}
+
+void ui_headerbar_args_set_fill(UiHeaderbarArgs *args, UiBool fill) {
+    args->fill = fill;
+}
+
+void ui_headerbar_args_set_hexpand(UiHeaderbarArgs *args, UiBool value) {
+    args->hexpand = value;
+}
+
+void ui_headerbar_args_set_vexpand(UiHeaderbarArgs *args, UiBool value) {
+    args->vexpand = value;
+}
+
+void ui_headerbar_args_set_hfill(UiHeaderbarArgs *args, UiBool value) {
+    args->hfill = value;
+}
+
+void ui_headerbar_args_set_vfill(UiHeaderbarArgs *args, UiBool value) {
+    args->vfill = value;
+}
+
+void ui_headerbar_args_set_override_defaults(UiHeaderbarArgs *args, UiBool value) {
+    args->override_defaults = value;
+}
+
+void ui_headerbar_args_set_margin(UiHeaderbarArgs *args, int value) {
+    args->margin = value;
+}
+
+void ui_headerbar_args_set_margin_left(UiHeaderbarArgs *args, int value) {
+    args->margin_left = value;
+}
+
+void ui_headerbar_args_set_margin_right(UiHeaderbarArgs *args, int value) {
+    args->margin_right = value;
+}
+
+void ui_headerbar_args_set_margin_top(UiHeaderbarArgs *args, int value) {
+    args->margin_top = value;
+}
+
+void ui_headerbar_args_set_margin_bottom(UiHeaderbarArgs *args, int value) {
+    args->margin_bottom = value;
+}
+
+void ui_headerbar_args_set_colspan(UiHeaderbarArgs *args, int colspan) {
+    args->colspan = colspan;
+}
+
+void ui_headerbar_args_set_rowspan(UiHeaderbarArgs *args, int rowspan) {
+    args->rowspan = rowspan;
+}
+
+void ui_headerbar_args_set_name(UiHeaderbarArgs *args, const char *name) {
+    args->name = strdup(name);
+}
+
+void ui_headerbar_args_set_style_class(UiHeaderbarArgs *args, const char *classname) {
+    args->style_class = strdup(classname);
+}
+
+void ui_headerbar_args_set_showtitle(UiHeaderbarArgs *args, UiBool value) {
+    args->showtitle = value;
+}
+
+void ui_headerbar_args_set_showwindowbuttons(UiHeaderbarArgs *args, UiBool value) {
+    args->showwindowbuttons = value;
+}
+
+void ui_headerbar_args_set_alternative(UiHeaderbarArgs *args, UiHeaderbarAlternative alt) {
+    args->alternative = alt;
+}
+
+void ui_headerbar_args_set_alt_spacing(UiHeaderbarArgs *args, int spacing) {
+    args->alt_spacing = spacing;
+}
+
+void ui_headerbar_args_free(UiHeaderbarArgs *args) {
+    free((void*)args->name);
+    free((void*)args->style_class);
+    free(args);
+}
+
+
+
 /* ---------------------------- UiMenuItemArgs ---------------------------- */
 
 UiMenuItemArgs* ui_menuitem_args_new(void) {
@@ -3032,6 +3124,10 @@ void ui_imageviewer_args_set_onbuttonpressdata(UiImageViewerArgs *args, void *on
     args->onbuttonpressdata = onbuttonpressdata;
 }
 
+void ui_imageviewer_args_set_onbuttonpress_action(UiImageViewerArgs *args, const char *action) {
+    args->onbuttonpress_action = strdup(action);
+}
+
 void ui_imageviewer_args_set_onbuttonrelease(UiImageViewerArgs *args, ui_callback callback) {
     args->onbuttonrelease = callback;
 }
@@ -3040,11 +3136,17 @@ void ui_imageviewer_args_set_onbuttonreleasedata(UiImageViewerArgs *args, void *
     args->onbuttonreleasedata = onbuttonreleasedata;
 }
 
+void ui_imageviewer_args_set_onbuttonrelease_action(UiImageViewerArgs *args, const char *action) {
+    args->onbuttonrelease_action = strdup(action);
+}
+
 void ui_imageviewer_args_free(UiImageViewerArgs *args) {
     free((void*)args->name);
     free((void*)args->style_class);
     free((void*)args->varname);
     free((void*)args->visibility_states);
+    free((void*)args->onbuttonpress_action);
+    free((void*)args->onbuttonrelease_action);
     free(args);
 }
 
index ec13c6455efe2131243e03492f0a07d9e121443b..fc4b8597f5e5a8e16901d4b8bb7e9abfe75ce565 100644 (file)
@@ -78,6 +78,28 @@ UIEXPORT void ui_dialogwindow_args_set_height(UiDialogWindowArgs *args, int heig
 UIEXPORT void ui_dialogwindow_args_set_onclick(UiDialogWindowArgs *args, ui_callback cb);
 UIEXPORT void ui_dialogwindow_args_set_onclickdata(UiDialogWindowArgs *args, void *userdata);
 UIEXPORT void ui_dialogwindow_args_free(UiDialogWindowArgs *args);
+
+UIEXPORT UiHeaderbarArgs* ui_headerbar_args_new(void);
+UIEXPORT void ui_headerbar_args_set_fill(UiHeaderbarArgs *args, UiBool fill);
+UIEXPORT void ui_headerbar_args_set_hexpand(UiHeaderbarArgs *args, UiBool value);
+UIEXPORT void ui_headerbar_args_set_vexpand(UiHeaderbarArgs *args, UiBool value);
+UIEXPORT void ui_headerbar_args_set_hfill(UiHeaderbarArgs *args, UiBool value);
+UIEXPORT void ui_headerbar_args_set_vfill(UiHeaderbarArgs *args, UiBool value);
+UIEXPORT void ui_headerbar_args_set_override_defaults(UiHeaderbarArgs *args, UiBool value);
+UIEXPORT void ui_headerbar_args_set_margin(UiHeaderbarArgs *args, int value);
+UIEXPORT void ui_headerbar_args_set_margin_left(UiHeaderbarArgs *args, int value);
+UIEXPORT void ui_headerbar_args_set_margin_right(UiHeaderbarArgs *args, int value);
+UIEXPORT void ui_headerbar_args_set_margin_top(UiHeaderbarArgs *args, int value);
+UIEXPORT void ui_headerbar_args_set_margin_bottom(UiHeaderbarArgs *args, int value);
+UIEXPORT void ui_headerbar_args_set_colspan(UiHeaderbarArgs *args, int colspan);
+UIEXPORT void ui_headerbar_args_set_rowspan(UiHeaderbarArgs *args, int rowspan);
+UIEXPORT void ui_headerbar_args_set_name(UiHeaderbarArgs *args, const char *name);
+UIEXPORT void ui_headerbar_args_set_style_class(UiHeaderbarArgs *args, const char *classname);
+UIEXPORT void ui_headerbar_args_set_showtitle(UiHeaderbarArgs *args, UiBool value);
+UIEXPORT void ui_headerbar_args_set_showwindowbuttons(UiHeaderbarArgs *args, UiBool value);
+UIEXPORT void ui_headerbar_args_set_alternative(UiHeaderbarArgs *args, UiHeaderbarAlternative alt);
+UIEXPORT void ui_headerbar_args_set_alt_spacing(UiHeaderbarArgs *args, int spacing);
+UIEXPORT void ui_headerbar_args_free(UiHeaderbarArgs *args);
     
 UIEXPORT UiMenuItemArgs* ui_menuitem_args_new(void);
 UIEXPORT void ui_menuitem_args_set_label(UiMenuItemArgs *args, const char *label);
@@ -701,8 +723,10 @@ UIEXPORT void ui_imageviewer_args_set_image_padding_bottom(UiImageViewerArgs *ar
 UIEXPORT void ui_imageviewer_args_set_contextmenu(UiImageViewerArgs *args, UiMenuBuilder *menubuilder);
 UIEXPORT void ui_imageviewer_args_set_onbuttonpress(UiImageViewerArgs *args, ui_callback callback);
 UIEXPORT void ui_imageviewer_args_set_onbuttonpressdata(UiImageViewerArgs *args, void *onbuttonpressdata);
+UIEXPORT void ui_imageviewer_args_set_onbuttonpress_action(UiImageViewerArgs *args, const char *action);
 UIEXPORT void ui_imageviewer_args_set_onbuttonrelease(UiImageViewerArgs *args, ui_callback callback);
 UIEXPORT void ui_imageviewer_args_set_onbuttonreleasedata(UiImageViewerArgs *args, void *onbuttonreleasedata);
+UIEXPORT void ui_imageviewer_args_set_onbuttonrelease_action(UiImageViewerArgs *args, const char *action);
 UIEXPORT void ui_imageviewer_args_free(UiImageViewerArgs *args);
 
 UIEXPORT UiWebviewArgs* ui_webview_args_new(void);
index 5fcb048d2ce451b40539c8ddcce691843bad9f88..0ed45c75ccd433c741626d841b2bae2b72b8dcbd 100644 (file)
 #include "widget.h"
 #include "../common/context.h"
 #include "../common/object.h"
+#include "../common/action.h"
 
 static void imageviewer_destroy(UiImageViewer *iv) {
     if(iv->pixbuf) {
         g_object_unref(iv->pixbuf);
     }
+    free(iv->onbuttonpress_action);
+    free(iv->onbuttonrelease_action);
     free(iv);
 }
 
@@ -96,8 +99,10 @@ UIWIDGET ui_imageviewer_create(UiObject *obj, UiImageViewerArgs *args) {
     imgviewer->obj = obj;
     imgviewer->onbuttonpress = args->onbuttonpress;
     imgviewer->onbuttonpressdata = args->onbuttonpressdata;
+    imgviewer->onbuttonpress_action = args->onbuttonpress_action ? strdup(args->onbuttonpress_action) : NULL;
     imgviewer->onbuttonrelease = args->onbuttonrelease;
     imgviewer->onbuttonreleasedata = args->onbuttonreleasedata;
+    imgviewer->onbuttonrelease_action = args->onbuttonrelease_action ? strdup(args->onbuttonrelease_action) : NULL;
     if(args->image_padding > 0) {
         imgviewer->padding_left = args->image_padding;
         imgviewer->padding_right = args->image_padding;
@@ -464,7 +469,8 @@ static void imgviewer_button_event(
         GtkGestureClick *gesture,
         UiImageViewer *imgviewer,
         ui_callback callback,
-        void *userdata)
+        void *userdata,
+        const char *action)
 {
     UiEvent event;
     event.obj = imgviewer->obj;
@@ -474,7 +480,13 @@ static void imgviewer_button_event(
     event.eventdatatype = 0;
     event.intval = gtk_gesture_single_get_current_button(GTK_GESTURE_SINGLE(gesture));
     event.set = 0;
-    callback(&event, userdata);
+    
+    if(callback) {
+        callback(&event, userdata);
+    }
+    if(action) {
+        uic_action_callback(&event, action);
+    }
 }
 
 void ui_imageviewer_pressed_cb(
@@ -485,9 +497,7 @@ void ui_imageviewer_pressed_cb(
         gpointer userdata)
 {
     UiImageViewer *imgviewer = userdata;
-    if(imgviewer->onbuttonpress) {
-        imgviewer_button_event(self, imgviewer, imgviewer->onbuttonpress, imgviewer->onbuttonpressdata);
-    }
+    imgviewer_button_event(self, imgviewer, imgviewer->onbuttonpress, imgviewer->onbuttonpressdata, imgviewer->onbuttonpress_action);
 }
 
 void ui_imageviewer_released_cb(
@@ -498,9 +508,7 @@ void ui_imageviewer_released_cb(
         gpointer userdata)
 {
     UiImageViewer *imgviewer = userdata;
-    if(imgviewer->onbuttonrelease) {
-        imgviewer_button_event(self, imgviewer, imgviewer->onbuttonrelease, imgviewer->onbuttonreleasedata);
-    }
+    imgviewer_button_event(self, imgviewer, imgviewer->onbuttonrelease, imgviewer->onbuttonreleasedata, imgviewer->onbuttonrelease_action);
 }
 
 #else
index 987c73b3262d872626d59e30197d4d427bb80b9b..0721032d26db956dfc3ccfb8bd123c4d2f272ccd 100644 (file)
@@ -60,8 +60,10 @@ typedef struct UiImageViewer {
     
     ui_callback onbuttonpress;
     void *onbuttonpressdata;
+    char *onbuttonpress_action;
     ui_callback onbuttonrelease;
     void *onbuttonreleasedata;
+    char *onbuttonrelease_action;
 } UiImageViewer;
 
 void ui_cairo_draw_image(UiImageViewer *imgviewer, cairo_t *cr, int width, int height);
index e4eee59b2461cc8466573e1401e6f96767c5f30c..2395ea71d4a64fff3cd47ff515c9238a0d3fcb21 100644 (file)
@@ -78,8 +78,10 @@ typedef struct UiImageViewerArgs {
     
     ui_callback onbuttonpress;
     void *onbuttonpressdata;
+    const char *onbuttonpress_action;
     ui_callback onbuttonrelease;
     void *onbuttonreleasedata;
+    const char *onbuttonrelease_action;
     
     const int *visibility_states;
 } UiImageViewerArgs;