From 6343c5f3f45ebade43b8267e24f625e87170504a Mon Sep 17 00:00:00 2001
From: Tomeu Vizoso <[EMAIL PROTECTED]>
Date: Tue, 1 Apr 2008 20:59:55 +0200
Subject: [PATCH] New devices tray.

---
 src/view/devices/battery.py          |   28 ++++++++++++-----------
 src/view/devices/deviceview.py       |    3 +-
 src/view/devices/network/mesh.py     |   40 +++++++++++++++++----------------
 src/view/devices/network/wireless.py |   31 +++++++++++++------------
 src/view/frame/Makefile.am           |    1 +
 src/view/frame/frame.py              |    6 ++++-
 src/view/home/HomeBox.py             |   35 -----------------------------
 7 files changed, 59 insertions(+), 85 deletions(-)

diff --git a/src/view/devices/battery.py b/src/view/devices/battery.py
index 09c69df..8ab5098 100644
--- a/src/view/devices/battery.py
+++ b/src/view/devices/battery.py
@@ -19,24 +19,26 @@ from gettext import gettext as _
 import gtk
 
 from sugar import profile
-from sugar.graphics.icon import CanvasIcon
 from sugar.graphics.icon import get_icon_state
-from sugar.graphics import style
+from sugar.graphics.tray import TrayIcon
 from sugar.graphics.palette import Palette
 
+from view.frame.frameinvoker import FrameWidgetInvoker
+
 _ICON_NAME = 'battery'
 
 _STATUS_CHARGING = 0
 _STATUS_DISCHARGING = 1
 _STATUS_FULLY_CHARGED = 2
 
-class DeviceView(CanvasIcon):
+class DeviceView(TrayIcon):
     def __init__(self, model):
-        CanvasIcon.__init__(self, size=style.MEDIUM_ICON_SIZE,
-                            xo_color=profile.get_color())
+        TrayIcon.__init__(self, icon_name=_ICON_NAME, xo_color=profile.get_color())
+
         self._model = model
-        self._palette = BatteryPalette(_('My Battery life'))
-        self.set_palette(self._palette)
+        self.palette = BatteryPalette(_('My Battery life'))
+        self.palette.props.invoker = FrameWidgetInvoker(self)
+        self.palette.set_group_id('frame')
 
         model.connect('notify::level', self._battery_status_changed_cb)
         model.connect('notify::charging', self._battery_status_changed_cb)
@@ -45,21 +47,21 @@ class DeviceView(CanvasIcon):
 
     def _update_info(self):
         name = get_icon_state(_ICON_NAME, self._model.props.level)
-        self.props.icon_name = name
+        self.icon.props.icon_name = name
 
         # Update palette
         if self._model.props.charging:
             status = _STATUS_CHARGING
-            self.props.badge_name = 'emblem-charging'
+            self.icon.props.badge_name = 'emblem-charging'
         elif self._model.props.discharging:
             status = _STATUS_DISCHARGING
-            self.props.badge_name = None
+            self.icon.props.badge_name = None
         else:
             status = _STATUS_FULLY_CHARGED
-            self.props.badge_name = None
+            self.icon.props.badge_name = None
 
-        self._palette.set_level(self._model.props.level)
-        self._palette.set_status(status)
+        self.palette.set_level(self._model.props.level)
+        self.palette.set_status(status)
 
     def _battery_status_changed_cb(self, pspec, param):
         self._update_info()
diff --git a/src/view/devices/deviceview.py b/src/view/devices/deviceview.py
index f58da02..90ebbf5 100644
--- a/src/view/devices/deviceview.py
+++ b/src/view/devices/deviceview.py
@@ -14,8 +14,6 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
-from sugar.graphics.icon import CanvasIcon
-
 def create(model):
     name = 'view.devices.' + model.get_type()
 
@@ -25,3 +23,4 @@ def create(model):
         mod = getattr(mod, comp)
 
     return mod.DeviceView(model)
+
diff --git a/src/view/devices/network/mesh.py b/src/view/devices/network/mesh.py
index 2543957..121e56a 100644
--- a/src/view/devices/network/mesh.py
+++ b/src/view/devices/network/mesh.py
@@ -1,5 +1,5 @@
-#
 # Copyright (C) 2006-2007 Red Hat, Inc.
+# Copyright (C) 2008 One Laptop Per Child
 #
 # 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
@@ -20,22 +20,24 @@ from gettext import gettext as _
 import gtk
 
 from sugar import profile
-from sugar.graphics.icon import CanvasIcon
+from sugar.graphics.tray import TrayIcon
 from sugar.graphics import style
-from model.devices import device
-
 from sugar.graphics.palette import Palette
-from model.devices.network import wireless
 
+from model.devices import device
+from model.devices.network import wireless
 from hardware import hardwaremanager
+from view.frame.frameinvoker import FrameWidgetInvoker
 
-class DeviceView(CanvasIcon):
+class DeviceView(TrayIcon):
     def __init__(self, model):
-        CanvasIcon.__init__(self, size=style.MEDIUM_ICON_SIZE,
-                            icon_name='network-mesh')
+        TrayIcon.__init__(self, icon_name='network-mesh')
+
         self._model = model
