← Back to team overview

gtg team mailing list archive

[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