Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/tutorius/TProbe.py
diff options
context:
space:
mode:
Diffstat (limited to 'tutorius/TProbe.py')
-rw-r--r--tutorius/TProbe.py60
1 files changed, 51 insertions, 9 deletions
diff --git a/tutorius/TProbe.py b/tutorius/TProbe.py
index 8361314..dbadefa 100644
--- a/tutorius/TProbe.py
+++ b/tutorius/TProbe.py
@@ -23,6 +23,7 @@ import gobject
import dbus.service
import cPickle as pickle
+from functools import partial
from . import addon
from . import properties
@@ -148,6 +149,7 @@ class TProbe(dbus.service.Object):
action.do(activity=self._activity)
else:
action.enter_editmode()
+ action.set_notification_cb(partial(self.update_action, address))
return address
@@ -239,7 +241,6 @@ class TProbe(dbus.service.Object):
@param address string adress returned by subscribe()
@return None
"""
-
if self._subscribedEvents.has_key(address):
eventfilter = self._subscribedEvents[address]
eventfilter.remove_handlers()
@@ -260,6 +261,21 @@ class TProbe(dbus.service.Object):
else:
raise RuntimeWarning("Attempted to raise an unregistered event")
+ @dbus.service.signal("org.tutorius.ProbeInterface")
+ def addonUpdated(self, addon_address, pickled_diff_dict):
+ # Don't do any added processing, the signal will be sent
+ # when the method exits
+ pass
+
+ def update_action(self, addon_address, diff_dict):
+ LOGGER.debug("TProbe :: Trying to update action %s with new property dict %s"%(addon_address, str(diff_dict)))
+ # Check that this action is installed
+ if addon_address in self._installedActions.keys():
+ LOGGER.debug("TProbe :: Updating action %s"%(addon_address))
+ self.addonUpdated(addon_address, pickle.dumps(diff_dict))
+ else:
+ raise RuntimeWarning("Attempted to updated an action that wasn't installed")
+
# Return a unique name for this action
def _generate_action_reference(self, action):
# TODO elavoie 2009-07-25 Should return a universal address
@@ -307,6 +323,7 @@ class ProbeProxy:
self._probe = dbus.Interface(self._object, "org.tutorius.ProbeInterface")
self._actions = {}
+ self._edition_callbacks = {}
# We keep those two data structures to be able to have multiple callbacks
# for the same event and be able to remove them independently
# _subscribedEvents holds a list of callback addresses's for each event
@@ -315,6 +332,17 @@ class ProbeProxy:
self._registeredCallbacks = {}
self._object.connect_to_signal("eventOccured", self._handle_signal, dbus_interface="org.tutorius.ProbeInterface")
+ self._object.connect_to_signal("addonUpdated", self._handle_update_signal, dbus_interface="org.tutorius.ProbeInterface")
+
+ def _handle_update_signal(self, addon_address, pickled_diff_dict):
+ address = str(addon_address)
+ diff_dict = pickle.loads(str(pickled_diff_dict))
+ LOGGER.debug("ProbeProxy :: Received update property for action %s"%(address))
+ # Launch the callback to warn the upper layers of a modification of the addon
+ # from a widget inside the activity
+ if self._edition_callbacks.has_key(address):
+ LOGGER.debug("ProbeProxy :: Executing update callback...")
+ self._edition_callbacks[address](address, diff_dict)
def _handle_signal(self, pickled_event):
event = pickle.loads(str(pickled_event))
@@ -335,26 +363,37 @@ class ProbeProxy:
except:
return False
- def __update_action(self, action, callback, address):
+ def __update_action(self, action, callback, editing_cb, address):
LOGGER.debug("ProbeProxy :: Updating action %s with address %s", str(action), str(address))
+ address = str(address)
+ # Store the action
self._actions[address] = action
+ # Store the edition callback
+ if editing_cb:
+ self._edition_callbacks[address] = editing_cb
+ # Propagate the action installed callback upwards in the stack
callback(address)
def __clear_action(self, address):
+ # Remove the action installed at this address
self._actions.pop(address, None)
+ # Remove the edition callback
+ self._edition_callbacks.pop(address, None)
- def install(self, action, action_installed_cb, error_cb, is_editing=False):
+ def install(self, action, action_installed_cb, error_cb, is_editing=False, editing_cb=None):
"""
Install an action on the TProbe's activity
@param action Action to install
@param action_installed_cb The callback function to call once the action is installed
@param error_cb The callback function to call when an error happens
@param is_editing whether this action comes from the editor
+ @param editing_cb The function to execute when the action is updated
+ (this is only done in edition mode)
@return None
"""
self._probe.install(pickle.dumps(action), is_editing,
- reply_handler=save_args(self.__update_action, action, action_installed_cb),
- error_handler=save_args(error_cb, action))
+ reply_handler=save_args(self.__update_action, action, action_installed_cb, editing_cb),
+ error_handler=save_args(error_cb, action))
def update(self, action_address, newaction, is_editing=False):
"""
@@ -487,6 +526,8 @@ class ProbeProxy:
subscribed events should be removed.
"""
for action_addr in self._actions.keys():
+ # TODO : Make sure there is a way for each action to be properly
+ # uninstalled according to its right edition mode
self.uninstall(action_addr, True)
for address in self._subscribedEvents.keys():
@@ -529,7 +570,7 @@ class ProbeManager(object):
currentActivity = property(fget=getCurrentActivity, fset=setCurrentActivity)
- def install(self, action, action_installed_cb, error_cb, is_editing=False):
+ def install(self, action, action_installed_cb, error_cb, is_editing=False, editing_cb=None):
"""
Install an action on the current activity
@param action Action to install
@@ -537,6 +578,8 @@ class ProbeManager(object):
@param error_cb The callback that will be called if there is an error during installation
@param block Force a synchroneous dbus call if True
@param is_editing whether this action comes from the editor
+ @param editing_cb The function to execute when propagating changes on
+ this action (only used when is_editing is true)
@return None
"""
if self.currentActivity:
@@ -544,7 +587,8 @@ class ProbeManager(object):
action=action,
is_editing=is_editing,
action_installed_cb=action_installed_cb,
- error_cb=error_cb)
+ error_cb=error_cb,
+ editing_cb=editing_cb)
else:
raise RuntimeWarning("No activity attached")
@@ -660,8 +704,6 @@ class ProbeManager(object):
return self._probes[process_name]
else:
return []
-
-
def _first_proxy(self, process_name):
"""