Completed
Push — qml ( 80840b...6787ae )
by Olivier
01:20
created

FiltersModel   A

Complexity

Total Complexity 16

Size/Duplication

Total Lines 105
Duplicated Lines 0 %

Importance

Changes 3
Bugs 0 Features 1
Metric Value
dl 0
loc 105
rs 10
c 3
b 0
f 1
wmc 16

11 Methods

Rating   Name   Duplication   Size   Complexity  
A iconFromIndex() 0 7 2
A updateCounters() 0 8 1
A _addDefaultTreeItems() 0 9 1
A roleNames() 0 5 1
A addFilter() 0 4 1
A __init__() 0 10 2
A _initFilterTypeMappings() 0 23 1
A addDueRangeFilter() 0 5 1
A clear() 0 4 1
A iconFromRow() 0 7 3
A getRootChildren() 0 8 2
1
from PyQt5 import QtCore
2
from PyQt5 import QtGui
3
from qtodotxt.lib.filters import ContextFilter, CompleteTasksFilter, DueFilter, DueOverdueFilter, DueThisMonthFilter, \
4
    DueThisWeekFilter, DueTodayFilter, DueTomorrowFilter, HasContextsFilter, HasDueDateFilter, HasProjectsFilter, \
5
    ProjectFilter, UncategorizedTasksFilter, AllTasksFilter, PriorityFilter, HasPriorityFilter
6
7
TotalCountRole = QtCore.Qt.UserRole + 1
8
CompletedCountRole = QtCore.Qt.UserRole + 2
9
10
11
class FilterItem(QtGui.QStandardItem):
12
    def __init__(self, parent, strings, flt=None, icon=None, order=None):
13
        QtGui.QStandardItem.__init__(self, strings)
14
        self.setSelectable(True)
15
        self.setEnabled(True)
16
        self.setData(flt, QtCore.Qt.UserRole)
17
        self.filter = flt
18
        parent.appendRow([self])
19
        #if order:
20
        #self.setText(1, str(order))
21
        self.iconSource = icon
22
23
    def setCounts(self, total, completed):
24
        self.setTotalCount(total)
25
        self.setCompletedCount(completed)
26
27
    def setTotalCount(self, total):
28
        self.setData(total, TotalCountRole)
29
30
    def setCompletedCount(self, val):
31
        self.setData(val, CompletedCountRole)
32
33
34
class FiltersModel(QtGui.QStandardItemModel):
35
    def __init__(self, parent):
36
        QtGui.QStandardItemModel.__init__(self, parent)
37
        self.style = ":/white_icons"
38
        if str(QtCore.QSettings().value("color_schem", "")).find("dark") >= 0:
39
            self.style = ":/dark_icons"
40
        self._filterItemByFilterType = dict()
41
        self._filterIconByFilterType = dict()
42
        self._treeItemByFilterType = dict()
43
        self._addDefaultTreeItems()
44
        self._initFilterTypeMappings()
45
46
    def roleNames(self):
47
        roles = QtGui.QStandardItemModel.roleNames(self)
48
        roles[TotalCountRole] = b"totalCount"
49
        roles[CompletedCountRole] = b"completedCount"
50
        return roles
51
52
    def addFilter(self, flt, counts):
53
        parent = self._filterItemByFilterType[type(flt)]
54
        item = FilterItem(parent, flt.text, flt)
55
        item.setCounts(*counts)
56
57
    def clear(self):
58
        QtGui.QStandardItemModel.clear(self)
59
        self._addDefaultTreeItems()
60
        self._initFilterTypeMappings()
61
62
    def _addDefaultTreeItems(self):
63
        self._allTasksItem = FilterItem(self, 'All', AllTasksFilter(), 'qtodotxt-filter-all')
64
        self._uncategorizedTasksItem = FilterItem(self, 'Uncategorized',
65
                                                  UncategorizedTasksFilter(), 'qtodotxt-filter-uncategorized')
66
        self._dueItem = FilterItem(self, 'Due', HasDueDateFilter(), 'qtodotxt-filter-due')
67
        self._contextsItem = FilterItem(self, 'Contexts', HasContextsFilter(), 'qtodotxt-filter-contexts')
68
        self._projectsItem = FilterItem(self, 'Projects', HasProjectsFilter(), 'qtodotxt-filter-projects')
69
        self._priorityItem = FilterItem(self, 'Priorities', HasPriorityFilter(), 'qtodotxt-filter-complete')
70
        self._completeTasksItem = FilterItem(self, 'Complete', CompleteTasksFilter(), 'qtodotxt-filter-complete')
71
72
    def _initFilterTypeMappings(self):
73
        self._filterItemByFilterType[ContextFilter] = self._contextsItem
74
        self._filterItemByFilterType[ProjectFilter] = self._projectsItem
75
        self._filterItemByFilterType[DueFilter] = self._dueItem
76
        self._filterItemByFilterType[PriorityFilter] = self._priorityItem
