Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTomeu Vizoso <tomeu@tomeuvizoso.net>2008-04-02 10:44:59 (GMT)
committer Tomeu Vizoso <tomeu@tomeuvizoso.net>2008-04-02 12:44:34 (GMT)
commit0162e14a1cf8e109d142ccfbd56a0f17267665c6 (patch)
tree7764bef32dc8a13f11cc9443f4387f0d64420e49 /src
parente79aea7e6bb84d5a24c2566592fa17693e042c4b (diff)
Add PulsingIcon and use it in the frame
Diffstat (limited to 'src')
-rw-r--r--src/view/frame/activitiestray.py28
-rw-r--r--src/view/pulsingicon.py156
2 files changed, 144 insertions, 40 deletions
diff --git a/src/view/frame/activitiestray.py b/src/view/frame/activitiestray.py
index e2a40cc..03d1e81 100644
--- a/src/view/frame/activitiestray.py
+++ b/src/view/frame/activitiestray.py
@@ -21,10 +21,11 @@ import gtk
from sugar.graphics import style
from sugar.graphics.tray import HTray
+from sugar.graphics.xocolor import XoColor
from sugar.graphics.radiotoolbutton import RadioToolButton
-from sugar.graphics.icon import Icon
from view.palettes import JournalPalette, CurrentActivityPalette
+from view.pulsingicon import PulsingIcon
from view.frame.frameinvoker import FrameWidgetInvoker
class ActivityButton(RadioToolButton):
@@ -33,13 +34,17 @@ class ActivityButton(RadioToolButton):
self._home_activity = home_activity
- icon = Icon(xo_color=home_activity.get_icon_color())
+ self._icon = PulsingIcon()
+ self._icon.props.base_color = home_activity.get_icon_color()
+ self._icon.props.pulse_color = \
+ XoColor('%s,%s' % (style.COLOR_BUTTON_GREY.get_svg(),
+ style.COLOR_TRANSPARENT.get_svg()))
if home_activity.get_icon_path():
- icon.props.file = home_activity.get_icon_path()
+ self._icon.props.file = home_activity.get_icon_path()
else:
- icon.props.icon_name = 'image-missing'
- self.set_icon_widget(icon)
- icon.show()
+ self._icon.props.icon_name = 'image-missing'
+ self.set_icon_widget(self._icon)
+ self._icon.show()
if self._home_activity.get_type() == "org.laptop.JournalActivity":
palette = JournalPalette(self, self._home_activity)
@@ -49,6 +54,17 @@ class ActivityButton(RadioToolButton):
palette.set_group_id('frame')
self.set_palette(palette)
+ if home_activity.props.launching:
+ self._icon.props.pulsing = True
+ self._notify_launching_hid = home_activity.connect('notify::launching',
+ self.__notify_launching_cb)
+ else:
+ self._notify_launching_hid = None
+
+ def __notify_launching_cb(self, home_activity, pspec):
+ self._icon.props.pulsing = False
+ home_activity.disconnect(self._notify_launching_hid)
+
class ActivitiesTray(HTray):
def __init__(self, shell):
HTray.__init__(self)
diff --git a/src/view/pulsingicon.py b/src/view/pulsingicon.py
index b937816..6d8e53f 100644
--- a/src/view/pulsingicon.py
+++ b/src/view/pulsingicon.py
@@ -14,18 +14,48 @@
# 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 math
-from sugar.graphics.icon import CanvasIcon
+import gobject
+import gtk
+
+from sugar.graphics.icon import Icon, CanvasIcon
from sugar.graphics.style import Color
from sugar.graphics.xocolor import XoColor
-class CanvasPulsingIcon(CanvasIcon):
- __gtype_name__ = 'SugarCanvasPulsingIcon'
+_INTERVAL = 100
+_STEP = math.pi / 10 # must be a fraction of pi, for clean caching
+
+def _get_as_rgba(self, html_color):
+ if html_color == 'none':
+ return Color('#FFFFFF', alpha=1.0).get_rgba()
+ else:
+ return Color(html_color).get_rgba()
+
+def _update_colors(self):
+ if self._pulsing:
+ base_stroke = self._get_as_rgba(self._base_color.get_stroke_color())
+ pulse_stroke = self._get_as_rgba(self._pulse_color.get_stroke_color())
+ base_fill = self._get_as_rgba(self._base_color.get_fill_color())
+ pulse_fill = self._get_as_rgba(self._pulse_color.get_fill_color())
+
+ self.props.stroke_color = \
+ self._get_color(base_stroke, pulse_stroke).get_svg()
+ self.props.fill_color = \
+ self._get_color(base_fill, pulse_fill).get_svg()
+ else:
+ self.props.xo_color = self._base_color
+
+def _get_color(self, orig_color, target_color):
+ next_point = (orig_color[0] + self._level * (target_color[0] - orig_color[0]),
+ orig_color[1] + self._level * (target_color[1] - orig_color[1]),
+ orig_color[2] + self._level * (target_color[2] - orig_color[2]))
+ return Color('#%02x%02x%02x' % (int(next_point[0] * 255),
+ int(next_point[1] * 255),
+ int(next_point[2] * 255)))
- _INTERVAL = 100
- _STEP = math.pi / 10 # must be a fraction of pi, for clean caching
+class PulsingIcon(Icon):
+ __gtype_name__ = 'SugarPulsingIcon'
__gproperties__ = {
'base-color' : (object, None, None, gobject.PARAM_READWRITE),
@@ -43,12 +73,17 @@ class CanvasPulsingIcon(CanvasIcon):
self._level = 0
self._phase = 0
- CanvasIcon.__init__(self, **kwargs)
+ Icon.__init__(self, **kwargs)
+
+ # Hack for sharing code between CanvasPulsingIcon and PulsingIcon
+ _get_as_rgba = _get_as_rgba
+ _update_colors = _update_colors
+ _get_color = _get_color
def _start_pulsing(self, restart=False):
if restart:
self._phase = 0
- self._pulse_hid = gobject.timeout_add(self._INTERVAL, self.__pulse_cb)
+ self._pulse_hid = gobject.timeout_add(_INTERVAL, self.__pulse_cb)
def _stop_pulsing(self):
if self._pulse_hid is not None:
@@ -56,40 +91,93 @@ class CanvasPulsingIcon(CanvasIcon):
self._pulse_hid = None
self.props.xo_color = self._base_color
- def _get_color(self, orig_color, target_color):
- next_point = (orig_color[0] + self._level * (target_color[0] - orig_color[0]),
- orig_color[1] + self._level * (target_color[1] - orig_color[1]),
- orig_color[2] + self._level * (target_color[2] - orig_color[2]))
- return Color('#%02x%02x%02x' % (int(next_point[0] * 255),
- int(next_point[1] * 255),
- int(next_point[2] * 255)))
-
def __pulse_cb(self):
- self._phase += self._STEP
+ self._phase += _STEP
self._level = (math.sin(self._phase) + 1) / 2
self._update_colors()
return True
- def _get_as_rgba(self, html_color):
- if html_color == 'none':
- return Color('#FFFFFF', alpha=1.0).get_rgba()
+ def do_set_property(self, pspec, value):
+ if pspec.name == 'base-color':
+ if self._base_color != value:
+ self._base_color = value
+ self._update_colors()
+ elif pspec.name == 'pulse-color':
+ if self._pulse_color != value:
+ self._pulse_color = value
+ self._update_colors()
+ elif pspec.name == 'pulsing':
+ if self._pulsing != value:
+ self._pulsing = value
+ if self._pulsing:
+ self._start_pulsing(restart=True)
+ else:
+ self._stop_pulsing()
+ elif pspec.name == 'paused':
+ if self._paused != value:
+ self._paused = value
+ if self._paused:
+ self._stop_pulsing()
+ else:
+ self._start_pulsing(restart=False)
else:
- return Color(html_color).get_rgba()
-
- def _update_colors(self):
- if self._pulsing:
- base_stroke = self._get_as_rgba(self._base_color.get_stroke_color())
- pulse_stroke = self._get_as_rgba(self._pulse_color.get_stroke_color())
- base_fill = self._get_as_rgba(self._base_color.get_fill_color())
- pulse_fill = self._get_as_rgba(self._pulse_color.get_fill_color())
-
- self.props.stroke_color = \
- self._get_color(base_stroke, pulse_stroke).get_svg()
- self.props.fill_color = \
- self._get_color(base_fill, pulse_fill).get_svg()
+ Icon.do_set_property(self, pspec, value)
+
+ def do_get_property(self, pspec):
+ if pspec.name == 'base-color':
+ return self._base_color
+ elif pspec.name == 'pulse-color':
+ return self._pulse_color
+ elif pspec.name == 'pulsing':
+ return self._pulsing
+ elif pspec.name == 'paused':
+ return self._paused
else:
- self.props.xo_color = self._base_color
+ return Icon.do_get_property(self, pspec)
+
+class CanvasPulsingIcon(CanvasIcon):
+ __gtype_name__ = 'SugarCanvasPulsingIcon'
+
+ __gproperties__ = {
+ 'base-color' : (object, None, None, gobject.PARAM_WRITABLE),
+ 'pulse-color' : (object, None, None, gobject.PARAM_WRITABLE),
+ 'pulsing' : (bool, None, None, False, gobject.PARAM_WRITABLE),
+ 'paused' : (bool, None, None, False, gobject.PARAM_WRITABLE)
+ }
+
+ def __init__(self, **kwargs):
+ self._base_color = None
+ self._pulse_color = None
+ self._pulse_hid = None
+ self._paused = False
+ self._pulsing = False
+ self._level = 0
+ self._phase = 0
+
+ CanvasIcon.__init__(self, **kwargs)
+
+ # Hack for sharing code between CanvasPulsingIcon and PulsingIcon
+ _get_as_rgba = _get_as_rgba
+ _update_colors = _update_colors
+ _get_color = _get_color
+
+ def _start_pulsing(self, restart=False):
+ if restart:
+ self._phase = 0
+ self._pulse_hid = gobject.timeout_add(_INTERVAL, self.__pulse_cb)
+
+ def _stop_pulsing(self):
+ gobject.source_remove(self._pulse_hid)
+ self._pulse_hid = None
+ self.props.xo_color = self._base_color
+
+ def __pulse_cb(self):
+ self._phase += _STEP
+ self._level = (math.sin(self._phase) + 1) / 2
+ self._update_colors()
+
+ return True
def do_set_property(self, pspec, value):
if pspec.name == 'base-color':