]> uap-core.de Git - rssreader.git/commitdiff
implement loading a whole feed group in the feed list
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Wed, 26 Nov 2025 17:38:33 +0000 (18:38 +0100)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Wed, 26 Nov 2025 17:38:33 +0000 (18:38 +0100)
rss-application/src/main/kotlin/de/unixwork/rssreader/Database.kt
rss-application/src/main/kotlin/de/unixwork/rssreader/FeedCollection.kt
rss-application/src/main/kotlin/de/unixwork/rssreader/FeedList.kt
rss-application/src/main/kotlin/de/unixwork/rssreader/Item.kt
rss-application/src/main/kotlin/de/unixwork/rssreader/MainWindow.kt

index 930ca4fa3bc119eb5d404ff3b7669cb6da8b90da..3ea05e9ce2950a3b31802e7a7aabe30f9ec495ba 100644 (file)
@@ -303,6 +303,7 @@ object Database {
                         item.feedUrl = rs.getString("URL")
                         item.isRead = rs.getBoolean("is_read")
                         item.isBookmark = rs.getBoolean("is_bookmarked")
+                        item.collection = feedCollection
                         items.add(item)
                     }
                 }
index 3362279092f2845d9e4fcbaf26d524adb33f2044..7108d9f5670ab39ec60a710c0ab1e86ca37208cd 100644 (file)
@@ -14,6 +14,10 @@ class FeedCollection(id: Int, name: String)  {
     var itemsLoaded = false
     var itemsLoading = false
 
+    // Is this FeedCollection actually a FeedGroup?
+    // In that case, id is the FeedGroup id
+    var isGroup = false
+
     fun updateReadStatus(isRead: Boolean) {
         items.forEach { it.isRead = isRead }
     }
index 3873069cb44b277f6f7b9f594b25fd4048be5834..d96339086e955e223267de8b4dccf97e434f81c8 100644 (file)
@@ -77,6 +77,48 @@ class FeedList(window: MainWindow) : Document() {
         items.update()
     }
 
+    fun loadFeedGroup(group: FeedGroup) {
+        var load = false
+        group.feeds.forEach { feed ->
+            if(!feed.itemsLoaded) {
+                load = true
+                feed.itemsLoading = true
+            }
+        }
+
+        val collection = FeedCollection(group.id, "")
+        collection.isGroup = true
+
+        showFeed = collection
+        if(load) {
+            GlobalScope.launch(Dispatchers.IO) {
+                group.feeds.forEach { feed ->
+                    feed.items = Database.getItems(feed, 10000)
+                    feed.itemsLoaded = true
+                }
+                GlobalScope.launch(ToolkitDispatcher) {
+                    group.feeds.forEach { feed ->
+                        feed.itemsLoading = false
+                    }
+                    if(showFeed == collection) {
+                        loadFeedGroup(group)
+                    }
+                }
+            }
+            return
+        }
+
+        group.feeds.forEach { feed ->
+            feed.items.forEach { item ->
+                collection.items.add(item)
+            }
+        }
+        collection.items.sortByDescending { it.pubDate }
+        collection.itemsLoaded = true
+
+        loadFeed(collection)
+    }
+
     fun reloadCurrentFeed() {
         currentFeed?.let { loadFeed(it) }
     }
index e4d42280f668b5b0dc8382c888b340c02d36e426..30431fa161304ab248509f5bb91f7f808b48b0c3 100644 (file)
@@ -22,6 +22,8 @@ class Item(id: Int) {
     var feedName: String? = null
     var feedUrl: String? = null
 
+    var collection: FeedCollection? = null
+
     fun getContent(): Content {
         contentHtml?.let {
             return Content(it, "text/html")
index 2939627e67fbc64da0f13e468b1d7fe4eef4b09f..d01738dc8cb602757066bc98ff892cf385631bec 100644 (file)
@@ -185,6 +185,10 @@ class MainWindow() {
                             currentSublistIndex = evt.sublistIndex
                             currentFeedIndex = evt.rowIndex
                             if(evt.rowIndex == -1) {
+                                val group = sourceList.groups[evt.sublistIndex]
+                                group?.let {
+                                    feedList.loadFeedGroup(it)
+                                }
                                 return@sourcelist
                             }
                             try {