77
78
        self._filterIconByFilterType[ContextFilter] = 'qtodotxt-filter-contexts'
79
        self._filterIconByFilterType[ProjectFilter] = 'qtodotxt-filter-projects'
80
81
        self._filterIconByFilterType[DueTodayFilter] = 'qtodotxt-filter-due-today'
82
        self._filterIconByFilterType[DueTomorrowFilter] = 'qtodotxt-filter-due-tomorrow'
83
        self._filterIconByFilterType[DueThisWeekFilter] = 'qtodotxt-filter-due-week'
84
        self._filterIconByFilterType[DueThisMonthFilter] = 'qtodotxt-filter-due-month'
85
        self._filterIconByFilterType[DueOverdueFilter] = 'qtodotxt-filter-due-overdue'
86
        self._filterIconByFilterType[PriorityFilter] = 'qtodotxt-filter-complete'
87
88
        self._treeItemByFilterType[AllTasksFilter] = self._allTasksItem
89
        self._treeItemByFilterType[UncategorizedTasksFilter] = self._uncategorizedTasksItem
90
        self._treeItemByFilterType[CompleteTasksFilter] = self._completeTasksItem
91
        self._treeItemByFilterType[HasProjectsFilter] = self._projectsItem
92
        self._treeItemByFilterType[HasDueDateFilter] = self._dueItem
93
        self._treeItemByFilterType[HasContextsFilter] = self._contextsItem
94
        self._treeItemByFilterType[HasPriorityFilter] = self._priorityItem
95
96
    # Predefined sorting for due ranges
97
    def addDueRangeFilter(self, flt, counts, sortKey=0):
98
        parentItem = self._dueItem
99
        icon = self._filterIconByFilterType[type(flt)]
100
        item = FilterItem(parentItem, flt.text, flt=flt, icon=icon, order=sortKey)
101
        item.setCounts(*counts)
102
103
        #parentItem.setExpanded(True)
104
        #parentItem.sortChildren(1, QtCore.Qt.AscendingOrder)
105
106
    @QtCore.pyqtSlot(result='QVariantList')
107
    def getRootChildren(self):
108
        indexes = []
109
        parent = self.invisibleRootItem()
110
        for i in range(0, parent.rowCount()):
111
            child = parent.child(i)
112
            indexes.append(child.index())
113
        return indexes
114
115
    @QtCore.pyqtSlot('QModelIndex', result='QString')
116
    def iconFromIndex(self, index):
117
        source = ""
118
        item = super(FiltersModel, self).itemFromIndex(index)
119
        if item is not None:
120
            source = item.iconSource
121
        return source
122
123
    @QtCore.pyqtSlot('int', result='QString')
124
    def iconFromRow(self, row):
125
        print(row)
126
        path = ""
127
        if row > 0 and row < self.rowCount():
128
            path = self.item(row, 0).iconSource
129
        return path
130
131
    def updateCounters(self, counters):
132
        self._completeTasksItem.setTotalCount(counters['All'][1])
133
        self._allTasksItem.setCounts(*counters['All'])
134
        self._dueItem.setCounts(*counters['Due'])
135
        self._contextsItem.setCounts(*counters['Contexts'])
136
        self._projectsItem.setCounts(*counters['Projects'])
137
        self._priorityItem.setCounts(*counters['Priority'])
138
        self._uncategorizedTasksItem.setCounts(*counters['Uncategorized'])
139
140
141
class FiltersTreeController(QtCore.QObject):
142
143
    filterSelectionChanged = QtCore.pyqtSignal(list)
144
145
    def __init__(self):
146
        QtCore.QObject.__init__(self)
147
        self.model = FiltersModel(self)
148
149
    def showFilters(self, mfile):
150
        self.model.clear()
151
        self._addAllContexts(mfile)
152
        self._addAllProjects(mfile)
153
        self._addAllDueRanges(mfile)
154
        self._addAllPriorities(mfile)
155
        self._updateCounter(mfile)
156
157
    def _updateCounter(self, mfile):
158
        counters = mfile.getTasksCounters()
159
        self.model.updateCounters(counters)
160
161
    def _addAllContexts(self, mfile):
162
        contexts = mfile.getAllContexts()
163
        for context, number in contexts.items():
164
            mfilter = ContextFilter(context)
165
            self.model.addFilter(mfilter, number)
166
167
    def _addAllProjects(self, mfile):
168
        projects = mfile.getAllProjects()
169
        for project, counts in projects.items():
170
            mfilter = ProjectFilter(project)
171
            self.model.addFilter(mfilter, counts)
172
173
    def _addAllPriorities(self, mfile):
174
        priorities = mfile.getAllPriorities()
175
        for priority, number in priorities.items():
176
            mfilter = PriorityFilter(priority)
177
            self.model.addFilter(mfilter, number)
178
179
    def _addAllDueRanges(self, mfile):
180
        dueRanges = mfile.getAllDueRanges()
181
182
        for flt, counts in dueRanges.items():
183
            self.model.addDueRangeFilter(flt, counts)
184