From 0f518e4d68b61f62f605579ba16dffd38e19eafa Mon Sep 17 00:00:00 2001 From: Olaf Wintermann Date: Tue, 12 Aug 2025 16:16:07 +0200 Subject: [PATCH] semi functional Add Category dialog --- .../main/kotlin/de/unixwork/rssreader/App.kt | 4 --- .../kotlin/de/unixwork/rssreader/Database.kt | 24 +++++++++++++- .../de/unixwork/rssreader/FeedSourceList.kt | 4 ++- .../de/unixwork/rssreader/MainWindow.kt | 31 +++++++++++++++---- .../main/java/de/unixwork/ui/ListFuncs.java | 3 ++ .../src/main/java/de/unixwork/ui/UiList.java | 15 ++++++++- 6 files changed, 68 insertions(+), 13 deletions(-) diff --git a/rss-application/src/main/kotlin/de/unixwork/rssreader/App.kt b/rss-application/src/main/kotlin/de/unixwork/rssreader/App.kt index 8d4ec88..744fc91 100644 --- a/rss-application/src/main/kotlin/de/unixwork/rssreader/App.kt +++ b/rss-application/src/main/kotlin/de/unixwork/rssreader/App.kt @@ -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() } diff --git a/rss-application/src/main/kotlin/de/unixwork/rssreader/Database.kt b/rss-application/src/main/kotlin/de/unixwork/rssreader/Database.kt index 410e21d..2c580ca 100644 --- a/rss-application/src/main/kotlin/de/unixwork/rssreader/Database.kt +++ b/rss-application/src/main/kotlin/de/unixwork/rssreader/Database.kt @@ -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) + } } diff --git a/rss-application/src/main/kotlin/de/unixwork/rssreader/FeedSourceList.kt b/rss-application/src/main/kotlin/de/unixwork/rssreader/FeedSourceList.kt index 10b468c..e900b40 100644 --- a/rss-application/src/main/kotlin/de/unixwork/rssreader/FeedSourceList.kt +++ b/rss-application/src/main/kotlin/de/unixwork/rssreader/FeedSourceList.kt @@ -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 init { val db = Database - val groups = db.getFeedTree() + groups = db.getFeedTree() groups.forEach { val sublist = SubList() sublist.header = it.name diff --git a/rss-application/src/main/kotlin/de/unixwork/rssreader/MainWindow.kt b/rss-application/src/main/kotlin/de/unixwork/rssreader/MainWindow.kt index 1b8d9df..8b3bdf5 100644 --- a/rss-application/src/main/kotlin/de/unixwork/rssreader/MainWindow.kt +++ b/rss-application/src/main/kotlin/de/unixwork/rssreader/MainWindow.kt @@ -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("groups").addAll(sourceList.groups) + + // UI grid( margin = 12, columnspacing = 8, @@ -64,8 +73,8 @@ class MainWindow { { row { rlabel("Category") - dropdown(varname = "group", hexpand = true) { elm, column -> - "" + dropdown(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) } } } diff --git a/ui-java/src/main/java/de/unixwork/ui/ListFuncs.java b/ui-java/src/main/java/de/unixwork/ui/ListFuncs.java index 48e8b8a..0c248f6 100644 --- a/ui-java/src/main/java/de/unixwork/ui/ListFuncs.java +++ b/ui-java/src/main/java/de/unixwork/ui/ListFuncs.java @@ -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); diff --git a/ui-java/src/main/java/de/unixwork/ui/UiList.java b/ui-java/src/main/java/de/unixwork/ui/UiList.java index 488ad24..fb5dca2 100644 --- a/ui-java/src/main/java/de/unixwork/ui/UiList.java +++ b/ui-java/src/main/java/de/unixwork/ui/UiList.java @@ -62,6 +62,19 @@ public class UiList extends ArrayList { } } + 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 extends ArrayList { 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++; -- 2.47.3