diff options
Diffstat (limited to 'src/sugar/tutorius/actions.py')
-rw-r--r-- | src/sugar/tutorius/actions.py | 138 |
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 |