Fix hidden selection on :del
authorJack Miller <jack@codezen.org>
Tue, 23 Jun 2015 19:59:20 +0000 (14:59 -0500)
committerJack Miller <jack@codezen.org>
Tue, 23 Jun 2015 19:59:20 +0000 (14:59 -0500)
For now, just unset the selection (similar to the initial state). May
want to scroll back/forward to get the nearest selection, but for now
just not being offscreen is okay.

canto_curses/taglist.py
tests/test-screen.py

index f2b7234..1bc0b60 100644 (file)
@@ -273,6 +273,7 @@ class TagList(GuiBase):
     def on_new_tagcore(self, tagcore):
         log.debug("Instantiating Tag() for %s", tagcore.tag)
         Tag(tagcore, self.callbacks)
+        self.callbacks["set_var"]("needs_refresh", True)
 
     def on_del_tagcore(self, tagcore):
         log.debug("taglist on_del_tag")
@@ -291,9 +292,11 @@ class TagList(GuiBase):
 
     def on_eval_tags_changed(self):
         self.callbacks["force_sync"]()
+        self.callbacks["release_gui"]()
 
     def on_update_complete(self):
         self.callbacks["force_sync"]()
+        self.callbacks["release_gui"]()
 
     # Called with sync_lock, so we are unrestricted.
 
@@ -896,9 +899,6 @@ class TagList(GuiBase):
                 log.info("tag %s is not a feed tag")
 
     def update_tag_lists(self):
-        sel = self.callbacks["get_var"]("selected")
-        toffset = self.callbacks["get_var"]("target_offset")
-
         curtags = self.callbacks["get_var"]("curtags")
         self.tags = []
 
@@ -909,6 +909,21 @@ class TagList(GuiBase):
                 if tagobj.tag == tag:
                     self.tags.append(tagobj)
 
+        # If selected is stale (i.e. its tag was deleted, the item should stick
+        # around in all other cases) then unset it.
+
+        sel = self.callbacks["get_var"]("selected")
+        tobj = self.callbacks["get_var"]("target_obj")
+
+        if sel and ((sel.is_tag and sel not in self.tags) or (not sel.is_tag and sel.parent_tag == None)):
+            log.debug("Stale selection")
+            self.callbacks["set_var"]("selected", None)
+
+        if tobj and ((tobj.is_tag and tobj not in self.tags) or (not tobj.is_tag and tobj.parent_tag == None)):
+            log.debug("Stale target obj")
+            self.callbacks["set_var"]("target_obj", None)
+            self.callbacks["set_var"]("target_offset", 0)
+
         hide_empty = self.callbacks["get_opt"]("taglist.hide_empty_tags")
 
         cur_item_offset = 0
index 23968a0..5010132 100755 (executable)
@@ -71,7 +71,6 @@ class TestScreen(Test):
         if len(alltagcores[1]) != 20:
             raise Exception("Didn't get all items in tagcore[1]")
 
-
         self.wait_on_update()
 
         Test.__init__(self, name)
@@ -307,6 +306,11 @@ class TestScreen(Test):
         if curses.pairs[8] != [ 0, 0 ]:
             raise Exception("Pair not immediately honored! %s" % curses.pairs[8])
 
+    def test_del(self):
+        self.config_backend.inject("DELTAGS", [ "maintag:Tag(1)" ])
+        time.sleep(1)
+        self.check_taglist()
+
     def check(self):
         taglist = self.get_taglist()
 
@@ -322,6 +326,11 @@ class TestScreen(Test):
 
         self.test_sel_disappear()
 
+        self.test_command("next-item", None, True)
+
+        # Can't test this with a command because :del requires a live remote -> daemon.
+        self.test_del()
+
         self.check_taglist()
 
         return True