Merge lp:~izidor/gtg/pep8-gtk into lp:~gtg/gtg/old-trunk
- pep8-gtk
- Merge into old-trunk
Proposed by
Izidor Matušov
Status: | Merged |
---|---|
Merged at revision: | 1254 |
Proposed branch: | lp:~izidor/gtg/pep8-gtk |
Merge into: | lp:~gtg/gtg/old-trunk |
Diff against target: |
1911 lines (+373/-323) 10 files modified
GTG/gtk/browser/CellRendererTags.py (+21/-21) GTG/gtk/browser/browser.py (+13/-17) GTG/gtk/browser/tag_context_menu.py (+4/-5) GTG/gtk/browser/treeview_factory.py (+95/-95) GTG/gtk/crashhandler.py (+1/-1) GTG/gtk/delete_dialog.py (+12/-10) GTG/gtk/editor/__init__.py (+2/-2) GTG/gtk/editor/editor.py (+67/-52) GTG/gtk/editor/taskview.py (+155/-117) GTG/gtk/editor/taskviewserial.py (+3/-3) |
To merge this branch: | bzr merge lp:~izidor/gtg/pep8-gtk |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Bertrand Rousseau (community) | code | Approve | |
Review via email: mp+136066@code.launchpad.net |
Commit message
Description of the change
Partial PEP8-ification of GTG/gtk folder (until I ran out of battery during refactoring :/)
To post a comment you must log in.
Revision history for this message
Bertrand Rousseau (bertrand-rousseau) wrote : | # |
review:
Approve
(code)
Revision history for this message
Izidor Matušov (izidor) wrote : | # |
I didn't want to remove them because of merge/including code from Steve's GSoC editor rework.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'GTG/gtk/browser/CellRendererTags.py' | |||
2 | --- GTG/gtk/browser/CellRendererTags.py 2012-05-23 08:55:31 +0000 | |||
3 | +++ GTG/gtk/browser/CellRendererTags.py 2012-11-25 21:29:25 +0000 | |||
4 | @@ -32,9 +32,9 @@ | |||
5 | 32 | 32 | ||
6 | 33 | class CellRendererTags(gtk.GenericCellRenderer): | 33 | class CellRendererTags(gtk.GenericCellRenderer): |
7 | 34 | __gproperties__ = { | 34 | __gproperties__ = { |
9 | 35 | 'tag_list': (gobject.TYPE_PYOBJECT,\ | 35 | 'tag_list': (gobject.TYPE_PYOBJECT, |
10 | 36 | "Tag list", "A list of tags", gobject.PARAM_READWRITE), | 36 | "Tag list", "A list of tags", gobject.PARAM_READWRITE), |
12 | 37 | 'tag': (gobject.TYPE_PYOBJECT, "Tag",\ | 37 | 'tag': (gobject.TYPE_PYOBJECT, "Tag", |
13 | 38 | "Tag", gobject.PARAM_READWRITE), | 38 | "Tag", gobject.PARAM_READWRITE), |
14 | 39 | } | 39 | } |
15 | 40 | 40 | ||
16 | @@ -66,7 +66,7 @@ | |||
17 | 66 | if self.tag_list != None: | 66 | if self.tag_list != None: |
18 | 67 | for my_tag in self.tag_list: | 67 | for my_tag in self.tag_list: |
19 | 68 | my_tag_color = my_tag.get_attribute("color") | 68 | my_tag_color = my_tag.get_attribute("color") |
21 | 69 | my_tag_icon = my_tag.get_attribute("icon") | 69 | my_tag_icon = my_tag.get_attribute("icon") |
22 | 70 | if my_tag_color or my_tag_icon: | 70 | if my_tag_color or my_tag_icon: |
23 | 71 | count = count + 1 | 71 | count = count + 1 |
24 | 72 | elif self.tag != None: | 72 | elif self.tag != None: |
25 | @@ -80,10 +80,10 @@ | |||
26 | 80 | def __init__(self): #pylint: disable-msg=W0231 | 80 | def __init__(self): #pylint: disable-msg=W0231 |
27 | 81 | self.__gobject_init__() | 81 | self.__gobject_init__() |
28 | 82 | self.tag_list = None | 82 | self.tag_list = None |
33 | 83 | self.tag = None | 83 | self.tag = None |
34 | 84 | self.xpad = 1 | 84 | self.xpad = 1 |
35 | 85 | self.ypad = 1 | 85 | self.ypad = 1 |
36 | 86 | self.PADDING = 1 | 86 | self.PADDING = 1 |
37 | 87 | 87 | ||
38 | 88 | def do_set_property(self, pspec, value): | 88 | def do_set_property(self, pspec, value): |
39 | 89 | if pspec.name == "tag-list": | 89 | if pspec.name == "tag-list": |
40 | @@ -97,11 +97,11 @@ | |||
41 | 97 | else: | 97 | else: |
42 | 98 | return getattr(self, pspec.name) | 98 | return getattr(self, pspec.name) |
43 | 99 | 99 | ||
46 | 100 | def on_render(\ | 100 | def on_render(self, window, widget, background_area, cell_area, |
47 | 101 | self, window, widget, background_area, cell_area, expose_area, flags): | 101 | expose_area, flags): |
48 | 102 | 102 | ||
49 | 103 | vw_tags = self.__count_viewable_tags() | 103 | vw_tags = self.__count_viewable_tags() |
51 | 104 | count = 0 | 104 | count = 0 |
52 | 105 | 105 | ||
53 | 106 | # Select source | 106 | # Select source |
54 | 107 | if self.tag_list != None: | 107 | if self.tag_list != None: |
55 | @@ -112,25 +112,25 @@ | |||
56 | 112 | return | 112 | return |
57 | 113 | 113 | ||
58 | 114 | # Drawing context | 114 | # Drawing context |
60 | 115 | cr = window.cairo_create() | 115 | cr = window.cairo_create() |
61 | 116 | gdkcontext = gtk.gdk.CairoContext(cr) | 116 | gdkcontext = gtk.gdk.CairoContext(cr) |
62 | 117 | gdkcontext.set_antialias(cairo.ANTIALIAS_NONE) | 117 | gdkcontext.set_antialias(cairo.ANTIALIAS_NONE) |
63 | 118 | 118 | ||
64 | 119 | # Coordinates of the origin point | 119 | # Coordinates of the origin point |
65 | 120 | x_align = self.get_property("xalign") | 120 | x_align = self.get_property("xalign") |
66 | 121 | y_align = self.get_property("yalign") | 121 | y_align = self.get_property("yalign") |
68 | 122 | orig_x = cell_area.x + int((cell_area.width - 16*vw_tags -\ | 122 | orig_x = cell_area.x + int((cell_area.width - 16*vw_tags - \ |
69 | 123 | self.PADDING*2*(vw_tags-1)) * x_align) | 123 | self.PADDING*2*(vw_tags-1)) * x_align) |
71 | 124 | orig_y = cell_area.y + int((cell_area.height - 16) * y_align) | 124 | orig_y = cell_area.y + int((cell_area.height - 16) * y_align) |
72 | 125 | 125 | ||
73 | 126 | # We draw the icons & squares | 126 | # We draw the icons & squares |
74 | 127 | for my_tag in tags: | 127 | for my_tag in tags: |
75 | 128 | 128 | ||
77 | 129 | my_tag_icon = my_tag.get_attribute("icon") | 129 | my_tag_icon = my_tag.get_attribute("icon") |
78 | 130 | my_tag_color = my_tag.get_attribute("color") | 130 | my_tag_color = my_tag.get_attribute("color") |
79 | 131 | 131 | ||
82 | 132 | rect_x = orig_x + self.PADDING*2*count + 16*count | 132 | rect_x = orig_x + self.PADDING*2*count + 16*count |
83 | 133 | rect_y = orig_y | 133 | rect_y = orig_y |
84 | 134 | 134 | ||
85 | 135 | if my_tag_icon: | 135 | if my_tag_icon: |
86 | 136 | try: | 136 | try: |
87 | @@ -162,11 +162,10 @@ | |||
88 | 162 | 162 | ||
89 | 163 | if self.tag and my_tag: #pylint: disable-msg=W0631 | 163 | if self.tag and my_tag: #pylint: disable-msg=W0631 |
90 | 164 | 164 | ||
92 | 165 | my_tag_icon = my_tag.get_attribute("icon") | 165 | my_tag_icon = my_tag.get_attribute("icon") |
93 | 166 | my_tag_color = my_tag.get_attribute("color") | 166 | my_tag_color = my_tag.get_attribute("color") |
94 | 167 | 167 | ||
97 | 168 | if not my_tag_icon and not my_tag_color: | 168 | if not my_tag_icon and not my_tag_color: |
96 | 169 | |||
98 | 170 | # Draw rounded rectangle | 169 | # Draw rounded rectangle |
99 | 171 | gdkcontext.set_source_rgba(0.95, 0.95, 0.95, 1) | 170 | gdkcontext.set_source_rgba(0.95, 0.95, 0.95, 1) |
100 | 172 | self.__roundedrec(gdkcontext, rect_x, rect_y, 16, 16, 8) | 171 | self.__roundedrec(gdkcontext, rect_x, rect_y, 16, 16, 8) |
101 | @@ -183,8 +182,9 @@ | |||
102 | 183 | count = self.__count_viewable_tags() | 182 | count = self.__count_viewable_tags() |
103 | 184 | 183 | ||
104 | 185 | if count != 0: | 184 | if count != 0: |
107 | 186 | return (self.xpad, self.ypad, self.xpad*2 + 16*count +\ | 185 | return (self.xpad, self.ypad, |
108 | 187 | 2*count*self.PADDING, 16 + 2*self.ypad) | 186 | self.xpad*2 + 16*count + 2*count*self.PADDING, |
109 | 187 | 16 + 2*self.ypad) | ||
110 | 188 | else: | 188 | else: |
111 | 189 | return (self.xpad, self.ypad, self.xpad*2, self.ypad*2) | 189 | return (self.xpad, self.ypad, self.xpad*2, self.ypad*2) |
112 | 190 | 190 | ||
113 | 191 | 191 | ||
114 | === modified file 'GTG/gtk/browser/browser.py' | |||
115 | --- GTG/gtk/browser/browser.py 2012-11-01 10:09:06 +0000 | |||
116 | +++ GTG/gtk/browser/browser.py 2012-11-25 21:29:25 +0000 | |||
117 | @@ -46,9 +46,6 @@ | |||
118 | 46 | from GTG.tools.dates import Date | 46 | from GTG.tools.dates import Date |
119 | 47 | from GTG.tools.logger import Log | 47 | from GTG.tools.logger import Log |
120 | 48 | 48 | ||
121 | 49 | #=== MAIN CLASS =============================================================== | ||
122 | 50 | |||
123 | 51 | |||
124 | 52 | 49 | ||
125 | 53 | class Timer: | 50 | class Timer: |
126 | 54 | 51 | ||
127 | @@ -96,7 +93,7 @@ | |||
128 | 96 | 93 | ||
129 | 97 | # Set up models | 94 | # Set up models |
130 | 98 | # Active Tasks | 95 | # Active Tasks |
132 | 99 | self.req.apply_global_filter(self.activetree,'active') | 96 | self.req.apply_global_filter(self.activetree, 'active') |
133 | 100 | # Tags | 97 | # Tags |
134 | 101 | self.tagtree = None | 98 | self.tagtree = None |
135 | 102 | self.tagtreeview = None | 99 | self.tagtreeview = None |
136 | @@ -405,7 +402,7 @@ | |||
137 | 405 | ### HELPER FUNCTIONS ######################################################## | 402 | ### HELPER FUNCTIONS ######################################################## |
138 | 406 | def open_preferences(self, widget): | 403 | def open_preferences(self, widget): |
139 | 407 | self.vmanager.open_preferences(self.config) | 404 | self.vmanager.open_preferences(self.config) |
141 | 408 | 405 | ||
142 | 409 | def open_plugins(self, widget): | 406 | def open_plugins(self, widget): |
143 | 410 | self.vmanager.configure_plugins() | 407 | self.vmanager.configure_plugins() |
144 | 411 | 408 | ||
145 | @@ -565,10 +562,10 @@ | |||
146 | 565 | 562 | ||
147 | 566 | def set_view(self, viewname): | 563 | def set_view(self, viewname): |
148 | 567 | if viewname == 'default': | 564 | if viewname == 'default': |
150 | 568 | self.req.unapply_global_filter(self.activetree,'workview') | 565 | self.req.unapply_global_filter(self.activetree, 'workview') |
151 | 569 | workview = False | 566 | workview = False |
152 | 570 | elif viewname == 'workview': | 567 | elif viewname == 'workview': |
154 | 571 | self.req.apply_global_filter(self.activetree,'workview') | 568 | self.req.apply_global_filter(self.activetree, 'workview') |
155 | 572 | workview = True | 569 | workview = True |
156 | 573 | else: | 570 | else: |
157 | 574 | raise Exception('Cannot set the view %s' %viewname) | 571 | raise Exception('Cannot set the view %s' %viewname) |
158 | @@ -613,7 +610,6 @@ | |||
159 | 613 | ### SIGNAL CALLBACKS ########################################################## | 610 | ### SIGNAL CALLBACKS ########################################################## |
160 | 614 | # Typically, reaction to user input & interactions with the GUI | 611 | # Typically, reaction to user input & interactions with the GUI |
161 | 615 | # | 612 | # |
162 | 616 | |||
163 | 617 | def on_sort_column_changed(self, model): | 613 | def on_sort_column_changed(self, model): |
164 | 618 | sort_column, sort_order = model.get_sort_column_id() | 614 | sort_column, sort_order = model.get_sort_column_id() |
165 | 619 | 615 | ||
166 | @@ -755,7 +751,7 @@ | |||
167 | 755 | colt = self.config.get("collapsed_tasks") | 751 | colt = self.config.get("collapsed_tasks") |
168 | 756 | if tid not in colt: | 752 | if tid not in colt: |
169 | 757 | colt.append(str(tid)) | 753 | colt.append(str(tid)) |
171 | 758 | 754 | ||
172 | 759 | def on_tag_expanded(self, sender, tag): | 755 | def on_tag_expanded(self, sender, tag): |
173 | 760 | colt = self.config.get("expanded_tags") | 756 | colt = self.config.get("expanded_tags") |
174 | 761 | if tag not in colt: | 757 | if tag not in colt: |
175 | @@ -980,7 +976,7 @@ | |||
176 | 980 | def on_delete_tasks(self, widget=None, tid=None): | 976 | def on_delete_tasks(self, widget=None, tid=None): |
177 | 981 | #If we don't have a parameter, then take the selection in the treeview | 977 | #If we don't have a parameter, then take the selection in the treeview |
178 | 982 | if not tid: | 978 | if not tid: |
180 | 983 | #tid_to_delete is a [project,task] tuple | 979 | #tid_to_delete is a [project, task] tuple |
181 | 984 | tids_todelete = self.get_selected_tasks() | 980 | tids_todelete = self.get_selected_tasks() |
182 | 985 | if not tids_todelete: | 981 | if not tids_todelete: |
183 | 986 | return | 982 | return |
184 | @@ -1110,13 +1106,13 @@ | |||
185 | 1110 | task.set_status(Task.STA_DISMISSED) | 1106 | task.set_status(Task.STA_DISMISSED) |
186 | 1111 | self.close_all_task_editors(uid) | 1107 | self.close_all_task_editors(uid) |
187 | 1112 | 1108 | ||
189 | 1113 | def apply_filter_on_panes(self, filter_name,refresh=True): | 1109 | def apply_filter_on_panes(self, filter_name, refresh=True): |
190 | 1114 | """ Apply filters for every pane: active tasks, closed tasks """ | 1110 | """ Apply filters for every pane: active tasks, closed tasks """ |
191 | 1115 | for pane in self.vtree_panes: | 1111 | for pane in self.vtree_panes: |
192 | 1116 | vtree = self.req.get_tasks_tree(name=pane, refresh=False) | 1112 | vtree = self.req.get_tasks_tree(name=pane, refresh=False) |
193 | 1117 | vtree.apply_filter(filter_name, refresh=refresh) | 1113 | vtree.apply_filter(filter_name, refresh=refresh) |
196 | 1118 | 1114 | ||
197 | 1119 | def unapply_filter_on_panes(self, filter_name,refresh=True): | 1115 | def unapply_filter_on_panes(self, filter_name, refresh=True): |
198 | 1120 | """ Apply filters for every pane: active tasks, closed tasks """ | 1116 | """ Apply filters for every pane: active tasks, closed tasks """ |
199 | 1121 | for pane in self.vtree_panes: | 1117 | for pane in self.vtree_panes: |
200 | 1122 | vtree = self.req.get_tasks_tree(name=pane, refresh=False) | 1118 | vtree = self.req.get_tasks_tree(name=pane, refresh=False) |
201 | @@ -1130,11 +1126,11 @@ | |||
202 | 1130 | 1126 | ||
203 | 1131 | #When you click on a tag, you want to unselect the tasks | 1127 | #When you click on a tag, you want to unselect the tasks |
204 | 1132 | new_taglist = self.get_selected_tags() | 1128 | new_taglist = self.get_selected_tags() |
206 | 1133 | 1129 | ||
207 | 1134 | for tagname in self.applied_tags: | 1130 | for tagname in self.applied_tags: |
208 | 1135 | if tagname not in new_taglist: | 1131 | if tagname not in new_taglist: |
211 | 1136 | self.unapply_filter_on_panes(tagname,refresh=False) | 1132 | self.unapply_filter_on_panes(tagname, refresh=False) |
212 | 1137 | 1133 | ||
213 | 1138 | for tagname in new_taglist: | 1134 | for tagname in new_taglist: |
214 | 1139 | if tagname not in self.applied_tags: | 1135 | if tagname not in self.applied_tags: |
215 | 1140 | self.apply_filter_on_panes(tagname) | 1136 | self.apply_filter_on_panes(tagname) |
216 | @@ -1143,7 +1139,7 @@ | |||
217 | 1143 | tag = self.req.get_tag(tagname) | 1139 | tag = self.req.get_tag(tagname) |
218 | 1144 | if tag.is_search_tag(): | 1140 | if tag.is_search_tag(): |
219 | 1145 | self.quickadd_entry.set_text(tag.get_attribute("query")) | 1141 | self.quickadd_entry.set_text(tag.get_attribute("query")) |
221 | 1146 | 1142 | ||
222 | 1147 | self.applied_tags = new_taglist | 1143 | self.applied_tags = new_taglist |
223 | 1148 | 1144 | ||
224 | 1149 | def on_taskdone_cursor_changed(self, selection=None): | 1145 | def on_taskdone_cursor_changed(self, selection=None): |
225 | 1150 | 1146 | ||
226 | === modified file 'GTG/gtk/browser/tag_context_menu.py' | |||
227 | --- GTG/gtk/browser/tag_context_menu.py 2012-05-23 08:55:31 +0000 | |||
228 | +++ GTG/gtk/browser/tag_context_menu.py 2012-11-25 21:29:25 +0000 | |||
229 | @@ -21,7 +21,7 @@ | |||
230 | 21 | """ | 21 | """ |
231 | 22 | tag_context_menu: | 22 | tag_context_menu: |
232 | 23 | Implements a context (pop-up) menu for the tag item in the sidebar. | 23 | Implements a context (pop-up) menu for the tag item in the sidebar. |
234 | 24 | Right now it is just a void shell It is supposed to become a more generic | 24 | Right now it is just a void shell It is supposed to become a more generic |
235 | 25 | sidebar context for all kind of item displayed there. | 25 | sidebar context for all kind of item displayed there. |
236 | 26 | Also, it is supposed to handle more complex menus (with non-std widgets, | 26 | Also, it is supposed to handle more complex menus (with non-std widgets, |
237 | 27 | like a color picker) | 27 | like a color picker) |
238 | @@ -33,6 +33,7 @@ | |||
239 | 33 | 33 | ||
240 | 34 | from GTG import _ | 34 | from GTG import _ |
241 | 35 | 35 | ||
242 | 36 | |||
243 | 36 | class TagContextMenu(gtk.Menu): # pylint: disable-msg=R0904 | 37 | class TagContextMenu(gtk.Menu): # pylint: disable-msg=R0904 |
244 | 37 | """Context menu fo the tag i the sidebar""" | 38 | """Context menu fo the tag i the sidebar""" |
245 | 38 | 39 | ||
246 | @@ -66,15 +67,13 @@ | |||
247 | 66 | # Make it visible | 67 | # Make it visible |
248 | 67 | self.show_all() | 68 | self.show_all() |
249 | 68 | 69 | ||
252 | 69 | ### PUBLIC API ### | 70 | ### PUBLIC API ############################################################ |
251 | 70 | |||
253 | 71 | def set_tag(self, tag): | 71 | def set_tag(self, tag): |
254 | 72 | """Update the context menu items using the tag attributes.""" | 72 | """Update the context menu items using the tag attributes.""" |
255 | 73 | self.tag = tag | 73 | self.tag = tag |
256 | 74 | self.__build_menu() | 74 | self.__build_menu() |
257 | 75 | 75 | ||
260 | 76 | ### CALLBACKS ### | 76 | ### CALLBACKS ############################################################# |
259 | 77 | |||
261 | 78 | def on_mi_cc_activate(self, widget): # pylint: disable-msg=W0613 | 77 | def on_mi_cc_activate(self, widget): # pylint: disable-msg=W0613 |
262 | 79 | """Callback: show the tag editor upon request""" | 78 | """Callback: show the tag editor upon request""" |
263 | 80 | self.vmanager.open_tag_editor(self.tag) | 79 | self.vmanager.open_tag_editor(self.tag) |
264 | 81 | 80 | ||
265 | === modified file 'GTG/gtk/browser/treeview_factory.py' | |||
266 | --- GTG/gtk/browser/treeview_factory.py 2012-11-01 10:23:05 +0000 | |||
267 | +++ GTG/gtk/browser/treeview_factory.py 2012-11-25 21:29:25 +0000 | |||
268 | @@ -33,14 +33,14 @@ | |||
269 | 33 | 33 | ||
270 | 34 | class TreeviewFactory(): | 34 | class TreeviewFactory(): |
271 | 35 | 35 | ||
273 | 36 | def __init__(self,requester,config): | 36 | def __init__(self, requester, config): |
274 | 37 | self.req = requester | 37 | self.req = requester |
275 | 38 | self.mainview = self.req.get_tasks_tree() | 38 | self.mainview = self.req.get_tasks_tree() |
276 | 39 | self.config = config | 39 | self.config = config |
278 | 40 | 40 | ||
279 | 41 | #Initial unactive color | 41 | #Initial unactive color |
282 | 42 | #This is a crude hack. As we don't have a reference to the | 42 | #This is a crude hack. As we don't have a reference to the |
283 | 43 | #treeview to retrieve the style, we save that color when we | 43 | #treeview to retrieve the style, we save that color when we |
284 | 44 | #build the treeview. | 44 | #build the treeview. |
285 | 45 | self.unactive_color = "#888a85" | 45 | self.unactive_color = "#888a85" |
286 | 46 | 46 | ||
287 | @@ -49,12 +49,12 @@ | |||
288 | 49 | 49 | ||
289 | 50 | # Cache tags treeview for on_rename_tag callback | 50 | # Cache tags treeview for on_rename_tag callback |
290 | 51 | self.tags_view = None | 51 | self.tags_view = None |
292 | 52 | 52 | ||
293 | 53 | ############################# | 53 | ############################# |
294 | 54 | #Functions for tasks columns | 54 | #Functions for tasks columns |
295 | 55 | ################################ | 55 | ################################ |
298 | 56 | 56 | ||
299 | 57 | def _has_hidden_subtask(self,task): | 57 | def _has_hidden_subtask(self, task): |
300 | 58 | #not recursive | 58 | #not recursive |
301 | 59 | display_count = self.mainview.node_n_children(task.get_id()) | 59 | display_count = self.mainview.node_n_children(task.get_id()) |
302 | 60 | real_count = 0 | 60 | real_count = 0 |
303 | @@ -64,15 +64,15 @@ | |||
304 | 64 | if sub_task and sub_task.get_status() == Task.STA_ACTIVE: | 64 | if sub_task and sub_task.get_status() == Task.STA_ACTIVE: |
305 | 65 | real_count = real_count + 1 | 65 | real_count = real_count + 1 |
306 | 66 | return display_count < real_count | 66 | return display_count < real_count |
308 | 67 | 67 | ||
309 | 68 | def task_bg_color(self, node, default_color): | 68 | def task_bg_color(self, node, default_color): |
310 | 69 | if self.config.get('bg_color_enable'): | 69 | if self.config.get('bg_color_enable'): |
311 | 70 | return colors.background_color(node.get_tags(), default_color) | 70 | return colors.background_color(node.get_tags(), default_color) |
312 | 71 | else: | 71 | else: |
313 | 72 | return None | 72 | return None |
315 | 73 | 73 | ||
316 | 74 | #return an ordered list of tags of a task | 74 | #return an ordered list of tags of a task |
318 | 75 | def task_tags_column(self,node): | 75 | def task_tags_column(self, node): |
319 | 76 | tags = node.get_tags() | 76 | tags = node.get_tags() |
320 | 77 | 77 | ||
321 | 78 | search_parent = self.req.get_tag(CoreConfig.SEARCH_TAG) | 78 | search_parent = self.req.get_tag(CoreConfig.SEARCH_TAG) |
322 | @@ -84,15 +84,15 @@ | |||
323 | 84 | 84 | ||
324 | 85 | tags.sort(key = lambda x: x.get_name()) | 85 | tags.sort(key = lambda x: x.get_name()) |
325 | 86 | return tags | 86 | return tags |
327 | 87 | 87 | ||
328 | 88 | #task title | 88 | #task title |
329 | 89 | def task_title_column(self, node): | 89 | def task_title_column(self, node): |
330 | 90 | return saxutils.escape(node.get_title()) | 90 | return saxutils.escape(node.get_title()) |
332 | 91 | 91 | ||
333 | 92 | #task title/label | 92 | #task title/label |
334 | 93 | def task_label_column(self, node): | 93 | def task_label_column(self, node): |
335 | 94 | str_format = "%s" | 94 | str_format = "%s" |
337 | 95 | 95 | ||
338 | 96 | if node.get_status() == Task.STA_ACTIVE: | 96 | if node.get_status() == Task.STA_ACTIVE: |
339 | 97 | # we mark in bold tasks which are due today or as Now | 97 | # we mark in bold tasks which are due today or as Now |
340 | 98 | days_left = node.get_days_left() | 98 | days_left = node.get_days_left() |
341 | @@ -114,40 +114,40 @@ | |||
342 | 114 | excerpt = saxutils.escape(node.get_excerpt(lines=1, | 114 | excerpt = saxutils.escape(node.get_excerpt(lines=1, |
343 | 115 | strip_tags=True, strip_subtasks=True)) | 115 | strip_tags=True, strip_subtasks=True)) |
344 | 116 | title += " <span size='small' color='%s'>%s</span>" \ | 116 | title += " <span size='small' color='%s'>%s</span>" \ |
346 | 117 | % (self.unactive_color, excerpt) | 117 | % (self.unactive_color, excerpt) |
347 | 118 | return title | 118 | return title |
349 | 119 | 119 | ||
350 | 120 | #task start date | 120 | #task start date |
352 | 121 | def task_sdate_column(self,node): | 121 | def task_sdate_column(self, node): |
353 | 122 | return node.get_start_date().to_readable_string() | 122 | return node.get_start_date().to_readable_string() |
356 | 123 | 123 | ||
357 | 124 | def task_duedate_column(self,node): | 124 | def task_duedate_column(self, node): |
358 | 125 | # We show the most constraining due date for task with no due dates. | 125 | # We show the most constraining due date for task with no due dates. |
359 | 126 | if node.get_due_date() == Date.no_date(): | 126 | if node.get_due_date() == Date.no_date(): |
360 | 127 | return node.get_due_date_constraint().to_readable_string() | 127 | return node.get_due_date_constraint().to_readable_string() |
361 | 128 | else: | 128 | else: |
362 | 129 | # Other tasks show their due date (which *can* be fuzzy) | 129 | # Other tasks show their due date (which *can* be fuzzy) |
363 | 130 | return node.get_due_date().to_readable_string() | 130 | return node.get_due_date().to_readable_string() |
366 | 131 | 131 | ||
367 | 132 | def task_cdate_column(self,node): | 132 | def task_cdate_column(self, node): |
368 | 133 | return node.get_closed_date().to_readable_string() | 133 | return node.get_closed_date().to_readable_string() |
386 | 134 | 134 | ||
387 | 135 | def start_date_sorting(self,task1,task2,order): | 135 | def start_date_sorting(self, task1, task2, order): |
388 | 136 | sort = self.__date_comp(task1,task2,'start',order) | 136 | sort = self.__date_comp(task1, task2, 'start', order) |
389 | 137 | return sort | 137 | return sort |
390 | 138 | 138 | ||
391 | 139 | def due_date_sorting(self,task1,task2,order): | 139 | def due_date_sorting(self, task1, task2, order): |
392 | 140 | sort = self.__date_comp(task1,task2,'due',order) | 140 | sort = self.__date_comp(task1, task2, 'due', order) |
393 | 141 | return sort | 141 | return sort |
394 | 142 | 142 | ||
395 | 143 | def closed_date_sorting(self,task1,task2,order): | 143 | def closed_date_sorting(self, task1, task2, order): |
396 | 144 | sort = self.__date_comp(task1,task2,'closed',order) | 144 | sort = self.__date_comp(task1, task2, 'closed', order) |
397 | 145 | return sort | 145 | return sort |
398 | 146 | 146 | ||
399 | 147 | def title_sorting(self,task1,task2,order): | 147 | def title_sorting(self, task1, task2, order): |
400 | 148 | return cmp(task1.get_title(),task2.get_title()) | 148 | return cmp(task1.get_title(), task2.get_title()) |
401 | 149 | 149 | ||
402 | 150 | def __date_comp(self,task1,task2,para,order): | 150 | def __date_comp(self, task1, task2, para, order): |
403 | 151 | '''This is a quite complex method to sort tasks by date, | 151 | '''This is a quite complex method to sort tasks by date, |
404 | 152 | handling fuzzy date and complex situation. | 152 | handling fuzzy date and complex situation. |
405 | 153 | Return -1 if nid1 is before nid2, return 1 otherwise | 153 | Return -1 if nid1 is before nid2, return 1 otherwise |
406 | @@ -168,39 +168,39 @@ | |||
407 | 168 | t2 = task2.get_closed_date() | 168 | t2 = task2.get_closed_date() |
408 | 169 | else: | 169 | else: |
409 | 170 | raise ValueError('invalid date comparison parameter: %s')%para | 170 | raise ValueError('invalid date comparison parameter: %s')%para |
411 | 171 | sort = cmp(t2,t1) | 171 | sort = cmp(t2, t1) |
412 | 172 | else: | 172 | else: |
413 | 173 | sort = 0 | 173 | sort = 0 |
415 | 174 | 174 | ||
416 | 175 | #local function | 175 | #local function |
417 | 176 | def reverse_if_descending(s): | 176 | def reverse_if_descending(s): |
419 | 177 | """Make a cmp() result relative to the top instead of following | 177 | """Make a cmp() result relative to the top instead of following |
420 | 178 | user-specified sort direction""" | 178 | user-specified sort direction""" |
421 | 179 | if order == gtk.SORT_ASCENDING: | 179 | if order == gtk.SORT_ASCENDING: |
422 | 180 | return s | 180 | return s |
423 | 181 | else: | 181 | else: |
424 | 182 | return -1*s | 182 | return -1*s |
425 | 183 | 183 | ||
427 | 184 | if sort == 0: # Group tasks with the same tag together for visual cleanness | 184 | if sort == 0: # Group tasks with the same tag together for visual cleanness |
428 | 185 | t1_tags = task1.get_tags_name() | 185 | t1_tags = task1.get_tags_name() |
429 | 186 | t1_tags.sort() | 186 | t1_tags.sort() |
430 | 187 | t2_tags = task2.get_tags_name() | 187 | t2_tags = task2.get_tags_name() |
431 | 188 | t2_tags.sort() | 188 | t2_tags.sort() |
432 | 189 | sort = reverse_if_descending(cmp(t1_tags, t2_tags)) | 189 | sort = reverse_if_descending(cmp(t1_tags, t2_tags)) |
434 | 190 | 190 | ||
435 | 191 | if sort == 0: # Break ties by sorting by title | 191 | if sort == 0: # Break ties by sorting by title |
436 | 192 | t1_title = task1.get_title() | 192 | t1_title = task1.get_title() |
437 | 193 | t2_title = task2.get_title() | 193 | t2_title = task2.get_title() |
438 | 194 | t1_title = locale.strxfrm(t1_title) | 194 | t1_title = locale.strxfrm(t1_title) |
439 | 195 | t2_title = locale.strxfrm(t2_title) | 195 | t2_title = locale.strxfrm(t2_title) |
440 | 196 | sort = reverse_if_descending(cmp(t1_title, t2_title)) | 196 | sort = reverse_if_descending(cmp(t1_title, t2_title)) |
442 | 197 | 197 | ||
443 | 198 | return sort | 198 | return sort |
445 | 199 | 199 | ||
446 | 200 | ############################# | 200 | ############################# |
447 | 201 | #Functions for tags columns | 201 | #Functions for tags columns |
448 | 202 | ############################# | 202 | ############################# |
450 | 203 | def tag_name(self,node): | 203 | def tag_name(self, node): |
451 | 204 | label = node.get_attribute("label") | 204 | label = node.get_attribute("label") |
452 | 205 | if label.startswith('@'): | 205 | if label.startswith('@'): |
453 | 206 | label = label[1:] | 206 | label = label[1:] |
454 | @@ -209,18 +209,18 @@ | |||
455 | 209 | return "<span color='%s'>%s</span>" %(self.unactive_color, label) | 209 | return "<span color='%s'>%s</span>" %(self.unactive_color, label) |
456 | 210 | else: | 210 | else: |
457 | 211 | return label | 211 | return label |
460 | 212 | 212 | ||
461 | 213 | def get_tag_count(self,node): | 213 | def get_tag_count(self, node): |
462 | 214 | if node.get_id() == 'search': | 214 | if node.get_id() == 'search': |
463 | 215 | return "" | 215 | return "" |
464 | 216 | else: | 216 | else: |
465 | 217 | toreturn = node.get_active_tasks_count() | 217 | toreturn = node.get_active_tasks_count() |
469 | 218 | return "<span color='%s'>%s</span>" %(self.unactive_color,toreturn) | 218 | return "<span color='%s'>%s</span>" %(self.unactive_color, toreturn) |
470 | 219 | 219 | ||
471 | 220 | def is_tag_separator_filter(self,tag): | 220 | def is_tag_separator_filter(self, tag): |
472 | 221 | return tag.get_attribute('special') == 'sep' | 221 | return tag.get_attribute('special') == 'sep' |
475 | 222 | 222 | ||
476 | 223 | def tag_sorting(self,t1,t2,order): | 223 | def tag_sorting(self, t1, t2, order): |
477 | 224 | t1_sp = t1.get_attribute("special") | 224 | t1_sp = t1.get_attribute("special") |
478 | 225 | t2_sp = t2.get_attribute("special") | 225 | t2_sp = t2.get_attribute("special") |
479 | 226 | t1_name = locale.strxfrm(t1.get_name()) | 226 | t1_name = locale.strxfrm(t1.get_name()) |
480 | @@ -235,8 +235,8 @@ | |||
481 | 235 | t1_order = t1.get_attribute("order") | 235 | t1_order = t1.get_attribute("order") |
482 | 236 | t2_order = t2.get_attribute("order") | 236 | t2_order = t2.get_attribute("order") |
483 | 237 | return cmp(t1_order, t2_order) | 237 | return cmp(t1_order, t2_order) |
486 | 238 | 238 | ||
487 | 239 | def ontag_task_dnd(self,source,target): | 239 | def ontag_task_dnd(self, source, target): |
488 | 240 | task = self.req.get_task(source) | 240 | task = self.req.get_task(source) |
489 | 241 | if target.startswith('@'): | 241 | if target.startswith('@'): |
490 | 242 | task.add_tag(target) | 242 | task.add_tag(target) |
491 | @@ -248,7 +248,7 @@ | |||
492 | 248 | ############################################ | 248 | ############################################ |
493 | 249 | ######## The Factory ####################### | 249 | ######## The Factory ####################### |
494 | 250 | ############################################ | 250 | ############################################ |
496 | 251 | def tags_treeview(self,tree): | 251 | def tags_treeview(self, tree): |
497 | 252 | desc = {} | 252 | desc = {} |
498 | 253 | 253 | ||
499 | 254 | #Tag id | 254 | #Tag id |
500 | @@ -260,32 +260,32 @@ | |||
501 | 260 | col['order'] = 0 | 260 | col['order'] = 0 |
502 | 261 | col['sorting_func'] = self.tag_sorting | 261 | col['sorting_func'] = self.tag_sorting |
503 | 262 | desc[col_name] = col | 262 | desc[col_name] = col |
505 | 263 | 263 | ||
506 | 264 | #Tags color | 264 | #Tags color |
507 | 265 | col_name = 'color' | 265 | col_name = 'color' |
508 | 266 | col = {} | 266 | col = {} |
509 | 267 | render_tags = CellRendererTags() | 267 | render_tags = CellRendererTags() |
510 | 268 | render_tags.set_property('ypad', 3) | 268 | render_tags.set_property('ypad', 3) |
511 | 269 | col['title'] = _("Tags") | 269 | col['title'] = _("Tags") |
514 | 270 | col['renderer'] = ['tag',render_tags] | 270 | col['renderer'] = ['tag', render_tags] |
515 | 271 | col['value'] = [gobject.TYPE_PYOBJECT,lambda node: node] | 271 | col['value'] = [gobject.TYPE_PYOBJECT, lambda node: node] |
516 | 272 | col['expandable'] = False | 272 | col['expandable'] = False |
517 | 273 | col['resizable'] = False | 273 | col['resizable'] = False |
518 | 274 | col['order'] = 1 | 274 | col['order'] = 1 |
519 | 275 | desc[col_name] = col | 275 | desc[col_name] = col |
521 | 276 | 276 | ||
522 | 277 | #Tag names | 277 | #Tag names |
523 | 278 | col_name = 'tagname' | 278 | col_name = 'tagname' |
524 | 279 | col = {} | 279 | col = {} |
525 | 280 | render_text = gtk.CellRendererText() | 280 | render_text = gtk.CellRendererText() |
526 | 281 | render_text.set_property('ypad', 3) | 281 | render_text.set_property('ypad', 3) |
529 | 282 | col['renderer'] = ['markup',render_text] | 282 | col['renderer'] = ['markup', render_text] |
530 | 283 | col['value'] = [str,self.tag_name] | 283 | col['value'] = [str, self.tag_name] |
531 | 284 | col['expandable'] = True | 284 | col['expandable'] = True |
532 | 285 | col['new_column'] = False | 285 | col['new_column'] = False |
533 | 286 | col['order'] = 2 | 286 | col['order'] = 2 |
534 | 287 | desc[col_name] = col | 287 | desc[col_name] = col |
536 | 288 | 288 | ||
537 | 289 | #Tag count | 289 | #Tag count |
538 | 290 | col_name = 'tagcount' | 290 | col_name = 'tagcount' |
539 | 291 | col = {} | 291 | col = {} |
540 | @@ -293,26 +293,26 @@ | |||
541 | 293 | render_text.set_property('xpad', 3) | 293 | render_text.set_property('xpad', 3) |
542 | 294 | render_text.set_property('ypad', 3) | 294 | render_text.set_property('ypad', 3) |
543 | 295 | render_text.set_property('xalign', 1.0) | 295 | render_text.set_property('xalign', 1.0) |
546 | 296 | col['renderer'] = ['markup',render_text] | 296 | col['renderer'] = ['markup', render_text] |
547 | 297 | col['value'] = [str,self.get_tag_count] | 297 | col['value'] = [str, self.get_tag_count] |
548 | 298 | col['expandable'] = False | 298 | col['expandable'] = False |
549 | 299 | col['new_column'] = False | 299 | col['new_column'] = False |
550 | 300 | col['order'] = 3 | 300 | col['order'] = 3 |
551 | 301 | desc[col_name] = col | 301 | desc[col_name] = col |
552 | 302 | 302 | ||
556 | 303 | return self.build_tag_treeview(tree,desc) | 303 | return self.build_tag_treeview(tree, desc) |
557 | 304 | 304 | ||
558 | 305 | def active_tasks_treeview(self,tree): | 305 | def active_tasks_treeview(self, tree): |
559 | 306 | #Build the title/label/tags columns | 306 | #Build the title/label/tags columns |
560 | 307 | desc = self.common_desc_for_tasks(tree) | 307 | desc = self.common_desc_for_tasks(tree) |
562 | 308 | 308 | ||
563 | 309 | # "startdate" column | 309 | # "startdate" column |
564 | 310 | col_name = 'startdate' | 310 | col_name = 'startdate' |
565 | 311 | col = {} | 311 | col = {} |
566 | 312 | col['title'] = _("Start date") | 312 | col['title'] = _("Start date") |
567 | 313 | col['expandable'] = False | 313 | col['expandable'] = False |
568 | 314 | col['resizable'] = False | 314 | col['resizable'] = False |
570 | 315 | col['value'] = [str,self.task_sdate_column] | 315 | col['value'] = [str, self.task_sdate_column] |
571 | 316 | col['order'] = 3 | 316 | col['order'] = 3 |
572 | 317 | col['sorting_func'] = self.start_date_sorting | 317 | col['sorting_func'] = self.start_date_sorting |
573 | 318 | desc[col_name] = col | 318 | desc[col_name] = col |
574 | @@ -323,40 +323,40 @@ | |||
575 | 323 | col['title'] = _("Due") | 323 | col['title'] = _("Due") |
576 | 324 | col['expandable'] = False | 324 | col['expandable'] = False |
577 | 325 | col['resizable'] = False | 325 | col['resizable'] = False |
579 | 326 | col['value'] = [str,self.task_duedate_column] | 326 | col['value'] = [str, self.task_duedate_column] |
580 | 327 | col['order'] = 4 | 327 | col['order'] = 4 |
581 | 328 | col['sorting_func'] = self.due_date_sorting | 328 | col['sorting_func'] = self.due_date_sorting |
582 | 329 | desc[col_name] = col | 329 | desc[col_name] = col |
583 | 330 | 330 | ||
584 | 331 | #Returning the treeview | 331 | #Returning the treeview |
586 | 332 | treeview = self.build_task_treeview(tree,desc) | 332 | treeview = self.build_task_treeview(tree, desc) |
587 | 333 | treeview.set_sort_column('duedate') | 333 | treeview.set_sort_column('duedate') |
588 | 334 | return treeview | 334 | return treeview |
591 | 335 | 335 | ||
592 | 336 | def closed_tasks_treeview(self,tree): | 336 | def closed_tasks_treeview(self, tree): |
593 | 337 | #Build the title/label/tags columns | 337 | #Build the title/label/tags columns |
594 | 338 | desc = self.common_desc_for_tasks(tree) | 338 | desc = self.common_desc_for_tasks(tree) |
596 | 339 | 339 | ||
597 | 340 | # "startdate" column | 340 | # "startdate" column |
598 | 341 | col_name = 'closeddate' | 341 | col_name = 'closeddate' |
599 | 342 | col = {} | 342 | col = {} |
600 | 343 | col['title'] = _("Closed date") | 343 | col['title'] = _("Closed date") |
601 | 344 | col['expandable'] = False | 344 | col['expandable'] = False |
602 | 345 | col['resizable'] = False | 345 | col['resizable'] = False |
604 | 346 | col['value'] = [str,self.task_cdate_column] | 346 | col['value'] = [str, self.task_cdate_column] |
605 | 347 | col['order'] = 3 | 347 | col['order'] = 3 |
606 | 348 | col['sorting_func'] = self.closed_date_sorting | 348 | col['sorting_func'] = self.closed_date_sorting |
607 | 349 | desc[col_name] = col | 349 | desc[col_name] = col |
608 | 350 | 350 | ||
609 | 351 | #Returning the treeview | 351 | #Returning the treeview |
611 | 352 | treeview = self.build_task_treeview(tree,desc) | 352 | treeview = self.build_task_treeview(tree, desc) |
612 | 353 | treeview.set_sort_column('closeddate') | 353 | treeview.set_sort_column('closeddate') |
613 | 354 | return treeview | 354 | return treeview |
616 | 355 | 355 | ||
617 | 356 | 356 | ||
618 | 357 | #This build the first tag/title columns, common | 357 | #This build the first tag/title columns, common |
619 | 358 | #to both active and closed tasks treeview | 358 | #to both active and closed tasks treeview |
621 | 359 | def common_desc_for_tasks(self,tree): | 359 | def common_desc_for_tasks(self, tree): |
622 | 360 | desc = {} | 360 | desc = {} |
623 | 361 | 361 | ||
624 | 362 | #invisible 'task_id' column | 362 | #invisible 'task_id' column |
625 | @@ -380,20 +380,20 @@ | |||
626 | 380 | col = {} | 380 | col = {} |
627 | 381 | render_text = gtk.CellRendererText() | 381 | render_text = gtk.CellRendererText() |
628 | 382 | render_text.set_property("ellipsize", pango.ELLIPSIZE_END) | 382 | render_text.set_property("ellipsize", pango.ELLIPSIZE_END) |
631 | 383 | col['renderer'] = ['markup',render_text] | 383 | col['renderer'] = ['markup', render_text] |
632 | 384 | col['value'] = [str,self.task_title_column] | 384 | col['value'] = [str, self.task_title_column] |
633 | 385 | col['visible'] = False | 385 | col['visible'] = False |
634 | 386 | col['order'] = 0 | 386 | col['order'] = 0 |
635 | 387 | col['sorting_func'] = self.title_sorting | 387 | col['sorting_func'] = self.title_sorting |
636 | 388 | desc[col_name] = col | 388 | desc[col_name] = col |
638 | 389 | 389 | ||
639 | 390 | # "tags" column (no title) | 390 | # "tags" column (no title) |
640 | 391 | col_name = 'tags' | 391 | col_name = 'tags' |
641 | 392 | col = {} | 392 | col = {} |
642 | 393 | render_tags = CellRendererTags() | 393 | render_tags = CellRendererTags() |
643 | 394 | render_tags.set_property('xalign', 0.0) | 394 | render_tags.set_property('xalign', 0.0) |
646 | 395 | col['renderer'] = ['tag_list',render_tags] | 395 | col['renderer'] = ['tag_list', render_tags] |
647 | 396 | col['value'] = [gobject.TYPE_PYOBJECT,self.task_tags_column] | 396 | col['value'] = [gobject.TYPE_PYOBJECT, self.task_tags_column] |
648 | 397 | col['expandable'] = False | 397 | col['expandable'] = False |
649 | 398 | col['resizable'] = False | 398 | col['resizable'] = False |
650 | 399 | col['order'] = 1 | 399 | col['order'] = 1 |
651 | @@ -405,18 +405,18 @@ | |||
652 | 405 | col['title'] = _("Title") | 405 | col['title'] = _("Title") |
653 | 406 | render_text = gtk.CellRendererText() | 406 | render_text = gtk.CellRendererText() |
654 | 407 | render_text.set_property("ellipsize", pango.ELLIPSIZE_END) | 407 | render_text.set_property("ellipsize", pango.ELLIPSIZE_END) |
657 | 408 | col['renderer'] = ['markup',render_text] | 408 | col['renderer'] = ['markup', render_text] |
658 | 409 | col['value'] = [str,self.task_label_column] | 409 | col['value'] = [str, self.task_label_column] |
659 | 410 | col['expandable'] = True | 410 | col['expandable'] = True |
660 | 411 | col['resizable'] = True | 411 | col['resizable'] = True |
661 | 412 | col['sorting'] = 'title' | 412 | col['sorting'] = 'title' |
662 | 413 | col['order'] = 2 | 413 | col['order'] = 2 |
663 | 414 | desc[col_name] = col | 414 | desc[col_name] = col |
664 | 415 | return desc | 415 | return desc |
669 | 416 | 416 | ||
670 | 417 | 417 | ||
671 | 418 | def build_task_treeview(self,tree,desc): | 418 | def build_task_treeview(self, tree, desc): |
672 | 419 | treeview = TreeView(tree,desc) | 419 | treeview = TreeView(tree, desc) |
673 | 420 | #Now that the treeview is done, we can polish | 420 | #Now that the treeview is done, we can polish |
674 | 421 | treeview.set_main_search_column('label') | 421 | treeview.set_main_search_column('label') |
675 | 422 | treeview.set_expander_column('label') | 422 | treeview.set_expander_column('label') |
676 | @@ -431,19 +431,19 @@ | |||
677 | 431 | self.unactive_color = \ | 431 | self.unactive_color = \ |
678 | 432 | treeview.style.text[gtk.STATE_INSENSITIVE].to_string() | 432 | treeview.style.text[gtk.STATE_INSENSITIVE].to_string() |
679 | 433 | return treeview | 433 | return treeview |
683 | 434 | 434 | ||
684 | 435 | def build_tag_treeview(self,tree,desc): | 435 | def build_tag_treeview(self, tree, desc): |
685 | 436 | treeview = TreeView(tree,desc) | 436 | treeview = TreeView(tree, desc) |
686 | 437 | # Global treeview properties | 437 | # Global treeview properties |
687 | 438 | treeview.set_property("enable-tree-lines", False) | 438 | treeview.set_property("enable-tree-lines", False) |
688 | 439 | treeview.set_rules_hint(False) | 439 | treeview.set_rules_hint(False) |
689 | 440 | treeview.set_row_separator_func(self.is_tag_separator_filter) | 440 | treeview.set_row_separator_func(self.is_tag_separator_filter) |
690 | 441 | treeview.set_headers_visible(False) | 441 | treeview.set_headers_visible(False) |
691 | 442 | treeview.set_dnd_name('gtg/tag-iter-str') | 442 | treeview.set_dnd_name('gtg/tag-iter-str') |
693 | 443 | treeview.set_dnd_external('gtg/task-iter-str',self.ontag_task_dnd) | 443 | treeview.set_dnd_external('gtg/task-iter-str', self.ontag_task_dnd) |
694 | 444 | #Updating the unactive color (same for everyone) | 444 | #Updating the unactive color (same for everyone) |
695 | 445 | self.unactive_color = \ | 445 | self.unactive_color = \ |
696 | 446 | treeview.style.text[gtk.STATE_INSENSITIVE].to_string() | 446 | treeview.style.text[gtk.STATE_INSENSITIVE].to_string() |
697 | 447 | treeview.set_sort_column('tag_id') | 447 | treeview.set_sort_column('tag_id') |
698 | 448 | self.tags_view = treeview | 448 | self.tags_view = treeview |
700 | 449 | return treeview | 449 | return treeview |
701 | 450 | 450 | ||
702 | === modified file 'GTG/gtk/crashhandler.py' | |||
703 | --- GTG/gtk/crashhandler.py 2012-07-23 12:04:01 +0000 | |||
704 | +++ GTG/gtk/crashhandler.py 2012-11-25 21:29:25 +0000 | |||
705 | @@ -332,7 +332,7 @@ | |||
706 | 332 | yield | 332 | yield |
707 | 333 | 333 | ||
708 | 334 | initialize(app_name = "Getting Things GNOME!", | 334 | initialize(app_name = "Getting Things GNOME!", |
710 | 335 | message = "GTG" + info.VERSION + | 335 | message = "GTG" + info.VERSION + |
711 | 336 | _(" has crashed. Please report the bug on <a href=\"" | 336 | _(" has crashed. Please report the bug on <a href=\"" |
712 | 337 | "http://bugs.edge.launchpad.net/gtg\">our Launchpad page</a>." | 337 | "http://bugs.edge.launchpad.net/gtg\">our Launchpad page</a>." |
713 | 338 | " If you have Apport installed, it will be started for you."), | 338 | " If you have Apport installed, it will be started for you."), |
714 | 339 | 339 | ||
715 | === modified file 'GTG/gtk/delete_dialog.py' | |||
716 | --- GTG/gtk/delete_dialog.py 2012-05-23 08:55:31 +0000 | |||
717 | +++ GTG/gtk/delete_dialog.py 2012-11-25 21:29:25 +0000 | |||
718 | @@ -24,18 +24,19 @@ | |||
719 | 24 | 24 | ||
720 | 25 | 25 | ||
721 | 26 | class DeletionUI(): | 26 | class DeletionUI(): |
723 | 27 | 27 | ||
724 | 28 | MAXIMUM_TIDS_TO_SHOW = 5 | 28 | MAXIMUM_TIDS_TO_SHOW = 5 |
725 | 29 | |||
726 | 29 | def __init__(self, req): | 30 | def __init__(self, req): |
727 | 30 | self.req = req | 31 | self.req = req |
728 | 31 | self.tids_todelete = [] | 32 | self.tids_todelete = [] |
729 | 32 | # Tags which must be updated | 33 | # Tags which must be updated |
730 | 33 | self.update_tags = [] | 34 | self.update_tags = [] |
731 | 34 | # Load window tree | 35 | # Load window tree |
733 | 35 | self.builder = gtk.Builder() | 36 | self.builder = gtk.Builder() |
734 | 36 | self.builder.add_from_file(ViewConfig.DELETE_GLADE_FILE) | 37 | self.builder.add_from_file(ViewConfig.DELETE_GLADE_FILE) |
737 | 37 | signals = { "on_delete_confirm": self.on_delete_confirm, | 38 | signals = {"on_delete_confirm": self.on_delete_confirm, |
738 | 38 | "on_delete_cancel": lambda x: x.hide,} | 39 | "on_delete_cancel": lambda x: x.hide, } |
739 | 39 | self.builder.connect_signals(signals) | 40 | self.builder.connect_signals(signals) |
740 | 40 | 41 | ||
741 | 41 | def on_delete_confirm(self, widget): | 42 | def on_delete_confirm(self, widget): |
742 | @@ -43,7 +44,7 @@ | |||
743 | 43 | otherwise, we will look which tid is selected""" | 44 | otherwise, we will look which tid is selected""" |
744 | 44 | for tid in self.tids_todelete: | 45 | for tid in self.tids_todelete: |
745 | 45 | if self.req.has_task(tid): | 46 | if self.req.has_task(tid): |
747 | 46 | self.req.delete_task(tid,recursive=True) | 47 | self.req.delete_task(tid, recursive=True) |
748 | 47 | self.tids_todelete = [] | 48 | self.tids_todelete = [] |
749 | 48 | 49 | ||
750 | 49 | # Update tags | 50 | # Update tags |
751 | @@ -60,10 +61,11 @@ | |||
752 | 60 | tasklist=[] | 61 | tasklist=[] |
753 | 61 | self.update_tags = [] | 62 | self.update_tags = [] |
754 | 62 | for tid in self.tids_todelete: | 63 | for tid in self.tids_todelete: |
755 | 64 | |||
756 | 63 | def recursive_list_tasks(task_list, root): | 65 | def recursive_list_tasks(task_list, root): |
758 | 64 | """Populate a list of all the subtasks and | 66 | """Populate a list of all the subtasks and |
759 | 65 | their children, recursively. | 67 | their children, recursively. |
761 | 66 | 68 | ||
762 | 67 | Also collect the list of affected tags | 69 | Also collect the list of affected tags |
763 | 68 | which should be refreshed""" | 70 | which should be refreshed""" |
764 | 69 | if root not in task_list: | 71 | if root not in task_list: |
765 | @@ -78,7 +80,7 @@ | |||
766 | 78 | task = self.req.get_task(tid) | 80 | task = self.req.get_task(tid) |
767 | 79 | recursive_list_tasks(tasklist, task) | 81 | recursive_list_tasks(tasklist, task) |
768 | 80 | 82 | ||
770 | 81 | # We fill the text and the buttons' labels according to the number | 83 | # We fill the text and the buttons' labels according to the number |
771 | 82 | # of tasks to delete | 84 | # of tasks to delete |
772 | 83 | label = self.builder.get_object("label1") | 85 | label = self.builder.get_object("label1") |
773 | 84 | label_text = label.get_text() | 86 | label_text = label.get_text() |
774 | @@ -104,7 +106,7 @@ | |||
775 | 104 | "Permanently remove tasks", | 106 | "Permanently remove tasks", |
776 | 105 | singular)) | 107 | singular)) |
777 | 106 | label_text = label_text[0:label_text.find(":") + 1] | 108 | label_text = label_text[0:label_text.find(":") + 1] |
779 | 107 | 109 | ||
780 | 108 | #we don't want to end with just one task that doesn't fit the | 110 | #we don't want to end with just one task that doesn't fit the |
781 | 109 | # screen and a line saying "And one more task", so we go a | 111 | # screen and a line saying "And one more task", so we go a |
782 | 110 | # little over our limit | 112 | # little over our limit |
783 | @@ -123,7 +125,7 @@ | |||
784 | 123 | cancel_button = self.builder.get_object("cancel") | 125 | cancel_button = self.builder.get_object("cancel") |
785 | 124 | cancel_button.grab_focus() | 126 | cancel_button.grab_focus() |
786 | 125 | if delete_dialog.run() != 1: | 127 | if delete_dialog.run() != 1: |
788 | 126 | tasklist = [] | 128 | tasklist = [] |
789 | 127 | delete_dialog.hide() | 129 | delete_dialog.hide() |
790 | 128 | return tasklist | 130 | return tasklist |
791 | 129 | else: | 131 | else: |
792 | 130 | 132 | ||
793 | === modified file 'GTG/gtk/editor/__init__.py' | |||
794 | --- GTG/gtk/editor/__init__.py 2012-05-23 08:55:31 +0000 | |||
795 | +++ GTG/gtk/editor/__init__.py 2012-11-25 21:29:25 +0000 | |||
796 | @@ -21,12 +21,12 @@ | |||
797 | 21 | """ | 21 | """ |
798 | 22 | import os | 22 | import os |
799 | 23 | 23 | ||
801 | 24 | from GTG import _ | 24 | from GTG import _ |
802 | 25 | 25 | ||
803 | 26 | 26 | ||
804 | 27 | class GnomeConfig: | 27 | class GnomeConfig: |
805 | 28 | current_rep = os.path.dirname(os.path.abspath(__file__)) | 28 | current_rep = os.path.dirname(os.path.abspath(__file__)) |
807 | 29 | GLADE_FILE = os.path.join(current_rep, "taskeditor.glade") | 29 | GLADE_FILE = os.path.join(current_rep, "taskeditor.glade") |
808 | 30 | 30 | ||
809 | 31 | MARK_DONE = _("Mark as Done") | 31 | MARK_DONE = _("Mark as Done") |
810 | 32 | MARK_UNDONE = _("Mark as not Done") | 32 | MARK_UNDONE = _("Mark as not Done") |
811 | 33 | 33 | ||
812 | === modified file 'GTG/gtk/editor/editor.py' | |||
813 | --- GTG/gtk/editor/editor.py 2012-08-26 16:41:47 +0000 | |||
814 | +++ GTG/gtk/editor/editor.py 2012-11-25 21:29:25 +0000 | |||
815 | @@ -28,21 +28,22 @@ | |||
816 | 28 | import pango | 28 | import pango |
817 | 29 | import gtk | 29 | import gtk |
818 | 30 | 30 | ||
821 | 31 | from GTG import _, ngettext | 31 | from GTG import _, ngettext |
822 | 32 | from GTG.gtk.editor import GnomeConfig | 32 | from GTG.gtk.editor import GnomeConfig |
823 | 33 | from GTG.gtk.editor.taskview import TaskView | 33 | from GTG.gtk.editor.taskview import TaskView |
824 | 34 | from GTG.core.plugins.engine import PluginEngine | 34 | from GTG.core.plugins.engine import PluginEngine |
828 | 35 | from GTG.core.plugins.api import PluginAPI | 35 | from GTG.core.plugins.api import PluginAPI |
829 | 36 | from GTG.core.task import Task | 36 | from GTG.core.task import Task |
830 | 37 | from GTG.tools.dates import Date | 37 | from GTG.tools.dates import Date |
831 | 38 | from GTG.gtk.editor.calendar import GTGCalendar | 38 | from GTG.gtk.editor.calendar import GTGCalendar |
832 | 39 | 39 | ||
833 | 40 | |||
834 | 40 | class TaskEditor: | 41 | class TaskEditor: |
835 | 41 | 42 | ||
840 | 42 | def __init__(self, | 43 | def __init__(self, |
841 | 43 | requester, | 44 | requester, |
842 | 44 | vmanager, | 45 | vmanager, |
843 | 45 | task, | 46 | task, |
844 | 46 | taskconfig = None, | 47 | taskconfig = None, |
845 | 47 | thisisnew = False, | 48 | thisisnew = False, |
846 | 48 | clipboard = None): | 49 | clipboard = None): |
847 | @@ -91,13 +92,13 @@ | |||
848 | 91 | "on_move": self.on_move, | 92 | "on_move": self.on_move, |
849 | 92 | } | 93 | } |
850 | 93 | self.builder.connect_signals(dic) | 94 | self.builder.connect_signals(dic) |
852 | 94 | self.window = self.builder.get_object("TaskEditor") | 95 | self.window = self.builder.get_object("TaskEditor") |
853 | 95 | #Removing the Normal textview to replace it by our own | 96 | #Removing the Normal textview to replace it by our own |
854 | 96 | #So don't try to change anything with glade, this is a home-made widget | 97 | #So don't try to change anything with glade, this is a home-made widget |
855 | 97 | textview = self.builder.get_object("textview") | 98 | textview = self.builder.get_object("textview") |
856 | 98 | scrolled = self.builder.get_object("scrolledtask") | 99 | scrolled = self.builder.get_object("scrolledtask") |
857 | 99 | scrolled.remove(textview) | 100 | scrolled.remove(textview) |
859 | 100 | self.textview = TaskView(self.req, self.clipboard) | 101 | self.textview = TaskView(self.req, self.clipboard) |
860 | 101 | self.textview.show() | 102 | self.textview.show() |
861 | 102 | self.textview.set_subtask_callback(self.new_subtask) | 103 | self.textview.set_subtask_callback(self.new_subtask) |
862 | 103 | self.textview.open_task_callback(self.vmanager.open_task) | 104 | self.textview.open_task_callback(self.vmanager.open_task) |
863 | @@ -106,13 +107,13 @@ | |||
864 | 106 | scrolled.add(self.textview) | 107 | scrolled.add(self.textview) |
865 | 107 | conf_font_value = self.browser_config.get("font_name") | 108 | conf_font_value = self.browser_config.get("font_name") |
866 | 108 | if conf_font_value!= "": | 109 | if conf_font_value!= "": |
868 | 109 | self.textview.modify_font(pango.FontDescription(conf_font_value)) | 110 | self.textview.modify_font(pango.FontDescription(conf_font_value)) |
869 | 110 | #Voila! it's done | 111 | #Voila! it's done |
871 | 111 | self.calendar = GTGCalendar(self.builder) | 112 | self.calendar = GTGCalendar(self.builder) |
872 | 112 | self.duedate_widget = self.builder.get_object("duedate_entry") | 113 | self.duedate_widget = self.builder.get_object("duedate_entry") |
873 | 113 | self.startdate_widget = self.builder.get_object("startdate_entry") | 114 | self.startdate_widget = self.builder.get_object("startdate_entry") |
874 | 114 | self.closeddate_widget = self.builder.get_object("closeddate_entry") | 115 | self.closeddate_widget = self.builder.get_object("closeddate_entry") |
876 | 115 | self.dayleft_label = self.builder.get_object("dayleft") | 116 | self.dayleft_label = self.builder.get_object("dayleft") |
877 | 116 | self.tasksidebar = self.builder.get_object("tasksidebar") | 117 | self.tasksidebar = self.builder.get_object("tasksidebar") |
878 | 117 | # Define accelerator keys | 118 | # Define accelerator keys |
879 | 118 | self.init_accelerators() | 119 | self.init_accelerators() |
880 | @@ -169,14 +170,15 @@ | |||
881 | 169 | if tid in self.config: | 170 | if tid in self.config: |
882 | 170 | if "position" in self.config[tid]: | 171 | if "position" in self.config[tid]: |
883 | 171 | pos = self.config[tid]["position"] | 172 | pos = self.config[tid]["position"] |
886 | 172 | self.move(pos[0],pos[1]) | 173 | self.move(pos[0], pos[1]) |
887 | 173 | #print "restoring position %s %s" %(pos[0],pos[1]) | 174 | #print "restoring position %s %s" %(pos[0], pos[1]) |
888 | 174 | if "size" in self.config[tid]: | 175 | if "size" in self.config[tid]: |
889 | 175 | size = self.config[tid]["size"] | 176 | size = self.config[tid]["size"] |
890 | 176 | #print "size %s - %s" %(str(size[0]), str(size[1])) | 177 | #print "size %s - %s" %(str(size[0]), str(size[1])) |
892 | 177 | #this eval(str()) is a ugly (!) hack to accept both int and str | 178 | #this eval(str()) is a ugly (!) hack to accept both int and |
893 | 179 | #str | ||
894 | 178 | #FIXME: Fix this! | 180 | #FIXME: Fix this! |
896 | 179 | self.window.resize(eval(str(size[0])),eval(str(size[1]))) | 181 | self.window.resize(eval(str(size[0])), eval(str(size[1]))) |
897 | 180 | 182 | ||
898 | 181 | self.textview.set_editable(True) | 183 | self.textview.set_editable(True) |
899 | 182 | self.window.show() | 184 | self.window.show() |
900 | @@ -201,18 +203,21 @@ | |||
901 | 201 | 203 | ||
902 | 202 | # Ctrl-Shift-N creates a new subtask | 204 | # Ctrl-Shift-N creates a new subtask |
903 | 203 | insert_subtask = self.builder.get_object("insert_subtask") | 205 | insert_subtask = self.builder.get_object("insert_subtask") |
906 | 204 | key, mod = gtk.accelerator_parse("<Control><Shift>n") | 206 | key, mod = gtk.accelerator_parse("<Control><Shift>n") |
907 | 205 | insert_subtask.add_accelerator('clicked', agr, key, mod, gtk.ACCEL_VISIBLE) | 207 | insert_subtask.add_accelerator('clicked', agr, key, mod, |
908 | 208 | gtk.ACCEL_VISIBLE) | ||
909 | 206 | 209 | ||
910 | 207 | # Ctrl-D marks task as done | 210 | # Ctrl-D marks task as done |
911 | 208 | mark_as_done_editor = self.builder.get_object('mark_as_done_editor') | 211 | mark_as_done_editor = self.builder.get_object('mark_as_done_editor') |
912 | 209 | key, mod = gtk.accelerator_parse('<Control>d') | 212 | key, mod = gtk.accelerator_parse('<Control>d') |
914 | 210 | mark_as_done_editor.add_accelerator('clicked', agr, key, mod, gtk.ACCEL_VISIBLE) | 213 | mark_as_done_editor.add_accelerator('clicked', agr, key, mod, |
915 | 214 | gtk.ACCEL_VISIBLE) | ||
916 | 211 | 215 | ||
917 | 212 | # Ctrl-I marks task as dismissed | 216 | # Ctrl-I marks task as dismissed |
918 | 213 | dismiss_editor = self.builder.get_object('dismiss_editor') | 217 | dismiss_editor = self.builder.get_object('dismiss_editor') |
919 | 214 | key, mod = gtk.accelerator_parse('<Control>i') | 218 | key, mod = gtk.accelerator_parse('<Control>i') |
921 | 215 | dismiss_editor.add_accelerator('clicked', agr, key, mod, gtk.ACCEL_VISIBLE) | 219 | dismiss_editor.add_accelerator('clicked', agr, key, mod, |
922 | 220 | gtk.ACCEL_VISIBLE) | ||
923 | 216 | 221 | ||
924 | 217 | #Can be called at any time to reflect the status of the Task | 222 | #Can be called at any time to reflect the status of the Task |
925 | 218 | #Refresh should never interfere with the TaskView. | 223 | #Refresh should never interfere with the TaskView. |
926 | @@ -224,34 +229,37 @@ | |||
927 | 224 | if self.window == None: | 229 | if self.window == None: |
928 | 225 | return | 230 | return |
929 | 226 | to_save = False | 231 | to_save = False |
931 | 227 | #title of the window | 232 | #title of the window |
932 | 228 | if title: | 233 | if title: |
933 | 229 | self.window.set_title(title) | 234 | self.window.set_title(title) |
934 | 230 | to_save = True | 235 | to_save = True |
935 | 231 | else: | 236 | else: |
936 | 232 | self.window.set_title(self.task.get_title()) | 237 | self.window.set_title(self.task.get_title()) |
937 | 233 | 238 | ||
939 | 234 | status = self.task.get_status() | 239 | status = self.task.get_status() |
940 | 235 | if status == Task.STA_DISMISSED: | 240 | if status == Task.STA_DISMISSED: |
941 | 236 | self.donebutton.set_label(GnomeConfig.MARK_DONE) | 241 | self.donebutton.set_label(GnomeConfig.MARK_DONE) |
942 | 237 | self.donebutton.set_tooltip_text(GnomeConfig.MARK_DONE_TOOLTIP) | 242 | self.donebutton.set_tooltip_text(GnomeConfig.MARK_DONE_TOOLTIP) |
943 | 238 | self.donebutton.set_icon_name("gtg-task-done") | 243 | self.donebutton.set_icon_name("gtg-task-done") |
944 | 239 | self.dismissbutton.set_label(GnomeConfig.MARK_UNDISMISS) | 244 | self.dismissbutton.set_label(GnomeConfig.MARK_UNDISMISS) |
946 | 240 | self.dismissbutton.set_tooltip_text(GnomeConfig.MARK_UNDISMISS_TOOLTIP) | 245 | self.dismissbutton.set_tooltip_text( |
947 | 246 | nomeConfig.MARK_UNDISMISS_TOOLTIP) | ||
948 | 241 | self.dismissbutton.set_icon_name("gtg-task-undismiss") | 247 | self.dismissbutton.set_icon_name("gtg-task-undismiss") |
949 | 242 | elif status == Task.STA_DONE: | 248 | elif status == Task.STA_DONE: |
950 | 243 | self.donebutton.set_label(GnomeConfig.MARK_UNDONE) | 249 | self.donebutton.set_label(GnomeConfig.MARK_UNDONE) |
951 | 244 | self.donebutton.set_tooltip_text(GnomeConfig.MARK_UNDONE_TOOLTIP) | 250 | self.donebutton.set_tooltip_text(GnomeConfig.MARK_UNDONE_TOOLTIP) |
952 | 245 | self.donebutton.set_icon_name("gtg-task-undone") | 251 | self.donebutton.set_icon_name("gtg-task-undone") |
953 | 246 | self.dismissbutton.set_label(GnomeConfig.MARK_DISMISS) | 252 | self.dismissbutton.set_label(GnomeConfig.MARK_DISMISS) |
955 | 247 | self.dismissbutton.set_tooltip_text(GnomeConfig.MARK_DISMISS_TOOLTIP) | 253 | self.dismissbutton.set_tooltip_text( |
956 | 254 | GnomeConfig.MARK_DISMISS_TOOLTIP) | ||
957 | 248 | self.dismissbutton.set_icon_name("gtg-task-dismiss") | 255 | self.dismissbutton.set_icon_name("gtg-task-dismiss") |
958 | 249 | else: | 256 | else: |
959 | 250 | self.donebutton.set_label(GnomeConfig.MARK_DONE) | 257 | self.donebutton.set_label(GnomeConfig.MARK_DONE) |
960 | 251 | self.donebutton.set_tooltip_text(GnomeConfig.MARK_DONE_TOOLTIP) | 258 | self.donebutton.set_tooltip_text(GnomeConfig.MARK_DONE_TOOLTIP) |
961 | 252 | self.donebutton.set_icon_name("gtg-task-done") | 259 | self.donebutton.set_icon_name("gtg-task-done") |
962 | 253 | self.dismissbutton.set_label(GnomeConfig.MARK_DISMISS) | 260 | self.dismissbutton.set_label(GnomeConfig.MARK_DISMISS) |
964 | 254 | self.dismissbutton.set_tooltip_text(GnomeConfig.MARK_DISMISS_TOOLTIP) | 261 | self.dismissbutton.set_tooltip_text( |
965 | 262 | GnomeConfig.MARK_DISMISS_TOOLTIP) | ||
966 | 255 | self.dismissbutton.set_icon_name("gtg-task-dismiss") | 263 | self.dismissbutton.set_icon_name("gtg-task-dismiss") |
967 | 256 | self.donebutton.show() | 264 | self.donebutton.show() |
968 | 257 | self.tasksidebar.show() | 265 | self.tasksidebar.show() |
969 | @@ -265,7 +273,7 @@ | |||
970 | 265 | else: | 273 | else: |
971 | 266 | self.builder.get_object("label4").hide() | 274 | self.builder.get_object("label4").hide() |
972 | 267 | self.builder.get_object("hbox4").hide() | 275 | self.builder.get_object("hbox4").hide() |
974 | 268 | self.builder.get_object("label2").show() | 276 | self.builder.get_object("label2").show() |
975 | 269 | self.builder.get_object("hbox1").show() | 277 | self.builder.get_object("hbox1").show() |
976 | 270 | 278 | ||
977 | 271 | #refreshing the start date field | 279 | #refreshing the start date field |
978 | @@ -277,7 +285,7 @@ | |||
979 | 277 | update_date = True | 285 | update_date = True |
980 | 278 | 286 | ||
981 | 279 | if update_date: | 287 | if update_date: |
983 | 280 | self.startdate_widget.set_text(str(startdate)) | 288 | self.startdate_widget.set_text(str(startdate)) |
984 | 281 | 289 | ||
985 | 282 | #refreshing the due date field | 290 | #refreshing the due date field |
986 | 283 | duedate = self.task.get_due_date() | 291 | duedate = self.task.get_due_date() |
987 | @@ -297,8 +305,8 @@ | |||
988 | 297 | self.closeddate_widget.set_text(str(closeddate)) | 305 | self.closeddate_widget.set_text(str(closeddate)) |
989 | 298 | 306 | ||
990 | 299 | #refreshing the day left label | 307 | #refreshing the day left label |
993 | 300 | #If the task is marked as done, we display the delay between the | 308 | #If the task is marked as done, we display the delay between the |
994 | 301 | #due date and the actual closing date. If the task isn't marked | 309 | #due date and the actual closing date. If the task isn't marked |
995 | 302 | #as done, we display the number of days left. | 310 | #as done, we display the number of days left. |
996 | 303 | if status in [Task.STA_DISMISSED, Task.STA_DONE]: | 311 | if status in [Task.STA_DISMISSED, Task.STA_DONE]: |
997 | 304 | delay = self.task.get_days_late() | 312 | delay = self.task.get_days_late() |
998 | @@ -307,22 +315,27 @@ | |||
999 | 307 | elif delay == 0: | 315 | elif delay == 0: |
1000 | 308 | txt = "Completed on time" | 316 | txt = "Completed on time" |
1001 | 309 | elif delay >= 1: | 317 | elif delay >= 1: |
1003 | 310 | txt = ngettext("Completed %(days)d day late", "Completed %(days)d days late", delay) % {'days': delay} | 318 | txt = ngettext("Completed %(days)d day late", |
1004 | 319 | "Completed %(days)d days late", delay) % {'days': delay} | ||
1005 | 311 | elif delay <= -1: | 320 | elif delay <= -1: |
1006 | 312 | abs_delay = abs(delay) | 321 | abs_delay = abs(delay) |
1008 | 313 | txt = ngettext("Completed %(days)d day early", "Completed %(days)d days early", abs_delay) % {'days': abs_delay} | 322 | txt = ngettext("Completed %(days)d day early", |
1009 | 323 | "Completed %(days)d days early", abs_delay) % \ | ||
1010 | 324 | {'days': abs_delay} | ||
1011 | 314 | else: | 325 | else: |
1012 | 315 | due_date = self.task.get_due_date() | 326 | due_date = self.task.get_due_date() |
1013 | 316 | result = due_date.days_left() | 327 | result = due_date.days_left() |
1014 | 317 | if due_date.is_fuzzy(): | 328 | if due_date.is_fuzzy(): |
1015 | 318 | txt = "" | 329 | txt = "" |
1016 | 319 | elif result > 0: | 330 | elif result > 0: |
1018 | 320 | txt = ngettext("Due tomorrow!", "%(days)d days left", result) % {'days': result} | 331 | txt = ngettext("Due tomorrow!", "%(days)d days left", result) \ |
1019 | 332 | % {'days': result} | ||
1020 | 321 | elif result == 0: | 333 | elif result == 0: |
1021 | 322 | txt = _("Due today!") | 334 | txt = _("Due today!") |
1022 | 323 | elif result < 0: | 335 | elif result < 0: |
1023 | 324 | abs_result = abs(result) | 336 | abs_result = abs(result) |
1025 | 325 | txt = ngettext("Due yesterday!", "Was %(days)d days ago", abs_result) % {'days': abs_result} | 337 | txt = ngettext("Due yesterday!", "Was %(days)d days ago", |
1026 | 338 | abs_result) % {'days': abs_result} | ||
1027 | 326 | window_style = self.window.get_style() | 339 | window_style = self.window.get_style() |
1028 | 327 | color = str(window_style.text[gtk.STATE_INSENSITIVE]) | 340 | color = str(window_style.text[gtk.STATE_INSENSITIVE]) |
1029 | 328 | self.dayleft_label.set_markup("<span color='"+color+"'>"+txt+"</span>") | 341 | self.dayleft_label.set_markup("<span color='"+color+"'>"+txt+"</span>") |
1030 | @@ -348,7 +361,7 @@ | |||
1031 | 348 | if to_save: | 361 | if to_save: |
1032 | 349 | self.light_save() | 362 | self.light_save() |
1033 | 350 | 363 | ||
1035 | 351 | def date_changed(self,widget,data): | 364 | def date_changed(self, widget, data): |
1036 | 352 | text = widget.get_text() | 365 | text = widget.get_text() |
1037 | 353 | valid = True | 366 | valid = True |
1038 | 354 | if not text: | 367 | if not text: |
1039 | @@ -418,7 +431,7 @@ | |||
1040 | 418 | for task in all_subtasks: | 431 | for task in all_subtasks: |
1041 | 419 | self.vmanager.close_task(task.get_id()) | 432 | self.vmanager.close_task(task.get_id()) |
1042 | 420 | 433 | ||
1044 | 421 | def dismiss(self,widget): #pylint: disable-msg=W0613 | 434 | def dismiss(self, widget): #pylint: disable-msg=W0613 |
1045 | 422 | stat = self.task.get_status() | 435 | stat = self.task.get_status() |
1046 | 423 | if stat == "Dismiss": | 436 | if stat == "Dismiss": |
1047 | 424 | self.task.set_status("Active") | 437 | self.task.set_status("Active") |
1048 | @@ -428,7 +441,7 @@ | |||
1049 | 428 | self.close_all_subtasks() | 441 | self.close_all_subtasks() |
1050 | 429 | self.close(None) | 442 | self.close(None) |
1051 | 430 | 443 | ||
1053 | 431 | def change_status(self,widget): #pylint: disable-msg=W0613 | 444 | def change_status(self, widget): #pylint: disable-msg=W0613 |
1054 | 432 | stat = self.task.get_status() | 445 | stat = self.task.get_status() |
1055 | 433 | if stat == "Done": | 446 | if stat == "Done": |
1056 | 434 | self.task.set_status("Active") | 447 | self.task.set_status("Active") |
1057 | @@ -447,7 +460,7 @@ | |||
1058 | 447 | self.vmanager.ask_delete_tasks([self.task.get_id()]) | 460 | self.vmanager.ask_delete_tasks([self.task.get_id()]) |
1059 | 448 | 461 | ||
1060 | 449 | #Take the title as argument and return the subtask ID | 462 | #Take the title as argument and return the subtask ID |
1062 | 450 | def new_subtask(self,title=None,tid=None): | 463 | def new_subtask(self, title=None, tid=None): |
1063 | 451 | if tid: | 464 | if tid: |
1064 | 452 | self.task.add_child(tid) | 465 | self.task.add_child(tid) |
1065 | 453 | elif title: | 466 | elif title: |
1066 | @@ -462,25 +475,25 @@ | |||
1067 | 462 | task_id = task.get_id() | 475 | task_id = task.get_id() |
1068 | 463 | self.vmanager.open_task(task_id) | 476 | self.vmanager.open_task(task_id) |
1069 | 464 | 477 | ||
1071 | 465 | def insert_subtask(self,widget): #pylint: disable-msg=W0613 | 478 | def insert_subtask(self, widget): #pylint: disable-msg=W0613 |
1072 | 466 | self.textview.insert_newtask() | 479 | self.textview.insert_newtask() |
1073 | 467 | self.textview.grab_focus() | 480 | self.textview.grab_focus() |
1074 | 468 | 481 | ||
1076 | 469 | def inserttag_clicked(self,widget): #pylint: disable-msg=W0613 | 482 | def inserttag_clicked(self, widget): #pylint: disable-msg=W0613 |
1077 | 470 | itera = self.textview.get_insert() | 483 | itera = self.textview.get_insert() |
1078 | 471 | if itera.starts_line(): | 484 | if itera.starts_line(): |
1080 | 472 | self.textview.insert_text("@",itera) | 485 | self.textview.insert_text("@", itera) |
1081 | 473 | else: | 486 | else: |
1083 | 474 | self.textview.insert_text(" @",itera) | 487 | self.textview.insert_text(" @", itera) |
1084 | 475 | self.textview.grab_focus() | 488 | self.textview.grab_focus() |
1085 | 476 | 489 | ||
1087 | 477 | def inserttag(self,widget,tag): #pylint: disable-msg=W0613 | 490 | def inserttag(self, widget, tag): #pylint: disable-msg=W0613 |
1088 | 478 | self.textview.insert_tags([tag]) | 491 | self.textview.insert_tags([tag]) |
1089 | 479 | self.textview.grab_focus() | 492 | self.textview.grab_focus() |
1090 | 480 | 493 | ||
1091 | 481 | def save(self): | 494 | def save(self): |
1092 | 482 | self.task.set_title(self.textview.get_title()) | 495 | self.task.set_title(self.textview.get_title()) |
1094 | 483 | self.task.set_text(self.textview.get_text()) | 496 | self.task.set_text(self.textview.get_text()) |
1095 | 484 | self.task.sync() | 497 | self.task.sync() |
1096 | 485 | if self.config != None: | 498 | if self.config != None: |
1097 | 486 | self.config.write() | 499 | self.config.write() |
1098 | @@ -499,22 +512,22 @@ | |||
1099 | 499 | if tosave: | 512 | if tosave: |
1100 | 500 | self.save() | 513 | self.save() |
1101 | 501 | 514 | ||
1103 | 502 | #This will bring the Task Editor to front | 515 | #This will bring the Task Editor to front |
1104 | 503 | def present(self): | 516 | def present(self): |
1105 | 504 | self.window.present() | 517 | self.window.present() |
1106 | 505 | 518 | ||
1108 | 506 | def move(self,x,y): | 519 | def move(self, x, y): |
1109 | 507 | try: | 520 | try: |
1110 | 508 | xx=int(x) | 521 | xx=int(x) |
1111 | 509 | yy=int(y) | 522 | yy=int(y) |
1113 | 510 | self.window.move(xx,yy) | 523 | self.window.move(xx, yy) |
1114 | 511 | except: | 524 | except: |
1115 | 512 | pass | 525 | pass |
1116 | 513 | 526 | ||
1117 | 514 | def get_position(self): | 527 | def get_position(self): |
1118 | 515 | return self.window.get_position() | 528 | return self.window.get_position() |
1119 | 516 | 529 | ||
1121 | 517 | def on_move(self,widget,event): | 530 | def on_move(self, widget, event): |
1122 | 518 | #saving the position | 531 | #saving the position |
1123 | 519 | if self.config != None: | 532 | if self.config != None: |
1124 | 520 | tid = self.task.get_id() | 533 | tid = self.task.get_id() |
1125 | @@ -525,17 +538,19 @@ | |||
1126 | 525 | self.config[tid]["size"] = self.window.get_size() | 538 | self.config[tid]["size"] = self.window.get_size() |
1127 | 526 | 539 | ||
1128 | 527 | #We define dummy variable for when close is called from a callback | 540 | #We define dummy variable for when close is called from a callback |
1130 | 528 | def close(self,window=None,a=None,b=None,c=None): #pylint: disable-msg=W0613 | 541 | def close(self, window=None, a=None, b=None, c=None): |
1131 | 542 | #pylint: disable-msg=W0613 | ||
1132 | 529 | #We should also destroy the whole taskeditor object. | 543 | #We should also destroy the whole taskeditor object. |
1133 | 530 | if self.window: | 544 | if self.window: |
1134 | 531 | self.window.destroy() | 545 | self.window.destroy() |
1135 | 532 | self.window = None | 546 | self.window = None |
1136 | 533 | 547 | ||
1137 | 534 | #The destroy signal is linked to the "close" button. So if we call | 548 | #The destroy signal is linked to the "close" button. So if we call |
1139 | 535 | #destroy in the close function, this will cause the close to be called twice | 549 | #destroy in the close function, this will cause the close to be called |
1140 | 550 | #twice | ||
1141 | 536 | #To solve that, close will just call "destroy" and the destroy signal | 551 | #To solve that, close will just call "destroy" and the destroy signal |
1142 | 537 | #Will be linked to this destruction method that will save the task | 552 | #Will be linked to this destruction method that will save the task |
1144 | 538 | def destruction(self,a=None): | 553 | def destruction(self, a=None): |
1145 | 539 | #Save should be also called when buffer is modified | 554 | #Save should be also called when buffer is modified |
1146 | 540 | self.pengine.onTaskClose(self.plugin_api) | 555 | self.pengine.onTaskClose(self.plugin_api) |
1147 | 541 | self.pengine.remove_api(self.plugin_api) | 556 | self.pengine.remove_api(self.plugin_api) |
1148 | 542 | 557 | ||
1149 | === modified file 'GTG/gtk/editor/taskview.py' | |||
1150 | --- GTG/gtk/editor/taskview.py 2012-10-23 09:31:00 +0000 | |||
1151 | +++ GTG/gtk/editor/taskview.py 2012-11-25 21:29:25 +0000 | |||
1152 | @@ -16,8 +16,6 @@ | |||
1153 | 16 | # You should have received a copy of the GNU General Public License along with | 16 | # You should have received a copy of the GNU General Public License along with |
1154 | 17 | # this program. If not, see <http://www.gnu.org/licenses/>. | 17 | # this program. If not, see <http://www.gnu.org/licenses/>. |
1155 | 18 | # ----------------------------------------------------------------------------- | 18 | # ----------------------------------------------------------------------------- |
1156 | 19 | |||
1157 | 20 | |||
1158 | 21 | """ | 19 | """ |
1159 | 22 | This class implements a gtk.TextView but with many other features | 20 | This class implements a gtk.TextView but with many other features |
1160 | 23 | like hyperlink and other stuff special for GTG | 21 | like hyperlink and other stuff special for GTG |
1161 | @@ -40,10 +38,10 @@ | |||
1162 | 40 | from GTG.gtk.editor import taskviewserial | 38 | from GTG.gtk.editor import taskviewserial |
1163 | 41 | from GTG.tools import urlregex | 39 | from GTG.tools import urlregex |
1164 | 42 | 40 | ||
1166 | 43 | separators = [' ', ',', '\n', '\t', '!', '?', ';', '\0','(',')'] | 41 | separators = [' ', ',', '\n', '\t', '!', '?', ';', '\0', '(', ')'] |
1167 | 44 | #those separators are only separators if followed by a space. Else, they | 42 | #those separators are only separators if followed by a space. Else, they |
1168 | 45 | #are part of the word | 43 | #are part of the word |
1170 | 46 | specials_separators = ['.','/'] | 44 | specials_separators = ['.', '/'] |
1171 | 47 | 45 | ||
1172 | 48 | bullet1_ltr = '→' | 46 | bullet1_ltr = '→' |
1173 | 49 | bullet1_rtl = '←' | 47 | bullet1_rtl = '←' |
1174 | @@ -51,22 +49,22 @@ | |||
1175 | 51 | 49 | ||
1176 | 52 | class TaskView(gtk.TextView): | 50 | class TaskView(gtk.TextView): |
1177 | 53 | __gtype_name__ = 'HyperTextView' | 51 | __gtype_name__ = 'HyperTextView' |
1179 | 54 | __gsignals__ = {'anchor-clicked': (gobject.SIGNAL_RUN_LAST, \ | 52 | __gsignals__ = {'anchor-clicked': (gobject.SIGNAL_RUN_LAST, |
1180 | 55 | None, (str, str, int))} | 53 | None, (str, str, int))} |
1181 | 56 | __gproperties__ = { | 54 | __gproperties__ = { |
1183 | 57 | 'link': (gobject.TYPE_PYOBJECT, 'link color',\ | 55 | 'link': (gobject.TYPE_PYOBJECT, 'link color', |
1184 | 58 | 'link color of TextView', gobject.PARAM_READWRITE), | 56 | 'link color of TextView', gobject.PARAM_READWRITE), |
1186 | 59 | 'failedlink': (gobject.TYPE_PYOBJECT, 'failed link color',\ | 57 | 'failedlink': (gobject.TYPE_PYOBJECT, 'failed link color', |
1187 | 60 | 'failed link color of TextView', gobject.PARAM_READWRITE), | 58 | 'failed link color of TextView', gobject.PARAM_READWRITE), |
1189 | 61 | 'active': (gobject.TYPE_PYOBJECT, 'active color', \ | 59 | 'active': (gobject.TYPE_PYOBJECT, 'active color', |
1190 | 62 | 'active color of TextView', gobject.PARAM_READWRITE), | 60 | 'active color of TextView', gobject.PARAM_READWRITE), |
1192 | 63 | 'hover': (gobject.TYPE_PYOBJECT, 'link:hover color', \ | 61 | 'hover': (gobject.TYPE_PYOBJECT, 'link:hover color', |
1193 | 64 | 'link:hover color of TextView', gobject.PARAM_READWRITE), | 62 | 'link:hover color of TextView', gobject.PARAM_READWRITE), |
1195 | 65 | 'tag': (gobject.TYPE_PYOBJECT, 'tag color', \ | 63 | 'tag': (gobject.TYPE_PYOBJECT, 'tag color', |
1196 | 66 | 'tag color of TextView', gobject.PARAM_READWRITE), | 64 | 'tag color of TextView', gobject.PARAM_READWRITE), |
1198 | 67 | 'done': (gobject.TYPE_PYOBJECT, 'link color', \ | 65 | 'done': (gobject.TYPE_PYOBJECT, 'link color', |
1199 | 68 | 'link color of TextView', gobject.PARAM_READWRITE), | 66 | 'link color of TextView', gobject.PARAM_READWRITE), |
1201 | 69 | 'indent': (gobject.TYPE_PYOBJECT, 'indent color', \ | 67 | 'indent': (gobject.TYPE_PYOBJECT, 'indent color', |
1202 | 70 | 'indent color of TextView', gobject.PARAM_READWRITE), | 68 | 'indent color of TextView', gobject.PARAM_READWRITE), |
1203 | 71 | } | 69 | } |
1204 | 72 | 70 | ||
1205 | @@ -83,22 +81,23 @@ | |||
1206 | 83 | raise AttributeError('unknown property %s' % prop.name) | 81 | raise AttributeError('unknown property %s' % prop.name) |
1207 | 84 | 82 | ||
1208 | 85 | #Yes, we want to redefine the buffer. Disabling pylint on that error. | 83 | #Yes, we want to redefine the buffer. Disabling pylint on that error. |
1210 | 86 | def __init__(self, requester, clipboard, buffer=None): #pylint: disable-msg=W0622 | 84 | def __init__(self, requester, clipboard, buffer=None): |
1211 | 85 | #pylint: disable-msg=W0622 | ||
1212 | 87 | gtk.TextView.__init__(self, buffer) | 86 | gtk.TextView.__init__(self, buffer) |
1213 | 88 | self.buff = self.get_buffer() | 87 | self.buff = self.get_buffer() |
1214 | 89 | self.req = requester | 88 | self.req = requester |
1215 | 90 | #Buffer init | 89 | #Buffer init |
1223 | 91 | self.link = {'background': 'white', 'foreground': '#007bff', \ | 90 | self.link = {'background': 'white', 'foreground': '#007bff', |
1224 | 92 | 'underline': pango.UNDERLINE_SINGLE, \ | 91 | 'underline': pango.UNDERLINE_SINGLE, |
1225 | 93 | 'strikethrough': False} | 92 | 'strikethrough': False} |
1226 | 94 | self.failedlink = {'background': 'white', 'foreground': '#ff5454', \ | 93 | self.failedlink = {'background': 'white', 'foreground': '#ff5454', |
1227 | 95 | 'underline': pango.UNDERLINE_NONE, \ | 94 | 'underline': pango.UNDERLINE_NONE, |
1228 | 96 | 'strikethrough': False} | 95 | 'strikethrough': False} |
1229 | 97 | self.done = {'background': 'white', 'foreground': 'gray',\ | 96 | self.done = {'background': 'white', 'foreground': 'gray', |
1230 | 98 | 'strikethrough': True} | 97 | 'strikethrough': True} |
1232 | 99 | self.active = {'background': 'light gray', 'foreground': '#ff1e00',\ | 98 | self.active = {'background': 'light gray', 'foreground': '#ff1e00', |
1233 | 100 | 'underline': pango.UNDERLINE_SINGLE} | 99 | 'underline': pango.UNDERLINE_SINGLE} |
1235 | 101 | self.hover = {'background': 'light gray'} | 100 | self.hover = {'background': 'light gray'} |
1236 | 102 | self.tag = {'background': "#FFea00", 'foreground': 'black'} | 101 | self.tag = {'background': "#FFea00", 'foreground': 'black'} |
1237 | 103 | self.indent = {'scale': 1.4, 'editable': False, 'left-margin': 10, | 102 | self.indent = {'scale': 1.4, 'editable': False, 'left-margin': 10, |
1238 | 104 | "accumulative-margin": True} | 103 | "accumulative-margin": True} |
1239 | @@ -108,7 +107,7 @@ | |||
1240 | 108 | # but set in self.modified) | 107 | # but set in self.modified) |
1241 | 109 | self.table = self.buff.get_tag_table() | 108 | self.table = self.buff.get_tag_table() |
1242 | 110 | # Tag for title | 109 | # Tag for title |
1244 | 111 | self.title_tag = self.buff.create_tag("title", foreground="#007bff", \ | 110 | self.title_tag = self.buff.create_tag("title", foreground="#007bff", |
1245 | 112 | scale=1.6, underline=1) | 111 | scale=1.6, underline=1) |
1246 | 113 | self.title_tag.set_property("pixels-above-lines", 10) | 112 | self.title_tag.set_property("pixels-above-lines", 10) |
1247 | 114 | self.title_tag.set_property("pixels-below-lines", 10) | 113 | self.title_tag.set_property("pixels-below-lines", 10) |
1248 | @@ -125,13 +124,14 @@ | |||
1249 | 125 | 124 | ||
1250 | 126 | #Signals | 125 | #Signals |
1251 | 127 | self.connect('motion-notify-event', self._motion) | 126 | self.connect('motion-notify-event', self._motion) |
1255 | 128 | self.connect('focus-out-event', lambda w, \ | 127 | self.connect('focus-out-event', |
1256 | 129 | e: self.table.foreach(self.__tag_reset, e.window)) | 128 | lambda w, e: self.table.foreach(self.__tag_reset, e.window)) |
1257 | 130 | self.insert_sigid = self.buff.connect('insert-text', \ | 129 | self.insert_sigid = self.buff.connect('insert-text', |
1258 | 131 | self._insert_at_cursor) | 130 | self._insert_at_cursor) |
1262 | 132 | self.delete_sigid = self.buff.connect("delete-range", self._delete_range) | 131 | self.delete_sigid = self.buff.connect("delete-range", |
1263 | 133 | self.connect('copy-clipboard', self.copy_clipboard,"copy") | 132 | self._delete_range) |
1264 | 134 | self.connect('cut-clipboard', self.copy_clipboard,"cut") | 133 | self.connect('copy-clipboard', self.copy_clipboard, "copy") |
1265 | 134 | self.connect('cut-clipboard', self.copy_clipboard, "cut") | ||
1266 | 135 | self.connect('paste-clipboard', self.paste_clipboard) | 135 | self.connect('paste-clipboard', self.paste_clipboard) |
1267 | 136 | 136 | ||
1268 | 137 | self.connect('drag-data-received', self.drag_receive) | 137 | self.connect('drag-data-received', self.drag_receive) |
1269 | @@ -146,8 +146,10 @@ | |||
1270 | 146 | self.mime_type = 'application/x-gtg-task' | 146 | self.mime_type = 'application/x-gtg-task' |
1271 | 147 | serializer = taskviewserial.Serializer() | 147 | serializer = taskviewserial.Serializer() |
1272 | 148 | unserializer = taskviewserial.Unserializer(self) | 148 | unserializer = taskviewserial.Unserializer(self) |
1275 | 149 | self.buff.register_serialize_format(self.mime_type, serializer.serialize, None) | 149 | self.buff.register_serialize_format(self.mime_type, |
1276 | 150 | self.buff.register_deserialize_format(self.mime_type, unserializer.unserialize, None) | 150 | serializer.serialize, None) |
1277 | 151 | self.buff.register_deserialize_format(self.mime_type, | ||
1278 | 152 | unserializer.unserialize, None) | ||
1279 | 151 | 153 | ||
1280 | 152 | #The list of callbacks we have to set | 154 | #The list of callbacks we have to set |
1281 | 153 | self.remove_tag_callback = None | 155 | self.remove_tag_callback = None |
1282 | @@ -156,7 +158,7 @@ | |||
1283 | 156 | self.get_subtasks = None | 158 | self.get_subtasks = None |
1284 | 157 | self.remove_subtask =None | 159 | self.remove_subtask =None |
1285 | 158 | self.__refresh_cb = None # refresh the editor window | 160 | self.__refresh_cb = None # refresh the editor window |
1287 | 159 | self.open_task = None # open another task | 161 | self.open_task = None # open another task |
1288 | 160 | self.new_subtask_callback = None # create a subtask | 162 | self.new_subtask_callback = None # create a subtask |
1289 | 161 | self.save_task = None #This will save the task without refreshing all | 163 | self.save_task = None #This will save the task without refreshing all |
1290 | 162 | 164 | ||
1291 | @@ -185,7 +187,8 @@ | |||
1292 | 185 | #editable means that the user can edit the taskview | 187 | #editable means that the user can edit the taskview |
1293 | 186 | #this is initially set at False and then to True once the editor window | 188 | #this is initially set at False and then to True once the editor window |
1294 | 187 | #is displayed. | 189 | #is displayed. |
1296 | 188 | #this is used to avoid saving the task when the window is still not displayed | 190 | #this is used to avoid saving the task when the window is still |
1297 | 191 | #not displayed | ||
1298 | 189 | def set_editable(self, boule): | 192 | def set_editable(self, boule): |
1299 | 190 | self.editable = boule | 193 | self.editable = boule |
1300 | 191 | 194 | ||
1301 | @@ -270,7 +273,8 @@ | |||
1302 | 270 | 273 | ||
1303 | 271 | #reconnect | 274 | #reconnect |
1304 | 272 | if reconnect_insert: | 275 | if reconnect_insert: |
1306 | 273 | self.insert_sigid = self.buff.connect('insert-text', self._insert_at_cursor) | 276 | self.insert_sigid = self.buff.connect('insert-text', |
1307 | 277 | self._insert_at_cursor) | ||
1308 | 274 | if reconnect_modified: | 278 | if reconnect_modified: |
1309 | 275 | self.modified_sigid = self.buff.connect("changed", self.modified) | 279 | self.modified_sigid = self.buff.connect("changed", self.modified) |
1310 | 276 | 280 | ||
1311 | @@ -308,7 +312,6 @@ | |||
1312 | 308 | else: | 312 | else: |
1313 | 309 | return True | 313 | return True |
1314 | 310 | 314 | ||
1315 | 311 | |||
1316 | 312 | def create_anchor_tag(self, b, anchor, text=None, typ=None): | 315 | def create_anchor_tag(self, b, anchor, text=None, typ=None): |
1317 | 313 | #We cannot have two tags with the same name | 316 | #We cannot have two tags with the same name |
1318 | 314 | #That's why the link tag has no name | 317 | #That's why the link tag has no name |
1319 | @@ -326,7 +329,8 @@ | |||
1320 | 326 | if linktype == 'link' and not self.check_link(anchor): | 329 | if linktype == 'link' and not self.check_link(anchor): |
1321 | 327 | linktype = 'failedlink' | 330 | linktype = 'failedlink' |
1322 | 328 | 331 | ||
1324 | 329 | tag = b.create_tag(None, **self.get_property(linktype)) #pylint: disable-msg=W0142 | 332 | #pylint: disable-msg=W0142 |
1325 | 333 | tag = b.create_tag(None, **self.get_property(linktype)) | ||
1326 | 330 | tag.set_data('is_anchor', True) | 334 | tag.set_data('is_anchor', True) |
1327 | 331 | tag.set_data('link', anchor) | 335 | tag.set_data('link', anchor) |
1328 | 332 | if typ: | 336 | if typ: |
1329 | @@ -349,7 +353,8 @@ | |||
1330 | 349 | if ss.begins_tag(t) and ee.ends_tag(t): | 353 | if ss.begins_tag(t) and ee.ends_tag(t): |
1331 | 350 | already = True | 354 | already = True |
1332 | 351 | if not texttag: | 355 | if not texttag: |
1334 | 352 | texttag = buff.create_tag(None,**self.get_property('tag'))#pylint: disable-msg=W0142 | 356 | #pylint: disable-msg=W0142 |
1335 | 357 | texttag = buff.create_tag(None, **self.get_property('tag')) | ||
1336 | 353 | texttag.set_data('is_tag', True) | 358 | texttag.set_data('is_tag', True) |
1337 | 354 | texttag.set_data('tagname', tag) | 359 | texttag.set_data('tagname', tag) |
1338 | 355 | #This one is for marks | 360 | #This one is for marks |
1339 | @@ -371,7 +376,8 @@ | |||
1340 | 371 | tex = buff.get_text(i_s, i_e) | 376 | tex = buff.get_text(i_s, i_e) |
1341 | 372 | if len(tex) > 0: | 377 | if len(tex) > 0: |
1342 | 373 | self.req.get_task(subtask).set_title(tex) | 378 | self.req.get_task(subtask).set_title(tex) |
1344 | 374 | texttag = self.create_anchor_tag(buff, subtask, text=tex, typ="subtask") | 379 | texttag = self.create_anchor_tag(buff, subtask, text=tex, |
1345 | 380 | typ="subtask") | ||
1346 | 375 | texttag.set_data('is_subtask', True) | 381 | texttag.set_data('is_subtask', True) |
1347 | 376 | texttag.set_data('child', subtask) | 382 | texttag.set_data('child', subtask) |
1348 | 377 | #This one is for marks | 383 | #This one is for marks |
1349 | @@ -382,7 +388,8 @@ | |||
1350 | 382 | buff.delete_mark(e) | 388 | buff.delete_mark(e) |
1351 | 383 | 389 | ||
1352 | 384 | def create_indent_tag(self, buff, level): | 390 | def create_indent_tag(self, buff, level): |
1354 | 385 | tag = buff.create_tag(None, **self.get_property('indent'))#pylint: disable-msg=W0142 | 391 | #pylint: disable-msg=W0142 |
1355 | 392 | tag = buff.create_tag(None, **self.get_property('indent')) | ||
1356 | 386 | tag.set_data('is_indent', True) | 393 | tag.set_data('is_indent', True) |
1357 | 387 | tag.set_data('indent_level', level) | 394 | tag.set_data('indent_level', level) |
1358 | 388 | return tag | 395 | return tag |
1359 | @@ -409,10 +416,12 @@ | |||
1360 | 409 | if tt.get_data('is_tag'): | 416 | if tt.get_data('is_tag'): |
1361 | 410 | newline = False | 417 | newline = False |
1362 | 411 | firstline.forward_to_line_end() | 418 | firstline.forward_to_line_end() |
1365 | 412 | #Now we should check if the current char is a separator or not | 419 | # Now we should check if the current char is |
1366 | 413 | #Currently, we insert a space | 420 | # a separator or not |
1367 | 421 | # Currently, we insert a space | ||
1368 | 414 | self.insert_text(" ", firstline) | 422 | self.insert_text(" ", firstline) |
1370 | 415 | #Now we check if this newline is empty (it contains only " " and ",") | 423 | # Now we check if this newline is empty |
1371 | 424 | # (it contains only " " and ",") | ||
1372 | 416 | # if newline: | 425 | # if newline: |
1373 | 417 | # endline = firstline.copy() | 426 | # endline = firstline.copy() |
1374 | 418 | # if not endline.ends_line(): | 427 | # if not endline.ends_line(): |
1375 | @@ -428,13 +437,13 @@ | |||
1376 | 428 | self.insert_text("\n", firstline) | 437 | self.insert_text("\n", firstline) |
1377 | 429 | firstline = self.buff.get_iter_at_line(1) | 438 | firstline = self.buff.get_iter_at_line(1) |
1378 | 430 | line_mark = self.buff.create_mark("firstline", firstline, False) | 439 | line_mark = self.buff.create_mark("firstline", firstline, False) |
1380 | 431 | #self.tv.insert_at_mark(buf, line_mark,"\n") | 440 | #self.tv.insert_at_mark(buf, line_mark, "\n") |
1381 | 432 | ntags = len(tag_list) | 441 | ntags = len(tag_list) |
1382 | 433 | for t in tag_list: | 442 | for t in tag_list: |
1383 | 434 | ntags = ntags - 1 | 443 | ntags = ntags - 1 |
1384 | 435 | self.insert_at_mark(self.buff, line_mark, t) | 444 | self.insert_at_mark(self.buff, line_mark, t) |
1385 | 436 | if ntags != 0: | 445 | if ntags != 0: |
1387 | 437 | self.insert_at_mark(self.buff, line_mark,",") | 446 | self.insert_at_mark(self.buff, line_mark, ",") |
1388 | 438 | self.buff.delete_mark(line_mark) | 447 | self.buff.delete_mark(line_mark) |
1389 | 439 | self.modified(full=True) | 448 | self.modified(full=True) |
1390 | 440 | 449 | ||
1391 | @@ -490,9 +499,7 @@ | |||
1392 | 490 | stripped = title.strip(' \n\t') | 499 | stripped = title.strip(' \n\t') |
1393 | 491 | return stripped | 500 | return stripped |
1394 | 492 | 501 | ||
1398 | 493 | ### PRIVATE FUNCTIONS ########################################################## | 502 | ### PRIVATE FUNCTIONS ##################################################### |
1396 | 494 | |||
1397 | 495 | |||
1399 | 496 | #This function is called so frequently that we should optimize it more. | 503 | #This function is called so frequently that we should optimize it more. |
1400 | 497 | def modified(self, buff=None, full=False, refresheditor=True): | 504 | def modified(self, buff=None, full=False, refresheditor=True): |
1401 | 498 | """Called when the buffer has been modified. | 505 | """Called when the buffer has been modified. |
1402 | @@ -538,9 +545,11 @@ | |||
1403 | 538 | #subt_list = self.get_subtasks() | 545 | #subt_list = self.get_subtasks() |
1404 | 539 | #First, we remove the olds tags | 546 | #First, we remove the olds tags |
1405 | 540 | tag_list = [] | 547 | tag_list = [] |
1406 | 548 | |||
1407 | 541 | def subfunc(texttag, data=None): #pylint: disable-msg=W0613 | 549 | def subfunc(texttag, data=None): #pylint: disable-msg=W0613 |
1408 | 542 | if texttag.get_data('is_subtask'): | 550 | if texttag.get_data('is_subtask'): |
1409 | 543 | tag_list.append(texttag) | 551 | tag_list.append(texttag) |
1410 | 552 | |||
1411 | 544 | table.foreach(subfunc) | 553 | table.foreach(subfunc) |
1412 | 545 | start, end = buff.get_bounds() | 554 | start, end = buff.get_bounds() |
1413 | 546 | for t in tag_list: | 555 | for t in tag_list: |
1414 | @@ -583,9 +592,11 @@ | |||
1415 | 583 | #First, we remove the olds tags | 592 | #First, we remove the olds tags |
1416 | 584 | tag_list = [] | 593 | tag_list = [] |
1417 | 585 | table = buff.get_tag_table() | 594 | table = buff.get_tag_table() |
1418 | 595 | |||
1419 | 586 | def subfunc(texttag, data=None): | 596 | def subfunc(texttag, data=None): |
1420 | 587 | if texttag.get_data('is_anchor'): | 597 | if texttag.get_data('is_anchor'): |
1421 | 588 | tag_list.append(texttag) | 598 | tag_list.append(texttag) |
1422 | 599 | |||
1423 | 589 | table.foreach(subfunc) | 600 | table.foreach(subfunc) |
1424 | 590 | for t in tag_list: | 601 | for t in tag_list: |
1425 | 591 | buff.remove_tag(t, start, end) | 602 | buff.remove_tag(t, start, end) |
1426 | @@ -606,7 +617,8 @@ | |||
1427 | 606 | # For short URL we must add http:// prefix | 617 | # For short URL we must add http:// prefix |
1428 | 607 | if text == "www": | 618 | if text == "www": |
1429 | 608 | url = "http://" + url | 619 | url = "http://" + url |
1431 | 609 | texttag = self.create_anchor_tag(buff, url, text=None, typ="http") | 620 | texttag = self.create_anchor_tag(buff, url, text=None, |
1432 | 621 | typ="http") | ||
1433 | 610 | it = prev.copy() | 622 | it = prev.copy() |
1434 | 611 | it.forward_chars(m.end()) | 623 | it.forward_chars(m.end()) |
1435 | 612 | buff.apply_tag(texttag, prev, it) | 624 | buff.apply_tag(texttag, prev, it) |
1436 | @@ -622,15 +634,18 @@ | |||
1437 | 622 | nbr = url.split("#")[1] | 634 | nbr = url.split("#")[1] |
1438 | 623 | topoint = None | 635 | topoint = None |
1439 | 624 | if url.startswith("bug #") or url.startswith("lp #"): | 636 | if url.startswith("bug #") or url.startswith("lp #"): |
1441 | 625 | topoint = "https://launchpad.net/bugs/%s" %nbr | 637 | topoint = "https://launchpad.net/bugs/%s" % nbr |
1442 | 626 | elif url.startswith("bgo #"): | 638 | elif url.startswith("bgo #"): |
1444 | 627 | topoint = "http://bugzilla.gnome.org/show_bug.cgi?id=%s" %nbr | 639 | topoint = "http://bugzilla.gnome.org/" + \ |
1445 | 640 | "show_bug.cgi?id=%s" % nbr | ||
1446 | 628 | elif url.startswith("bko #"): | 641 | elif url.startswith("bko #"): |
1448 | 629 | topoint = "https://bugs.kde.org/show_bug.cgi?id=%s" %nbr | 642 | topoint = "https://bugs.kde.org/show_bug.cgi?id=%s" \ |
1449 | 643 | % nbr | ||
1450 | 630 | elif url.startswith("fdo #"): | 644 | elif url.startswith("fdo #"): |
1452 | 631 | topoint = "http://bugs.freedesktop.org/show_bug.cgi?id=%s" %nbr | 645 | topoint = "http://bugs.freedesktop.org/" + \ |
1453 | 646 | "show_bug.cgi?id=%s" % nbr | ||
1454 | 632 | if topoint: | 647 | if topoint: |
1456 | 633 | texttag = self.create_anchor_tag(buff,\ | 648 | texttag = self.create_anchor_tag(buff, |
1457 | 634 | topoint, text=None, typ="http") | 649 | topoint, text=None, typ="http") |
1458 | 635 | buff.apply_tag(texttag, prev, it) | 650 | buff.apply_tag(texttag, prev, it) |
1459 | 636 | 651 | ||
1460 | @@ -659,29 +674,31 @@ | |||
1461 | 659 | mark1 = buff.get_mark(tagname) | 674 | mark1 = buff.get_mark(tagname) |
1462 | 660 | if mark1: | 675 | if mark1: |
1463 | 661 | offset1 = buff.get_iter_at_mark(mark1).get_offset() | 676 | offset1 = buff.get_iter_at_mark(mark1).get_offset() |
1465 | 662 | if start.get_offset() <= offset1 <= end.get_offset(): | 677 | if start.get_offset() <= offset1 <= \ |
1466 | 678 | end.get_offset(): | ||
1467 | 663 | buff.delete_mark_by_name(tagname) | 679 | buff.delete_mark_by_name(tagname) |
1468 | 664 | mark2 = buff.get_mark("/%s"%tagname) | 680 | mark2 = buff.get_mark("/%s"%tagname) |
1469 | 665 | if mark2: | 681 | if mark2: |
1470 | 666 | offset2 = buff.get_iter_at_mark(mark2).get_offset() | 682 | offset2 = buff.get_iter_at_mark(mark2).get_offset() |
1472 | 667 | if start.get_offset() <= offset2 <= end.get_offset(): | 683 | if start.get_offset() <= offset2 <= \ |
1473 | 684 | end.get_offset(): | ||
1474 | 668 | buff.delete_mark_by_name("/%s"%tagname) | 685 | buff.delete_mark_by_name("/%s"%tagname) |
1475 | 669 | it.forward_char() | 686 | it.forward_char() |
1476 | 670 | 687 | ||
1477 | 671 | # Set iterators for word | 688 | # Set iterators for word |
1478 | 672 | word_start = start.copy() | 689 | word_start = start.copy() |
1480 | 673 | word_end = start.copy() | 690 | word_end = start.copy() |
1481 | 674 | 691 | ||
1482 | 675 | # Set iterators for char | 692 | # Set iterators for char |
1483 | 676 | char_start = start.copy() | 693 | char_start = start.copy() |
1485 | 677 | char_end = start.copy() | 694 | char_end = start.copy() |
1486 | 678 | char_end.forward_char() | 695 | char_end.forward_char() |
1487 | 679 | last_char = None | 696 | last_char = None |
1488 | 680 | 697 | ||
1489 | 681 | # Iterate over characters of the line to get words | 698 | # Iterate over characters of the line to get words |
1490 | 682 | while char_end.compare(end) <= 0: | 699 | while char_end.compare(end) <= 0: |
1491 | 683 | do_word_check = False | 700 | do_word_check = False |
1493 | 684 | my_char = buff.get_text(char_start, char_end) | 701 | my_char = buff.get_text(char_start, char_end) |
1494 | 685 | if my_char not in separators: | 702 | if my_char not in separators: |
1495 | 686 | last_char = my_char | 703 | last_char = my_char |
1496 | 687 | word_end = char_end.copy() | 704 | word_end = char_end.copy() |
1497 | @@ -707,7 +724,8 @@ | |||
1498 | 707 | #and it shouldn't start with @@ (bug 531553) | 724 | #and it shouldn't start with @@ (bug 531553) |
1499 | 708 | if len(my_word) > 1 and my_word[0] == '@' \ | 725 | if len(my_word) > 1 and my_word[0] == '@' \ |
1500 | 709 | and not my_word[1] == '@': | 726 | and not my_word[1] == '@': |
1502 | 710 | #self.apply_tag_tag(buff, my_word, word_start, word_end) | 727 | #self.apply_tag_tag(buff, my_word, word_start, |
1503 | 728 | # word_end) | ||
1504 | 711 | #We will add mark where tag should be applied | 729 | #We will add mark where tag should be applied |
1505 | 712 | buff.create_mark(my_word, word_start, True) | 730 | buff.create_mark(my_word, word_start, True) |
1506 | 713 | buff.create_mark("/%s"%my_word, word_end, False) | 731 | buff.create_mark("/%s"%my_word, word_end, False) |
1507 | @@ -718,7 +736,7 @@ | |||
1508 | 718 | 736 | ||
1509 | 719 | # We set new word boundaries | 737 | # We set new word boundaries |
1510 | 720 | word_start = char_end.copy() | 738 | word_start = char_end.copy() |
1512 | 721 | word_end = char_end.copy() | 739 | word_end = char_end.copy() |
1513 | 722 | 740 | ||
1514 | 723 | # Stop loop if we are at the end | 741 | # Stop loop if we are at the end |
1515 | 724 | if char_end.compare(end) == 0: | 742 | if char_end.compare(end) == 0: |
1516 | @@ -768,7 +786,7 @@ | |||
1517 | 768 | # buff.remove_tag(ta, start, endindent) | 786 | # buff.remove_tag(ta, start, endindent) |
1518 | 769 | #Now we delete all, char after char | 787 | #Now we delete all, char after char |
1519 | 770 | it = start.copy() | 788 | it = start.copy() |
1521 | 771 | while (it.get_offset() <= end.get_offset()) and (it.get_char() != '\0'): | 789 | while it.get_offset() <= end.get_offset() and it.get_char() != '\0': |
1522 | 772 | if it.begins_tag(): | 790 | if it.begins_tag(): |
1523 | 773 | tags = it.get_tags() | 791 | tags = it.get_tags() |
1524 | 774 | for ta in tags: | 792 | for ta in tags: |
1525 | @@ -798,7 +816,8 @@ | |||
1526 | 798 | #now we really delete the selected stuffs | 816 | #now we really delete the selected stuffs |
1527 | 799 | selec = self.buff.get_selection_bounds() | 817 | selec = self.buff.get_selection_bounds() |
1528 | 800 | # if selec: | 818 | # if selec: |
1530 | 801 | # print "deleted text is ##%s##" %self.buff.get_text(selec[0], selec[1])#(start, end) | 819 | # print "deleted text is ##%s##" %self.buff.get_text(selec[0], |
1531 | 820 | # selec[1])#(start, end) | ||
1532 | 802 | # self.buff.disconnect(self.delete_sigid) | 821 | # self.buff.disconnect(self.delete_sigid) |
1533 | 803 | # self.disconnect(self.backspace_sigid) | 822 | # self.disconnect(self.backspace_sigid) |
1534 | 804 | # self.buff.stop_emission("delete-range") | 823 | # self.buff.stop_emission("delete-range") |
1535 | @@ -807,16 +826,20 @@ | |||
1536 | 807 | # else: | 826 | # else: |
1537 | 808 | # end.forward_char() | 827 | # end.forward_char() |
1538 | 809 | # self.buff.backspace(end, False, True) | 828 | # self.buff.backspace(end, False, True) |
1540 | 810 | # self.delete_sigid = self.buff.connect("delete-range", self._delete_range) | 829 | # self.delete_sigid = self.buff.connect("delete-range", |
1541 | 830 | # self._delete_range) | ||
1542 | 811 | # self.backspace_sigid = self.connect("backspace", self.backspace) | 831 | # self.backspace_sigid = self.connect("backspace", self.backspace) |
1543 | 812 | #We return false so the parent still get the signal | 832 | #We return false so the parent still get the signal |
1544 | 813 | return False | 833 | return False |
1545 | 814 | 834 | ||
1546 | 815 | #Apply the title and return an iterator after that title.buff.get_iter_at_mar | ||
1547 | 816 | def _apply_title(self, buff, refresheditor=True): | 835 | def _apply_title(self, buff, refresheditor=True): |
1551 | 817 | start = buff.get_start_iter() | 836 | """ |
1552 | 818 | end = buff.get_end_iter() | 837 | Apply the title and return an iterator after that |
1553 | 819 | line_nbr = 1 | 838 | title.buff.get_iter_at_mar |
1554 | 839 | """ | ||
1555 | 840 | start = buff.get_start_iter() | ||
1556 | 841 | end = buff.get_end_iter() | ||
1557 | 842 | line_nbr = 1 | ||
1558 | 820 | linecount = buff.get_line_count() | 843 | linecount = buff.get_line_count() |
1559 | 821 | 844 | ||
1560 | 822 | # Apply the title tag on the first line | 845 | # Apply the title tag on the first line |
1561 | @@ -828,14 +851,14 @@ | |||
1562 | 828 | # Applying title on the first line | 851 | # Applying title on the first line |
1563 | 829 | title_end = buff.get_iter_at_line(line_nbr-1) | 852 | title_end = buff.get_iter_at_line(line_nbr-1) |
1564 | 830 | title_end.forward_to_line_end() | 853 | title_end.forward_to_line_end() |
1566 | 831 | stripped = buff.get_text(title_start, title_end).strip('\n\t ') | 854 | stripped = buff.get_text(title_start, title_end).strip('\n\t ') |
1567 | 832 | # Here we ignore lines that are blank | 855 | # Here we ignore lines that are blank |
1568 | 833 | # Title is the first written line | 856 | # Title is the first written line |
1569 | 834 | while line_nbr <= linecount and not stripped: | 857 | while line_nbr <= linecount and not stripped: |
1572 | 835 | line_nbr += 1 | 858 | line_nbr += 1 |
1573 | 836 | title_end = buff.get_iter_at_line(line_nbr-1) | 859 | title_end = buff.get_iter_at_line(line_nbr-1) |
1574 | 837 | title_end.forward_to_line_end() | 860 | title_end.forward_to_line_end() |
1576 | 838 | stripped = buff.get_text(title_start, title_end).strip('\n\t ') | 861 | stripped = buff.get_text(title_start, title_end).strip('\n\t ') |
1577 | 839 | # Or to all the buffer if there is only one line | 862 | # Or to all the buffer if there is only one line |
1578 | 840 | else: | 863 | else: |
1579 | 841 | title_end = end.copy() | 864 | title_end = end.copy() |
1580 | @@ -846,8 +869,6 @@ | |||
1581 | 846 | self.refresh(buff.get_text(title_start, title_end).strip('\n\t')) | 869 | self.refresh(buff.get_text(title_start, title_end).strip('\n\t')) |
1582 | 847 | return title_end | 870 | return title_end |
1583 | 848 | 871 | ||
1584 | 849 | |||
1585 | 850 | |||
1586 | 851 | def __newsubtask(self, buff, title, line_nbr, level=1): | 872 | def __newsubtask(self, buff, title, line_nbr, level=1): |
1587 | 852 | anchor = self.new_subtask_callback(title) | 873 | anchor = self.new_subtask_callback(title) |
1588 | 853 | end_i = self.write_subtask(buff, line_nbr, anchor, level=level) | 874 | end_i = self.write_subtask(buff, line_nbr, anchor, level=level) |
1589 | @@ -875,10 +896,10 @@ | |||
1590 | 875 | #be in the subtask title | 896 | #be in the subtask title |
1591 | 876 | start_i = buff.get_iter_at_line(line_nbr) | 897 | start_i = buff.get_iter_at_line(line_nbr) |
1592 | 877 | start_i.forward_to_line_end() | 898 | start_i.forward_to_line_end() |
1594 | 878 | buff.insert(start_i,"\n") | 899 | buff.insert(start_i, "\n") |
1595 | 879 | #Ok, now we can start working | 900 | #Ok, now we can start working |
1596 | 880 | start_i = buff.get_iter_at_line(line_nbr) | 901 | start_i = buff.get_iter_at_line(line_nbr) |
1598 | 881 | end_i = start_i.copy() | 902 | end_i = start_i.copy() |
1599 | 882 | #We go back at the end of the previous line | 903 | #We go back at the end of the previous line |
1600 | 883 | # start_i.backward_char() | 904 | # start_i.backward_char() |
1601 | 884 | # #But only if this is not the title. | 905 | # #But only if this is not the title. |
1602 | @@ -886,9 +907,9 @@ | |||
1603 | 886 | # if start_i.has_tag(self.title_tag): | 907 | # if start_i.has_tag(self.title_tag): |
1604 | 887 | # start_i.forward_char() | 908 | # start_i.forward_char() |
1605 | 888 | # insert_enter = False | 909 | # insert_enter = False |
1607 | 889 | start = buff.create_mark("start", start_i, True) | 910 | start = buff.create_mark("start", start_i, True) |
1608 | 890 | end_i.forward_line() | 911 | end_i.forward_line() |
1610 | 891 | end = buff.create_mark("end", end_i, False) | 912 | end = buff.create_mark("end", end_i, False) |
1611 | 892 | buff.delete(start_i, end_i) | 913 | buff.delete(start_i, end_i) |
1612 | 893 | start_i = buff.get_iter_at_mark(start) | 914 | start_i = buff.get_iter_at_mark(start) |
1613 | 894 | self.insert_indent(buff, start_i, level, enter=insert_enter) | 915 | self.insert_indent(buff, start_i, level, enter=insert_enter) |
1614 | @@ -905,7 +926,8 @@ | |||
1615 | 905 | #buff.delete_mark(end) | 926 | #buff.delete_mark(end) |
1616 | 906 | 927 | ||
1617 | 907 | if reconnect_insert: | 928 | if reconnect_insert: |
1619 | 908 | self.insert_sigid = self.buff.connect('insert-text', self._insert_at_cursor) | 929 | self.insert_sigid = self.buff.connect('insert-text', |
1620 | 930 | self._insert_at_cursor) | ||
1621 | 909 | if reconnect_modified: | 931 | if reconnect_modified: |
1622 | 910 | self.modified_sigid = self.buff.connect("changed", self.modified) | 932 | self.modified_sigid = self.buff.connect("changed", self.modified) |
1623 | 911 | return end_i | 933 | return end_i |
1624 | @@ -936,7 +958,7 @@ | |||
1625 | 936 | if line == self.buff.get_line_count(): | 958 | if line == self.buff.get_line_count(): |
1626 | 937 | itera.forward_to_line_end() | 959 | itera.forward_to_line_end() |
1627 | 938 | mark = self.buff.create_mark(None, itera, True) | 960 | mark = self.buff.create_mark(None, itera, True) |
1629 | 939 | self.buff.insert(itera,"\n") | 961 | self.buff.insert(itera, "\n") |
1630 | 940 | itera = self.buff.get_iter_at_mark(mark) | 962 | itera = self.buff.get_iter_at_mark(mark) |
1631 | 941 | self.buff.delete_mark(mark) | 963 | self.buff.delete_mark(mark) |
1632 | 942 | 964 | ||
1633 | @@ -946,7 +968,7 @@ | |||
1634 | 946 | enter = True | 968 | enter = True |
1635 | 947 | if itera.starts_line(): | 969 | if itera.starts_line(): |
1636 | 948 | mark = self.buff.create_mark(None, itera, True) | 970 | mark = self.buff.create_mark(None, itera, True) |
1638 | 949 | self.buff.insert(itera,"\n") | 971 | self.buff.insert(itera, "\n") |
1639 | 950 | itera = self.buff.get_iter_at_mark(mark) | 972 | itera = self.buff.get_iter_at_mark(mark) |
1640 | 951 | self.buff.delete_mark(mark) | 973 | self.buff.delete_mark(mark) |
1641 | 952 | enter = False | 974 | enter = False |
1642 | @@ -977,9 +999,9 @@ | |||
1643 | 977 | #It will be later replaced by the good one with right gravity | 999 | #It will be later replaced by the good one with right gravity |
1644 | 978 | temp_mark = self.buff.create_mark("temp", start_i, True) | 1000 | temp_mark = self.buff.create_mark("temp", start_i, True) |
1645 | 979 | 1001 | ||
1647 | 980 | end = buff.create_mark("end", start_i, False) | 1002 | end = buff.create_mark("end", start_i, False) |
1648 | 981 | if enter: | 1003 | if enter: |
1650 | 982 | buff.insert(start_i,"\n") | 1004 | buff.insert(start_i, "\n") |
1651 | 983 | 1005 | ||
1652 | 984 | #Moving the end of subtask mark to the position of the temp mark | 1006 | #Moving the end of subtask mark to the position of the temp mark |
1653 | 985 | if stag: | 1007 | if stag: |
1654 | @@ -994,7 +1016,7 @@ | |||
1655 | 994 | #This is normally not needed and purely defensive | 1016 | #This is normally not needed and purely defensive |
1656 | 995 | if itera.get_line() <= 0: | 1017 | if itera.get_line() <= 0: |
1657 | 996 | itera = buff.get_iter_at_line(1) | 1018 | itera = buff.get_iter_at_line(1) |
1659 | 997 | start = buff.create_mark("start", itera, True) | 1019 | start = buff.create_mark("start", itera, True) |
1660 | 998 | indentation = "" | 1020 | indentation = "" |
1661 | 999 | #adding two spaces by level | 1021 | #adding two spaces by level |
1662 | 1000 | spaces = " " | 1022 | spaces = " " |
1663 | @@ -1007,7 +1029,6 @@ | |||
1664 | 1007 | self.__apply_tag_to_mark(start, end, tag=indenttag) | 1029 | self.__apply_tag_to_mark(start, end, tag=indenttag) |
1665 | 1008 | return end | 1030 | return end |
1666 | 1009 | 1031 | ||
1667 | 1010 | |||
1668 | 1011 | def __apply_tag_to_mark(self, start, end, tag=None, name=None): | 1032 | def __apply_tag_to_mark(self, start, end, tag=None, name=None): |
1669 | 1012 | start_i = self.buff.get_iter_at_mark(start) | 1033 | start_i = self.buff.get_iter_at_mark(start) |
1670 | 1013 | end_i = self.buff.get_iter_at_mark(end) | 1034 | end_i = self.buff.get_iter_at_mark(end) |
1671 | @@ -1027,9 +1048,8 @@ | |||
1672 | 1027 | else: | 1048 | else: |
1673 | 1028 | buff.insert(ite, text) | 1049 | buff.insert(ite, text) |
1674 | 1029 | 1050 | ||
1675 | 1030 | |||
1676 | 1031 | def _get_indent_level(self, itera): | 1051 | def _get_indent_level(self, itera): |
1678 | 1032 | line_nbr = itera.get_line() | 1052 | line_nbr = itera.get_line() |
1679 | 1033 | start_line = itera.copy() | 1053 | start_line = itera.copy() |
1680 | 1034 | start_line.set_line(line_nbr) | 1054 | start_line.set_line(line_nbr) |
1681 | 1035 | tags = start_line.get_tags() | 1055 | tags = start_line.get_tags() |
1682 | @@ -1046,10 +1066,10 @@ | |||
1683 | 1046 | 1066 | ||
1684 | 1047 | #First, we analyse the selection to put in our own | 1067 | #First, we analyse the selection to put in our own |
1685 | 1048 | #GTG clipboard a selection with description of subtasks | 1068 | #GTG clipboard a selection with description of subtasks |
1687 | 1049 | bounds = self.buff.get_selection_bounds() | 1069 | bounds = self.buff.get_selection_bounds() |
1688 | 1050 | if not bounds: | 1070 | if not bounds: |
1689 | 1051 | return | 1071 | return |
1691 | 1052 | start, stop = self.buff.get_selection_bounds() | 1072 | start, stop = self.buff.get_selection_bounds() |
1692 | 1053 | 1073 | ||
1693 | 1054 | self.clipboard.copy(start, stop, bullet=self.bullet1) | 1074 | self.clipboard.copy(start, stop, bullet=self.bullet1) |
1694 | 1055 | 1075 | ||
1695 | @@ -1105,10 +1125,10 @@ | |||
1696 | 1105 | 1125 | ||
1697 | 1106 | #First, we will get the actual indentation value | 1126 | #First, we will get the actual indentation value |
1698 | 1107 | #The nbr just before the \n | 1127 | #The nbr just before the \n |
1700 | 1108 | line_nbr = itera.get_line() | 1128 | line_nbr = itera.get_line() |
1701 | 1109 | start_line = itera.copy() | 1129 | start_line = itera.copy() |
1702 | 1110 | start_line.set_line(line_nbr) | 1130 | start_line.set_line(line_nbr) |
1704 | 1111 | end_line = itera.copy() | 1131 | end_line = itera.copy() |
1705 | 1112 | tags = start_line.get_tags() | 1132 | tags = start_line.get_tags() |
1706 | 1113 | subtask_nbr = None | 1133 | subtask_nbr = None |
1707 | 1114 | current_indent = self._get_indent_level(itera) | 1134 | current_indent = self._get_indent_level(itera) |
1708 | @@ -1157,24 +1177,28 @@ | |||
1709 | 1157 | #the "-" might be after a space | 1177 | #the "-" might be after a space |
1710 | 1158 | #Python 2.5 should allow both tests in one | 1178 | #Python 2.5 should allow both tests in one |
1711 | 1159 | if current_indent == 0: | 1179 | if current_indent == 0: |
1713 | 1160 | if (line.startswith('-') or line.startswith(' -')) and line.lstrip(' -').strip() != "": | 1180 | if (line.startswith('-') or line.startswith(' -')) \ |
1714 | 1181 | and line.lstrip(' -').strip() != "": | ||
1715 | 1161 | line = line.lstrip(' -') | 1182 | line = line.lstrip(' -') |
1717 | 1162 | end_i = self.__newsubtask(self.buff, line, line_nbr) | 1183 | end_i = self.__newsubtask(self.buff, line, |
1718 | 1184 | line_nbr) | ||
1719 | 1163 | #Here, we should increment indent level | 1185 | #Here, we should increment indent level |
1720 | 1164 | #If we inserted enter in the middle of a line | 1186 | #If we inserted enter in the middle of a line |
1721 | 1165 | if restofline and restofline.strip() != "": | 1187 | if restofline and restofline.strip() != "": |
1722 | 1166 | #it means we have two subtask to create | 1188 | #it means we have two subtask to create |
1723 | 1167 | if self.buff.get_line_count() > line_nbr+1: | 1189 | if self.buff.get_line_count() > line_nbr+1: |
1724 | 1168 | #but don't merge with the next line | 1190 | #but don't merge with the next line |
1728 | 1169 | itera = self.buff.get_iter_at_line(line_nbr+1) | 1191 | itera = self.buff.get_iter_at_line( |
1729 | 1170 | self.buff.insert(itera,"\n\n") | 1192 | line_nbr + 1) |
1730 | 1171 | self.__newsubtask(self.buff, restofline,\ | 1193 | self.buff.insert(itera, "\n\n") |
1731 | 1194 | self.__newsubtask(self.buff, restofline, | ||
1732 | 1172 | line_nbr+1) | 1195 | line_nbr+1) |
1733 | 1173 | else: | 1196 | else: |
1735 | 1174 | self.insert_indent(self.buff, end_i, 1, enter=True) | 1197 | self.insert_indent(self.buff, end_i, 1, |
1736 | 1198 | enter=True) | ||
1737 | 1175 | tv.emit_stop_by_name('insert-text') | 1199 | tv.emit_stop_by_name('insert-text') |
1738 | 1176 | else: | 1200 | else: |
1740 | 1177 | self.buff.insert(itera,"\n") | 1201 | self.buff.insert(itera, "\n") |
1741 | 1178 | tv.emit_stop_by_name('insert-text') | 1202 | tv.emit_stop_by_name('insert-text') |
1742 | 1179 | 1203 | ||
1743 | 1180 | #Then, if indent > 0, we increment it | 1204 | #Then, if indent > 0, we increment it |
1744 | @@ -1191,22 +1215,26 @@ | |||
1745 | 1191 | else: | 1215 | else: |
1746 | 1192 | #we first put the subtask one line below | 1216 | #we first put the subtask one line below |
1747 | 1193 | itera2 = self.buff.get_iter_at_line(line_nbr) | 1217 | itera2 = self.buff.get_iter_at_line(line_nbr) |
1749 | 1194 | self.buff.insert(itera2,"\n") | 1218 | self.buff.insert(itera2, "\n") |
1750 | 1195 | #and increment the new white line | 1219 | #and increment the new white line |
1751 | 1196 | itera2 = self.buff.get_iter_at_line(line_nbr) | 1220 | itera2 = self.buff.get_iter_at_line(line_nbr) |
1753 | 1197 | self.insert_indent(self.buff, itera2, current_indent, enter=False) | 1221 | self.insert_indent(self.buff, itera2, |
1754 | 1222 | current_indent, enter=False) | ||
1755 | 1198 | elif current_indent == 1: | 1223 | elif current_indent == 1: |
1757 | 1199 | self.insert_indent(self.buff, itera, current_indent) | 1224 | self.insert_indent(self.buff, itera, |
1758 | 1225 | current_indent) | ||
1759 | 1200 | #we stop the signal in all cases | 1226 | #we stop the signal in all cases |
1760 | 1201 | tv.emit_stop_by_name('insert-text') | 1227 | tv.emit_stop_by_name('insert-text') |
1761 | 1202 | #Then we close the tag tag | 1228 | #Then we close the tag tag |
1762 | 1203 | if closed_tag: | 1229 | if closed_tag: |
1763 | 1204 | insert_mark = self.buff.get_mark("insert_point") | 1230 | insert_mark = self.buff.get_mark("insert_point") |
1764 | 1205 | insert_iter = self.buff.get_iter_at_mark(insert_mark) | 1231 | insert_iter = self.buff.get_iter_at_mark(insert_mark) |
1766 | 1206 | self.buff.move_mark_by_name("/%s"%closed_tag, insert_iter) | 1232 | self.buff.move_mark_by_name("/%s" % closed_tag, |
1767 | 1233 | insert_iter) | ||
1768 | 1207 | self.buff.delete_mark(insert_mark) | 1234 | self.buff.delete_mark(insert_mark) |
1769 | 1208 | if cutting_subtask: | 1235 | if cutting_subtask: |
1771 | 1209 | cursor = self.buff.get_iter_at_mark(self.buff.get_insert()) | 1236 | cursor = self.buff.get_iter_at_mark( |
1772 | 1237 | self.buff.get_insert()) | ||
1773 | 1210 | endl = cursor.copy() | 1238 | endl = cursor.copy() |
1774 | 1211 | if not endl.ends_line(): | 1239 | if not endl.ends_line(): |
1775 | 1212 | endl.forward_to_line_end() | 1240 | endl.forward_to_line_end() |
1776 | @@ -1222,7 +1250,7 @@ | |||
1777 | 1222 | if itera.starts_line(): | 1250 | if itera.starts_line(): |
1778 | 1223 | #we are at the start of an existing subtask | 1251 | #we are at the start of an existing subtask |
1779 | 1224 | #we simply move that subtask down | 1252 | #we simply move that subtask down |
1781 | 1225 | self.buff.insert(itera,"\n") | 1253 | self.buff.insert(itera, "\n") |
1782 | 1226 | itera2 = self.buff.get_iter_at_line(line_nbr) | 1254 | itera2 = self.buff.get_iter_at_line(line_nbr) |
1783 | 1227 | self.buff.insert(itera2, tex) | 1255 | self.buff.insert(itera2, tex) |
1784 | 1228 | itera3 = self.buff.get_iter_at_line(line_nbr) | 1256 | itera3 = self.buff.get_iter_at_line(line_nbr) |
1785 | @@ -1230,25 +1258,28 @@ | |||
1786 | 1230 | self.buff.place_cursor(itera3) | 1258 | self.buff.place_cursor(itera3) |
1787 | 1231 | tv.emit_stop_by_name('insert-text') | 1259 | tv.emit_stop_by_name('insert-text') |
1788 | 1232 | else: | 1260 | else: |
1790 | 1233 | #self.__newsubtask(self.buff, tex, line_nbr, level=current_indent) | 1261 | #self.__newsubtask(self.buff, tex, line_nbr, |
1791 | 1262 | # level=current_indent) | ||
1792 | 1234 | anchor = self.new_subtask_callback(tex) | 1263 | anchor = self.new_subtask_callback(tex) |
1793 | 1235 | self.buff.create_mark(anchor, itera, True) | 1264 | self.buff.create_mark(anchor, itera, True) |
1794 | 1236 | self.buff.create_mark("/%s"%anchor, itera, False) | 1265 | self.buff.create_mark("/%s"%anchor, itera, False) |
1796 | 1237 | self.insert_sigid = self.buff.connect('insert-text', self._insert_at_cursor) | 1266 | self.insert_sigid = self.buff.connect('insert-text', |
1797 | 1267 | self._insert_at_cursor) | ||
1798 | 1238 | self.connect('key_press_event', self._keypress) | 1268 | self.connect('key_press_event', self._keypress) |
1799 | 1239 | self.modified_sigid = self.buff.connect("changed", self.modified) | 1269 | self.modified_sigid = self.buff.connect("changed", self.modified) |
1800 | 1240 | 1270 | ||
1801 | 1241 | def _keypress(self, widget, event): | 1271 | def _keypress(self, widget, event): |
1802 | 1242 | # Check for Ctrl-Return/Enter | 1272 | # Check for Ctrl-Return/Enter |
1804 | 1243 | if event.state & gtk.gdk.CONTROL_MASK and event.keyval in (gtk.keysyms.Return, gtk.keysyms.KP_Enter): | 1273 | if event.state & gtk.gdk.CONTROL_MASK and \ |
1805 | 1274 | event.keyval in (gtk.keysyms.Return, gtk.keysyms.KP_Enter): | ||
1806 | 1244 | buff = self.buff | 1275 | buff = self.buff |
1807 | 1245 | cursor_mark = buff.get_insert() | 1276 | cursor_mark = buff.get_insert() |
1808 | 1246 | cursor_iter = buff.get_iter_at_mark(cursor_mark) | 1277 | cursor_iter = buff.get_iter_at_mark(cursor_mark) |
1809 | 1247 | local_start = cursor_iter.copy() | 1278 | local_start = cursor_iter.copy() |
1810 | 1248 | 1279 | ||
1811 | 1249 | for tag in local_start.get_tags(): | 1280 | for tag in local_start.get_tags(): |
1814 | 1250 | anchor = tag.get_data('link') | 1281 | anchor = tag.get_data('link') |
1815 | 1251 | typ = tag.get_data('type') | 1282 | typ = tag.get_data('type') |
1816 | 1252 | if(anchor): | 1283 | if(anchor): |
1817 | 1253 | if typ == "subtask": | 1284 | if typ == "subtask": |
1818 | 1254 | self.open_task(anchor) | 1285 | self.open_task(anchor) |
1819 | @@ -1278,12 +1309,12 @@ | |||
1820 | 1278 | self.buff.disconnect(self.delete_sigid) | 1309 | self.buff.disconnect(self.delete_sigid) |
1821 | 1279 | #print "deintdent-delete: %s" %self.buff.get_text(startline, itera) | 1310 | #print "deintdent-delete: %s" %self.buff.get_text(startline, itera) |
1822 | 1280 | self.buff.delete(startline, itera) | 1311 | self.buff.delete(startline, itera) |
1823 | 1281 | self.delete_sigid = self.buff.connect("delete-range", \ | ||
1824 | 1282 | self._delete_range) | ||
1825 | 1283 | #For the day when we will have different indent levels | 1312 | #For the day when we will have different indent levels |
1826 | 1284 | #newiter = self.buff.get_iter_at_mark(tempm) | 1313 | #newiter = self.buff.get_iter_at_mark(tempm) |
1827 | 1285 | #self.buff.delete_mark(tempm) | 1314 | #self.buff.delete_mark(tempm) |
1828 | 1286 | #self.insert_indent(self.buff, newiter, newlevel, enter=False) | 1315 | #self.insert_indent(self.buff, newiter, newlevel, enter=False) |
1829 | 1316 | self.delete_sigid = self.buff.connect("delete-range", | ||
1830 | 1317 | self._delete_range) | ||
1831 | 1287 | 1318 | ||
1832 | 1288 | def backspace(self, tv): | 1319 | def backspace(self, tv): |
1833 | 1289 | self.buff.disconnect(self.insert_sigid) | 1320 | self.buff.disconnect(self.insert_sigid) |
1834 | @@ -1298,7 +1329,7 @@ | |||
1835 | 1298 | #we stopped the signal, don't forget to erase | 1329 | #we stopped the signal, don't forget to erase |
1836 | 1299 | #the selection if one | 1330 | #the selection if one |
1837 | 1300 | self.buff.delete_selection(True, True) | 1331 | self.buff.delete_selection(True, True) |
1839 | 1301 | self.insert_sigid = self.buff.connect('insert-text', \ | 1332 | self.insert_sigid = self.buff.connect('insert-text', |
1840 | 1302 | self._insert_at_cursor) | 1333 | self._insert_at_cursor) |
1841 | 1303 | 1334 | ||
1842 | 1304 | #The mouse is moving. We must change it to a hand when hovering over a link | 1335 | #The mouse is moving. We must change it to a hand when hovering over a link |
1843 | @@ -1318,8 +1349,11 @@ | |||
1844 | 1318 | tag_table = self.buff.get_tag_table() | 1349 | tag_table = self.buff.get_tag_table() |
1845 | 1319 | tag_table.foreach(self.__tag_reset, window) | 1350 | tag_table.foreach(self.__tag_reset, window) |
1846 | 1320 | 1351 | ||
1849 | 1321 | #We clicked on a link | 1352 | def _tag_event(self, tag, view, ev, _iter, text, anchor, typ): |
1850 | 1322 | def _tag_event(self, tag, view, ev, _iter, text, anchor, typ): #pylint: disable-msg=W0613 | 1353 | """ |
1851 | 1354 | We clicked on a link | ||
1852 | 1355 | """ | ||
1853 | 1356 | #pylint: disable-msg=W0613 | ||
1854 | 1323 | _type = ev.type | 1357 | _type = ev.type |
1855 | 1324 | if _type == gtk.gdk.MOTION_NOTIFY: | 1358 | if _type == gtk.gdk.MOTION_NOTIFY: |
1856 | 1325 | return | 1359 | return |
1857 | @@ -1330,14 +1364,17 @@ | |||
1858 | 1330 | if typ == "subtask": | 1364 | if typ == "subtask": |
1859 | 1331 | self.open_task(anchor) | 1365 | self.open_task(anchor) |
1860 | 1332 | elif typ == "http": | 1366 | elif typ == "http": |
1862 | 1333 | if button == 1 and self.check_link(anchor) and self.buff.get_has_selection() == False: | 1367 | if button == 1 and self.check_link(anchor) and \ |
1863 | 1368 | not self.buff.get_has_selection(): | ||
1864 | 1334 | openurl(anchor) | 1369 | openurl(anchor) |
1865 | 1335 | else: | 1370 | else: |
1866 | 1336 | print "Unknown link type for %s" %anchor | 1371 | print "Unknown link type for %s" %anchor |
1867 | 1337 | self.emit('anchor-clicked', text, anchor, button) | 1372 | self.emit('anchor-clicked', text, anchor, button) |
1869 | 1338 | self.__set_anchor(ev.window, tag, cursor, self.get_property('hover')) | 1373 | self.__set_anchor(ev.window, tag, cursor, |
1870 | 1374 | self.get_property('hover')) | ||
1871 | 1339 | elif button in [1, 2]: | 1375 | elif button in [1, 2]: |
1873 | 1340 | self.__set_anchor(ev.window, tag, cursor, self.get_property('active')) | 1376 | self.__set_anchor(ev.window, tag, cursor, |
1874 | 1377 | self.get_property('active')) | ||
1875 | 1341 | 1378 | ||
1876 | 1342 | def __tag_reset(self, tag, window): | 1379 | def __tag_reset(self, tag, window): |
1877 | 1343 | if tag.get_data('is_anchor'): | 1380 | if tag.get_data('is_anchor'): |
1878 | @@ -1351,7 +1388,8 @@ | |||
1879 | 1351 | linktype = 'link' | 1388 | linktype = 'link' |
1880 | 1352 | else: | 1389 | else: |
1881 | 1353 | linktype = 'failedlink' | 1390 | linktype = 'failedlink' |
1883 | 1354 | self.__set_anchor(window, tag, editing_cursor, self.get_property(linktype)) | 1391 | self.__set_anchor(window, tag, editing_cursor, |
1884 | 1392 | self.get_property(linktype)) | ||
1885 | 1355 | 1393 | ||
1886 | 1356 | def __set_anchor(self, window, tag, cursor, prop): | 1394 | def __set_anchor(self, window, tag, cursor, prop): |
1887 | 1357 | window.set_cursor(cursor) | 1395 | window.set_cursor(cursor) |
1888 | 1358 | 1396 | ||
1889 | === modified file 'GTG/gtk/editor/taskviewserial.py' | |||
1890 | --- GTG/gtk/editor/taskviewserial.py 2012-05-23 08:55:31 +0000 | |||
1891 | +++ GTG/gtk/editor/taskviewserial.py 2012-11-25 21:29:25 +0000 | |||
1892 | @@ -107,8 +107,8 @@ | |||
1893 | 107 | elif ta.get_data('is_subtask'): | 107 | elif ta.get_data('is_subtask'): |
1894 | 108 | #The current gtkTextTag is a subtask | 108 | #The current gtkTextTag is a subtask |
1895 | 109 | tagname = "subtask" | 109 | tagname = "subtask" |
1898 | 110 | subt = doc.createElement(tagname) | 110 | subt = doc.createElement(tagname) |
1899 | 111 | target = ta.get_data('child') | 111 | target = ta.get_data('child') |
1900 | 112 | subt.appendChild(doc.createTextNode(target)) | 112 | subt.appendChild(doc.createTextNode(target)) |
1901 | 113 | parent.appendChild(subt) | 113 | parent.appendChild(subt) |
1902 | 114 | parent.appendChild(doc.createTextNode("\n")) | 114 | parent.appendChild(doc.createTextNode("\n")) |
1903 | @@ -187,7 +187,7 @@ | |||
1904 | 187 | #parse the XML and put the content in the buffer | 187 | #parse the XML and put the content in the buffer |
1905 | 188 | def parsexml(self, buf, ite, element): | 188 | def parsexml(self, buf, ite, element): |
1906 | 189 | start = buf.create_mark(None, ite, True) | 189 | start = buf.create_mark(None, ite, True) |
1908 | 190 | end = buf.create_mark(None, ite, False) | 190 | end = buf.create_mark(None, ite, False) |
1909 | 191 | subtasks = self.tv.get_subtasks() | 191 | subtasks = self.tv.get_subtasks() |
1910 | 192 | taglist2 = [] | 192 | taglist2 = [] |
1911 | 193 | if element: | 193 | if element: |
Ok for me. There are some comments that could probably be deleted here and there (mainly editor.py), but that can be done in another pass.