|
13 | 13 | from vit.base_list_box import BaseListBox
|
14 | 14 | from vit.list_batcher import ListBatcher
|
15 | 15 | from vit.formatter.project import Project as ProjectFormatter
|
16 |
| -from vit.config_parser import TaskParser |
17 | 16 | from vit.util import unicode_len
|
18 | 17 |
|
19 | 18 |
|
@@ -177,43 +176,30 @@ def flash_focus(self, repeat_times=None, pause_seconds=None):
|
177 | 176 |
|
178 | 177 | def sort(self):
|
179 | 178 | if 'sort' in self.report:
|
180 |
| - self.task_parser = TaskParser(self.config) |
181 |
| - uda_config = self.task_parser.subtree('uda.') |
182 |
| - DEFAULT_COLUMNS = {'depends', 'description', 'due', 'end', 'entry', 'id', 'imask', 'last', 'mask', 'modified', 'parent', 'project', 'recur', 'rtype', 'scheduled', 'start', 'status', 'tags', 'template', 'until', 'urgency', 'uuid', 'wait'} |
183 |
| - # except 'priority' as UDA |
184 |
| - |
185 |
| - def default_comparator(first, second): |
186 |
| - if first[column] is not None and second[column] is not None: |
187 |
| - return -1 if first[column] < second[column] else 1 if first[column] > second[column] else 0 |
188 |
| - elif first[column] is None and second[column] is None: |
189 |
| - return 0 |
190 |
| - elif first[column] is not None and second[column] is None: |
191 |
| - return -1 |
192 |
| - elif first[column] is None and second[column] is not None: |
193 |
| - return 1 |
194 |
| - |
195 |
| - def string_comparator(uda_index, first, second): |
196 |
| - a, b = first[column], second[column] |
197 |
| - a_index = uda_index.get(a or '', len(uda_index)) |
198 |
| - b_index = uda_index.get(b or '', len(uda_index)) |
199 |
| - return (a_index > b_index) - (a_index < b_index) |
200 |
| - |
201 | 179 | for column, order, collate in reversed(self.report['sort']):
|
202 |
| - if column.strip() in DEFAULT_COLUMNS: |
203 |
| - comparator = default_comparator |
204 |
| - else: # UDA, priority |
205 |
| - uda_values = uda_config[column].get('values') |
206 |
| - uda_type = uda_config[column].get('type') |
207 |
| - if uda_type.strip() == 'string': |
208 |
| - if uda_values: # has .values |
209 |
| - uda_values_list = uda_values.rstrip(',').split(',') |
210 |
| - uda_index = {v: i for i, v in enumerate(uda_values_list)} |
211 |
| - comparator = partial(string_comparator, uda_index) |
212 |
| - else: # has no .values |
213 |
| - comparator = default_comparator |
214 |
| - else: # numeric, date, duration |
215 |
| - comparator = default_comparator |
216 |
| - |
| 180 | + def comparator_default(first, second): |
| 181 | + if first[column] is not None and second[column] is not None: |
| 182 | + return -1 if first[column] < second[column] else 1 if first[column] > second[column] else 0 |
| 183 | + elif first[column] is None and second[column] is None: |
| 184 | + return 0 |
| 185 | + elif first[column] is not None and second[column] is None: |
| 186 | + return -1 |
| 187 | + elif first[column] is None and second[column] is not None: |
| 188 | + return 1 |
| 189 | + |
| 190 | + def comparator_uda_string(values_index, first, second): |
| 191 | + a, b = first[column], second[column] |
| 192 | + default_index = len(values_index) |
| 193 | + a_index = values_index.get(a or '', default_index) |
| 194 | + b_index = values_index.get(b or '', default_index) |
| 195 | + return (a_index > b_index) - (a_index < b_index) |
| 196 | + |
| 197 | + uda = self.task_config.uda_config.get(column) |
| 198 | + if uda != None and uda.get('type') == 'string': |
| 199 | + values_index = uda.get('values_index') |
| 200 | + comparator = partial(comparator_uda_string, values_index) |
| 201 | + else: |
| 202 | + comparator = comparator_default |
217 | 203 | if order and order == 'descending':
|
218 | 204 | self.tasks = sorted(self.tasks, key=cmp_to_key(comparator), reverse=True)
|
219 | 205 | else:
|
|
0 commit comments