Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/service
diff options
context:
space:
mode:
authorTomeu Vizoso <tomeu@tomeu-asus.(none)>2008-06-11 15:38:17 (GMT)
committer Tomeu Vizoso <tomeu@tomeu-laptop.(none)>2008-06-20 10:24:58 (GMT)
commit8653d936ef59916a6c3f4b56f17161e5a61afdfc (patch)
tree5e2fa7f92bb9570a6f3dd8c1d63f15e87bbb3429 /service
parent3cc77d917005e5c6ae8728bbc6eab38db45708ed (diff)
Persist position of favorite icons
Diffstat (limited to 'service')
-rw-r--r--service/activityregistryservice.py12
-rw-r--r--service/bundleregistry.py106
2 files changed, 89 insertions, 29 deletions
diff --git a/service/activityregistryservice.py b/service/activityregistryservice.py
index bf98ef9..a42eae0 100644
--- a/service/activityregistryservice.py
+++ b/service/activityregistryservice.py
@@ -109,6 +109,12 @@ class ActivityRegistry(dbus.service.Object):
registry = bundleregistry.get_registry()
registry.set_bundle_favorite(bundle_id, version, favorite)
+ @dbus.service.method(_ACTIVITY_REGISTRY_IFACE,
+ in_signature='siii', out_signature='')
+ def SetActivityPosition(self, bundle_id, version, x, y):
+ registry = bundleregistry.get_registry()
+ registry.set_bundle_position(bundle_id, version, x, y)
+
@dbus.service.signal(_ACTIVITY_REGISTRY_IFACE, signature='a{sv}')
def ActivityAdded(self, activity_info):
pass
@@ -125,6 +131,8 @@ class ActivityRegistry(dbus.service.Object):
registry = bundleregistry.get_registry()
favorite = registry.is_bundle_favorite(bundle.get_bundle_id(),
bundle.get_activity_version())
+ x, y = registry.get_bundle_position(bundle.get_bundle_id(),
+ bundle.get_activity_version())
return {'name': bundle.get_name(),
'icon': bundle.get_icon(),
'bundle_id': bundle.get_bundle_id(),
@@ -133,7 +141,9 @@ class ActivityRegistry(dbus.service.Object):
'command': bundle.get_command(),
'show_launcher': bundle.get_show_launcher(),
'favorite': favorite,
- 'installation_time': bundle.get_installation_time()}
+ 'installation_time': bundle.get_installation_time(),
+ 'position_x': x,
+ 'position_y': y}
def _bundle_added_cb(self, bundle_registry, bundle):
self.ActivityAdded(self._bundle_to_dict(bundle))
diff --git a/service/bundleregistry.py b/service/bundleregistry.py
index 8b7f09b..e7c30a8 100644
--- a/service/bundleregistry.py
+++ b/service/bundleregistry.py
@@ -16,6 +16,7 @@
import os
import logging
+import traceback
import gobject
import simplejson
@@ -48,7 +49,14 @@ class BundleRegistry(gobject.GObject):
self._scan_directory(activity_dir)
self._last_defaults_mtime = -1
- self._favorite_bundles = self._load_favorites()
+ self._favorite_bundles = {}
+
+ try:
+ self._load_favorites()
+ except Exception, e:
+ logging.error('Error while loading favorite_activities\n%s.' \
+ % traceback.format_exc())
+
self._merge_default_favorites()
def _get_activity_directories(self):
@@ -74,24 +82,34 @@ class BundleRegistry(gobject.GObject):
return defaults
+ def _get_favorite_key(self, bundle_id, version):
+ """We use a string as a composite key for the favorites dictionary
+ because JSON doesn't support tuples and python won't accept a list
+ as a dictionary key.
+ """
+ if ' ' in bundle_id:
+ raise ValueError('bundle_id cannot contain spaces')
+ return '%s %s' % (bundle_id, version)
+
def _load_favorites(self):
- favorite_bundles = []
favorites_path = env.get_profile_path('favorite_activities')
if os.path.exists(favorites_path):
- try:
- favorites_data = simplejson.load(open(favorites_path))
- except ValueError, e:
- logging.error('Error while loading favorite_activities: %r.' %
- e)
- else:
- # Old structure used to be a list, instead of a dictionary.
- if isinstance(favorites_data, list):
- favorite_bundles = favorites_data
- else:
- favorite_bundles = favorites_data['favorites']
- self._last_defaults_mtime = favorites_data['defaults-mtime']
+ favorites_data = simplejson.load(open(favorites_path))
+
+ favorite_bundles = favorites_data['favorites']
+ if not isinstance(favorite_bundles, dict):
+ raise ValueError('Invalid format in %s.' % favorites_path)
+ if favorite_bundles:
+ first_key = favorite_bundles.keys()[0]
+ if not isinstance(first_key, basestring):
+ raise ValueError('Invalid format in %s.' % favorites_path)
- return favorite_bundles
+ first_value = favorite_bundles.values()[0]
+ if first_value is not None and not isinstance(first_value, dict):
+ raise ValueError('Invalid format in %s.' % favorites_path)
+
+ self._last_defaults_mtime = float(favorites_data['defaults-mtime'])
+ self._favorite_bundles = favorite_bundles
def _merge_default_favorites(self):
default_activities = []
@@ -117,9 +135,9 @@ class BundleRegistry(gobject.GObject):
max_version < bundle.get_activity_version():
max_version = bundle.get_activity_version()
- if max_version > -1 and \
- [bundle_id, max_version] not in self._favorite_bundles:
- self._favorite_bundles.append([bundle_id, max_version])
+ key = self._get_favorite_key(bundle_id, max_version)
+ if max_version > -1 and key not in self._favorite_bundles:
+ self._favorite_bundles[key] = None
logging.debug('After merging: %r' % self._favorite_bundles)
@@ -205,24 +223,56 @@ class BundleRegistry(gobject.GObject):
(bundle_id, version))
def set_bundle_favorite(self, bundle_id, version, favorite):
+ key = self._get_favorite_key(bundle_id, version)
+ if favorite and not key in self._favorite_bundles:
+ self._favorite_bundles[key] = None
+ elif not favorite and key in self._favorite_bundles:
+ del self._favorite_bundles[key]
+ else:
+ return
+
+ self._write_favorites_file()
bundle = self._find_bundle(bundle_id, version)
- if favorite and not [bundle_id, version] in self._favorite_bundles:
- self._favorite_bundles.append([bundle_id, version])
- self.emit('bundle-changed', bundle)
- self._write_favorites_file()
- elif not favorite and [bundle_id, version] in self._favorite_bundles:
- self._favorite_bundles.remove([bundle_id, version])
- self.emit('bundle-changed', bundle)
- self._write_favorites_file()
+ self.emit('bundle-changed', bundle)
def is_bundle_favorite(self, bundle_id, version):
- return [bundle_id, version] in self._favorite_bundles
+ key = self._get_favorite_key(bundle_id, version)
+ return key in self._favorite_bundles
+
+ def set_bundle_position(self, bundle_id, version, x, y):
+ key = self._get_favorite_key(bundle_id, version)
+ if key not in self._favorite_bundles:
+ raise ValueError('Bundle %s %s not favorite' % (bundle_id, version))
+
+ if self._favorite_bundles[key] is None:
+ self._favorite_bundles[key] = {}
+ if 'position' not in self._favorite_bundles[key] or \
+ [x, y] != self._favorite_bundles[key]['position']:
+ self._favorite_bundles[key]['position'] = [x, y]
+ else:
+ return
+
+ self._write_favorites_file()
+ bundle = self._find_bundle(bundle_id, version)
+ self.emit('bundle-changed', bundle)
+
+ def get_bundle_position(self, bundle_id, version):
+ """Get the coordinates where the user wants the representation of this
+ bundle to be displayed. Coordinates are relative to a 1000x1000 area.
+ """
+ key = self._get_favorite_key(bundle_id, version)
+ if key not in self._favorite_bundles or \
+ self._favorite_bundles[key] is None or \
+ 'position' not in self._favorite_bundles[key]:
+ return (-1, -1)
+ else:
+ return tuple(self._favorite_bundles[key]['position'])
def _write_favorites_file(self):
path = env.get_profile_path('favorite_activities')
favorites_data = {'defaults-mtime': self._last_defaults_mtime,
'favorites': self._favorite_bundles}
- simplejson.dump(favorites_data, open(path, 'w'))
+ simplejson.dump(favorites_data, open(path, 'w'), indent=1)
_instance = None