]> uap-core.de Git - rssreader.git/commitdiff
semi functional Add Category dialog main
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Tue, 12 Aug 2025 14:16:07 +0000 (16:16 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Tue, 12 Aug 2025 14:16:07 +0000 (16:16 +0200)
rss-application/src/main/kotlin/de/unixwork/rssreader/App.kt
rss-application/src/main/kotlin/de/unixwork/rssreader/Database.kt
rss-application/src/main/kotlin/de/unixwork/rssreader/FeedSourceList.kt
rss-application/src/main/kotlin/de/unixwork/rssreader/MainWindow.kt
ui-java/src/main/java/de/unixwork/ui/ListFuncs.java
ui-java/src/main/java/de/unixwork/ui/UiList.java

index 8d4ec88a60b5e8548e2446bc475305506eb378f5..744fc912cb92aab5c3c49574c0ae0b3bcb9a0c29 100644 (file)
@@ -6,10 +6,6 @@ import de.unixwork.ui.Toolkit
 class App : Application {
     override fun startup() {
         val window = MainWindow()
-
-        val data = FeedSourceList()
-        window.window.ui.attach(data)
-
         window.show()
     }
 
index 410e21d4addd27478d00ad8ec6f9ea21a1cf3020..2c580cadf8d124b6c990da544b7b45dc77168106 100644 (file)
@@ -2,6 +2,7 @@ package de.unixwork.rssreader
 
 import java.sql.Connection
 import java.sql.DriverManager
+import java.sql.Statement
 
 object Database {
     val connection: Connection
@@ -102,11 +103,32 @@ object Database {
                     groups.add(currentGroup)
                 }
 
-                currentGroup.feeds.add(FeedCollection(feedId, feedName))
+                if(feedId != null && feedName != null) {
+                    currentGroup.feeds.add(FeedCollection(feedId, feedName))
+                }
+
             }
             rs.close()
         }
 
         return groups
     }
+
+    public fun newFeedGroup(name: String) : FeedGroup {
+        var groupId = 0
+        connection.prepareStatement("""
+            insert into groups (pos, name) select max(pos)+1, ? from groups
+        """.trimIndent(), Statement.RETURN_GENERATED_KEYS).use { stmt ->
+            stmt.setString(1, name)
+            stmt.execute()
+            stmt.generatedKeys.use { rs ->
+                if(rs.next()) {
+                    groupId = rs.getInt(1)
+                } else {
+                    throw Exception("Insert Group failed")
+                }
+            }
+        }
+        return FeedGroup(groupId, name)
+    }
 }
index 10b468c0a1e32cec909c6dca59f38f7720472917..e900b40e5738ad5204872c8eb0049204f8ec71c1 100644 (file)
@@ -2,14 +2,16 @@ package de.unixwork.rssreader
 
 import de.unixwork.ui.Document
 import de.unixwork.ui.SubList
