Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--examples/radiopalette.py63
-rw-r--r--src/sugar/activity/activity.py44
-rw-r--r--src/sugar/graphics/Makefile.am56
-rw-r--r--src/sugar/graphics/radiopalette.py54
-rw-r--r--src/sugar/graphics/toolbar.py9
5 files changed, 116 insertions, 110 deletions
diff --git a/examples/radiopalette.py b/examples/radiopalette.py
index eb86831..8a47f98 100644
--- a/examples/radiopalette.py
+++ b/examples/radiopalette.py
@@ -2,6 +2,7 @@ import gtk
from sugar.graphics.radiopalette import RadioPalette, RadioMenuButton, \
RadioToolsButton
+from sugar.graphics.radiotoolbutton import RadioToolButton
from sugar.graphics.toolbutton import ToolButton
from sugar.graphics import style
@@ -16,39 +17,61 @@ box.pack_start(toolbar, False)
text_view = gtk.TextView()
box.pack_start(text_view)
-def echo(text):
- text_view.props.buffer.props.text += "\n" + text
+def echo(button):
+ if not button.props.active:
+ return
+ text_view.props.buffer.props.text += "\n" + button.props.tooltip
+
+# RadioMenuButton
palette = RadioPalette()
-palette.append(
+
+group = RadioToolButton(
icon_name='document-open',
- tooltip='menu.document-open',
- toggled_cb=lambda: echo('menu.document-open'))
-palette.append(
+ tooltip='menu.document-open')
+group.connect('clicked', lambda button: echo(button))
+palette.append(group)
+
+button = RadioToolButton(
icon_name='document-save',
- tooltip='menu.document-save',
- toggled_cb=lambda: echo('menu.document-save'))
-palette.append(
+ group=group,
+ tooltip='menu.document-save')
+button.connect('clicked', lambda button: echo(button))
+palette.append(button)
+
+button = RadioToolButton(
icon_name='document-send',
- tooltip='menu.document-send',
- toggled_cb=lambda: echo('menu.document-send'))
+ group=group,
+ tooltip='menu.document-send')
+button.connect('clicked', lambda button: echo(button))
+palette.append(button)
button = RadioMenuButton(palette=palette)
toolbar.insert(button, -1)
+# RadioToolsButton
+
palette = RadioPalette()
-palette.append(
+
+group = RadioToolButton(
icon_name='document-open',
- tooltip='tools.document-open',
- toggled_cb=lambda: echo('tools.document-open'))
-palette.append(
+ tooltip='menu.document-open')
+group.connect('clicked', lambda button: echo(button))
+palette.append(group)
+
+button = RadioToolButton(
icon_name='document-save',
- tooltip='tools.document-save',
- toggled_cb=lambda: echo('tools.document-save'))
-palette.append(
+ group=group,
+ tooltip='menu.document-save')
+button.connect('clicked', lambda button: echo(button))
+palette.append(button)
+
+button = RadioToolButton(
icon_name='document-send',
- tooltip='tools.document-send',
- toggled_cb=lambda: echo('tools.document-send'))
+ group=group,
+ tooltip='menu.document-send')
+button.connect('clicked', lambda button: echo(button))
+palette.append(button)
button = RadioToolsButton(palette=palette)
toolbar.insert(button, -1)
diff --git a/src/sugar/activity/activity.py b/src/sugar/activity/activity.py
index a4690e5..76a349f 100644
--- a/src/sugar/activity/activity.py
+++ b/src/sugar/activity/activity.py
@@ -75,6 +75,7 @@ from sugar.graphics.icon import Icon
from sugar.graphics.xocolor import XoColor
from sugar.graphics.toolbar import Toolbar, ToolbarButton
from sugar.graphics.radiopalette import RadioPalette, RadioMenuButton
+from sugar.graphics.radiotoolbutton import RadioToolButton
from sugar.datastore import datastore
from sugar.session import XSMPClient
from sugar import wm
@@ -1054,35 +1055,36 @@ def paste_button(**kwargs):
return paste
def share_button(activity, **kwargs):
- quiet_trigger = []
-
- def neighborhood_cb():
- if quiet_trigger:
- return
+ def neighborhood_cb(button):
activity.share()
palette = RadioPalette()
- private = palette.append(
+
+ private = RadioToolButton(
icon_name='zoom-home',
tooltip=_('Private'))
- neighborhood = palette.append(
+ palette.append(private)
+
+ neighborhood = RadioToolButton(
icon_name='zoom-neighborhood',
- tooltip=_('My Neighborhood'),
- toggled_cb=neighborhood_cb)
+ group=private,
+ tooltip=_('My Neighborhood'))
+ neighborhood.connect('clicked', neighborhood_cb)
+ palette.append(neighborhood)
def update_share():
- quiet_trigger.append(True)
-
- if activity.get_shared():
- private.props.sensitive = False
- neighborhood.props.sensitive = False
- neighborhood.props.active = True
- else:
- private.props.sensitive = True
- neighborhood.props.sensitive = True
- private.props.active = True
-
- quiet_trigger.pop()
+ neighborhood.handler_block_by_func(neighborhood_cb)
+ try:
+ if activity.get_shared():
+ private.props.sensitive = False
+ neighborhood.props.sensitive = False
+ neighborhood.props.active = True
+ else:
+ private.props.sensitive = True
+ neighborhood.props.sensitive = True
+ private.props.active = True
+ finally:
+ neighborhood.handler_unblock_by_func(neighborhood_cb)
activity.connect('shared', lambda activity: update_share())
activity.connect('joined', lambda activity: update_share())
diff --git a/src/sugar/graphics/Makefile.am b/src/sugar/graphics/Makefile.am
index d1c6f09..6739a13 100644
--- a/src/sugar/graphics/Makefile.am
+++ b/src/sugar/graphics/Makefile.am
@@ -1,29 +1,29 @@
sugardir = $(pythondir)/sugar/graphics
-sugar_PYTHON = \
- __init__.py \
- alert.py \
- animator.py \
- canvastextview.py \
- combobox.py \
- colorbutton.py \
- entry.py \
- icon.py \
- iconentry.py \
- menuitem.py \
- notebook.py \
- objectchooser.py \
- radiotoolbutton.py \
- palette.py \
- palettegroup.py \
- panel.py \
- roundbox.py \
- style.py \
- toggletoolbutton.py \
- toolbox.py \
- toolbutton.py \
- toolcombobox.py \
- tray.py \
- window.py \
- xocolor.py \
- toolbar.py \
- radiopalette.py
+sugar_PYTHON = \
+ alert.py \
+ animator.py \
+ canvastextview.py \
+ colorbutton.py \
+ combobox.py \
+ entry.py \
+ iconentry.py \
+ icon.py \
+ __init__.py \
+ menuitem.py \
+ notebook.py \
+ objectchooser.py \
+ palettegroup.py \
+ palette.py \
+ panel.py \
+ radiopalette.py \
+ radiotoolbutton.py \
+ roundbox.py \
+ style.py \
+ toggletoolbutton.py \
+ toolbar.py \
+ toolbox.py \
+ toolbutton.py \
+ toolcombobox.py \
+ tray.py \
+ window.py \
+ xocolor.py \
diff --git a/src/sugar/graphics/radiopalette.py b/src/sugar/graphics/radiopalette.py
index d510ed3..743a45f 100644
--- a/src/sugar/graphics/radiopalette.py
+++ b/src/sugar/graphics/radiopalette.py
@@ -18,21 +18,16 @@
import gtk
import gobject
import logging
-from gobject import SIGNAL_RUN_FIRST, TYPE_NONE
+from gobject import SIGNAL_RUN_FIRST, TYPE_NONE, TYPE_PYOBJECT
from sugar.graphics import style
from sugar.graphics.toolbutton import ToolButton
from sugar.graphics.palette import Palette
-from sugar.graphics.radiotoolbutton import RadioToolButton
-
-ARROW_SIZE = hasattr(style, 'TOOLBAR_ARROW_SIZE') and style.TOOLBAR_ARROW_SIZE \
- or 8
class RadioPaletteButton(ToolButton):
def __init__(self, **kwargs):
ToolButton.__init__(self, **kwargs)
-
- self._button_cb = None
+ self.selected_button = None
if self.props.palette:
self.__palette_cb(None, None)
@@ -44,10 +39,6 @@ class RadioPaletteButton(ToolButton):
return
self.props.palette.update_button()
- def _set_current_button(self, button):
- self.set_icon(button.rp_icon_name)
- self._button_cb = button.rp_toggled_cb
-
class RadioMenuButton(RadioPaletteButton):
def __init__(self, **kwargs):
RadioPaletteButton.__init__(self, **kwargs)
@@ -75,18 +66,19 @@ class RadioMenuButton(RadioPaletteButton):
self.get_style().paint_arrow(event.window,
gtk.STATE_NORMAL, gtk.SHADOW_IN, event.area, self,
None, type, True,
- a.x + a.width/2 - ARROW_SIZE/2,
- a.y + a.height - ARROW_SIZE - style._FOCUS_LINE_WIDTH,
- ARROW_SIZE, ARROW_SIZE)
+ a.x + a.width/2 - style.TOOLBAR_ARROW_SIZE/2,
+ a.y + a.height - style.TOOLBAR_ARROW_SIZE - \
+ style._FOCUS_LINE_WIDTH,
+ style.TOOLBAR_ARROW_SIZE, style.TOOLBAR_ARROW_SIZE)
class RadioToolsButton(RadioPaletteButton):
def __init__(self, **kwargs):
RadioPaletteButton.__init__(self, **kwargs)
def do_clicked(self):
- if not self._button_cb:
+ if not self.selected_button:
return
- self._button_cb()
+ self.selected_button.emit('clicked')
class RadioPalette(Palette):
def __init__(self, **kwargs):
@@ -96,39 +88,31 @@ class RadioPalette(Palette):
self.top.show()
self.set_content(self.top)
- def append(self, icon_name, tooltip=None, toggled_cb=None):
+ def append(self, button):
children = self.top.get_children()
- button = RadioToolButton(icon_name=icon_name,
- group=children and children[0] or None)
+
button.show()
- button.connect('toggled', self.__toggled_cb)
+ button.connect('clicked', self.__clicked_cb)
self.top.pack_start(button, fill=False)
- button.rp_icon_name = icon_name
- button.rp_tooltip = tooltip
- button.rp_toggled_cb = toggled_cb
-
if not children:
- self.__toggled_cb(button, True)
-
- return button
+ self.__clicked_cb(button, True)
def update_button(self):
for i in self.top.get_children():
- self.__toggled_cb(i, True)
+ self.__clicked_cb(i, True)
- def __toggled_cb(self, button, quiet=False):
+ def __clicked_cb(self, button, quiet=False):
if not button.get_active():
return
- self.set_primary_text(button.rp_tooltip)
+ self.set_primary_text(button.props.tooltip)
if not quiet:
- if button.rp_toggled_cb:
- button.rp_toggled_cb()
self.popdown(immediate=True)
- if not self.invoker or \
- not isinstance(self.invoker.parent, RadioPaletteButton):
+ parent = self.invoker and self.invoker.parent
+ if not isinstance(parent, RadioPaletteButton):
return
- self.invoker.parent._set_current_button(button)
+ parent.set_icon(button.props.icon_name)
+ parent.selected_button = button
diff --git a/src/sugar/graphics/toolbar.py b/src/sugar/graphics/toolbar.py
index 35699e8..abeceee 100644
--- a/src/sugar/graphics/toolbar.py
+++ b/src/sugar/graphics/toolbar.py
@@ -27,9 +27,6 @@ from sugar.graphics.palette import MouseSpeedDetector, Invoker
from sugar.graphics import animator
from sugar.graphics import palettegroup
-ARROW_SIZE = hasattr(style, 'TOOLBAR_ARROW_SIZE') and style.TOOLBAR_ARROW_SIZE \
- or 8
-
class ToolbarButton(ToolButton):
def __init__(self, **kwargs):
self._page = None
@@ -401,6 +398,6 @@ def _paint_arrow(widget, event, type):
widget.get_style().paint_arrow(event.window,
gtk.STATE_NORMAL, gtk.SHADOW_IN, event.area, widget,
None, type, True,
- a.x + a.width/2 - ARROW_SIZE/2,
- a.y + a.height - ARROW_SIZE - style._FOCUS_LINE_WIDTH,
- ARROW_SIZE, ARROW_SIZE)
+ a.x + a.width/2 - style.TOOLBAR_ARROW_SIZE/2,
+ a.y + a.height - style.TOOLBAR_ARROW_SIZE - style._FOCUS_LINE_WIDTH,
+ style.TOOLBAR_ARROW_SIZE, style.TOOLBAR_ARROW_SIZE)