Can restore closed tabs
authorthib
Thu Sep 18 19:11:43 2008 +0000 (2008-09-18)
changeset 7f1ffefe6f706
parent 6 947429a724d7
child 8 b96bcb97111e
Can restore closed tabs
browser_window.py
     1.1 --- a/browser_window.py	Thu Sep 18 17:46:42 2008 +0000
     1.2 +++ b/browser_window.py	Thu Sep 18 19:11:43 2008 +0000
     1.3 @@ -48,6 +48,7 @@
     1.4          self._window_list.remove(widget)
     1.5          self.emit('window-removed')
     1.6  
     1.7 +
     1.8      def __len__(self):
     1.9          return len(self._window_list)
    1.10  
    1.11 @@ -56,6 +57,49 @@
    1.12          return y in self._window_list
    1.13  
    1.14  
    1.15 +    def __getitem__(self, y):
    1.16 +        return self._window_list[y]
    1.17 +
    1.18 +
    1.19 +class ClosedTabsList(gobject.GObject):
    1.20 +    def __init__(self):
    1.21 +        self._list = list()
    1.22 +
    1.23 +
    1.24 +    def add(self, uri, title):
    1.25 +        if (uri, title) in self._list:
    1.26 +            self._list.remove((uri, title))
    1.27 +        self._list.insert(0, (uri, title))
    1.28 +        self.check_len()
    1.29 +
    1.30 +
    1.31 +    def clean(self):
    1.32 +        self._list = list()
    1.33 +
    1.34 +
    1.35 +    def remove(self, item):
    1.36 +        if item in self._list:
    1.37 +            self._list.remove(item)
    1.38 +
    1.39 +
    1.40 +    def check_len(self, max_len=8):
    1.41 +        if len(self._list) > max_len:
    1.42 +            count = len(self._list) - max_len
    1.43 +            for i in xrange(count):
    1.44 +                del self._list[max_len]
    1.45 +
    1.46 +
    1.47 +    def __len__(self):
    1.48 +        return len(self._list)
    1.49 +
    1.50 +
    1.51 +    def __contains__(self, y):
    1.52 +        return y in self._list
    1.53 +
    1.54 +
    1.55 +    def __getitem__(self, y):
    1.56 +        return self._list[y]
    1.57 +
    1.58  
    1.59  class BrowserWindow(gtk.Window):
    1.60      def __init__(self, pages=None):
    1.61 @@ -64,7 +108,10 @@
    1.62          
    1.63          vbox = gtk.VBox()
    1.64          self.add(vbox)
    1.65 -        
    1.66 +
    1.67 +        # Various things
    1.68 +        self.closed_tabs = ClosedTabsList()
    1.69 +
    1.70          # Fake menubar
    1.71          self._menubar = BrowserMenu()
    1.72          self._menubar.new_tab_item.connect('activate', lambda *x: self.add_page('', True))
    1.73 @@ -86,6 +133,8 @@
    1.74          self._notebook.connect('page-removed', self.handle_page_removed)
    1.75          self._notebook.connect('create-window', self.handle_create_window)
    1.76          
    1.77 +        self._menubar.connect('restore-page', lambda widget, url: self.add_page(url))
    1.78 +        
    1.79          # Add pages
    1.80          if pages is None:
    1.81              pages = ['http://thibg.dyndns.org/']
    1.82 @@ -118,9 +167,11 @@
    1.83  
    1.84  
    1.85      def remove_page(self, page):
    1.86 +        self.closed_tabs.add(page.uri, page.title)
    1.87          num = self._notebook.page_num(page)
    1.88          self._notebook.remove_page(num)
    1.89          self.check_pages_nb()
    1.90 +        self._menubar.update(self.closed_tabs)
    1.91  
    1.92  
    1.93      def check_pages_nb(self):
    1.94 @@ -167,6 +218,10 @@
    1.95  
    1.96  
    1.97  class BrowserMenu(gtk.MenuBar):
    1.98 +    __gsignals__ = {
    1.99 +        'restore-page' : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE,
   1.100 +                         (gobject.TYPE_STRING,)),
   1.101 +    }
   1.102      def __init__(self):
   1.103          gtk.MenuBar.__init__(self)
   1.104          #self.set_accel_group(self)
   1.105 @@ -192,11 +247,41 @@
   1.106          self.append(menu_item)
   1.107  
   1.108          # Fake menu item for closed tabs and wins
   1.109 -        imagem = gtk.MenuItem()
   1.110 +        self.trash_menu_item = gtk.MenuItem()
   1.111          image = gtk.image_new_from_stock(gtk.STOCK_UNDELETE, gtk.ICON_SIZE_MENU)
   1.112 -        imagem.add(image)
   1.113 -        imagem.set_sensitive(False)
   1.114 -        imagem.set_right_justified(True)
   1.115 -        self.append(imagem)
   1.116 +        self.trash_menu_item.add(image)
   1.117 +        self.trash_menu_item.set_sensitive(False)
   1.118 +        self.trash_menu_item.set_right_justified(True)
   1.119 +        self.append(self.trash_menu_item)
   1.120 +
   1.121 +
   1.122 +    def handle_trash_clean(self, widget, trash_list):
   1.123 +        trash_list.clean()
   1.124 +        self.update(trash_list)
   1.125 +
   1.126 +
   1.127 +    def handle_trash_item(self, widget, trash_list, item):
   1.128 +        self.emit('restore-page', item[0])
   1.129 +        trash_list.remove(item)
   1.130 +        self.update(trash_list)
   1.131 +
   1.132 +
   1.133 +    def update(self, trash_list):
   1.134 +        self.trash_menu_item.set_sensitive(len(trash_list) > 0)
   1.135 +        trash_menu = gtk.Menu()
   1.136 +        for i in trash_list:
   1.137 +            menu_item = gtk.MenuItem(i[1])
   1.138 +            menu_item.connect('activate', self.handle_trash_item,
   1.139 +                              trash_list, i)
   1.140 +            trash_menu.append(menu_item)
   1.141 +
   1.142 +        trash_menu.append(gtk.SeparatorMenuItem())
   1.143 +
   1.144 +        menu_item = gtk.ImageMenuItem(stock_id=gtk.STOCK_CLEAR)
   1.145 +        menu_item.connect('activate', self.handle_trash_clean, trash_list)
   1.146 +        trash_menu.append(menu_item)
   1.147 +
   1.148 +        self.trash_menu_item.set_submenu(trash_menu)
   1.149 +        self.trash_menu_item.show_all()
   1.150          
   1.151