# Copyright (C) 2007, Red Hat, Inc. # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # This library 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 # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the # Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. """ STABLE. """ import gtk import gobject from sugar.graphics import style class ToolboxContainer(gtk.Container): __gtype_name__ = 'SugarToolboxContainer' def __init__(self, **kwargs): gobject.GObject.__init__(self, **kwargs) super(ToolboxContainer, self).__init__() def do_realize(self): self.set_flags(self.flags() | gtk.REALIZED) self.window = gtk.gdk.Window( self.get_parent_window(), width=self.allocation.width, height=self.allocation.height, window_type=gtk.gdk.WINDOW_CHILD, wclass=gtk.gdk.INPUT_OUTPUT, event_mask=self.get_events() | gtk.gdk.EXPOSURE_MASK | gtk.gdk.BUTTON1_MOTION_MASK | gtk.gdk.BUTTON_PRESS_MASK | gtk.gdk.POINTER_MOTION_MASK | gtk.gdk.POINTER_MOTION_HINT_MASK) self.window.set_user_data(self) self.style.attach(self.window) self.style.set_background(self.window, gtk.STATE_NORMAL) self.window.move_resize(*self.allocation) self.gc = self.style.fg_gc[gtk.STATE_NORMAL] self.modify_bg(gtk.STATE_NORMAL, style.COLOR_PANEL_GREY.get_gdk_color()) def do_size_request(self, requisition): requisition.height = style.TOOLBOX_SEPARATOR_HEIGHT # TODO: calculate our mininum width size requisition.width = 200 def do_size_allocate(self, allocation): if self.flags() & gtk.REALIZED: self.window.move_resize(*allocation) width, height = allocation.width, allocation.height def do_remove(self, child): pass class Toolbox(gtk.VBox): __gtype_name__ = 'SugarToolbox' __gsignals__ = { 'current-toolbar-changed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([int])), } def __init__(self): gtk.VBox.__init__(self) self._notebook = gtk.Notebook() self._notebook.set_tab_pos(gtk.POS_BOTTOM) self._notebook.set_show_border(False) self._notebook.set_show_tabs(False) self._notebook.props.tab_vborder = style.TOOLBOX_TAB_VBORDER self._notebook.props.tab_hborder = style.TOOLBOX_TAB_HBORDER self.pack_start(self._notebook) self._notebook.show() self._separator = ToolboxContainer() self.pack_start(self._separator, False) self._notebook.connect('notify::page', self._notify_page_cb) def _notify_page_cb(self, notebook, pspec): self.emit('current-toolbar-changed', notebook.props.page) def add_toolbar(self, name, toolbar): label = gtk.Label(name) width, height_ = label.size_request() label.set_size_request(max(width, style.TOOLBOX_TAB_LABEL_WIDTH), -1) label.set_alignment(0.0, 0.5) event_box = gtk.EventBox() alignment = gtk.Alignment(0.0, 0.0, 1.0, 1.0) alignment.set_padding(0, 0, style.TOOLBOX_HORIZONTAL_PADDING, style.TOOLBOX_HORIZONTAL_PADDING) alignment.add(toolbar) event_box.add(alignment) alignment.show() event_box.show() self._notebook.append_page(event_box, label) if self._notebook.get_n_pages() > 1: self._notebook.set_show_tabs(True) self._separator.show() def remove_toolbar(self, index): self._notebook.remove_page(index) if self._notebook.get_n_pages() < 2: self._notebook.set_show_tabs(False) self._separator.hide() def set_current_toolbar(self, index): self._notebook.set_current_page(index) def get_current_toolbar(self): return self._notebook.get_current_page() current_toolbar = property(get_current_toolbar, set_current_toolbar)