Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/src/sugar/tutorius/actions.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/sugar/tutorius/actions.py')
-rw-r--r--src/sugar/tutorius/actions.py138
1 files changed, 135 insertions, 3 deletions
diff --git a/src/sugar/tutorius/actions.py b/src/sugar/tutorius/actions.py
index 12de298..ad91fb4 100644
--- a/src/sugar/tutorius/actions.py
+++ b/src/sugar/tutorius/actions.py
@@ -42,6 +42,13 @@ class Action(object):
"""
pass #Should raise NotImplemented?
+ def get_properties(self):
+ if not hasattr(self, "_props") or self._props is None:
+ self._props = []
+ for i in dir(self.__class__):
+ if type(getattr(self.__class__,i)) is property:
+ self._props.append(i)
+ return self._props
class OnceWrapper(object):
"""
@@ -71,6 +78,9 @@ class OnceWrapper(object):
if self._need_undo:
self._action.undo()
self._need_undo = False
+
+ def get_properties(self):
+ return self._action.get_properties()
class DialogMessage(Action):
"""
@@ -82,9 +92,25 @@ class DialogMessage(Action):
def __init__(self, message, pos=[0,0]):
super(DialogMessage, self).__init__()
self._message = message
- self.position = pos
+ self._position = pos
self._dialog = None
+ def set_message(self, msg):
+ self._message = msg
+
+ def get_message(self):
+ return self._message
+
+ message = property(fget=get_message, fset=set_message)
+
+ def set_pos(self, x, y):
+ self._position = [x, y]
+
+ def get_pos(self):
+ return self._position
+
+ position = property(fget=get_pos, fset=set_pos)
+
def do(self):
"""
Show the dialog
@@ -115,14 +141,31 @@ class BubbleMessage(Action):
def __init__(self, message, pos=[0,0], speaker=None, tailpos=None):
Action.__init__(self)
self._message = message
- self.position = pos
+ self._position = pos
self.overlay = None
self._bubble = None
self._speaker = None
self._tailpos = tailpos
+ def set_message(self, msg):
+ self._message = msg
+ def get_message(self):
+ return self._message
+ message = property(fget=get_message, fset=set_message, doc="Message displayed to the user")
+ def set_pos(self, x, y):
+ self._position = [x, y]
+ def get_pos(self):
+ return self.position
+ position = property(fget=get_pos, fset=set_pos, doc="Position in [x, y] on the screen")
+
+ def set_tail_pos(self, x, y):
+ self._tailpos = [x, y]
+ def get_tail_pos(self):
+ return self._tailpos
+ tail_pos = property(fget=get_tail_pos, fset=set_tail_pos, doc="Position the tail of the bubble must point to")
+
def do(self):
"""
Show the dialog
@@ -135,7 +178,7 @@ class BubbleMessage(Action):
# draw the overlay.
if not self._bubble:
- x, y = self.position
+ x, y = self._position
# TODO: tails are relative to tailpos. They should be relative to
# the speaking widget. Same of the bubble position.
self._bubble = overlayer.TextBubble(text=self._message,
@@ -170,4 +213,93 @@ class WidgetIdentifyAction(Action):
if self._dialog:
self._dialog.destroy()
+class ChainAction(Action):
+ """Utility class to allow executing actions in a specific order"""
+ def __init__(self, *actions):
+ """ChainAction(action1, ... ) builds a chain of actions"""
+ self._actions = actions
+
+ def do(self,**kwargs):
+ """do() each action in the chain"""
+ for act in self._actions:
+ act.do(**kwargs)
+
+ def undo(self):
+ """undo() each action in the chain, starting with the last"""
+ for act in reversed(self._actions):
+ act.undo()
+
+class DisableWidgetAction(Action):
+ def __init__(self, target):
+ """Constructor
+ @param target target treeish
+ """
+ Action.__init__(self)
+ self._target = target
+ self._widget = None
+ def do(self):
+ """Action do"""
+ os = ObjectStore()
+ if os.activity:
+ self._widget = gtkutils.find_widget(os.activity, self._target)
+ if self._widget:
+ self._widget.set_sensitive(False)
+
+ def undo(self):
+ """Action undo"""
+ if self._widget:
+ self._widget.set_sensitive(True)
+
+class TypeTextAction(Action):
+ """
+ Simulate a user typing text in a widget
+ Work on any widget that implements a insert_text method
+
+ @param widget The treehish representation of the widget
+ @param text the text that is typed
+ """
+ def __init__(self, widget, text):
+ Action.__init__(self)
+
+ self._widget = widget
+ self._text = text
+
+ def do(self, **kwargs):
+ """
+ Type the text
+ """
+ widget = gtkutils.find_widget(ObjectStore().activity, self._widget)
+ if hasattr(widget, "insert_text"):
+ widget.insert_text(self._text, -1)
+
+ def undo(self):
+ """
+ no undo
+ """
+ pass
+
+class ClickAction(Action):
+ """
+ Action that simulate a click on a widget
+ Work on any widget that implements a clicked() method
+
+ @param widget The threehish representation of the widget
+ """
+ def __init__(self, widget):
+ Action.__init__(self)
+ self._widget = widget
+
+ def do(self):
+ """
+ click the widget
+ """
+ widget = gtkutils.find_widget(ObjectStore().activity, self._widget)
+ if hasattr(widget, "clicked"):
+ widget.clicked()
+
+ def undo(self):
+ """
+ No undo
+ """
+ pass