[Sugar-devel] [PATCH 2/2] Words: removal of pippy code
Rafael Ortiz
rafael at activitycentral.com
Thu Aug 25 14:54:05 EDT 2011
On Wed, Aug 24, 2011 at 9:20 PM, Manuel Quiñones <manuq at laptop.org> wrote:
> The activity was done in Pippy. It has unneeded functions, and svg
> icons embedded in the code. I'm removing them to make Words code more
> consistent with the rest of the activities.
>
> Signed-off-by: Manuel Quiñones <manuq at laptop.org>
> ---
> activity.py | 84 ------------
> activity/activity.info | 2 +-
> pippy_app.py | 349
> ------------------------------------------------
> wordsactivity.py | 267 ++++++++++++++++++++++++++++++++++++
> 4 files changed, 268 insertions(+), 434 deletions(-)
> delete mode 100644 activity.py
> delete mode 100644 pippy_app.py
> create mode 100644 wordsactivity.py
>
> diff --git a/activity.py b/activity.py
> deleted file mode 100644
> index 061187e..0000000
> --- a/activity.py
> +++ /dev/null
> @@ -1,84 +0,0 @@
> -from sugar.activity import activity
> -
> -class ViewSourceActivity(activity.Activity):
> - """Activity subclass which handles the 'view source' key."""
> - def __init__(self, handle):
> - super(ViewSourceActivity, self).__init__(handle)
> - self.__source_object_id = None # XXX: persist this across
> invocations?
> - self.connect('key-press-event', self._key_press_cb)
> - def _key_press_cb(self, widget, event):
> - import gtk
> - if gtk.gdk.keyval_name(event.keyval) == 'XF86Start':
> - self.view_source()
> - return True
> - return False
> - def view_source(self):
> - """Implement the 'view source' key by saving pippy_app.py to the
> - datastore, and then telling the Journal to view it."""
> - if self.__source_object_id is None:
> - from sugar import profile
> - from sugar.datastore import datastore
> - from sugar.activity.activity import get_bundle_name,
> get_bundle_path
> - from gettext import gettext as _
> - import os.path
> - jobject = datastore.create()
> - metadata = {
> - 'title': _('%s Source') % get_bundle_name(),
> - 'title_set_by_user': '1',
> - 'suggested_filename': 'pippy_app.py',
> - 'icon-color': profile.get_color().to_string(),
> - 'mime_type': 'text/x-python',
> - }
> - for k, v in metadata.items():
> - jobject.metadata[k] = v # dict.update method is missing
> =(
> - jobject.file_path = os.path.join(get_bundle_path(),
> 'pippy_app.py')
> - datastore.write(jobject)
> - self.__source_object_id = jobject.object_id
> - jobject.destroy()
> - self.journal_show_object(self.__source_object_id)
> - def journal_show_object(self, object_id):
> - """Invoke journal_show_object from sugar.activity.activity if it
> - exists."""
> - try:
> - from sugar.activity.activity import show_object_in_journal
> - show_object_in_journal(object_id)
> - except ImportError:
> - pass # no love from sugar.
> -
> -class VteActivity(ViewSourceActivity):
> - def __init__(sfelf, handle):
> - import gtk, pango, vte
> - super(VteActivity, self).__init__(handle)
> - toolbox = activity.ActivityToolbox(self)
> - self.set_toolbox(toolbox)
> - toolbox.show()
> -
> - # creates vte widget
> - self._vte = vte.Terminal()
> - self._vte.set_size(30, 5)
> - self._vte.set_size_request(200, 300)
> - font = 'Monospace 10'
> - self._vte.set_font(pango.FontDescription(font))
> - self._vte.set_colors(gtk.gdk.color_parse ('#000000'),
> - gtk.gdk.color_parse ('#E7E7E7'),
> - [])
> - # ...and its scrollbar
> - vtebox = gtk.HBox()
> - vtebox.pack_start(self._vte)
> - vtesb = gtk.VScrollbar(self._vte.get_adjustment())
> - vtesb.show()
> - vtebox.pack_start(vtesb, False, False, 0)
> - self.set_canvas(vtebox)
> - self.show_all()
> -
> - # now start subprocess.
> - self._vte.grab_focus()
> - bundle_path = activity.get_bundle_path()
> - # the 'sleep 1' works around a bug with the command dying before
> - # the vte widget manages to snarf the last bits of its output
> - self._pid = self._vte.fork_command \
> - (command='/bin/sh',
> - argv=['/bin/sh','-c',
> - 'python %s/pippy_app.py; sleep 1' %
> bundle_path],
> - envv=["PYTHONPATH=%s/library" % bundle_path],
> - directory=bundle_path)
> diff --git a/activity/activity.info b/activity/activity.info
> index 43fd48e..be2269c 100644
> --- a/activity/activity.info
> +++ b/activity/activity.info
> @@ -1,7 +1,7 @@
> [Activity]
> name = Words
> bundle_id = org.laptop.Words
> -class = pippy_app.WordsActivity
> +class = wordsactivity.WordsActivity
> icon = activity-icon
> activity_version = 10
> show_launcher = yes
> diff --git a/pippy_app.py b/pippy_app.py
> deleted file mode 100644
> index 52750c2..0000000
> --- a/pippy_app.py
> +++ /dev/null
> @@ -1,349 +0,0 @@
> -# Copyright 2008 Chris Ball.
> -#
> -# 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
> -
> -"""Words Activity: A multi-lingual dictionary with speech synthesis."""
> -"""Actividad Palabras: Un diccionario multi-lengua con sintesis de
> habla"""
> -
> -import gtk
> -import logging
> -import pango
> -import re
> -import os
> -import os.path
> -import subprocess
> -
> -from gettext import gettext as _
> -from dbus.service import method, signal
> -
> -from activity import ViewSourceActivity
> -from sugar.activity.activity import ActivityToolbox, \
> - get_bundle_path, get_bundle_name
> -
> -from sugar.graphics.toolbutton import ToolButton
> -
> -# logging
> -logger = logging.getLogger('Words')
> -
> -SERVICE = "org.laptop.Words"
> -IFACE = SERVICE
> -PATH = "/org/laptop/Words"
> -
> -class WordsActivity(ViewSourceActivity):
> - """Words Activity as specified in activity.info"""
> - def __init__(self, handle):
> - """Set up the Words activity."""
> - super(WordsActivity, self).__init__(handle)
> - self._logger = logging.getLogger('words-activity')
> -
> - from sugar.graphics.menuitem import MenuItem
> - from sugar.graphics.icon import Icon
> -
> - # Instantiate a language model.
> - # FIXME: We should ask the language model what langs it supports.
> - self.langs = ["French", "German", "Italian", "Portuguese",
> "Spanish"]
> - # Initial values.
> - self.fromlang = "English"
> - self.tolang = "Spanish"
> - import LanguageModel
> - self.languagemodel = LanguageModel.LanguageModel()
> -
> - # We do not have collaboration features
> - # make the share option insensitive
> - self.max_participants = 1
> -
> - # Main layout.
> - hbox = gtk.HBox(homogeneous=True, spacing=8)
> - vbox = gtk.VBox(spacing=16)
> - vbox.set_border_width(16)
> -
> - # Toolbar (compatibility with old-toolbars).
> - try:
> - from sugar.graphics.toolbarbox import ToolbarBox,
> ToolbarButton
> - from sugar.activity.widgets import ActivityButton, StopButton,
> \
> - ShareButton, KeepButton,
> TitleEntry
> -
> - 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()
> -
> - 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_toolbox(toolbar_box)
> - toolbar_box.show()
> - except ImportError:
> - toolbox = ActivityToolbox(self)
> - self.set_toolbox(toolbox)
> - toolbox.show()
> -
> - # transbox: <label> - <text entry> - <speak button>
> - transbox = gtk.Table()
> - transbox.resize(2, 3)
> - transbox.set_row_spacings(8)
> - transbox.set_col_spacings(12)
> -
> - # Labels.
> - label1 = gtk.Label(_("Word") + ':')
> - label1.set_alignment(xalign=0.0, yalign=0.5)
> - label2 = gtk.Label(_("Translation") + ':')
> - label2.set_alignment(xalign=0.0, yalign=0.5)
> -
> - # Text entry box to enter word to be translated.
> - self.totranslate = gtk.Entry(max=50)
> - self.totranslate.connect("changed", self.totranslate_cb)
> - self.totranslate.modify_font(pango.FontDescription("Sans 14"))
> -
> - # Text entry box to receive word translated.
> - self.translated = gtk.Entry(max=50)
> - self.translated.set_property('editable', False)
> - self.translated.modify_font(pango.FontDescription("Sans 14"))
> -
> - # Speak buttons.
> - speak1 = gtk.ToolButton()
> - speak_icon1 = Icon(icon_name='microphone')
> - speak1.set_icon_widget(speak_icon1)
> - speak1.connect("clicked", self.speak1_cb)
> - speak2 = gtk.ToolButton()
> - speak_icon2 = Icon(icon_name='microphone')
> - speak2.set_icon_widget(speak_icon2)
> - speak2.connect("clicked", self.speak2_cb)
> -
> - transbox.attach(label1, 0, 1, 0, 1, xoptions=gtk.FILL)
> - transbox.attach(self.totranslate, 1, 2, 0, 1,
> xoptions=gtk.FILL|gtk.EXPAND)
> - transbox.attach(speak1, 2, 3, 0, 1, xoptions=gtk.FILL)
> -
> - transbox.attach(label2, 0, 1, 1, 2, xoptions=gtk.FILL)
> - transbox.attach(self.translated, 1, 2, 1, 2,
> xoptions=gtk.FILL|gtk.EXPAND)
> - transbox.attach(speak2, 2, 3, 1, 2, xoptions=gtk.FILL)
> -
> - vbox.pack_start(transbox, expand=False)
> -
> - # The language choice combo boxes.
> - self.lang1combo = gtk.combo_box_new_text()
> - self.lang1combo.append_text("English")
> - self.lang1combo.connect("changed", self.lang1combo_cb)
> - self.lang1combo.set_active(0)
> -
> - self.lang2combo = gtk.combo_box_new_text()
> - for x in self.langs:
> - self.lang2combo.append_text(x)
> - self.lang2combo.connect("changed", self.lang2combo_cb)
> - self.lang2combo.set_active(4)
> -
> - self.lang1combo.set_size_request(600,50)
> - self.lang2combo.set_size_request(600,50)
> -
> - # The "lang1" treeview box
> - self.lang1model = gtk.ListStore(str)
> - lang1view = gtk.TreeView(self.lang1model)
> - lang1view.set_headers_visible(False)
> - lang1cell = gtk.CellRendererText()
> - lang1treecol = gtk.TreeViewColumn("", lang1cell, text=0)
> - lang1view.get_selection().connect("changed", self.lang1sel_cb)
> - lang1view.append_column(lang1treecol)
> - lang1scroll = gtk.ScrolledWindow(hadjustment=None,
> vadjustment=None)
> - lang1scroll.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
> - lang1scroll.add(lang1view)
> -
> - # The "lang2" box
> - self.lang2model = gtk.ListStore(str)
> - lang2view = gtk.TreeView(self.lang2model)
> - lang2view.set_headers_visible(False)
> - lang2cell = gtk.CellRendererText()
> - lang2treecol = gtk.TreeViewColumn("", lang2cell, text=0)
> - lang2view.get_selection().connect("changed", self.lang2sel_cb)
> - lang2view.append_column(lang2treecol)
> - lang2scroll = gtk.ScrolledWindow(hadjustment=None,
> vadjustment=None)
> - lang2scroll.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
> - lang2scroll.add(lang2view)
> -
> - lang1_vbox = gtk.VBox(spacing=8)
> - lang1_vbox.pack_start(self.lang1combo, expand=False)
> - lang1_vbox.pack_start(lang1scroll)
> -
> - lang2_vbox = gtk.VBox(spacing=8)
> - lang2_vbox.pack_start(self.lang2combo, expand=False)
> - lang2_vbox.pack_start(lang2scroll)
> -
> - hbox.pack_start(lang1_vbox)
> - hbox.pack_start(lang2_vbox)
> -
> - vbox.pack_start(hbox)
> - self.set_canvas(vbox)
> - self.totranslate.grab_focus()
> - self.show_all()
> -
> - def say(self, text, lang):
> - # No Portuguese accent yet.
> - if lang == "portuguese":
> - lang = "spanish"
> - tmpfile = "/tmp/something.wav"
> - subprocess.call(["espeak", text, "-w", tmpfile, "-v", lang])
> - subprocess.call(["aplay", tmpfile])
> - os.unlink(tmpfile)
> -
> - def lang1combo_cb(self, combo):
> - pass
> -
> - def lang2combo_cb(self, combo):
> - self.languagemodel.SetLanguages("English",
> self.langs[combo.get_active()])
> -
> - def lang1sel_cb(self, column):
> - # FIXME: Complete the text entry box
> - model, _iter = column.get_selected()
> - value = model.get_value(_iter,0)
> - translations = self.languagemodel.GetTranslations(0, value)
> - self.translated.set_text(",".join(translations))
> -
> - def lang2sel_cb(self, column):
> - model, _iter = column.get_selected()
> - value = model.get_value(_iter,0)
> - translations = self.languagemodel.GetTranslations(1, value)
> - self.translated.set_text(",".join(translations))
> -
> - def speak1_cb(self, button):
> - text = self.totranslate.get_text()
> - lang = self.fromlang.lower()
> - self.say(text, lang)
> -
> - def speak2_cb(self, button):
> - text = self.translated.get_text()
> - lang = self.tolang.lower()
> - self.say(text, lang)
> -
> - def totranslate_cb(self, totranslate):
> - entry = totranslate.get_text()
> - # Ask for completion suggestions
> - if not entry:
> - return
> -
> - (list1, list2) = self.languagemodel.GetSuggestions(entry)
> - self.lang1model.clear()
> - self.lang2model.clear()
> - for x in list1:
> - self.lang1model.append([x])
> - for x in list2:
> - self.lang2model.append([x])
> -
> - # If we think we know what the word will be, translate it.
> - if entry in list1 or len(list1) == 1 and len(list2) == 0:
> - langiter = self.lang2combo.get_active()
> - lang = self.langs[langiter].lower()
> - self.fromlang = "English"
> - self.tolang = lang
> - translations = self.languagemodel.GetTranslations(0, list1[0])
> - self.translated.set_text(",".join(translations))
> -
> - elif entry in list2 or len(list1) == 0 and len(list2) == 1:
> - langiter = self.lang2combo.get_active()
> - lang = self.langs[langiter].lower()
> - self.fromlang = lang
> - self.tolang = "English"
> - translations = self.languagemodel.GetTranslations(1, list2[0])
> - self.translated.set_text(",".join(translations))
> -
> -############# TEMPLATES AND INLINE FILES ##############
> -ACTIVITY_INFO_TEMPLATE = """
> -[Activity]
> -name = %(title)s
> -bundle_id = %(bundle_id)s
> -service_name = %(bundle_id)s
> -class = %(class)s
> -icon = activity-icon
> -activity_version = %(version)d
> -mime_types = %(mime_types)s
> -show_launcher = yes
> -%(extra_info)s
> -"""
> -
> -PIPPY_ICON = \
> -"""<?xml version="1.0" ?><!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN'
> 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd' [
> - <!ENTITY stroke_color "#010101">
> - <!ENTITY fill_color "#FFFFFF">
> -]><svg enable-background="new 0 0 55 55" height="55px" version="1.1"
> viewBox="0 0 55 55" width="55px" x="0px" xml:space="preserve" xmlns="
> http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
> y="0px"><g display="block" id="activity-pippy">
> - <path d="M28.497,48.507
> c5.988,0,14.88-2.838,14.88-11.185c0-9.285-7.743-10.143-10.954-11.083c-3.549-0.799-5.913-1.914-6.055-3.455
>
> c-0.243-2.642,1.158-3.671,3.946-3.671c0,0,6.632,3.664,12.266,0.74c1.588-0.823,4.432-4.668,4.432-7.32
>
> c0-2.653-9.181-5.719-11.967-5.719c-2.788,0-5.159,3.847-5.159,3.847c-5.574,0-11.149,5.306-11.149,10.612
>
> c0,5.305,5.333,9.455,11.707,10.612c2.963,0.469,5.441,2.22,4.878,5.438c-0.457,2.613-2.995,5.306-8.361,5.306
>
> c-4.252,0-13.3-0.219-14.745-4.079c-0.929-2.486,0.168-5.205,1.562-5.205l-0.027-0.16c-1.42-0.158-5.548,0.16-5.548,5.465
> C8.202,45.452,17.347,48.507,28.497,48.507z" fill="&fill_color;"
> stroke="&stroke_color;" stroke-linecap="round" stroke-linejoin="round"
> stroke-width="3.5"/>
> - <path d="M42.579,19.854c-2.623-0.287-6.611-2-7.467-5.022"
> fill="none" stroke="&stroke_color;" stroke-linecap="round"
> stroke-width="3"/>
> - <circle cx="35.805" cy="10.96" fill="&stroke_color;" r="1.676"/>
> -</g></svg><!-- " -->
> -"""
> -
> -PIPPY_DEFAULT_ICON = \
> -"""<?xml version="1.0" ?><!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN'
> 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd' [
> - <!ENTITY stroke_color "#010101">
> - <!ENTITY fill_color "#FFFFFF">
> -]><svg enable-background="new 0 0 55 55" height="55px" version="1.1"
> - viewBox="0 0 55 55" width="55px" x="0px" y="0px" xml:space="preserve"
> - xmlns="http://www.w3.org/2000/svg"
> - xmlns:xlink="http://www.w3.org/1999/xlink"
> -><g display="block" id="activity-icon"><path
> - d="M 28.497,48.507 C 34.485,48.507 43.377,45.669 43.377,37.322 C
> 43.377,32.6795 41.44125,30.14375 39.104125,28.651125 C 36.767,27.1585
> 38.482419,26.816027 39.758087,25.662766 C 39.42248,24.275242
> 37.206195,22.826987 36.262179,21.037968 C 34.005473,20.582994 27.526,19.113
> 30.314,19.113 C 30.314,19.113 36.946,22.777 42.58,19.853 C 44.168,19.03
> 47.012,15.185 47.012,12.533 C 47.012,9.88 37.831,6.814 35.045,6.814 C
> 32.257,6.814 29.886,10.661 29.886,10.661 C 24.312,10.661 12.043878,16.258005
> 12.043878,21.564005 C 12.043878,24.216505 16.585399,30.069973
> 19.144694,33.736352 C 22.438716,38.455279 27.257,31.3065 30.444,31.885 C
> 33.407,32.354 35.885,34.105 35.322,37.323 C 34.865,39.936 32.327,42.629
> 26.961,42.629 C 22.709,42.629 13.661,42.41 12.216,38.55 C 11.287,36.064
> 12.384,33.345 13.778,33.345 L 13.751,33.185 C 12.331,33.027 8.203,33.345
> 8.203,38.65 C 8.202,45.452 17.347,48.507 28.497,48.507 z "
> - fill="&fill_color;" stroke="&stroke_color;" stroke-linecap="round"
> stroke-linejoin="round" stroke-width="3.5" />
> - <path d="M42.579,19.854c-2.623-0.287-6.611-2-7.467-5.022"
> fill="none" stroke="&stroke_color;" stroke-linecap="round"
> stroke-width="3"/>
> - <circle cx="35.805" cy="10.96" fill="&stroke_color;" r="1.676"/>
> -</g></svg><!-- " -->
> -"""
> -
> -############# ACTIVITY META-INFORMATION ###############
> -# this is used by Words to generate a bundle for itself.
> -
> -def pippy_activity_version():
> - """Returns the version number of the generated activity bundle."""
> - return 1
> -def pippy_activity_extra_files():
> - """Returns a map of 'extra' files which should be included in the
> - generated activity bundle."""
> - # Cheat here and generate the map from the fs contents.
> - extra = {}
> - bp = get_bundle_path()
> - for d in [ 'po', 'data' ]: # everybody gets library already
> - for root, dirs, files in os.walk(os.path.join(bp, d)):
> - for name in files:
> - fn = os.path.join(root, name).replace(bp+'/', '')
> - extra[fn] = open(os.path.join(root, name), 'r').read()
> - extra['activity/activity-default.svg'] = PIPPY_DEFAULT_ICON
> - return extra
> -def pippy_activity_news():
> - """Return the NEWS file for this activity."""
> - # Cheat again.
> - return open(os.path.join(get_bundle_path(), 'NEWS')).read()
> -def pippy_activity_icon():
> - """Return an SVG document specifying the icon for this activity."""
> - return PIPPY_ICON
> -def pippy_activity_class():
> - """Return the class which should be started to run this activity."""
> - return 'pippy_app.WordsActivity'
> -def pippy_activity_bundle_id():
> - """Return the bundle_id for the generated activity."""
> - return 'org.laptop.Words'
> -def pippy_activity_mime_types():
> - """Return the mime types handled by the generated activity, as a
> list."""
> - return 'text/x-python'
> diff --git a/wordsactivity.py b/wordsactivity.py
> new file mode 100644
> index 0000000..afa7369
> --- /dev/null
> +++ b/wordsactivity.py
> @@ -0,0 +1,267 @@
> +# Copyright 2008 Chris Ball.
> +#
> +# 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
> +
> +"""Words Activity: A multi-lingual dictionary with speech synthesis."""
> +"""Actividad Palabras: Un diccionario multi-lengua con sintesis de
> habla"""
> +
> +import gtk
> +import logging
> +import pango
> +import os
> +import subprocess
> +
> +from gettext import gettext as _
> +
> +from sugar.activity import activity
> +from sugar.activity.activity import ActivityToolbox, \
> + get_bundle_path, get_bundle_name
> +
> +from sugar.graphics.icon import Icon
> +OLD_TOOLBARS = False
> +try:
> + from sugar.graphics.toolbarbox import ToolbarBox, ToolbarButton
> + from sugar.activity.widgets import ActivityButton, StopButton, \
> + ShareButton, KeepButton,
> TitleEntry
> +except ImportError:
> + OLD_TOOLBARS = True
> +
> +# logging
> +logger = logging.getLogger('Words')
> +
> +
> +class WordsActivity(activity.Activity):
> + """Words Activity as specified in activity.info"""
> +
> + def __init__(self, handle):
> + """Set up the Words activity."""
> + super(WordsActivity, self).__init__(handle)
> + self._logger = logging.getLogger('words-activity')
> +
> + # Instantiate a language model.
> + # FIXME: We should ask the language model what langs it supports.
> + self.langs = ["French", "German", "Italian", "Portuguese",
> "Spanish"]
> + # Initial values.
> + self.fromlang = "English"
> + self.tolang = "Spanish"
> + import LanguageModel
> + self.languagemodel = LanguageModel.LanguageModel()
> +
> + # We do not have collaboration features
> + # make the share option insensitive
> + self.max_participants = 1
> +
> + # Main layout.
> + hbox = gtk.HBox(homogeneous=True, spacing=8)
> + vbox = gtk.VBox(spacing=16)
> + vbox.set_border_width(16)
> +
> + # Toolbar (compatibility with old-toolbars).
> + if not OLD_TOOLBARS:
> + 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()
> +
> + 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_toolbox(toolbar_box)
> + toolbar_box.show()
> + else:
> + toolbox = ActivityToolbox(self)
> + self.set_toolbox(toolbox)
> + toolbox.show()
> +
> + # transbox: <label> - <text entry> - <speak button>
> + transbox = gtk.Table()
> + transbox.resize(2, 3)
> + transbox.set_row_spacings(8)
> + transbox.set_col_spacings(12)
> +
> + # Labels.
> + label1 = gtk.Label(_("Word") + ':')
> + label1.set_alignment(xalign=0.0, yalign=0.5)
> + label2 = gtk.Label(_("Translation") + ':')
> + label2.set_alignment(xalign=0.0, yalign=0.5)
> +
> + # Text entry box to enter word to be translated.
> + self.totranslate = gtk.Entry(max=50)
> + self.totranslate.connect("changed", self.totranslate_cb)
> + self.totranslate.modify_font(pango.FontDescription("Sans 14"))
> +
> + # Text entry box to receive word translated.
> + self.translated = gtk.Entry(max=50)
> + self.translated.set_property('editable', False)
> + self.translated.modify_font(pango.FontDescription("Sans 14"))
> +
> + # Speak buttons.
> + speak1 = gtk.ToolButton()
> + speak_icon1 = Icon(icon_name='microphone')
> + speak1.set_icon_widget(speak_icon1)
> + speak1.connect("clicked", self.speak1_cb)
> + speak2 = gtk.ToolButton()
> + speak_icon2 = Icon(icon_name='microphone')
> + speak2.set_icon_widget(speak_icon2)
> + speak2.connect("clicked", self.speak2_cb)
> +
> + transbox.attach(label1, 0, 1, 0, 1, xoptions=gtk.FILL)
> + transbox.attach(self.totranslate, 1, 2, 0, 1,
> xoptions=gtk.FILL|gtk.EXPAND)
> + transbox.attach(speak1, 2, 3, 0, 1, xoptions=gtk.FILL)
> +
> + transbox.attach(label2, 0, 1, 1, 2, xoptions=gtk.FILL)
> + transbox.attach(self.translated, 1, 2, 1, 2,
> xoptions=gtk.FILL|gtk.EXPAND)
> + transbox.attach(speak2, 2, 3, 1, 2, xoptions=gtk.FILL)
> +
> + vbox.pack_start(transbox, expand=False)
> +
> + # The language choice combo boxes.
> + self.lang1combo = gtk.combo_box_new_text()
> + self.lang1combo.append_text("English")
> + self.lang1combo.connect("changed", self.lang1combo_cb)
> + self.lang1combo.set_active(0)
> +
> + self.lang2combo = gtk.combo_box_new_text()
> + for x in self.langs:
> + self.lang2combo.append_text(x)
> + self.lang2combo.connect("changed", self.lang2combo_cb)
> + self.lang2combo.set_active(4)
> +
> + self.lang1combo.set_size_request(600,50)
> + self.lang2combo.set_size_request(600,50)
> +
> + # The "lang1" treeview box
> + self.lang1model = gtk.ListStore(str)
> + lang1view = gtk.TreeView(self.lang1model)
> + lang1view.set_headers_visible(False)
> + lang1cell = gtk.CellRendererText()
> + lang1treecol = gtk.TreeViewColumn("", lang1cell, text=0)
> + lang1view.get_selection().connect("changed", self.lang1sel_cb)
> + lang1view.append_column(lang1treecol)
> + lang1scroll = gtk.ScrolledWindow(hadjustment=None,
> vadjustment=None)
> + lang1scroll.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
> + lang1scroll.add(lang1view)
> +
> + # The "lang2" box
> + self.lang2model = gtk.ListStore(str)
> + lang2view = gtk.TreeView(self.lang2model)
> + lang2view.set_headers_visible(False)
> + lang2cell = gtk.CellRendererText()
> + lang2treecol = gtk.TreeViewColumn("", lang2cell, text=0)
> + lang2view.get_selection().connect("changed", self.lang2sel_cb)
> + lang2view.append_column(lang2treecol)
> + lang2scroll = gtk.ScrolledWindow(hadjustment=None,
> vadjustment=None)
> + lang2scroll.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
> + lang2scroll.add(lang2view)
> +
> + lang1_vbox = gtk.VBox(spacing=8)
> + lang1_vbox.pack_start(self.lang1combo, expand=False)
> + lang1_vbox.pack_start(lang1scroll)
> +
> + lang2_vbox = gtk.VBox(spacing=8)
> + lang2_vbox.pack_start(self.lang2combo, expand=False)
> + lang2_vbox.pack_start(lang2scroll)
> +
> + hbox.pack_start(lang1_vbox)
> + hbox.pack_start(lang2_vbox)
> +
> + vbox.pack_start(hbox)
> + self.set_canvas(vbox)
> + self.totranslate.grab_focus()
> + self.show_all()
> +
> + def say(self, text, lang):
> + # No Portuguese accent yet.
> + if lang == "portuguese":
> + lang = "spanish"
> + tmpfile = "/tmp/something.wav"
> + subprocess.call(["espeak", text, "-w", tmpfile, "-v", lang])
> + subprocess.call(["aplay", tmpfile])
> + os.unlink(tmpfile)
> +
> + def lang1combo_cb(self, combo):
> + pass
> +
> + def lang2combo_cb(self, combo):
> + self.languagemodel.SetLanguages("English",
> self.langs[combo.get_active()])
> +
> + def lang1sel_cb(self, column):
> + # FIXME: Complete the text entry box
> + model, _iter = column.get_selected()
> + value = model.get_value(_iter,0)
> + translations = self.languagemodel.GetTranslations(0, value)
> + self.translated.set_text(",".join(translations))
> +
> + def lang2sel_cb(self, column):
> + model, _iter = column.get_selected()
> + value = model.get_value(_iter,0)
> + translations = self.languagemodel.GetTranslations(1, value)
> + self.translated.set_text(",".join(translations))
> +
> + def speak1_cb(self, button):
> + text = self.totranslate.get_text()
> + lang = self.fromlang.lower()
> + self.say(text, lang)
> +
> + def speak2_cb(self, button):
> + text = self.translated.get_text()
> + lang = self.tolang.lower()
> + self.say(text, lang)
> +
> + def totranslate_cb(self, totranslate):
> + entry = totranslate.get_text()
> + # Ask for completion suggestions
> + if not entry:
> + return
> +
> + (list1, list2) = self.languagemodel.GetSuggestions(entry)
> + self.lang1model.clear()
> + self.lang2model.clear()
> + for x in list1:
> + self.lang1model.append([x])
> + for x in list2:
> + self.lang2model.append([x])
> +
> + # If we think we know what the word will be, translate it.
> + if entry in list1 or len(list1) == 1 and len(list2) == 0:
> + langiter = self.lang2combo.get_active()
> + lang = self.langs[langiter].lower()
> + self.fromlang = "English"
> + self.tolang = lang
> + translations = self.languagemodel.GetTranslations(0, list1[0])
> + self.translated.set_text(",".join(translations))
> +
> + elif entry in list2 or len(list1) == 0 and len(list2) == 1:
> + langiter = self.lang2combo.get_active()
> + lang = self.langs[langiter].lower()
> + self.fromlang = lang
> + self.tolang = "English"
> + translations = self.languagemodel.GetTranslations(1, list2[0])
> + self.translated.set_text(",".join(translations))
> --
> 1.7.4.4
>
>
Thanks..applied as
http://git.sugarlabs.org/words-activity/words-activity/commit/95d72bf197c0196b690a821f21f4ce37e79fe088
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.sugarlabs.org/archive/sugar-devel/attachments/20110825/c77100c3/attachment-0001.html>
More information about the Sugar-devel
mailing list