From dee3a3d2ba0f3495400cc5cdd608f0269d9622f1 Mon Sep 17 00:00:00 2001 From: Aleksey Lim Date: Fri, 01 Oct 2010 18:00:38 +0000 Subject: Bundle toolkit dependecy --- (limited to 'toolkit/radiopalette.py') diff --git a/toolkit/radiopalette.py b/toolkit/radiopalette.py new file mode 100644 index 0000000..9c902b1 --- /dev/null +++ b/toolkit/radiopalette.py @@ -0,0 +1,109 @@ +# Copyright (C) 2009, Aleksey Lim +# +# 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. + +import gtk + +from sugar.graphics.toolbutton import ToolButton +from sugar.graphics.palette import Palette + + +class RadioMenuButton(ToolButton): + + def __init__(self, **kwargs): + ToolButton.__init__(self, **kwargs) + self.selected_button = None + + if self.props.palette: + self.__palette_cb(None, None) + + self.connect('clicked', self.__clicked_cb) + self.connect('notify::palette', self.__palette_cb) + + def _do_clicked(self): + if self.palette is None: + return + if self.palette.is_up() and \ + self.palette.palette_state == Palette.SECONDARY: + self.palette.popdown(immediate=True) + else: + self.palette.popup(immediate=True) + self.palette.props.invoker.emit('right-click') + + def __palette_cb(self, widget, pspec): + if not isinstance(self.props.palette, RadioPalette): + return + self.props.palette.update_button() + + def __clicked_cb(self, button): + self._do_clicked() + + +class RadioToolsButton(RadioMenuButton): + + def __init__(self, **kwargs): + RadioMenuButton.__init__(self, **kwargs) + + def _do_clicked(self): + if not self.selected_button: + return + self.selected_button.emit('clicked') + + +class RadioPalette(Palette): + + def __init__(self, **kwargs): + Palette.__init__(self, **kwargs) + + self.button_box = gtk.HBox() + self.button_box.show() + self.set_content(self.button_box) + + def append(self, button, label): + children = self.button_box.get_children() + + if button.palette is not None: + raise RuntimeError("Palette's button should not have sub-palettes") + + button.show() + button.connect('clicked', self.__clicked_cb) + self.button_box.pack_start(button, fill=False) + button.palette_label = label + + if not children: + self.__clicked_cb(button) + + def update_button(self): + for i in self.button_box.get_children(): + self.__clicked_cb(i) + + def __clicked_cb(self, button): + if not button.get_active(): + return + + self.set_primary_text(button.palette_label) + self.popdown(immediate=True) + + if self.props.invoker is not None: + parent = self.props.invoker.parent + else: + parent = None + if not isinstance(parent, RadioMenuButton): + return + + parent.props.label = button.palette_label + parent.set_icon(button.props.icon_name) + parent.selected_button = button -- cgit v0.9.1