+import de.unixwork.ui.UiList
 
 class FeedSourceList : Document() {
     val feeds = this.sourcelist("feeds")
+    val groups: List<FeedGroup>
 
     init {
         val db = Database
 
-        val groups = db.getFeedTree()
+        groups = db.getFeedTree()
         groups.forEach {
             val sublist = SubList<FeedCollection>()
             sublist.header = it.name
index 1b8d9dfbf33477a511a439be58021d408de58fe2..8b3bdf5ef16c5b705625560732bae2d773a60748 100644 (file)
@@ -1,12 +1,14 @@
 package de.unixwork.rssreader
 
 import de.unixwork.ui.SubListItem
+import de.unixwork.ui.UiString
 import de.unixwork.ui.kotlin.Toplevel
 import de.unixwork.ui.kotlin.sidebarWindow
 import de.unixwork.ui.kotlin.dialogWindow
 
 class MainWindow {
     val window : Toplevel
+    val sourceList = FeedSourceList()
 
     init {
         window = sidebarWindow("RSS Reader") {
@@ -41,6 +43,8 @@ class MainWindow {
             }
 
         }
+
+        window.ui.attach(sourceList)
     }
 
     private fun createFeedDialog() {
@@ -49,11 +53,16 @@ class MainWindow {
             title = "Add Feed",
             lbutton1 = "Add",
             rbutton4 = "Cancel",
+            modal = true,
+            showCloseButton = false,
             onClick = { ev ->
                 ev.`object`.close()
-            },
-            modal = true)
+            })
         {
+            // data
+            ui.list<FeedGroup>("groups").addAll(sourceList.groups)
+
+            // UI
             grid(
                 margin = 12,
                 columnspacing = 8,
@@ -64,8 +73,8 @@ class MainWindow {
             {
                 row {
                     rlabel("Category")
-                    dropdown<String>(varname = "group", hexpand = true) { elm, column ->
-                        ""
+                    dropdown<FeedGroup>(varname = "groups", hexpand = true) { elm, column ->
+                        elm.name
                     }
                 }
                 row {
@@ -82,12 +91,22 @@ class MainWindow {
     }
 
     private fun createCategoryDialog() {
+        var name: UiString? = null
         val w = dialogWindow(
             parent = window.ui,
             title = "Add Category",
             lbutton1 = "Add",
-            modal = true)
+            rbutton4 = "Cancel",
+            modal = true,
+            showCloseButton = false,
+            onClick = { ev ->
+                val nameStr = name.toString()
+                Database.newFeedGroup(nameStr)
+                ev.`object`.close()
+            })
         {
+            name = ui.string()
+
             grid(
                 margin = 12,
                 columnspacing = 8,
@@ -98,7 +117,7 @@ class MainWindow {
             {
                 row {
                     rlabel("Name")
-                    textfield(varname = "name", hexpand = true)
+                    textfield(value = name, hexpand = true)
                 }
             }
         }
index 48e8b8aabcb8eae59259f6ef1eddb551b9b626c2..0c248f602ba770519047549b8e5ccb0f2ac90fd4 100644 (file)
@@ -17,6 +17,7 @@ public class ListFuncs {
     public MethodHandle list_set_data;
     public MethodHandle list_get_iter;
     public MethodHandle list_set_iter;
+    public MethodHandle list_update_row;
 
     public MethodHandle srclist_new;
     public MethodHandle srclist_add;
@@ -51,6 +52,7 @@ public class ListFuncs {
         MemorySegment ui_list_set_data_addr = lib.find("ui_list_set_data").orElseThrow();
         MemorySegment ui_list_get_iter_addr = lib.find("ui_list_get_iter").orElseThrow();
         MemorySegment ui_list_set_iter_addr = lib.find("ui_list_set_iter").orElseThrow();
+        MemorySegment ui_list_update_row_addr = lib.find("ui_list_update_row").orElseThrow();
 
         MemorySegment ui_srclist_new_addr = lib.find("ui_srclist_new").orElseThrow();
         MemorySegment ui_srclist_add_addr = lib.find("ui_srclist_add").orElseThrow();
@@ -75,6 +77,7 @@ public class ListFuncs {
         list_set_data = linker.downcallHandle(ui_list_set_data_addr, sigm_mm);
         list_get_iter = linker.downcallHandle(ui_list_get_iter_addr, sigm_m);
         list_set_iter = linker.downcallHandle(ui_list_set_iter_addr, sigm_mm);
+        list_update_row = linker.downcallHandle(ui_list_update_row_addr, sigv_mi);
 
         srclist_new = linker.downcallHandle(ui_srclist_new_addr, sigm_mm);
         srclist_add = linker.downcallHandle(ui_srclist_add_addr, sigv_mm);
index 488ad248f682a65a319ae3074b8b8f449cb47e2f..fb5dca242050b381b83e11cef5ba75f1d712f427 100644 (file)
@@ -62,6 +62,19 @@ public class UiList<T> extends ArrayList<T> {
         }
     }
 
+    public void update() {
+        update(-1);
+    }
+
+    public void update(int row) {
+        ListFuncs ui = ListFuncs.getInstance();
+        try {
+            ui.list_update_row.invoke(valuePtr, row);
+        } catch (Throwable e) {
+            throw new RuntimeException(e);
+        }
+    }
+
     public void free() {
         ToolkitFuncs tk = ToolkitFuncs.getInstance();
         try {
@@ -97,7 +110,7 @@ public class UiList<T> extends ArrayList<T> {
 
     protected static MemorySegment next(MemorySegment ls) {
         UiList list = UiList.getList(ls);
-        if(list.iter >= list.size()) {
+        if(list.iter+1 >= list.size()) {
             return MemorySegment.NULL;
         }
         list.iter++;