From 938cdfc307b359d3c4cc528acd5d412aae8b2a80 Mon Sep 17 00:00:00 2001 From: Vincent Vinet Date: Fri, 27 Feb 2009 16:38:02 +0000 Subject: Use actions instead of messages in the tutorials --- (limited to 'src/sugar/tutorius/actions.py') diff --git a/src/sugar/tutorius/actions.py b/src/sugar/tutorius/actions.py new file mode 100644 index 0000000..b48cb8b --- /dev/null +++ b/src/sugar/tutorius/actions.py @@ -0,0 +1,135 @@ +# Copyright (C) 2009, Tutorius.org +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +""" +This module defines Actions that can be done and undone on a state +""" + +from dialog import TutoriusDialog + + +class Action(object): + """Base class for Actions""" + def __init__(self): + object.__init__(self) + + def do(self): + """ + Perform the action + """ + raise NotImplementedError("Not implemented") + + def undo(self): + """ + Revert anything the action has changed + """ + pass #Should raise NotImplemented? + + +class DoOnceMixin(object): + """Mixin class used to have an action be called only on the first do(). + + To use this mixin, create a new class that derives from this and from + the action you want executed only once. + + class ConcreteOnceAction(DoOnceMixin, ConcreteAction): + pass + + This ConcreteActions's do() method will only be called on the first do() + and the undo() will be callable after do() has been called + + Maybe it would be better off just using a wrapper class instead of this. + + But it was fun to play with. + + Did I mention the wrapper is 25 lines "south" of here? Besides, this mixin + class fails at __init__ ..... mixins... right....narwhals! + """ + def __init__(self ): + super(DoOnceMixin, self).__init + self._called = False + self._need_undo = False + + def do(self): + """ + Do the action only on the first time + """ + if not self._called: + self._called = True + super(DoOnceMixin, self).do() + self._need_undo = True + + def undo(self): + """ + Undo the action if it's been done + """ + if self._need_undo: + super(DoOnceMixin, self).undo() + self._need_undo = False + +class OnceWrapper(object): + """Wraps a class to perform an action once only + """ + def __init__(self, action): + self._action = action + self._called = False + self._need_undo = False + + def do(self): + """ + Do the action only on the first time + """ + if not self._called: + self._called = True + self._action.do() + self._need_undo = True + + def undo(self): + """ + Undo the action if it's been done + """ + if self._need_undo: + self._action.undo() + self._need_undo = False + +class DialogMessage(Action): + """Show a dialog!""" + def __init__(self, message): + super(DialogMessage, self).__init__(self) + self._message = message + self._dialog = None + + def do(self): + """ + Show the dialog + """ + self._dialog = TutoriusDialog(self._message) + self._dialog.set_button_clicked_cb(self._dialog.close_self) + self._dialog.set_modal(False) + self._dialog.show() + + def undo(self): + """ + Destroy the dialog + """ + if self._dialog: + self._dialog.destroy() + self._dialog = None + + + +class OnceDialogMessage(DoOnceMixin, DialogMessage): + """Broken!""" + pass -- cgit v0.9.1