File: feed_store.py

package info (click to toggle)
gnome-feeds 2.2.0-5
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,520 kB
  • sloc: python: 5,369; sh: 93; xml: 28; makefile: 2
file content (79 lines) | stat: -rw-r--r-- 2,622 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
from gi.repository import GObject, Gtk, Gio
from typing import Optional
from gfeeds.confManager import ConfManager
from gfeeds.feed import Feed


class FeedStore(Gtk.FilterListModel):
    __gsignals__ = {
        'item-removed': (
            GObject.SignalFlags.RUN_LAST,
            None,
            (GObject.TYPE_PYOBJECT,)
        )
    }

    def __init__(self):
        self.sorter = Gtk.CustomSorter()
        self.sorter.set_sort_func(self._sort_func)
        self.filter = Gtk.CustomFilter()
        self.filter.set_filter_func(self._filter_func)
        self.list_store = Gio.ListStore(item_type=Feed)
        self.sort_store = Gtk.SortListModel(
            model=self.list_store, sorter=self.sorter
        )
        self.confman = ConfManager()
        self.confman.connect(
                'gfeeds_show_empty_feeds_changed',
                lambda *_: self.invalidate_filter()
        )
        # Hiding read articles can result in empty feeds which should
        # be hidden
        self.confman.connect(
                'gfeeds_show_read_changed',
                lambda *_: self.invalidate_filter()
        )
        super().__init__(model=self.sort_store, filter=self.filter)

    def _sort_func(self, feed1: Feed, feed2: Feed, *_) -> int:
        return -1 if feed1.title.lower() < feed2.title.lower() else 1

    def invalidate_sort(self):
        self.sorter.set_sort_func(self._sort_func)

    def _filter_func(self, feed: Feed, *_) -> bool:
        res = True
        if not self.confman.nconf.show_empty_feeds:
            if self.confman.nconf.show_read_items:
                res = res and len(feed.items) > 0
            else:
                res = res and feed.unread_count > 0
        return res

    def invalidate_filter(self):
        self.filter.set_filter_func(self._filter_func)

    def empty(self):
        return self.list_store.remove_all()

    def add_feed(self, n_feed: Feed):
        self.list_store.append(n_feed)
        n_feed.connect(
            'empty_changed', lambda *_: self.invalidate_filter()
        )

    def remove_by_index(self, index: int):
        self.emit('item-removed', self.list_store[index])
        self.list_store.remove(index)

    def remove_feed(self, to_rm: Feed):
        for i, feed in enumerate(self.list_store):
            if feed.title == to_rm.title and feed.rss_link == to_rm.rss_link:
                self.remove_by_index(i)
                return

    def get_feed(self, identifier: str) -> Optional[Feed]:
        for f in self.list_store:
            if f.rss_link + f.title == identifier:
                return f
        return None