]> uap-core.de Git - rssreader.git/commitdiff
add bindings for toggle buttons
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Thu, 12 Jun 2025 09:31:17 +0000 (11:31 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Thu, 12 Jun 2025 09:31:17 +0000 (11:31 +0200)
ui-java/src/main/java/de/unixwork/ui/ArgFuncs.java
ui-java/src/main/java/de/unixwork/ui/Button.java
ui-java/src/main/java/de/unixwork/ui/ButtonFuncs.java
ui-java/src/main/java/de/unixwork/ui/ToggleArgs.java [new file with mode: 0644]
ui-java/src/test/java/de/unixwork/ui/demo/Main.java

index 8024d197a737212f0afca8edd98180a93d8d0de1..9500eeaf9ffa07a349c988fe3452889a2ab9d2f8 100644 (file)
@@ -32,6 +32,29 @@ class ArgFuncs {
     MethodHandle button_args_set_groups;
     MethodHandle button_args_free;
 
+    MethodHandle toggle_args_new;
+    MethodHandle toggle_args_set_fill;
+    MethodHandle toggle_args_set_hexpand;
+    MethodHandle toggle_args_set_vexpand;
+    MethodHandle toggle_args_set_hfill;
+    MethodHandle toggle_args_set_vfill;
+    MethodHandle toggle_args_set_override_defaults;
+    MethodHandle toggle_args_set_colspan;
+    MethodHandle toggle_args_set_rowspan;
+    MethodHandle toggle_args_set_name;
+    MethodHandle toggle_args_set_style_class;
+    MethodHandle toggle_args_set_label;
+    MethodHandle toggle_args_set_stockid;
+    MethodHandle toggle_args_set_icon;
+    MethodHandle toggle_args_set_labeltype;
+    MethodHandle toggle_args_set_varname;
+    MethodHandle toggle_args_set_value;
+    MethodHandle toggle_args_set_enablegroup;
+    MethodHandle toggle_args_set_onchange;
+    MethodHandle toggle_args_set_onchangedata;
+    MethodHandle toggle_args_set_groups;
+    MethodHandle toggle_args_free;
+
     private ArgFuncs(Linker linker, SymbolLookup lib) {
         FunctionDescriptor sigm = FunctionDescriptor.of(ValueLayout.ADDRESS);
         FunctionDescriptor sigv_m = FunctionDescriptor.ofVoid(ValueLayout.ADDRESS);
@@ -67,6 +90,29 @@ class ArgFuncs {
         MemorySegment ui_button_args_set_groups_addr = lib.find("ui_button_args_set_groups").orElseThrow();
         MemorySegment ui_button_args_free_addr = lib.find("ui_button_args_free").orElseThrow();
 
+        MemorySegment ui_toggle_args_new_addr = lib.find("ui_toggle_args_new").orElseThrow();
+        MemorySegment ui_toggle_args_set_fill_addr = lib.find("ui_toggle_args_set_fill").orElseThrow();
+        MemorySegment ui_toggle_args_set_hexpand_addr = lib.find("ui_toggle_args_set_hexpand").orElseThrow();
+        MemorySegment ui_toggle_args_set_vexpand_addr = lib.find("ui_toggle_args_set_vexpand").orElseThrow();
+        MemorySegment ui_toggle_args_set_hfill_addr = lib.find("ui_toggle_args_set_hfill").orElseThrow();
+        MemorySegment ui_toggle_args_set_vfill_addr = lib.find("ui_toggle_args_set_vfill").orElseThrow();
+        MemorySegment ui_toggle_args_set_override_defaults_addr = lib.find("ui_toggle_args_set_override_defaults").orElseThrow();
+        MemorySegment ui_toggle_args_set_colspan_addr = lib.find("ui_toggle_args_set_colspan").orElseThrow();
+        MemorySegment ui_toggle_args_set_rowspan_addr = lib.find("ui_toggle_args_set_rowspan").orElseThrow();
+        MemorySegment ui_toggle_args_set_name_addr = lib.find("ui_toggle_args_set_name").orElseThrow();
+        MemorySegment ui_toggle_args_set_style_class_addr = lib.find("ui_toggle_args_set_style_class").orElseThrow();
+        MemorySegment ui_toggle_args_set_label_addr = lib.find("ui_toggle_args_set_label").orElseThrow();
+        MemorySegment ui_toggle_args_set_stockid_addr = lib.find("ui_toggle_args_set_stockid").orElseThrow();
+        MemorySegment ui_toggle_args_set_icon_addr = lib.find("ui_toggle_args_set_icon").orElseThrow();
+        MemorySegment ui_toggle_args_set_labeltype_addr = lib.find("ui_toggle_args_set_labeltype").orElseThrow();
+        MemorySegment ui_toggle_args_set_varname_addr = lib.find("ui_toggle_args_set_varname").orElseThrow();
+        MemorySegment ui_toggle_args_set_value_addr = lib.find("ui_toggle_args_set_value").orElseThrow();
+        MemorySegment ui_toggle_args_set_onchange_addr = lib.find("ui_toggle_args_set_onchange").orElseThrow();
+        MemorySegment ui_toggle_args_set_onchangedata_addr = lib.find("ui_toggle_args_set_onchangedata").orElseThrow();
+        MemorySegment ui_toggle_args_set_enablegroup = lib.find("ui_toggle_args_set_enablegroup").orElseThrow();
+        MemorySegment ui_toggle_args_set_groups_addr = lib.find("ui_toggle_args_set_groups").orElseThrow();
+        MemorySegment ui_toggle_args_free_addr = lib.find("ui_toggle_args_free").orElseThrow();
+
         menuitem_args_new = linker.downcallHandle(ui_menuitem_args_new_addr, sigm);
         menuitem_args_set_label = linker.downcallHandle(ui_menuitem_args_set_label_addr, sigv_mm);
         menuitem_args_set_stockid = linker.downcallHandle(ui_menuitem_args_set_stockid_addr, sigv_mm);
@@ -92,6 +138,29 @@ class ArgFuncs {
         button_args_set_onclickdata = linker.downcallHandle(ui_button_args_set_onclickdata_addr, sigv_mm);
         button_args_set_groups = linker.downcallHandle(ui_button_args_set_groups_addr, sigv_mm);
         button_args_free = linker.downcallHandle(ui_button_args_free_addr, sigv_m);
+
+        toggle_args_new = linker.downcallHandle(ui_toggle_args_new_addr, sigm);
+        toggle_args_set_fill = linker.downcallHandle(ui_toggle_args_set_fill_addr, sigm);
+        toggle_args_set_hexpand = linker.downcallHandle(ui_toggle_args_set_hexpand_addr, sigv_mb);
+        toggle_args_set_vexpand = linker.downcallHandle(ui_toggle_args_set_vexpand_addr, sigv_mb);
+        toggle_args_set_hfill = linker.downcallHandle(ui_toggle_args_set_hfill_addr, sigv_mb);
+        toggle_args_set_vfill = linker.downcallHandle(ui_toggle_args_set_vfill_addr, sigv_mb);
+        toggle_args_set_override_defaults = linker.downcallHandle(ui_toggle_args_set_override_defaults_addr, sigv_mb);
+        toggle_args_set_colspan = linker.downcallHandle(ui_toggle_args_set_colspan_addr, sigv_mi);
+        toggle_args_set_rowspan = linker.downcallHandle(ui_toggle_args_set_rowspan_addr, sigv_mi);
+        toggle_args_set_name = linker.downcallHandle(ui_toggle_args_set_name_addr, sigv_mm);
+        toggle_args_set_style_class = linker.downcallHandle(ui_toggle_args_set_style_class_addr, sigv_mm);
+        toggle_args_set_label = linker.downcallHandle(ui_toggle_args_set_label_addr, sigv_mm);
+        toggle_args_set_stockid = linker.downcallHandle(ui_toggle_args_set_stockid_addr, sigv_mm);
+        toggle_args_set_icon = linker.downcallHandle(ui_toggle_args_set_icon_addr, sigv_mm);
+        toggle_args_set_labeltype = linker.downcallHandle(ui_toggle_args_set_labeltype_addr, sigv_mi);
+        toggle_args_set_varname = linker.downcallHandle(ui_toggle_args_set_varname_addr, sigv_mm);
+        toggle_args_set_value = linker.downcallHandle(ui_toggle_args_set_value_addr, sigv_mm);
+        toggle_args_set_onchange = linker.downcallHandle(ui_toggle_args_set_onchange_addr, sigv_mm);
+        toggle_args_set_onchangedata = linker.downcallHandle(ui_toggle_args_set_onchangedata_addr, sigv_mm);
+        toggle_args_set_enablegroup = linker.downcallHandle(ui_toggle_args_set_enablegroup, sigv_mi);
+        toggle_args_set_groups = linker.downcallHandle(ui_toggle_args_set_groups_addr, sigv_mm);
+        toggle_args_free = linker.downcallHandle(ui_toggle_args_free_addr, sigv_m);
     }
 
     static ArgFuncs getInstance() {
index d9f7b4b262c425859027bd40b20b0e30cd2a6228..e952f98ba0636dc9c195f2605a07dc2d2f949ee3 100644 (file)
@@ -4,6 +4,7 @@ import java.lang.foreign.Arena;
 import java.lang.foreign.FunctionDescriptor;
 import java.lang.foreign.MemorySegment;
 import java.lang.foreign.ValueLayout;
+import java.lang.invoke.MethodHandle;
 
 public class Button {
     public static void createButton(UiObject obj, ButtonArgs args) {
@@ -15,4 +16,34 @@ public class Button {
             throw new RuntimeException(e);
         }
     }
+
+    private static void createToggleButton(UiObject obj, MethodHandle func, ToggleArgs args) {
+        ButtonFuncs ui = ButtonFuncs.getInstance();
+        try (Arena arena = Arena.ofConfined()) {
+            MemorySegment buttonArgs = args.createToggleArgs(obj, arena);
+            MemorySegment widget = (MemorySegment) func.invoke(obj.ptr, buttonArgs);
+        } catch (Throwable e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public static void createToggleButton(UiObject obj, ToggleArgs args) {
+        ButtonFuncs ui = ButtonFuncs.getInstance();
+        Button.createToggleButton(obj, ui.togglebutton_create, args);
+    }
+
+    public static void createCheckbox(UiObject obj, ToggleArgs args) {
+        ButtonFuncs ui = ButtonFuncs.getInstance();
+        Button.createToggleButton(obj, ui.checkbox_create, args);
+    }
+
+    public static void createSwitch(UiObject obj, ToggleArgs args) {
+        ButtonFuncs ui = ButtonFuncs.getInstance();
+        Button.createToggleButton(obj, ui.switch_create, args);
+    }
+
+    public static void createRadioButton(UiObject obj, ToggleArgs args) {
+        ButtonFuncs ui = ButtonFuncs.getInstance();
+        Button.createToggleButton(obj, ui.radiobutton_create, args);
+    }
 }
index 507d39c077dd44d04e7e41bf12eee31ccb33e093..eb2795da6cca41cdbf70c725711e34a0ce2447ca 100644 (file)
@@ -8,14 +8,26 @@ public class ButtonFuncs {
     static ButtonFuncs instance;
 
     public MethodHandle button_create;
+    public MethodHandle togglebutton_create;
+    public MethodHandle checkbox_create;
+    public MethodHandle switch_create;
+    public MethodHandle radiobutton_create;
 
     private ButtonFuncs(Linker linker, SymbolLookup lib) {
         // void* func(void*, void*)
         FunctionDescriptor sigm_mm = FunctionDescriptor.of(ValueLayout.ADDRESS, ValueLayout.ADDRESS, ValueLayout.ADDRESS);
 
         MemorySegment ui_button_create_addr = lib.find("ui_button_create").orElseThrow();
+        MemorySegment ui_togglebutton_create_addr = lib.find("ui_togglebutton_create").orElseThrow();
+        MemorySegment ui_checkbox_create_addr = lib.find("ui_checkbox_create").orElseThrow();
+        MemorySegment ui_switch_create_addr = lib.find("ui_switch_create").orElseThrow();
+        MemorySegment ui_radiobutton_create_addr = lib.find("ui_radiobutton_create").orElseThrow();
 
         button_create = linker.downcallHandle(ui_button_create_addr, sigm_mm);
+        togglebutton_create = linker.downcallHandle(ui_togglebutton_create_addr, sigm_mm);
+        checkbox_create = linker.downcallHandle(ui_checkbox_create_addr, sigm_mm);
+        switch_create = linker.downcallHandle(ui_switch_create_addr, sigm_mm);
+        radiobutton_create = linker.downcallHandle(ui_radiobutton_create_addr, sigm_mm);
     }
 
     static ButtonFuncs getInstance() {
diff --git a/ui-java/src/main/java/de/unixwork/ui/ToggleArgs.java b/ui-java/src/main/java/de/unixwork/ui/ToggleArgs.java
new file mode 100644 (file)
index 0000000..6805c76
--- /dev/null
@@ -0,0 +1,176 @@
+package de.unixwork.ui;
+
+import java.lang.foreign.Arena;
+import java.lang.foreign.MemorySegment;
+
+public class ToggleArgs {
+
+    private boolean fill;
+    private boolean hexpand;
+    private boolean vexpand;
+    private boolean hfill;
+    private boolean vfill;
+    private boolean overrideDefaults;
+    private int colspan;
+    private int rowspan;
+    private String name;
+    private String styleClass;
+    private String label;
+    private String stockId;
+    private String icon;
+    private int labelType;
+    private String varname;
+    private EventHandler onChange;
+    private int[] states;
+
+    public ToggleArgs() {
+
+    }
+
+    public ToggleArgs fill(boolean fill) {
+        this.fill = fill;
+        return this;
+    }
+
+    public ToggleArgs hexpand(boolean hexpand) {
+        this.hexpand = hexpand;
+        return this;
+    }
+
+    public ToggleArgs vexpand(boolean vexpand) {
+        this.vexpand = vexpand;
+        return this;
+    }
+
+    public ToggleArgs hfill(boolean hfill) {
+        this.hfill = hfill;
+        return this;
+    }
+
+    public ToggleArgs vfill(boolean vfill) {
+        this.vfill = vfill;
+        return this;
+    }
+
+    public ToggleArgs overrideDefaults(boolean overrideDefaults) {
+        this.overrideDefaults = overrideDefaults;
+        return this;
+    }
+
+    public ToggleArgs colspan(int colspan) {
+        this.colspan = colspan;
+        return this;
+    }
+
+    public ToggleArgs rowspan(int rowspan) {
+        this.rowspan = rowspan;
+        return this;
+    }
+
+    public ToggleArgs name(String name) {
+        this.name = name;
+        return this;
+    }
+
+    public ToggleArgs styleClass(String styleClass) {
+        this.styleClass = styleClass;
+        return this;
+    }
+
+    public ToggleArgs label(String label) {
+        this.label = label;
+        return this;
+    }
+
+    public ToggleArgs stockId(String stockId) {
+        this.stockId = stockId;
+        return this;
+    }
+
+    public ToggleArgs icon(String icon) {
+        this.icon = icon;
+        return this;
+    }
+
+    public ToggleArgs labelType(int labelType) {
+        this.labelType = labelType;
+        return this;
+    }
+    
+    public ToggleArgs varname(String varname) {
+        this.varname = varname;
+        return this;
+    }
+
+    public ToggleArgs onChange(EventHandler onChange) {
+        this.onChange = onChange;
+        return this;
+    }
+
+    public ToggleArgs states(int... states) {
+        this.states = states;
+        return this;
+    }
+
+    public MemorySegment createToggleArgs(UiObject parent, Arena arena) throws Throwable {
+        ArgFuncs ui = ArgFuncs.getInstance();
+
+        MemorySegment args = (MemorySegment)ui.toggle_args_new.invoke();
+        if(fill) {
+            // TODO
+        }
+        if(hexpand) {
+            ui.toggle_args_set_hexpand.invoke(args, hexpand);
+        }
+        if(vexpand) {
+            ui.toggle_args_set_vexpand.invoke(args, vexpand);
+        }
+        if(hfill) {
+            ui.toggle_args_set_hfill.invoke(args, hfill);
+        }
+        if(vfill) {
+            ui.toggle_args_set_vfill.invoke(args, vfill);
+        }
+        if(overrideDefaults) {
+            ui.toggle_args_set_override_defaults.invoke(args, overrideDefaults);
+        }
+        if(colspan > 0) {
+            ui.toggle_args_set_colspan.invoke(args, colspan);
+        }
+        if(rowspan > 0) {
+            ui.toggle_args_set_rowspan.invoke(args, rowspan);
+        }
+        if(name != null) {
+            MemorySegment cstr = arena.allocateFrom(name);
+            ui.toggle_args_set_name.invoke(args, cstr);
+        }
+        if(styleClass != null) {
+            MemorySegment cstr = arena.allocateFrom(styleClass);
+            ui.toggle_args_set_style_class.invoke(args, cstr);
+        }
+        if(label != null) {
+            MemorySegment cstr = arena.allocateFrom(label);
+            ui.toggle_args_set_label.invoke(args, cstr);
+        }
+        if(stockId != null) {
+            MemorySegment cstr = arena.allocateFrom(stockId);
+            ui.toggle_args_set_stockid.invoke(args, cstr);
+        }
+        if(icon != null) {
+            MemorySegment cstr = arena.allocateFrom(icon);
+            ui.toggle_args_set_icon.invoke(args, cstr);
+        }
+        ui.toggle_args_set_labeltype.invoke(args, labelType);
+        
+        if(varname != null) {
+            MemorySegment cstr = arena.allocateFrom(varname);
+            ui.toggle_args_set_varname.invoke(args, cstr);
+        }
+        
+        if(onChange != null) {
+            // TODO
+        }
+
+        return args;
+    }
+}
index 06ab562034a05b0bf621df1d087250e2fc8e9612..77fb80fb52a87fa7e6c1308506eda876f0430384 100644 (file)
@@ -6,6 +6,10 @@ public class Main implements Application{
     public void startup() {
         UiObject window = UiObject.createWindow("Test Window");
         Button.createButton(window, new ButtonArgs().label("Hello World!"));
+        Button.createToggleButton(window, new ToggleArgs().label("Toggle"));
+        Button.createCheckbox(window, new ToggleArgs().label("Checkbox"));
+        Button.createRadioButton(window, new ToggleArgs().label("Radio 1").varname("radio"));
+        Button.createRadioButton(window, new ToggleArgs().label("Radio 2").varname("radio"));
         window.show();
     }