Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore2
-rw-r--r--activity.py54
-rw-r--r--simpleactivity.py240
3 files changed, 250 insertions, 46 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..52e4e61
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+*.pyc
+*.pyo
diff --git a/activity.py b/activity.py
index 2252983..b0a66ae 100644
--- a/activity.py
+++ b/activity.py
@@ -14,63 +14,25 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-"""HelloWorld Activity: A case study for developing an activity."""
+"""HelloWorld Activity: A case study for developing an activity"""
from gi.repository import Gtk
-import logging
from gettext import gettext as _
+from simpleactivity import SimpleActivity
-from sugar3.activity import activity
-from sugar3.graphics.toolbarbox import ToolbarBox
-from sugar3.activity.widgets import ActivityButton
-from sugar3.activity.widgets import TitleEntry
-from sugar3.activity.widgets import StopButton
-from sugar3.activity.widgets import ShareButton
-from sugar3.activity.widgets import DescriptionItem
-class HelloWorldActivity(activity.Activity):
+class HelloWorldActivity(SimpleActivity):
"""HelloWorldActivity class as specified in activity.info"""
def __init__(self, handle):
"""Set up the HelloWorld activity."""
- activity.Activity.__init__(self, handle)
+ SimpleActivity.__init__(self, handle,
+ activitytoolbarbutton=False)
+ # The last param puts our activity buttons directly in the main toolbar
- # we do not have collaboration features
- # make the share option insensitive
- self.max_participants = 1
-
- # toolbar with the new toolbar redesign
- toolbar_box = ToolbarBox()
-
- activity_button = ActivityButton(self)
- toolbar_box.toolbar.insert(activity_button, 0)
- activity_button.show()
-
- title_entry = TitleEntry(self)
- toolbar_box.toolbar.insert(title_entry, -1)
- title_entry.show()
-
- description_item = DescriptionItem(self)
- toolbar_box.toolbar.insert(description_item, -1)
- description_item.show()
-
- share_button = ShareButton(self)
- toolbar_box.toolbar.insert(share_button, -1)
- share_button.show()
-
- separator = Gtk.SeparatorToolItem()
- separator.props.draw = False
- separator.set_expand(True)
- toolbar_box.toolbar.insert(separator, -1)
- separator.show()
-
- stop_button = StopButton(self)
- toolbar_box.toolbar.insert(stop_button, -1)
- stop_button.show()
-
- self.set_toolbar_box(toolbar_box)
- toolbar_box.show()
+ # Let's add the StopButton
+ self.add_stopbutton()
# label with the text, make the string translatable
label = Gtk.Label(_("Hello World!"))
diff --git a/simpleactivity.py b/simpleactivity.py
new file mode 100644
index 0000000..46e1181
--- /dev/null
+++ b/simpleactivity.py
@@ -0,0 +1,240 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (C) 2013 Agustin Zubiaga <aguz@sugarlabs.org>.
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 3 of the License, or (at your option) any later version.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the
+# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+from gi.repository import Gtk
+from gi.repository import GObject
+from sugar3.activity import activity
+from sugar3.activity.widgets import StopButton
+from sugar3.graphics.toolbarbox import ToolbarBox
+from sugar3.activity.widgets import ToolbarButton
+from sugar3.graphics.toolbutton import ToolButton
+
+import time
+import os
+
+try:
+ import json
+except ImportError:
+ import simplejson as json
+
+
+class SimpleActivity(activity.Activity):
+
+ """SimpleActivity: This class is extension of
+ sugar3.activity.activity.Activiy
+
+ This will create the Toolbar automatically with the
+ ActivityToolbarButton or will put all the Activity Buttons in the
+ toolbarbox if you set activitytoolbarbutton (__init__ parameter)
+ to False.
+
+ And you can add buttons to the main in a simple way just
+ using the add_toolbutton method.
+
+ Every "add-method" support the index parameter:
+ self.add_toolbutton(..., index=2)
+
+ And when you finish building you toolbar just call:
+ self.add_stop_button()
+
+ There is a reserved variable (self.data) where you can save something
+ and when the activity gets closed, it is auto-saved to the jorunal.
+ And then when the activity runs again, self.data will contain what was
+ saved. You can connect to the "data-loaded" signal to know when the
+ self.data loaded is ready to use (Have loaded data from file).
+
+ There are also other very easy-to-use methods, see their docs
+ to get more information about what you can do with this.
+ """
+
+ __gtype_name__ = 'SugarSimpleActivity'
+
+ __gsignals__ = {
+ 'data-loaded': (GObject.SignalFlags.RUN_FIRST, None, [])}
+
+ def __init__(self, handle,
+ activitytoolbarbutton=True,
+ sharing=False):
+ activity.Activity.__init__(self, handle)
+
+ if not sharing:
+ self.max_participants = 1
+
+ self.data = {}
+ self.activity_toolbar = None
+ self.toolbarbox = ToolbarBox()
+
+ if activitytoolbarbutton:
+ from sugar3.activity.widgets import ActivityToolbarButton
+
+ activity_button = ActivityToolbarButton(self)
+ self.activity_toolbar = activity_button.props.page
+ self.add_to_toolbar(activity_button)
+
+ else:
+ from sugar3.activity.widgets import ActivityButton
+ from sugar3.activity.widgets import TitleEntry
+ from sugar3.activity.widgets import ShareButton
+ from sugar3.activity.widgets import DescriptionItem
+
+ activity_button = ActivityButton(self)
+ self.add_to_toolbar(activity_button)
+ activity_button.show()
+
+ title_entry = TitleEntry(self)
+ self.add_to_toolbar(title_entry)
+ title_entry.show()
+
+ description_item = DescriptionItem(self)
+ self.add_to_toolbar(description_item)
+ description_item.show()
+
+ share_button = ShareButton(self)
+ self.add_to_toolbar(share_button)
+ share_button.show()
+
+ self.toolbarbox.show()
+ self.set_toolbar_box(self.toolbarbox)
+
+ def add_toolbar(self, item, icon, index=-1):
+ """Add a ToolbarButton to the toolbarbox, and return the page
+ (Gtk.Toolbar)"""
+
+ toolbar_btn = ToolbarButton(icon_name=icon)
+ toolbar_btn.props.page = Gtk.Toolbar()
+ self.toolbarbox.toolbar.insert(toolbar_btn, index)
+
+ return toolbar_btn.props.page
+
+ def add_toolbutton(self, icon=None, cb=None, tooltip=None, index=-1,
+ toolbar=None):
+ """
+ Creates a ToolButton and add it to the main toolbar or another.
+
+ To add a ToolButton just do this:
+ self.add_toolbutton(icon, callback, tooltip, index, toolbar)
+
+ icon: The name of the icon you want to use
+ callback: The method you want to call when the button is clicked
+ tooltip: The tooltip you want to show
+ index: The place of the toolbar you want to take
+ toolbar: The toolbar where you want to add this button
+ If you do not give this parameter, it will use the main
+ toolbar (self.toolbarbox)
+
+ Do you want to do more with your button?
+ Don't worry you can get it doing this:
+ mybutton = self.add_toolbutton(...
+ """
+
+ toolbutton = ToolButton(icon) if icon is not None else ToolButton()
+ if cb is not None:
+ toolbutton.connect('clicked', cb)
+
+ if tooltip is not None:
+ toolbutton.set_tooltip(tooltip)
+
+ self.add_to_toolbar(toolbutton, index=index, toolbar=toolbar)
+
+ return toolbutton
+
+ def add_to_toolbar(self, item, index=-1, toolbar=None):
+ """Add a ToolItem to the main toolbar (toolbarbox) or another
+
+ If you give another Gtk.Widget (not an instance of Gtk.ToolItem)
+ it will be added automatically into a one.
+
+ Example:
+ entry = Gtk.Entry()
+ self.add_to_toolbar(entry)
+
+ Want to add this to another toolbar just set the toolbar parameter:
+ self.add_to_toolbar(button, toolbar=mytoolbar)
+ """
+
+ toolbar = toolbar or self.toolbarbox.toolbar
+
+ if not isinstance(item, Gtk.ToolItem):
+ widget = item
+ item = Gtk.ToolItem()
+ item.add(widget)
+
+ toolbar.insert(item, index)
+ item.show()
+
+ def add_to_activitytoolbar(self, item, index=-1):
+ """Add an item to activity_toolbar"""
+ if self.activity_toolbar:
+ self.add_to_toolbar(item, index=index,
+ toolbar=self.activity_toolbar)
+ else:
+ raise Exception("There isn't an activity toolbar")
+
+ def add_separator(self, draw=True, expand=False, index=-1, toolbar=None):
+ """Add separator to the toolbarbox or another
+
+ self.add_separator(draw, expand)
+ It also supports index and toolbar parameters.
+ """
+
+ separator = Gtk.SeparatorToolItem()
+ separator.set_draw(draw)
+ separator.set_expand(expand)
+
+ self.add_to_toolbar(separator, index=index, toolbar=toolbar)
+
+ def add_stopbutton(self):
+ """Appends the stop button to the end of the toolbarbox"""
+ self.add_separator(False, True)
+
+ stopbutton = StopButton(self)
+ self.add_to_toolbar(stopbutton)
+
+ def get_data_file(self, filename=None):
+ """Returns a file in the data/ dir of the activity, where you can
+ save whatever"""
+ data_dir = os.path.join(activity.get_activity_root(), 'data')
+ file_path = filename if filename else os.path.join(data_dir,
+ str(time.time()))
+
+ return file_path
+
+ def save_data(self):
+ """Override this function, in order to save whatever in self.data,
+ this mean that sugar is call the write_file method"""
+ return
+
+ def write_file(self, file_name):
+ self.save_data()
+ if self.data is not None and self.data != {}:
+ try:
+ wfile = open(file_name, 'w')
+ json.dump(self.data, wfile)
+ finally:
+ wfile.close()
+
+ def read_file(self, file_name):
+ try:
+ rfile = open(file_name)
+ self.data = json.load(rfile)
+ self.emit('data-loaded')
+ finally:
+ rfile.close()
+