Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/extensions/deviceicon/volume.py
diff options
context:
space:
mode:
Diffstat (limited to 'extensions/deviceicon/volume.py')
-rw-r--r--extensions/deviceicon/volume.py95
1 files changed, 64 insertions, 31 deletions
diff --git a/extensions/deviceicon/volume.py b/extensions/deviceicon/volume.py
index 8342cf9..80cf242 100644
--- a/extensions/deviceicon/volume.py
+++ b/extensions/deviceicon/volume.py
@@ -17,15 +17,19 @@
import os
import statvfs
from gettext import gettext as _
+import logging
+import gobject
+import gio
import gtk
+import gconf
from sugar.graphics.tray import TrayIcon
from sugar.graphics.palette import Palette
from sugar.graphics.menuitem import MenuItem
from sugar.graphics.icon import Icon
+from sugar.graphics.xocolor import XoColor
-from jarabe.model import volume
from jarabe.journal import journalactivity
_icons = {}
@@ -34,26 +38,35 @@ class DeviceView(TrayIcon):
FRAME_POSITION_RELATIVE = 800
- def __init__(self, model):
- TrayIcon.__init__(self, icon_name=model.icon_name,
- xo_color=model.icon_color)
- self._model = model
+ def __init__(self, mount):
+ TrayIcon.__init__(self)
+ self._mount = mount
+
+ # TODO: fallback to the more generic icons when needed
+ self.get_icon().props.icon_name = self._mount.get_icon().props.names[0]
+
+ # TODO: retrieve the colors from the owner of the device
+ client = gconf.client_get_default()
+ color = XoColor(client.get_string('/desktop/sugar/user/color'))
+ self.get_icon().props.xo_color = color
+
self.connect('button-release-event', self.__button_release_event_cb)
def create_palette(self):
- return VolumePalette(self._model)
+ return VolumePalette(self._mount)
def __button_release_event_cb(self, widget, event):
journal = journalactivity.get_journal()
- journal.set_active_volume(self._model.mount_point)
+ journal.set_active_volume(self._mount)
journal.present()
return True
class VolumePalette(Palette):
- def __init__(self, model):
- Palette.__init__(self, label=model.name,
- secondary_text=model.mount_point)
- self._model = model
+ def __init__(self, mount):
+ Palette.__init__(self, label=mount.get_name())
+ self._mount = mount
+
+ self.props.secondary_text = mount.get_root().get_path()
vbox = gtk.VBox()
self.set_content(vbox)
@@ -81,10 +94,14 @@ class VolumePalette(Palette):
menu_item.show()
def __unmount_activate_cb(self, menu_item):
- self._model.unmount()
+ self._mount.unmount(self.__unmount_cb)
+
+ def __unmount_cb(self, source, result):
+ logging.debug('__unmount_cb %r %r' % (source, result))
def __popup_cb(self, palette):
- stat = os.statvfs(self._model.mount_point)
+ mount_point = self._mount.get_root().get_path()
+ stat = os.statvfs(mount_point)
free_space = stat[statvfs.F_BSIZE] * stat[statvfs.F_BAVAIL]
total_space = stat[statvfs.F_BSIZE] * stat[statvfs.F_BLOCKS]
@@ -94,28 +111,44 @@ class VolumePalette(Palette):
{'free_space': free_space / (1024 * 1024)}
def setup(tray):
- volumes_manager = volume.get_volumes_manager()
+ gobject.idle_add(_setup_volumes, tray)
- for vol in volumes_manager.get_volumes():
- if vol.mount_point != '/':
- _add_device(vol, tray)
+def _setup_volumes(tray):
+ volume_monitor = gio.volume_monitor_get()
- volumes_manager.connect('volume-added', _volume_added_cb, tray)
- volumes_manager.connect('volume-removed', _volume_removed_cb, tray)
+ for volume in volume_monitor.get_volumes():
+ _mount(volume, tray)
-def _volume_added_cb(volumes_manager, vol, tray):
- if vol.mount_point != '/':
- _add_device(vol, tray)
+ for mount in volume_monitor.get_mounts():
+ _add_device(mount, tray)
-def _volume_removed_cb(volumes_manager, vol, tray):
- _remove_device(vol, tray)
+ #volume_monitor.connect('volume-added', _volume_added_cb, tray)
+ volume_monitor.connect('mount-added', _mount_added_cb, tray)
+ volume_monitor.connect('mount-removed', _mount_removed_cb, tray)
-def _add_device(vol, tray):
- icon = DeviceView(vol)
- _icons[vol] = icon
- tray.add_device(icon)
+def _volume_added_cb(volume_monitor, volume, tray):
+ _mount(volume, tray)
-def _remove_device(vol, tray):
- icon = _icons[vol]
+def _mount(volume, tray):
+ #TODO: this should be done by some other process, like gvfs-hal-volume-monitor
+ #TODO: use volume.should_automount() when it gets into pygtk
+ if volume.get_mount() is None and volume.can_mount():
+ #TODO: pass None as mount_operation, or better, SugarMountOperation
+ volume.mount(gtk.MountOperation(tray.get_toplevel()), _mount_cb)
+
+def _mount_cb(source, result):
+ logging.debug('mount finished %r %r' % (source, result))
+
+def _mount_added_cb(volume_monitor, mount, tray):
+ _add_device(mount, tray)
+
+def _mount_removed_cb(volume_monitor, mount, tray):
+ icon = _icons[mount]
tray.remove_device(icon)
- del _icons[vol]
+ del _icons[mount]
+
+def _add_device(mount, tray):
+ icon = DeviceView(mount)
+ _icons[mount] = icon
+ tray.add_device(icon)
+