Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/widgets.py
diff options
context:
space:
mode:
Diffstat (limited to 'widgets.py')
-rw-r--r--widgets.py93
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)