From: Olaf Wintermann Date: Wed, 10 Sep 2025 16:52:06 +0000 (+0200) Subject: add UiObject close handler X-Git-Url: https://uap-core.de/gitweb/?a=commitdiff_plain;h=a6722b47cf9d5a33d0a6c639cc99493b07fd864c;p=rssreader.git add UiObject close handler --- diff --git a/ui-java/src/main/java/de/unixwork/ui/ObjectDestroyHandler.java b/ui-java/src/main/java/de/unixwork/ui/ObjectDestroyHandler.java new file mode 100644 index 0000000..d509265 --- /dev/null +++ b/ui-java/src/main/java/de/unixwork/ui/ObjectDestroyHandler.java @@ -0,0 +1,6 @@ +package de.unixwork.ui; + +@FunctionalInterface +public interface ObjectDestroyHandler { + public void callback(UiObject obj); +} diff --git a/ui-java/src/main/java/de/unixwork/ui/Toolkit.java b/ui-java/src/main/java/de/unixwork/ui/Toolkit.java index abf7868..5ae476b 100644 --- a/ui-java/src/main/java/de/unixwork/ui/Toolkit.java +++ b/ui-java/src/main/java/de/unixwork/ui/Toolkit.java @@ -322,6 +322,10 @@ public class Toolkit { private static void onObjectDestroy(MemorySegment obj, MemorySegment unused) { Toolkit toolkit = Toolkit.getInstance(); + UiObject uiObj = toolkit.getToplevelObject(obj.address()); + if(uiObj != null) { + uiObj.destroy(); + } toolkit.toplevelObjects.remove(obj.address()); } diff --git a/ui-java/src/main/java/de/unixwork/ui/UiObject.java b/ui-java/src/main/java/de/unixwork/ui/UiObject.java index bfcafae..f8cdeb8 100644 --- a/ui-java/src/main/java/de/unixwork/ui/UiObject.java +++ b/ui-java/src/main/java/de/unixwork/ui/UiObject.java @@ -1,16 +1,14 @@ package de.unixwork.ui; import java.lang.foreign.Arena; -import java.lang.foreign.FunctionDescriptor; import java.lang.foreign.MemorySegment; -import java.lang.invoke.MethodHandle; import java.util.ArrayList; -import java.util.function.Function; public class UiObject extends Context { MemorySegment ptr; private ArrayList eventHandlers = new ArrayList<>(); + private ArrayList closeHandlers = new ArrayList<>(); private Arena arena; @@ -33,6 +31,20 @@ public class UiObject extends Context { } } + public void addCloseHandler(ObjectDestroyHandler handler) { + closeHandlers.add(handler); + } + + public void removeCloseHandler(ObjectDestroyHandler handler) { + closeHandlers.remove(handler); + } + + protected void destroy() { + for(var handler : closeHandlers) { + handler.callback(this); + } + } + public static UiObject createWindow(String title) { return UiObjectFuncs.instance.window(title); }