diff options
Diffstat (limited to 'widgets.py')
-rw-r--r-- | widgets.py | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/widgets.py b/widgets.py new file mode 100644 index 0000000..b39ba5e --- /dev/null +++ b/widgets.py @@ -0,0 +1,93 @@ +# Copyright (C) 2006, Red Hat, Inc. +# Copyright (C) 2011, One Laptop Per Child +# Copyright (C) 2009, Tomeu Vizoso, Simon Schampijer +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +import gobject +import gtk + +from sugar.graphics.icon import Icon + + +class TabAdd(gtk.HBox): + __gtype_name__ = 'TabAdd' + + __gsignals__ = { + 'tab-added': (gobject.SIGNAL_RUN_FIRST, + gobject.TYPE_NONE, + ([])), + } + + def __init__(self): + gtk.HBox.__init__(self) + + add_tab_icon = Icon(icon_name='add') + button = gtk.Button() + button.props.relief = gtk.RELIEF_NONE + button.props.focus_on_click = False + icon_box = gtk.HBox() + icon_box.pack_start(add_tab_icon, True, False, 0) + button.add(icon_box) + button.connect('clicked', self.__button_clicked_cb) + button.set_name('browse-tab-add') + self.pack_start(button) + add_tab_icon.show() + icon_box.show() + button.show() + + def __button_clicked_cb(self, button): + self.emit('tab-added') + + +class BrowserNotebook(gtk.Notebook): + """Handle an extra tab at the end with an Add Tab button.""" + + def __init__(self): + gtk.Notebook.__init__(self) + self._switch_handler = self.connect('switch-page', + self.__on_switch_page) + + tab_add = TabAdd() + tab_add.connect('tab-added', self.on_add_tab) + empty_page = gtk.HBox() + self.append_page(empty_page, tab_add) + empty_page.show() + + def on_add_tab(self, obj): + raise NotImplementedError, "implement this in the subclass" + + def __on_switch_page(self, notebook, page, page_num): + """Don't switch to the extra tab at the end.""" + if page_num == gtk.Notebook.get_n_pages(self) - 1: + self.handler_block(self._switch_handler) + self.set_current_page(-1) + self.handler_unblock(self._switch_handler) + self.connect('switch-page', self.__on_switch_page) + self.stop_emission("switch-page") + + def get_n_pages(self): + """Skip the extra tab at the end on the pages count.""" + return gtk.Notebook.get_n_pages(self) - 1 + + def append_page(self, page, label): + """Append keeping the extra tab at the end.""" + return self.insert_page(page, label, self.get_n_pages()) + + def set_current_page(self, number): + """If indexing from the end, skip the extra tab.""" + if number < 0: + number = self.get_n_pages() - 1 + gtk.Notebook.set_current_page(self, number) |