From 4a1c3a0ed5e7dc7994864512d6f8d302e9ecfd1d Mon Sep 17 00:00:00 2001 From: Olaf Wintermann Date: Wed, 20 Aug 2025 20:08:44 +0200 Subject: [PATCH] handle sourcelist selection events and add FeedList controller --- .../kotlin/de/unixwork/rssreader/FeedList.kt | 18 +++++++++ .../de/unixwork/rssreader/MainWindow.kt | 38 ++++++++++++++++--- .../kotlin/de/unixwork/ui/kotlin/Toplevel.kt | 8 ++++ 3 files changed, 58 insertions(+), 6 deletions(-) create mode 100644 rss-application/src/main/kotlin/de/unixwork/rssreader/FeedList.kt diff --git a/rss-application/src/main/kotlin/de/unixwork/rssreader/FeedList.kt b/rss-application/src/main/kotlin/de/unixwork/rssreader/FeedList.kt new file mode 100644 index 0000000..2a8b5ab --- /dev/null +++ b/rss-application/src/main/kotlin/de/unixwork/rssreader/FeedList.kt @@ -0,0 +1,18 @@ +package de.unixwork.rssreader + +import de.unixwork.ui.Document + +class FeedList : Document() { + val items = list("items") + + fun loadFeed(feed: FeedCollection) { + items.clear() + if(feed.itemsLoaded) { + feed.items.forEach { item -> + items.add(item) + } + } else { + // TODO: load items from DB + } + } +} \ No newline at end of file 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 f61500a..dca0ff4 100644 --- a/rss-application/src/main/kotlin/de/unixwork/rssreader/MainWindow.kt +++ b/rss-application/src/main/kotlin/de/unixwork/rssreader/MainWindow.kt @@ -12,12 +12,29 @@ import de.unixwork.ui.kotlin.openFileDialog class MainWindow { val window : Toplevel val sourceList = FeedSourceList() + val feedList = FeedList() init { window = sidebarWindow("RSS Reader") { sidebar { vbox(fill = true) { - sourcelist(fill = true, varname = "feeds") { elm: FeedCollection -> + sourcelist( + fill = true, + varname = "feeds", + onActivate = { event -> + val evt = event.subListEventData + try { + val feed = sourceList.groups[evt.sublistIndex].feeds[evt.rowIndex] + feed?.let { + println("feed: ${feed.name}") + feedList.loadFeed(feed) + } + } catch (e: Exception) { + e.printStackTrace() + } + } + ) + { elm: FeedCollection -> val item = SubListItem() item.label = elm.name item @@ -35,8 +52,8 @@ class MainWindow { hsplitpane(fill = true, initialPosition = 300) { vbox(fill = true) { - listview(varname = "items", fill = true) { elm, col -> - "todo" + listview(varname = "items", fill = true) { elm, col -> + elm.title } } @@ -48,6 +65,7 @@ class MainWindow { } window.ui.attach(sourceList) + window.ui.attach(feedList) } private fun createFeedDialog() { @@ -76,8 +94,12 @@ class MainWindow { val uris = urlStr.split("\n").map { it.trim() }.filter { it.isNotBlank() } println("groupSel: ${groups?.selectedIndex}, feedName: $feedName, urlStr: $urlStr") parent?.let { - val feedCol = Database.newFeeds(it, feedName, uris, user.toString(), password.toString(), cert.toString()) - parent.feeds.update() + try { + val feedCol = Database.newFeeds(it, feedName, uris, user.toString(), password.toString(), cert.toString()) + parent.feeds.update() + } catch (e: Exception) { + e.printStackTrace() + } } } ev.`object`.close() @@ -156,7 +178,11 @@ class MainWindow { if(ev.intValue == 1) { val nameStr = name.toString() if(!nameStr.isBlank()) { - Database.newFeedGroup(sourceList,nameStr) + try { + Database.newFeedGroup(sourceList,nameStr) + } catch (e: Exception) { + e.printStackTrace() + } } else { println("name is null or blank") return@dialogWindow diff --git a/ui-kotlin/src/main/kotlin/de/unixwork/ui/kotlin/Toplevel.kt b/ui-kotlin/src/main/kotlin/de/unixwork/ui/kotlin/Toplevel.kt index bccd7f2..e8da16d 100644 --- a/ui-kotlin/src/main/kotlin/de/unixwork/ui/kotlin/Toplevel.kt +++ b/ui-kotlin/src/main/kotlin/de/unixwork/ui/kotlin/Toplevel.kt @@ -994,6 +994,8 @@ class Toplevel(obj: UiObject) { rowspan: Int = -1, name: String? = null, styleClass: String? = null, + onActivate: EventHandler? = null, + onButtonClick: EventHandler? = null, getvalue: SubListValueConverter? = null ): UiWidget { val list = ListView.sourcelist(ui) @@ -1033,6 +1035,12 @@ class Toplevel(obj: UiObject) { styleClass?.let { list.styleClass(it) } + onActivate?.let { + list.onActivate(it) + } + onButtonClick?.let { + list.onButtonClick(it) + } getvalue?.let { list.getvalue(it) } -- 2.47.3