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