Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/activity.py
diff options
context:
space:
mode:
Diffstat (limited to 'activity.py')
-rw-r--r--activity.py295
1 files changed, 295 insertions, 0 deletions
diff --git a/activity.py b/activity.py
new file mode 100644
index 0000000..54460df
--- /dev/null
+++ b/activity.py
@@ -0,0 +1,295 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# Enyo activity: A case study for developing a HTML5 activity with Enyo Framework.
+# Lionel Laské inspired by Manuel Quiñones and Simon Schampijer
+
+
+from gi.repository import Gtk
+import logging
+import os
+
+from gettext import gettext as _
+
+from sugar3.activity import activity
+from sugar3.graphics.toolbarbox import ToolbarBox
+from sugar3.graphics.toolbutton import ToolButton
+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
+from sugar3.presence import presenceservice
+
+from gi.repository import WebKit
+import logging
+import gconf
+
+from datetime import date
+
+from enyo import Enyo
+
+
+class EnyoActivity(activity.Activity):
+ """EnyoActivity class as specified in activity.info"""
+
+ def __init__(self, handle):
+ """Set up the activity."""
+ activity.Activity.__init__(self, handle)
+
+ self.max_participants = 1
+
+ self.make_toolbar()
+ self.make_mainview()
+
+ class DummyObject:
+ """Dummy class used to demonstrated object transfer to JavaScript"""
+ name = "Lionel"
+ version = 2.0
+ modified = date.today()
+ language = ['Python', 'JavaScript']
+ def foo(self):
+ pass
+
+ def send_string(self, button):
+ """Click on send string button, send a simple string to JavaScript"""
+ self.enyo.send_message("helloFromPY", "Hello JavaScript !")
+
+ def send_object(self, button):
+ """Click on send string button, send a simple string to JavaScript"""
+ self.enyo.send_message("helloFromPY", self.DummyObject())
+
+ def alert(self, msg):
+ """Display a message dialog"""
+ messagedialog = Gtk.MessageDialog(self, type=1, buttons=1, message_format=msg)
+ messagedialog.run()
+ messagedialog.destroy()
+
+ def display_message(self, param):
+ """A message was received from JavaScript, display it"""
+ # Display as a JSON string to see structure
+ self.alert("Python received "+self.enyo.json_encode(param))
+
+ def go_home(self, button):
+ """Toolbar button home clicked, signal to JavaScript to update page count"""
+ self.enyo.send_message("home_clicked", 0)
+
+ def go_back(self, button):
+ """Toolbar button back clicked, signal to JavaScript to update page count"""
+ self.enyo.send_message("back_clicked", -1)
+
+ def go_forward(self, button):
+ """Toolbar button forward clicked, signal to JavaScript to update page count"""
+ self.enyo.send_message("forward_clicked", 1)
+
+ def checkbox_changed(self, button):
+ """Checked state changed, signal to JavaScript to update the matching control"""
+ self.enyo.send_message("py_checkbox_changed", self.checkbox.get_active())
+
+ def slider_changed(self, event):
+ """Slider changed, signal to JavaScript to update page count"""
+ self.enyo.send_message("py_slider_changed", self.adjustment.get_value())
+
+ def turtle_forward(self, button):
+ """Turtle forward button clicked, signal to JavaScript to update Canvas"""
+ self.enyo.send_message("liogo_forward_clicked", 60)
+
+ def turtle_left(self, button):
+ """Turtle left button clicked, signal to JavaScript to update Canvas"""
+ self.enyo.send_message("liogo_left_clicked", 90)
+
+ def turtle_right(self, button):
+ """Turtle right button clicked, signal to JavaScript to update Canvas"""
+ self.enyo.send_message("liogo_right_clicked", 90)
+
+ def turtle_clear(self, button):
+ """Turtle clear button clicked, signal to JavaScript to update Canvas"""
+ self.enyo.send_message("liogo_clear_clicked")
+
+ def jscript_slider_changed(self, args):
+ """Javascript slider changed, update the matching slider"""
+ self.adjustment.set_value(int(args))
+
+ def jscript_checkbox_changed(self, args):
+ """Javascript checkbox changed, update the matching checkbox"""
+ if args:
+ self.checkbox.set_active(True)
+ else:
+ self.checkbox.set_active(False)
+
+ def disable_back(self, args):
+ """Javascript request to change sensitive status of the toolbar back button"""
+ self.back_button.set_sensitive(args != "True")
+
+ def disable_forward(self, args):
+ """Javascript request to change sensitive status of the toolbar forward button"""
+ self.forward_button.set_sensitive(args != "True")
+
+ def init_context(self, args):
+ """Init Javascript context sending buddy information"""
+ # Get XO colors
+ buddy = {}
+ client = gconf.client_get_default()
+ colors = client.get_string("/desktop/sugar/user/color")
+ buddy["colors"] = colors.split(",")
+
+ # Get XO name
+ presenceService = presenceservice.get_instance()
+ buddy["name"] = presenceService.get_owner().props.nick
+
+ self.enyo.send_message("buddy", buddy)
+
+ def make_mainview(self):
+ """Create the activity view"""
+ # Create global box
+ vbox = Gtk.VBox(True)
+
+ # Create webview
+ scrolled_window = Gtk.ScrolledWindow()
+ self.webview = webview = WebKit.WebView()
+ scrolled_window.add(webview)
+ webview.show()
+ vbox.pack_start(scrolled_window, True, True, 0)
+ scrolled_window.show()
+
+ # Create python view
+ hbox = Gtk.VBox(False)
+
+ # Create image and label
+ ubox = Gtk.HBox(False)
+ image = Gtk.Image()
+ image.set_from_file("images/python-logo.jpg")
+ ubox.pack_start(image, False, False, 5)
+ image.show()
+ label = Gtk.Label("This the Sugar part of the activity. All content is handle by Python code.")
+ ubox.pack_start(label, False, False, 10)
+ label.show()
+ ubox.show()
+ hbox.pack_start(ubox, False, False, 10)
+
+ # Create send simple message buttons
+ ubox = Gtk.HBox(False)
+ button = Gtk.Button("Send string to JavaScript")
+ button.connect('clicked', self.send_string)
+ ubox.pack_start(button, False, False, 0)
+ button.show()
+ button = Gtk.Button("Send object to JavaScript")
+ button.connect('clicked', self.send_object)
+ ubox.pack_start(button, False, False, 10)
+ button.show()
+ ubox.show()
+ hbox.pack_start(ubox, False, False, 0)
+
+ # Create synchronized control
+ ubox = Gtk.HBox(False)
+ checkbox = self.checkbox = Gtk.CheckButton("Checkbox")
+ checkbox.set_active(True)
+ checkbox.connect('toggled', self.checkbox_changed)
+ ubox.pack_start(checkbox, False, False, 0)
+ checkbox.show()
+ adjustment = self.adjustment = Gtk.Adjustment(50, 0, 100, 1)
+ adjustment.connect('value-changed', self.slider_changed)
+ hscale = self.hscale = Gtk.HScale()
+ hscale.set_adjustment(adjustment)
+ hscale.set_size_request(250, 50)
+ hscale.set_digits(0)
+ ubox.pack_start(hscale, False, False, 20)
+ hscale.show()
+ ubox.show()
+ hbox.pack_start(ubox, False, False, 20)
+
+ # Create turtle commander
+ ubox = Gtk.HBox(False)
+ label = Gtk.Label("Turtle command:")
+ ubox.pack_start(label, False, False, 10)
+ label.show()
+ button = Gtk.Button("forward 60")
+ button.connect('clicked', self.turtle_forward)
+ ubox.pack_start(button, False, False, 10)
+ button.show()
+ button = Gtk.Button("left 90")
+ button.connect('clicked', self.turtle_left)
+ ubox.pack_start(button, False, False, 10)
+ button.show()
+ button = Gtk.Button("right 90")
+ button.connect('clicked', self.turtle_right)
+ ubox.pack_start(button, False, False, 10)
+ button.show()
+ button = Gtk.Button("clear")
+ button.connect('clicked', self.turtle_clear)
+ ubox.pack_start(button, False, False, 10)
+ button.show()
+ ubox.show()
+ hbox.pack_start(ubox, False, False, 20)
+
+ vbox.pack_start(hbox, False, False, 0)
+ hbox.show()
+
+ # Activate Enyo interface
+ self.enyo = Enyo(webview)
+ self.enyo.connect("ready", self.init_context)
+ self.enyo.connect("helloFromJS", self.display_message)
+ self.enyo.connect("disableBack", self.disable_back)
+ self.enyo.connect("disableForward", self.disable_forward)
+ self.enyo.connect("JSsliderChanged", self.jscript_slider_changed)
+ self.enyo.connect("JScheckboxChanged", self.jscript_checkbox_changed)
+
+ # Go to first page
+ web_app_page = os.path.join(activity.get_bundle_path(), "html/index.html")
+ self.webview.load_uri('file://' + web_app_page)
+
+ # Display all
+ self.set_canvas(vbox)
+ vbox.show()
+
+ def make_toolbar(self):
+ # toolbar with the new toolbar redesign
+ toolbar_box = ToolbarBox()
+
+ activity_button = ActivityButton(self)
+ toolbar_box.toolbar.insert(activity_button, 0)
+ activity_button.show()
+
+ home_button = ToolButton('go-home')
+ home_button.set_tooltip('Page count to 0')
+ home_button.connect('clicked', self.go_home)
+ toolbar_box.toolbar.insert(home_button, -1)
+ home_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()
+
+ back_button = self.back_button = ToolButton('go-previous-paired')
+ back_button.set_tooltip('Page count -1')
+ back_button.connect('clicked', self.go_back)
+ back_button.set_sensitive(False)
+ toolbar_box.toolbar.insert(back_button, -1)
+ back_button.show()
+
+ forward_button = self.forward_button = ToolButton('go-next-paired')
+ forward_button.set_tooltip('Page count +1')
+ forward_button.connect('clicked', self.go_forward)
+ toolbar_box.toolbar.insert(forward_button, -1)
+ forward_button.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()