Author: andar

Revision: 5809

Log:
        Allow plugins to properly add tabs and have them restored upon restart 
- patch from Ian Martin

Diff:
Modified: trunk/deluge/ui/gtkui/torrentdetails.py
===================================================================
--- trunk/deluge/ui/gtkui/torrentdetails.py     2009-10-04 19:15:35 UTC (rev 
5808)
+++ trunk/deluge/ui/gtkui/torrentdetails.py     2009-10-04 19:24:15 UTC (rev 
5809)
@@ -127,41 +127,79 @@
             # Set the default order
             state = default_order
 
-        # Add the tabs in the order from the state
-        for tab_name, visible in state:
-            # We need to rename the tab in the state for backwards compat
-            tab_name = tab_name.replace("Statistics", "Status")
-            self.add_tab(default_tabs[tab_name]())
+        # We need to rename the tab in the state for backwards compat
+        self.state = [(tab_name.replace("Statistics", "Status"), visible) for
+                       tab_name, visible in state]
 
-        # Hide any of the non-visible ones
-        for tab_name, visible in state:
-            if not visible:
-                self.hide_tab(tab_name)
+        for tab in default_tabs.itervalues():
+            self.add_tab(tab(), generate_menu=False)
 
         # Generate the checklist menu
         self.generate_menu()
 
-    def add_tab(self, tab_object, position=-1, generate_menu=True):
-        """Adds a tab object to the notebook."""
-        self.tabs[tab_object.get_name()] = tab_object
-        pos = self.notebook.insert_page(
-            tab_object.get_child_widget(),
-            tab_object.get_tab_label(),
-            position)
+    def tab_insert_position(self, weight):
+        """Returns the position a tab with a given weight should be inserted 
in"""
+        # Determine insert position based on weight
+        # weights is a list of visible tab names in weight order
 
-        tab_object.position = pos
-        tab_object.weight = pos
+        weights = [(tab.weight, name) for name, tab in self.tabs.iteritems() 
if tab.is_visible]
 
-        # Regenerate positions if an insert occured
-        if position > -1:
-            self.regenerate_positions()
+        weights.sort()
+        log.debug("weights: %s", weights)
+        log.debug("weight of tab: %s", weight)
 
+        position = -1
+        for w, name in weights:
+            if w >= weight:
+                position = self.tabs[name].position
+                log.debug("Found pos %d" % position)
+                break
+        return position
+
+
+    def add_tab(self, tab, generate_menu=True, visible=None):
+        name = tab.get_name()
+
+        #find position of tab in self.state, this is the tab weight
+        weight = None
+        for w, item in enumerate(self.state):
+            if item[0] == name:
+                weight = w
+                if visible is None:
+                    visible = item[1]
+                break
+
+        if weight is None:
+            if visible is None:
+                visible = True
+            weight = len(self.state)
+            self.state.append((name, visible))
+
+        tab.weight = weight
+
+        if visible:
+            tab.is_visible = True
+            #add the tab at position guided by the weight
+            insert_pos = self.tab_insert_position(weight)
+            log.debug("Trying to insert tab at %d" % insert_pos)
+            pos = self.notebook.insert_page(
+                tab.get_child_widget(),
+                tab.get_tab_label(),
+                insert_pos)
+            log.debug("Tab inserted at %d" % pos)
+            tab.position = pos
+            if not self.notebook.get_property("visible"):
+                # If the notebook isn't visible, show it
+                self.visible(True)
+        else:
+            tab.is_visible = False
+
+        self.tabs[name] = tab
+
+        self.regenerate_positions()
         if generate_menu:
             self.generate_menu()
 
-        if not self.notebook.get_property("visible"):
-            # If the notebook isn't visible, show it
-            self.visible(True)
 
     def regenerate_positions(self):
         """This will sync up the positions in the tab, with the position stored
@@ -198,15 +236,8 @@
         """Shows all tabs"""
         for tab in self.tabs:
             if not self.tabs[tab].is_visible:
-                self.notebook.insert_page(
-                    self.tabs[tab].get_child_widget(),
-                    self.tabs[tab].get_tab_label(),
-                    self.tabs[tab].position)
-                self.tabs[tab].is_visible = True
+                self.show_tab(tab, generate_menu=False)
         self.generate_menu()
-        if not self.notebook.get_property("visible"):
-            # If the notebook isn't visible, show it
-            self.visible(True)
 
     def hide_tab(self, tab_name):
         """Hides tab by name"""
@@ -221,28 +252,13 @@
 
         self.visible(show)
 
-    def show_tab(self, tab_name):
+    def show_tab(self, tab_name, generate_menu=True):
         log.debug("%s\n%s\n%s", self.tabs[tab_name].get_child_widget(),
             self.tabs[tab_name].get_tab_label(),
             self.tabs[tab_name].position)
 
-        # Determine insert position based on weight
-        # weights is a list of visible tab names in weight order
-        weights = []
+        position = self.tab_insert_position(self.tabs[tab_name].weight)
 
-        for tab in self.tabs:
-            if self.tabs[tab].is_visible:
-                weights.append((self.tabs[tab].weight, 
self.tabs[tab].get_name()))
-
-        weights.sort()
-        log.debug("weights: %s", weights)
-        position = self.tabs[tab_name].position
-        log.debug("weight of tab: %s", self.tabs[tab_name].weight)
-        for i, w in enumerate(weights):
-            if w[0] >= self.tabs[tab_name].weight:
-                position = self.tabs[w[1]].position
-                break
-
         log.debug("position: %s", position)
         self.notebook.insert_page(
             self.tabs[tab_name].get_child_widget(),
@@ -250,7 +266,8 @@
             position)
         self.tabs[tab_name].is_visible = True
         self.regenerate_positions()
-        self.generate_menu()
+        if generate_menu:
+            self.generate_menu()
         self.visible(True)
 
     def generate_menu(self):
@@ -381,14 +398,17 @@
     def save_state(self):
         """We save the state, which is basically the tab_index list"""
         filename = "tabs.state"
-        state = []
-        for tab in self.tabs:
-            state.append((self.tabs[tab].weight, self.tabs[tab].get_name(),
-                self.tabs[tab].is_visible))
-        # Sort by weight
-        state.sort()
-        state = [(n, v) for w, n, v in state]
 
+        #Update the visiblity status of all tabs
+        #Leave tabs we dont know anything about it the state as they
+        #might come from a plugin
+        for i, (name, visible) in enumerate(self.state):
+            log.debug("Testing name: %s" % name)
+            if name in self.tabs:
+                self.state[i] = (name, self.tabs[name].is_visible)
+                log.debug("Set to %s %d" % self.state[i])
+        state = self.state
+
         # Get the config location for saving the state file
         config_location = deluge.configmanager.get_config_dir()
 



--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"deluge-commit" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/deluge-commit?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to