From 7a907d13e45ab1505a579dafb86653a8af4c746c Mon Sep 17 00:00:00 2001 From: Olaf Wintermann Date: Fri, 20 Jun 2025 13:05:47 +0200 Subject: [PATCH] add UiInteger class, allow passing UiInteger value to toggle buttons --- .../src/main/java/de/unixwork/ui/Context.java | 8 ++++ .../java/de/unixwork/ui/ToggleBuilder.java | 9 ++++ .../main/java/de/unixwork/ui/UiInteger.java | 42 +++++++++++++++++++ .../main/java/de/unixwork/ui/UiString.java | 2 +- .../kotlin/de/unixwork/ui/kotlin/Toplevel.kt | 13 ++++++ 5 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 ui-java/src/main/java/de/unixwork/ui/UiInteger.java diff --git a/ui-java/src/main/java/de/unixwork/ui/Context.java b/ui-java/src/main/java/de/unixwork/ui/Context.java index f087a7c..c42ec8a 100644 --- a/ui-java/src/main/java/de/unixwork/ui/Context.java +++ b/ui-java/src/main/java/de/unixwork/ui/Context.java @@ -24,6 +24,14 @@ public abstract class Context { return new UiString(this, name); } + public UiInteger integer() { + return integer(null); + } + + public UiInteger integer(String name) { + return new UiInteger(this, name); + } + public void attach(Document doc) { ToolkitFuncs ui = ToolkitFuncs.getInstance(); try { diff --git a/ui-java/src/main/java/de/unixwork/ui/ToggleBuilder.java b/ui-java/src/main/java/de/unixwork/ui/ToggleBuilder.java index ff10b4d..02277b4 100644 --- a/ui-java/src/main/java/de/unixwork/ui/ToggleBuilder.java +++ b/ui-java/src/main/java/de/unixwork/ui/ToggleBuilder.java @@ -20,6 +20,7 @@ public class ToggleBuilder extends AbstractWidgetBuilder { private String icon; private int labelType; private String varname; + private UiInteger value; private EventHandler onChange; private int[] states; @@ -103,6 +104,11 @@ public class ToggleBuilder extends AbstractWidgetBuilder { return this; } + public ToggleBuilder value(UiInteger value) { + this.value = value; + return this; + } + public ToggleBuilder onChange(EventHandler onChange) { this.onChange = onChange; return this; @@ -167,6 +173,9 @@ public class ToggleBuilder extends AbstractWidgetBuilder { MemorySegment cstr = arena.allocateFrom(varname); ui.toggle_args_set_varname.invoke(args, cstr); } + if(value != null) { + ui.toggle_args_set_value.invoke(args, value.valuePtr); + } if(onChange != null) { // TODO diff --git a/ui-java/src/main/java/de/unixwork/ui/UiInteger.java b/ui-java/src/main/java/de/unixwork/ui/UiInteger.java new file mode 100644 index 0000000..e3b89e6 --- /dev/null +++ b/ui-java/src/main/java/de/unixwork/ui/UiInteger.java @@ -0,0 +1,42 @@ +package de.unixwork.ui; + +import java.lang.foreign.Arena; +import java.lang.foreign.MemorySegment; + +public class UiInteger { + protected MemorySegment valuePtr; + + protected UiInteger(Context ctx, String name) { + ToolkitFuncs ui = ToolkitFuncs.getInstance(); + + MemorySegment nameCStr = MemorySegment.NULL; + try (Arena arena = Arena.ofConfined()) { + if(name != null) { + nameCStr = arena.allocateFrom(name); + } + + valuePtr = (MemorySegment) ui.int_new.invoke(ctx.getCtx(), nameCStr); + } catch (Throwable e) { + throw new RuntimeException(e); + } + } + + public int intValue() { + ToolkitFuncs ui = ToolkitFuncs.getInstance(); + try { + Integer value = (Integer) ui.int_get.invoke(valuePtr); + return intValue(); + } catch (Throwable e) { + throw new RuntimeException(e); + } + } + + public void setIntValue(int value) { + ToolkitFuncs ui = ToolkitFuncs.getInstance(); + try (Arena arena = Arena.ofConfined()) { + ui.int_set.invoke(valuePtr, value); + } catch (Throwable e) { + throw new RuntimeException(e); + } + } +} diff --git a/ui-java/src/main/java/de/unixwork/ui/UiString.java b/ui-java/src/main/java/de/unixwork/ui/UiString.java index 3fd5d69..14228e1 100644 --- a/ui-java/src/main/java/de/unixwork/ui/UiString.java +++ b/ui-java/src/main/java/de/unixwork/ui/UiString.java @@ -4,7 +4,7 @@ import java.lang.foreign.Arena; import java.lang.foreign.MemorySegment; public class UiString { - private MemorySegment valuePtr; + protected MemorySegment valuePtr; protected UiString(Context ctx, String name) { ToolkitFuncs ui = ToolkitFuncs.getInstance(); diff --git a/ui-kotlin/src/main/kotlin/de/unixwork/ui/kotlin/Toplevel.kt b/ui-kotlin/src/main/kotlin/de/unixwork/ui/kotlin/Toplevel.kt index f006fd8..3591d70 100644 --- a/ui-kotlin/src/main/kotlin/de/unixwork/ui/kotlin/Toplevel.kt +++ b/ui-kotlin/src/main/kotlin/de/unixwork/ui/kotlin/Toplevel.kt @@ -5,6 +5,7 @@ import de.unixwork.ui.ButtonBuilder import de.unixwork.ui.EventHandler import de.unixwork.ui.EventWrapper.eventHandler import de.unixwork.ui.ToggleBuilder +import de.unixwork.ui.UiInteger import de.unixwork.ui.UiObject import de.unixwork.ui.UiWidget import java.lang.foreign.MemorySegment @@ -83,6 +84,7 @@ class Toplevel(obj: UiObject) { stockId: String? = null, icon: String? = null, varname: String? = null, + value: UiInteger? = null, fill: Boolean = false, hexpand: Boolean = false, vexpand: Boolean = false, @@ -101,6 +103,9 @@ class Toplevel(obj: UiObject) { varname?.let { button.varname(it) } + value?.let { + button.value(it) + } // TODO: fill if(hexpand) { button.hexpand(true) @@ -143,6 +148,7 @@ class Toplevel(obj: UiObject) { stockId: String? = null, icon: String? = null, varname: String? = null, + value: UiInteger? = null, fill: Boolean = false, hexpand: Boolean = false, vexpand: Boolean = false, @@ -161,6 +167,7 @@ class Toplevel(obj: UiObject) { stockId = stockId, icon = icon, varname = varname, + value = value, fill = fill, hexpand = hexpand, vexpand = vexpand, @@ -180,6 +187,7 @@ class Toplevel(obj: UiObject) { stockId: String? = null, icon: String? = null, varname: String? = null, + value: UiInteger? = null, fill: Boolean = false, hexpand: Boolean = false, vexpand: Boolean = false, @@ -198,6 +206,7 @@ class Toplevel(obj: UiObject) { stockId = stockId, icon = icon, varname = varname, + value = value, fill = fill, hexpand = hexpand, vexpand = vexpand, @@ -217,6 +226,7 @@ class Toplevel(obj: UiObject) { stockId: String? = null, icon: String? = null, varname: String? = null, + value: UiInteger? = null, fill: Boolean = false, hexpand: Boolean = false, vexpand: Boolean = false, @@ -235,6 +245,7 @@ class Toplevel(obj: UiObject) { stockId = stockId, icon = icon, varname = varname, + value = value, fill = fill, hexpand = hexpand, vexpand = vexpand, @@ -254,6 +265,7 @@ class Toplevel(obj: UiObject) { stockId: String? = null, icon: String? = null, varname: String? = null, + value: UiInteger? = null, fill: Boolean = false, hexpand: Boolean = false, vexpand: Boolean = false, @@ -272,6 +284,7 @@ class Toplevel(obj: UiObject) { stockId = stockId, icon = icon, varname = varname, + value = value, fill = fill, hexpand = hexpand, vexpand = vexpand, -- 2.47.3