]> uap-core.de Git - rssreader.git/commitdiff
add value observers main
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Wed, 24 Dec 2025 07:45:39 +0000 (08:45 +0100)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Wed, 24 Dec 2025 07:45:39 +0000 (08:45 +0100)
ui-java/src/main/java/de/unixwork/ui/ToolkitFuncs.java
ui-java/src/main/java/de/unixwork/ui/UiDouble.java
ui-java/src/main/java/de/unixwork/ui/UiInteger.java
ui-java/src/main/java/de/unixwork/ui/UiString.java

index c94760ebbcb06076b16c3b75ce04bfea888c09c5..8e47f0458130303dd4c8e86305f906dbf7675d5e 100644 (file)
@@ -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);
index 7b5b790d11316a6b1822389c60bab2b8751e647a..5f7c26653bda98481e4b9cdd5f0998336b02d5c6 100644 (file)
@@ -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<EventHandler> 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);
+    }
 }
index dd74eef162914a12e296b09c6975fbd3ee4e36ec..273891db656492a787b40d814864edade3f6a8d2 100644 (file)
@@ -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<EventHandler> 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);
+    }
 }
index 1b64094b04fb66c041cab2733e37446c4d15c860..87934140350da61eaee6e2e1a9fd9c4b8c85008b 100644 (file)
@@ -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<EventHandler> 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);
+    }
 }