From: Olaf Wintermann Date: Wed, 24 Dec 2025 07:45:39 +0000 (+0100) Subject: add value observers X-Git-Url: https://uap-core.de/gitweb/?a=commitdiff_plain;h=refs%2Fheads%2Fmain;p=rssreader.git add value observers --- diff --git a/ui-java/src/main/java/de/unixwork/ui/ToolkitFuncs.java b/ui-java/src/main/java/de/unixwork/ui/ToolkitFuncs.java index c94760e..8e47f04 100644 --- a/ui-java/src/main/java/de/unixwork/ui/ToolkitFuncs.java +++ b/ui-java/src/main/java/de/unixwork/ui/ToolkitFuncs.java @@ -89,6 +89,13 @@ public class ToolkitFuncs { public MethodHandle ui_get_list_var; public MethodHandle ui_get_generic_var; + public MethodHandle int_add_observer; + public MethodHandle double_add_observer; + public MethodHandle string_add_observer; + public MethodHandle text_add_observer; + public MethodHandle range_add_observer; + public MethodHandle list_add_observer; + public MethodHandle model_new; public MethodHandle model_add_column; public MethodHandle model_free; @@ -235,6 +242,13 @@ public class ToolkitFuncs { MemorySegment get_list_var_addr = lib.find("ui_get_list_var").orElseThrow(); MemorySegment get_generic_var_addr = lib.find("ui_get_generic_var").orElseThrow(); + MemorySegment int_add_observer_addr = lib.find("ui_int_add_observer").orElseThrow(); + MemorySegment double_add_observer_addr = lib.find("ui_double_add_observer").orElseThrow(); + MemorySegment string_add_observer_addr = lib.find("ui_string_add_observer").orElseThrow(); + MemorySegment text_add_observer_addr = lib.find("ui_text_add_observer").orElseThrow(); + MemorySegment range_add_observer_addr = lib.find("ui_range_add_observer").orElseThrow(); + MemorySegment list_add_observer_addr = lib.find("ui_list_add_observer").orElseThrow(); + MemorySegment model_new_addr = lib.find("ui_model_new").orElseThrow(); MemorySegment model_add_column_addr = lib.find("ui_model_add_column").orElseThrow(); MemorySegment model_free_addr = lib.find("ui_model_free").orElseThrow(); @@ -351,6 +365,12 @@ public class ToolkitFuncs { ui_get_list_var = linker.downcallHandle(get_list_var_addr, sigm_mm); ui_get_generic_var = linker.downcallHandle(get_generic_var_addr, sigm_mm); + int_add_observer = linker.downcallHandle(int_add_observer_addr, sigv_mmm); + double_add_observer = linker.downcallHandle(double_add_observer_addr, sigv_mmm); + string_add_observer = linker.downcallHandle(string_add_observer_addr, sigv_mmm); + text_add_observer = linker.downcallHandle(text_add_observer_addr, sigv_mmm); + range_add_observer = linker.downcallHandle(range_add_observer_addr, sigv_mmm); + model_new = linker.downcallHandle(model_new_addr, sigm_m); model_add_column = linker.downcallHandle(model_add_column_addr, sigv_mimi); model_free = linker.downcallHandle(model_free_addr, sigv_m); diff --git a/ui-java/src/main/java/de/unixwork/ui/UiDouble.java b/ui-java/src/main/java/de/unixwork/ui/UiDouble.java index 7b5b790..5f7c266 100644 --- a/ui-java/src/main/java/de/unixwork/ui/UiDouble.java +++ b/ui-java/src/main/java/de/unixwork/ui/UiDouble.java @@ -2,11 +2,15 @@ package de.unixwork.ui; import java.lang.foreign.Arena; import java.lang.foreign.MemorySegment; +import java.util.LinkedList; public class UiDouble { + protected Context ctx; protected MemorySegment valuePtr; + protected LinkedList observers; protected UiDouble(Context ctx, String name) { + this.ctx = ctx; ToolkitFuncs ui = ToolkitFuncs.getInstance(); MemorySegment nameCStr = MemorySegment.NULL; @@ -39,4 +43,21 @@ public class UiDouble { throw new RuntimeException(e); } } + + public void addObserver(EventHandler eh) { + if(observers == null) { + observers = new LinkedList<>(); + // register native observer for this value + EventWrapper event = new EventWrapper(e -> { + observers.forEach(obs -> obs.callback(e)); + }); + ToolkitFuncs ui = ToolkitFuncs.getInstance(); + try { + ui.double_add_observer.invoke(valuePtr, event.getCallback(), event.getUserData()); + } catch (Throwable e) { + throw new RuntimeException(e); + } + } + observers.add(eh); + } } diff --git a/ui-java/src/main/java/de/unixwork/ui/UiInteger.java b/ui-java/src/main/java/de/unixwork/ui/UiInteger.java index dd74eef..273891d 100644 --- a/ui-java/src/main/java/de/unixwork/ui/UiInteger.java +++ b/ui-java/src/main/java/de/unixwork/ui/UiInteger.java @@ -2,11 +2,15 @@ package de.unixwork.ui; import java.lang.foreign.Arena; import java.lang.foreign.MemorySegment; +import java.util.LinkedList; public class UiInteger { + protected Context ctx; protected MemorySegment valuePtr; + protected LinkedList observers; protected UiInteger(Context ctx, String name) { + this.ctx = ctx; ToolkitFuncs ui = ToolkitFuncs.getInstance(); MemorySegment nameCStr = MemorySegment.NULL; @@ -54,4 +58,21 @@ public class UiInteger { public void setBooleanValue(boolean value) { setLongValue(value ? 1 : 0); } + + public void addObserver(EventHandler eh) { + if(observers == null) { + observers = new LinkedList<>(); + // register native observer for this value + EventWrapper event = new EventWrapper(e -> { + observers.forEach(obs -> obs.callback(e)); + }); + ToolkitFuncs ui = ToolkitFuncs.getInstance(); + try { + ui.int_add_observer.invoke(valuePtr, event.getCallback(), event.getUserData()); + } catch (Throwable e) { + throw new RuntimeException(e); + } + } + observers.add(eh); + } } 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 1b64094..8793414 100644 --- a/ui-java/src/main/java/de/unixwork/ui/UiString.java +++ b/ui-java/src/main/java/de/unixwork/ui/UiString.java @@ -2,11 +2,15 @@ package de.unixwork.ui; import java.lang.foreign.Arena; import java.lang.foreign.MemorySegment; +import java.util.LinkedList; public class UiString { + protected Context ctx; protected MemorySegment valuePtr; + protected LinkedList observers; protected UiString(Context ctx, String name) { + this.ctx = ctx; ToolkitFuncs ui = ToolkitFuncs.getInstance(); MemorySegment nameCStr = MemorySegment.NULL; @@ -51,4 +55,21 @@ public class UiString { throw new RuntimeException(e); } } + + public void addObserver(EventHandler eh) { + if(observers == null) { + observers = new LinkedList<>(); + // register native observer for this value + EventWrapper event = new EventWrapper(e -> { + observers.forEach(obs -> obs.callback(e)); + }); + ToolkitFuncs ui = ToolkitFuncs.getInstance(); + try { + ui.string_add_observer.invoke(valuePtr, event.getCallback(), event.getUserData()); + } catch (Throwable e) { + throw new RuntimeException(e); + } + } + observers.add(eh); + } }