diff --git a/src/sugar3/activity/activity.py b/src/sugar3/activity/activity.py index 9d67873f..63c6f222 100644 --- a/src/sugar3/activity/activity.py +++ b/src/sugar3/activity/activity.py @@ -448,6 +448,7 @@ class Activity(Window, Gtk.Container): bundle = get_bundle_instance(get_bundle_path()) self.set_icon_from_file(bundle.get_icon()) + self._busy_count = 0 self._stop_buttons = [] def add_stop_button(self, button): @@ -1197,6 +1198,42 @@ class Activity(Window, Gtk.Container): def get_document_path(self, async_cb, async_err_cb): async_err_cb(NotImplementedError()) + def busy(self): + ''' + Show that the activity is busy. If used, must be called once + before a lengthy operation, and unbusy must be called after + the operation completes. + + .. code-block:: python + + self.busy() + self.long_operation() + self.unbusy() + + ''' + if self._busy_count == 0: + self._old_cursor = self.get_window().get_cursor() + self._set_cursor(Gdk.Cursor.new(Gdk.CursorType.WATCH)) + self._busy_count += 1 + + def unbusy(self): + ''' + Returns: + + int: a count of further calls to unbusy expected + + Show that the activity is not busy. An equal number of calls + to unbusy are required to balance the calls to busy. + ''' + self._busy_count -= 1 + if self._busy_count == 0: + self._set_cursor(self._old_cursor) + return self._busy_count + + def _set_cursor(self, cursor): + self.get_window().set_cursor(cursor) + Gdk.flush() + class _ClientHandler(dbus.service.Object, DBusProperties): def __init__(self, bundle_id, got_channel_cb):