gtg team mailing list archive
-
gtg team
-
Mailing list archive
-
Message #03652
[Merge] lp:~gtg/gtg/viewcount into lp:gtg
Lionel Dricot has proposed merging lp:~gtg/gtg/viewcount into lp:gtg.
Requested reviews:
Gtg developers (gtg)
Related bugs:
Bug #1001962 in Getting Things GNOME!: "Writing a tag in a task leave all the intermediary tags"
https://bugs.launchpad.net/gtg/+bug/1001962
For more details, see:
https://code.launchpad.net/~gtg/gtg/viewcount/+merge/130696
This branch solves the @t @ta @tag problem by using a new liblarch feature : the viewcount (which is a simpler viewtree).
It also removes any use of the "transparent" concept, which has been removed from liblarch.
Thing to test : performance regression and tag counting regressions.
--
https://code.launchpad.net/~gtg/gtg/viewcount/+merge/130696
Your team Gtg developers is requested to review the proposed merge of lp:~gtg/gtg/viewcount into lp:gtg.
=== modified file 'GTG/core/datastore.py'
--- GTG/core/datastore.py 2012-08-12 22:32:09 +0000
+++ GTG/core/datastore.py 2012-10-21 10:08:23 +0000
@@ -114,8 +114,6 @@
if self.__tagstore.has_node(name):
raise IndexError('tag %s was already in the datastore' % name)
- parameters['transparent'] = True
-
self.__tasks.add_filter(name, filter_func, parameters=parameters)
self.__tagstore.add_node(tag, parent_id=parent_id)
tag.set_save_callback(self.save)
=== modified file 'GTG/core/requester.py'
--- GTG/core/requester.py 2012-07-13 17:24:28 +0000
+++ GTG/core/requester.py 2012-10-21 10:08:23 +0000
@@ -54,6 +54,23 @@
def is_displayed(self, task):
return self.__basetree.get_viewtree(name='active').is_displayed(task)
+
+ def get_basetree(self):
+ return self.__basetree
+
+ #this method also update the viewcount of tags
+ def apply_global_filter(self,tree,filtername):
+ tree.apply_filter(filtername)
+ for t in self.get_all_tags():
+ ta = self.get_tag(t)
+ ta.apply_filter(filtername)
+
+ def unapply_global_filter(self,tree,filtername):
+ tree.unapply_filter(filtername)
+ for t in self.get_all_tags():
+ ta = self.get_tag(t)
+ ta.unapply_filter(filtername)
+
######### Filters bank #######################
# List, by name, all available filters
=== modified file 'GTG/core/tag.py'
--- GTG/core/tag.py 2012-07-23 14:43:13 +0000
+++ GTG/core/tag.py 2012-10-21 10:08:23 +0000
@@ -56,6 +56,30 @@
self._attributes = {'name': self._name}
for key, value in attributes.iteritems():
self.set_attribute(key, value)
+
+ self.viewcount = None
+
+ def __get_viewcount(self):
+ if not self.viewcount:
+ self.viewcount = self.req.get_basetree().get_viewcount\
+ (name=self.get_name())
+ self.viewcount.apply_filter(self.get_name())
+ self.viewcount.register_cllbck(self.modified)
+ return self.viewcount
+
+ def apply_filter(self,filtername):
+ if self.viewcount:
+ self.viewcount.apply_filter(filtername)
+
+ def unapply_filter(self,filtername):
+ if self.viewcount:
+ self.viewcount.unapply_filter(filtername)
+
+ #When a task change a tag, we may want to manually update
+ #To ensure that the task is well counted/uncounted for that tag
+ def update_task(self,nid):
+ vc = self.__get_viewcount()
+ vc.modify(nid)
#overiding some functions to not allow dnd of special tags
def add_parent(self, parent_id):
@@ -163,21 +187,18 @@
# this method purposefully doesn't rely on get_related_tasks()
# which does a similar job, in order to benefit from liblarch
# optimizations
- if not tasktree:
- tasktree = self.req.get_tasks_tree()
- sp_id = self.get_attribute("special")
+ vc = self.__get_viewcount()
+ sp_id = self.get_attribute("special")
if sp_id == "all":
- toreturn = tasktree.get_n_nodes(\
- withfilters=['active'], include_transparent=False)
+ vc.apply_filter('active')
+ toreturn = vc.get_n_nodes()
elif sp_id == "notag":
- toreturn = tasktree.get_n_nodes(\
- withfilters=['notag'], include_transparent=False)
+ vc.apply_filter('notag')
+ toreturn = vc.get_n_nodes()
elif sp_id == "sep":
toreturn = 0
else:
- tname = self.get_name()
- toreturn = tasktree.get_n_nodes(\
- withfilters=[tname], include_transparent=False)
+ toreturn = vc.get_n_nodes()
return toreturn
def get_related_tasks(self, tasktree=None):
@@ -187,16 +208,16 @@
sp_id = self.get_attribute("special")
if sp_id == "all":
toreturn = tasktree.get_nodes(\
- withfilters=['active'], include_transparent=False)
+ withfilters=['active'])
elif sp_id == "notag":
toreturn = tasktree.get_nodes(\
- withfilters=['notag'], include_transparent=False)
+ withfilters=['notag'])
elif sp_id == "sep" :
toreturn = []
else:
tname = self.get_name()
toreturn = tasktree.get_nodes(\
- withfilters=[tname], include_transparent=False)
+ withfilters=[tname])
return toreturn
def notify_related_tasks(self):
=== modified file 'GTG/core/task.py'
--- GTG/core/task.py 2012-08-15 15:23:45 +0000
+++ GTG/core/task.py 2012-10-21 10:08:23 +0000
@@ -601,6 +601,7 @@
#remove by tagname
def remove_tag(self, tagname):
+# print "remove tag %s" %tagname
modified = False
if tagname in self.tags:
self.tags.remove(tagname)
@@ -611,8 +612,12 @@
self.content = self._strip_tag(self.content, tagname)
if modified:
tag = self.req.get_tag(tagname)
+ # The ViewCount of the tag still doesn't know that
+ # the task was removed. We need to update manually
+ tag.update_task(self.get_id())
if tag:
tag.modified()
+# print "removing now %s and tag is %s - %s" %(tagname,tag, tag.get_active_tasks_count())
def set_only_these_tags(self, tags_list):
'''
=== modified file 'GTG/core/treefactory.py'
--- GTG/core/treefactory.py 2012-07-13 17:24:28 +0000
+++ GTG/core/treefactory.py 2012-10-21 10:08:23 +0000
@@ -45,14 +45,14 @@
'workview': [self.workview],
'active': [self.active],
'closed': [self.closed, {'flat': True}],
- 'notag': [self.notag, {'transparent': True}],
+ 'notag': [self.notag],
'workable': [self.is_workable],
'started': [self.is_started],
'workdue': [self.workdue],
'workstarted': [self.workstarted],
'worktostart': [self.worktostart],
'worklate': [self.worklate],
- 'no_disabled_tag': [self.no_disabled_tag, {'transparent': True}],
+ 'no_disabled_tag': [self.no_disabled_tag],
}
for f in f_dic:
@@ -80,7 +80,7 @@
alltag.set_attribute("icon", "gtg-tags-all")
alltag.set_attribute("order", 0)
tagtree.add_node(alltag)
- p = {'transparent': True}
+ p = {}
self.tasktree.add_filter(CoreConfig.ALLTASKS_TAG,\
self.alltag, parameters=p)
# Build the "without tag tag"
@@ -91,7 +91,7 @@
notag_tag.set_attribute("icon", "gtg-tags-none")
notag_tag.set_attribute("order", 2)
tagtree.add_node(notag_tag)
- p = {'transparent': True}
+ p = {}
self.tasktree.add_filter(CoreConfig.NOTAG_TAG,\
self.notag, parameters=p)
@@ -103,7 +103,7 @@
search_tag.set_attribute("icon", "search")
search_tag.set_attribute("order", 1)
tagtree.add_node(search_tag)
- p = {'transparent': True}
+ p = {}
self.tasktree.add_filter(CoreConfig.SEARCH_TAG,
search_filter, parameters=p)
=== modified file 'GTG/gtk/browser/browser.py'
--- GTG/gtk/browser/browser.py 2012-08-12 23:01:10 +0000
+++ GTG/gtk/browser/browser.py 2012-10-21 10:08:23 +0000
@@ -79,6 +79,7 @@
self.vmanager = vmanager
self.config = self.req.get_config('browser')
self.tag_active = False
+ self.applied_tags = []
#treeviews handlers
self.vtree_panes = {}
@@ -95,7 +96,7 @@
# Set up models
# Active Tasks
- self.activetree.apply_filter('active')
+ self.req.apply_global_filter(self.activetree,'active')
# Tags
self.tagtree = None
self.tagtreeview = None
@@ -201,10 +202,11 @@
self.tagtree = self.req.get_tag_tree()
self.tagtreeview = self.tv_factory.tags_treeview(self.tagtree)
#Tags treeview
- self.tagtreeview.connect('cursor-changed', \
- self.on_select_tag)
- self.tagtreeview.connect('row-activated', \
- self.on_select_tag)
+ #TODO : change that with a gtk.TreeSelection
+ self.tagtreeview.get_selection().connect('changed', \
+ self.on_select_tag)
+# self.tagtreeview.connect('row-activated', \
+# self.on_select_tag)
self.tagtreeview.connect('button-press-event', \
self.on_tag_treeview_button_press_event)
self.tagtreeview.connect('key-press-event', \
@@ -212,7 +214,7 @@
self.sidebar_container.add(self.tagtreeview)
# Refresh tree
- self.tagtree.reset_filters(transparent_only=True)
+# self.tagtree.reset_filters(transparent_only=True)
# expanding search tag does not work automatically, request it
self.expand_search_tag()
@@ -565,10 +567,10 @@
def set_view(self, viewname):
if viewname == 'default':
- self.activetree.unapply_filter('workview')
+ self.req.unapply_global_filter(self.activetree,'workview')
workview = False
elif viewname == 'workview':
- self.activetree.apply_filter('workview')
+ self.req.apply_global_filter(self.activetree,'workview')
workview = True
else:
raise Exception('Cannot set the view %s' %viewname)
@@ -613,13 +615,6 @@
### SIGNAL CALLBACKS ##########################################################
# Typically, reaction to user input & interactions with the GUI
#
- def register_filter_callback(self, cb):
- print "DEPRECATED function register_filter_callback."
- print "It is only dummy funnction now, ready for removing"
-
- def unregister_filter_callback(self, cb):
- print "DEPRECATED function unregister_filter_callback."
- print "It is only dummy funnction now, ready for removing"
def on_sort_column_changed(self, model):
sort_column, sort_order = model.get_sort_column_id()
@@ -1107,12 +1102,18 @@
task.set_status(Task.STA_DISMISSED)
self.close_all_task_editors(uid)
- def apply_filter_on_panes(self, filter_name):
- """ Apply filters for every pane: active tasks, closed tasks """
- for pane in self.vtree_panes:
- vtree = self.req.get_tasks_tree(name=pane, refresh=False)
- vtree.reset_filters(refresh=False, transparent_only=True)
- vtree.apply_filter(filter_name, refresh=True)
+ def apply_filter_on_panes(self, filter_name,refresh=True):
+ """ Apply filters for every pane: active tasks, closed tasks """
+ for pane in self.vtree_panes:
+ vtree = self.req.get_tasks_tree(name=pane, refresh=False)
+# vtree.reset_filters(refresh=False, transparent_only=True)
+ vtree.apply_filter(filter_name, refresh=refresh)
+
+ def unapply_filter_on_panes(self, filter_name,refresh=True):
+ """ Apply filters for every pane: active tasks, closed tasks """
+ for pane in self.vtree_panes:
+ vtree = self.req.get_tasks_tree(name=pane, refresh=False)
+ vtree.unapply_filter(filter_name, refresh=refresh)
def on_select_tag(self, widget=None, row=None, col=None):
"""
@@ -1128,17 +1129,21 @@
self.tv_factory.disable_update_tags()
#When you click on a tag, you want to unselect the tasks
- taglist = self.get_selected_tags()
- if len(taglist) > 0:
- tagname = taglist[0]
- self.apply_filter_on_panes(tagname)
-
- # In case of search tag, set query in quickadd for
- # refining search query
- tag = self.req.get_tag(tagname)
- if tag.is_search_tag():
- self.quickadd_entry.set_text(tag.get_attribute("query"))
-
+ new_taglist = self.get_selected_tags()
+ for tagname in self.applied_tags:
+ if tagname not in new_taglist:
+ self.unapply_filter_on_panes(tagname,refresh=False)
+
+ for tagname in new_taglist:
+ if tagname not in self.applied_tags:
+ self.apply_filter_on_panes(tagname)
+ # In case of search tag, set query in quickadd for
+ # refining search query
+ tag = self.req.get_tag(tagname)
+ if tag.is_search_tag():
+ self.quickadd_entry.set_text(tag.get_attribute("query"))
+
+ self.applied_tags = new_taglist
self.tv_factory.enable_update_tags()
def on_taskdone_cursor_changed(self, selection=None):
=== modified file 'GTG/gtk/editor/taskview.py'
--- GTG/gtk/editor/taskview.py 2012-07-13 17:24:28 +0000
+++ GTG/gtk/editor/taskview.py 2012-10-21 10:08:23 +0000
@@ -714,6 +714,7 @@
#adding tag to a local list
new_tags.append(my_word)
#adding tag to the model
+# print "adding %s to the add_tag_callback" %my_word
self.add_tag_callback(my_word)
# We set new word boundaries
@@ -733,6 +734,8 @@
for t in old_tags:
if not t in new_tags:
self.remove_tag_callback(t)
+# for t in new_tags:
+# self.add_tag_callback(t)
def is_at_title(self, buff, itera):
to_return = False
Follow ups
-
Re: [Merge] lp:~gtg/gtg/viewcount into lp:gtg
From: Izidor Matušov, 2012-11-01
-
[Merge] lp:~gtg/gtg/viewcount into lp:gtg
From: noreply, 2012-11-01
-
Re: [Merge] lp:~gtg/gtg/viewcount into lp:gtg
From: Bertrand Rousseau, 2012-11-01
-
Re: [Merge] lp:~gtg/gtg/viewcount into lp:gtg
From: Lionel Dricot, 2012-10-31
-
Re: [Merge] lp:~gtg/gtg/viewcount into lp:gtg
From: Izidor Matušov, 2012-10-31
-
Re: [Merge] lp:~gtg/gtg/viewcount into lp:gtg
From: Izidor Matušov, 2012-10-31
-
Re: [Merge] lp:~gtg/gtg/viewcount into lp:gtg
From: Lionel Dricot, 2012-10-29
-
Re: [Merge] lp:~gtg/gtg/viewcount into lp:gtg
From: Lionel Dricot, 2012-10-29
-
Re: [Merge] lp:~gtg/gtg/viewcount into lp:gtg
From: Lionel Dricot, 2012-10-28
-
Re: [Merge] lp:~gtg/gtg/viewcount into lp:gtg
From: Izidor Matušov, 2012-10-25
-
Re: [Merge] lp:~gtg/gtg/viewcount into lp:gtg
From: Lionel Dricot, 2012-10-23
-
Re: [Merge] lp:~gtg/gtg/viewcount into lp:gtg
From: Lionel Dricot, 2012-10-23
-
Re: [Merge] lp:~gtg/gtg/viewcount into lp:gtg
From: Lionel Dricot, 2012-10-23
-
Re: [Merge] lp:~gtg/gtg/viewcount into lp:gtg
From: Lionel Dricot, 2012-10-23
-
Re: [Merge] lp:~gtg/gtg/viewcount into lp:gtg
From: Lionel Dricot, 2012-10-23
-
Re: [Merge] lp:~gtg/gtg/viewcount into lp:gtg
From: Lionel Dricot, 2012-10-23
-
Re: [Merge] lp:~gtg/gtg/viewcount into lp:gtg
From: Izidor Matušov, 2012-10-22