-        self._palette = MeshPalette(_("Mesh Network"), model)
-        self.set_palette(self._palette)
+
+        self.palette = MeshPalette(_("Mesh Network"), model)
+        self.palette.props.invoker = FrameWidgetInvoker(self)
+        self.palette.set_group_id('frame')
 
         model.connect('notify::state', self._state_changed_cb)
         model.connect('notify::activation-stage', self._state_changed_cb)
@@ -47,24 +49,24 @@ class DeviceView(CanvasIcon):
     def _update_state(self):
         # FIXME Change icon colors once we have real icons
         state = self._model.props.state
-        self._palette.update_state(state)
+        self.palette.update_state(state)
 
         if state == device.STATE_ACTIVATING:
-            self.props.fill_color = style.COLOR_INACTIVE_FILL.get_svg()
-            self.props.stroke_color = style.COLOR_INACTIVE_STROKE.get_svg()
+            self.icon.props.fill_color = style.COLOR_INACTIVE_FILL.get_svg()
+            self.icon.props.stroke_color = style.COLOR_INACTIVE_STROKE.get_svg()
         elif state == device.STATE_ACTIVATED:
-            self.props.xo_color = profile.get_color()
+            self.icon.props.xo_color = profile.get_color()
         elif state == device.STATE_INACTIVE:
-            self.props.fill_color = style.COLOR_INACTIVE_FILL.get_svg()
-            self.props.stroke_color = style.COLOR_INACTIVE_STROKE.get_svg()
+            self.icon.props.fill_color = style.COLOR_INACTIVE_FILL.get_svg()
+            self.icon.props.stroke_color = style.COLOR_INACTIVE_STROKE.get_svg()
 
         if state == device.STATE_INACTIVE:
-            self._palette.set_primary_text(_("Mesh Network"))
+            self.palette.set_primary_text(_("Mesh Network"))
         else:
             chan = wireless.freq_to_channel(self._model.props.frequency)
             if chan > 0:
-                self._palette.set_primary_text(_("Mesh Network") + " %d" % chan)
-            self._palette.set_mesh_step(self._model.props.mesh_step, state)
+                self.palette.set_primary_text(_("Mesh Network") + " %d" % chan)
+            self.palette.set_mesh_step(self._model.props.mesh_step, state)
 
 class MeshPalette(Palette):
     def __init__(self, primary_text, model):
diff --git a/src/view/devices/network/wireless.py b/src/view/devices/network/wireless.py
index f4f8869..ff1ba53 100644
--- a/src/view/devices/network/wireless.py
+++ b/src/view/devices/network/wireless.py
@@ -20,21 +20,21 @@ from gettext import gettext as _
 import gtk
 
 from sugar.graphics.icon import get_icon_state
-from sugar.graphics.icon import CanvasIcon
+from sugar.graphics.tray import TrayIcon
 from sugar.graphics import style
 from sugar.graphics.palette import Palette
 
 from model.devices.network import wireless
 from model.devices import device
-
 from hardware import hardwaremanager
 from hardware import nmclient
+from view.frame.frameinvoker import FrameWidgetInvoker
 
 _ICON_NAME = 'network-wireless'
 
-class DeviceView(CanvasIcon):
+class DeviceView(TrayIcon):
     def __init__(self, model):
-        CanvasIcon.__init__(self, size=style.MEDIUM_ICON_SIZE)
+        TrayIcon.__init__(self, icon_name=_ICON_NAME)
         self._model = model
 
         meshdev = None
@@ -44,10 +44,11 @@ class DeviceView(CanvasIcon):
                 meshdev = device
                 break
 
-        self._palette = WirelessPalette(self._get_palette_primary_text(), meshdev)
-        self.set_palette(self._palette)
         self._counter = 0
-        self._palette.set_frequency(self._model.props.frequency)
+        self.palette = WirelessPalette(self._get_palette_primary_text(), meshdev)
+        self.palette.props.invoker = FrameWidgetInvoker(self)
+        self.palette.set_group_id('frame')
+        self.palette.set_frequency(self._model.props.frequency)
 
         model.connect('notify::name', self._name_changed_cb)
         model.connect('notify::strength', self._strength_changed_cb)
@@ -65,7 +66,7 @@ class DeviceView(CanvasIcon):
         self._update_icon()
         # Only update frequency periodically
         if self._counter % 4 == 0:
-            self._palette.set_frequency(self._model.props.frequency)
+            self.palette.set_frequency(self._model.props.frequency)
         self._counter += 1
 
     def _name_changed_cb(self, model, pspec):
@@ -81,21 +82,21 @@ class DeviceView(CanvasIcon):
             strength = 0
         icon_name = get_icon_state(_ICON_NAME, strength)
         if icon_name:
-            self.props.icon_name = icon_name
+            self.icon.props.icon_name = icon_name
 
     def _update_state(self):
         # FIXME Change icon colors once we have real icons
         state = self._model.props.state
         if state == device.STATE_ACTIVATING:
