From: Olaf Wintermann Date: Thu, 12 Jun 2025 09:31:17 +0000 (+0200) Subject: add bindings for toggle buttons X-Git-Url: https://uap-core.de/gitweb/?a=commitdiff_plain;h=e2fff59f6579400881b19d444088d5311044a809;p=rssreader.git add bindings for toggle buttons --- diff --git a/ui-java/src/main/java/de/unixwork/ui/ArgFuncs.java b/ui-java/src/main/java/de/unixwork/ui/ArgFuncs.java index 8024d19..9500eea 100644 --- a/ui-java/src/main/java/de/unixwork/ui/ArgFuncs.java +++ b/ui-java/src/main/java/de/unixwork/ui/ArgFuncs.java @@ -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() { diff --git a/ui-java/src/main/java/de/unixwork/ui/Button.java b/ui-java/src/main/java/de/unixwork/ui/Button.java index d9f7b4b..e952f98 100644 --- a/ui-java/src/main/java/de/unixwork/ui/Button.java +++ b/ui-java/src/main/java/de/unixwork/ui/Button.java @@ -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); + } } diff --git a/ui-java/src/main/java/de/unixwork/ui/ButtonFuncs.java b/ui-java/src/main/java/de/unixwork/ui/ButtonFuncs.java index 507d39c..eb2795d 100644 --- a/ui-java/src/main/java/de/unixwork/ui/ButtonFuncs.java +++ b/ui-java/src/main/java/de/unixwork/ui/ButtonFuncs.java @@ -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 index 0000000..6805c76 --- /dev/null +++ b/ui-java/src/main/java/de/unixwork/ui/ToggleArgs.java @@ -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; + } +} diff --git a/ui-java/src/test/java/de/unixwork/ui/demo/Main.java b/ui-java/src/test/java/de/unixwork/ui/demo/Main.java index 06ab562..77fb80f 100644 --- a/ui-java/src/test/java/de/unixwork/ui/demo/Main.java +++ b/ui-java/src/test/java/de/unixwork/ui/demo/Main.java @@ -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(); }