-            self.props.fill_color = style.COLOR_INACTIVE_FILL.get_svg()
-            self.props.stroke_color = style.COLOR_INACTIVE_STROKE.get_svg()
+            self.icon.props.fill_color = style.COLOR_INACTIVE_FILL.get_svg()
+            self.icon.props.stroke_color = style.COLOR_INACTIVE_STROKE.get_svg()
         elif state == device.STATE_ACTIVATED:
             (stroke, fill) = self._model.get_active_network_colors()
-            self.props.stroke_color = stroke
-            self.props.fill_color = fill
+            self.icon.props.stroke_color = stroke
+            self.icon.props.fill_color = fill
         elif state == device.STATE_INACTIVE:
-            self.props.fill_color = style.COLOR_INACTIVE_FILL.get_svg()
-            self.props.stroke_color = style.COLOR_INACTIVE_STROKE.get_svg()
+            self.icon.props.fill_color = style.COLOR_INACTIVE_FILL.get_svg()
+            self.icon.props.stroke_color = style.COLOR_INACTIVE_STROKE.get_svg()
 
 class WirelessPalette(Palette):
     def __init__(self, primary_text, meshdev):
diff --git a/src/view/frame/Makefile.am b/src/view/frame/Makefile.am
index 9bf5952..de3b38a 100644
--- a/src/view/frame/Makefile.am
+++ b/src/view/frame/Makefile.am
@@ -5,6 +5,7 @@ sugar_PYTHON =				\
 	activitybutton.py		\
 	clipboardpanelwindow.py		\
 	clipboardtray.py		\
+	devicestray.py			\
 	frameinvoker.py			\
 	friendstray.py			\
 	eventarea.py			\
diff --git a/src/view/frame/frame.py b/src/view/frame/frame.py
index 5fea0d1..508d1a1 100644
--- a/src/view/frame/frame.py
+++ b/src/view/frame/frame.py
@@ -29,6 +29,7 @@ from view.frame.eventarea import EventArea
 from view.frame.activitiestray import ActivitiesTray
 from view.frame.zoomtoolbar import ZoomToolbar
 from view.frame.friendstray import FriendsTray
+from view.frame.devicestray import DevicesTray
 from view.frame.framewindow import FrameWindow
 from view.frame.clipboardpanelwindow import ClipboardPanelWindow
 from model.shellmodel import ShellModel
@@ -184,7 +185,10 @@ class Frame(object):
     def _create_bottom_panel(self):
         panel = self._create_panel(gtk.POS_BOTTOM)
 
-        # Append devices tray.
+        # TODO: same issue as in _create_top_panel()
+        devices_tray = DevicesTray(self._shell)
+        panel.append(hippo.CanvasWidget(widget=devices_tray), hippo.PACK_EXPAND)
+        devices_tray.show()
 
         return panel
 
diff --git a/src/view/home/HomeBox.py b/src/view/home/HomeBox.py
index 8764887..d2105fe 100644
--- a/src/view/home/HomeBox.py
+++ b/src/view/home/HomeBox.py
@@ -32,7 +32,6 @@ from sugar.profile import get_profile
 from sugar import env
 
 from view.home.activitiesdonut import ActivitiesDonut
-from view.devices import deviceview
 from view.home.MyIcon import MyIcon
 from model.shellmodel import ShellModel
 from hardware import schoolserver
@@ -64,9 +63,6 @@ class HomeBox(hippo.CanvasBox, hippo.CanvasItem):
         self._my_icon = _MyIcon(shell, style.XLARGE_ICON_SIZE)
         self.append(self._my_icon, hippo.PACK_FIXED)
 
-        self._devices_box = _DevicesBox(shell_model.get_devices())
-        bottom_box.append(self._devices_box)
-
         shell_model.connect('notify::state',
                             self._shell_state_changed_cb)
 
@@ -114,37 +110,6 @@ class HomeBox(hippo.CanvasBox, hippo.CanvasItem):
     def release(self):
         pass
 
-class _DevicesBox(hippo.CanvasBox):
-    def __init__(self, devices_model):
-        gobject.GObject.__init__(self,
-                orientation=hippo.ORIENTATION_HORIZONTAL,
-                xalign=hippo.ALIGNMENT_CENTER)
-
-        self._device_icons = {}
-
-        for device in devices_model:
-            self._add_device(device)
-
-        devices_model.connect('device-appeared',
-                              self._device_appeared_cb)
-        devices_model.connect('device-disappeared',
-                              self._device_disappeared_cb)
-
-    def _add_device(self, device):
-        view = deviceview.create(device)
-        self.append(view)
-        self._device_icons[device.get_id()] = view
-
-    def _remove_device(self, device):
-        self.remove(self._device_icons[device.get_id()])
-        del self._device_icons[device.get_id()]
-
-    def _device_appeared_cb(self, model, device):
-        self._add_device(device)
-
-    def _device_disappeared_cb(self, model, device):
-        self._remove_device(device)
-
 class _MyIcon(MyIcon):
     def __init__(self, shell, scale):
         MyIcon.__init__(self, scale)
-- 
1.5.2.5

_______________________________________________
Sugar mailing list
[email protected]
http://lists.laptop.org/listinfo/sugar

Reply via email to