From: Ariel Calzada <aricalso@000PaRaDoX000.(none)> THIS PATCH Let users change the font for the cards. Users just need to edit the game and select each font ( top and bottom cards ). Also this patch has included 0001-Made-english_rp-default-for-en_AU.patch
--- createcardpanel.py | 88 +++++++++++++++++++++++++++++++++++++++++++++++++--- speak/voice.py | 48 ++++++++++++++++++++++++---- svgcard.py | 33 ++++++++++++++++--- 3 files changed, 152 insertions(+), 17 deletions(-) diff --git a/createcardpanel.py b/createcardpanel.py index e654b1c..3aec20b 100644 --- a/createcardpanel.py +++ b/createcardpanel.py @@ -19,6 +19,8 @@ import gtk from os.path import join, basename +import os +from sugar.activity.activity import get_bundle_path import shutil from gettext import gettext as _ @@ -92,8 +94,8 @@ class CreateCardPanel(gtk.EventBox): # Set card editors - self.cardeditor1 = CardEditor() - self.cardeditor2 = CardEditor() + self.cardeditor1 = CardEditor(1) + self.cardeditor2 = CardEditor(2) self.clean(None) self.cardeditor1.connect('has-text', self.receive_text_signals) self.cardeditor2.connect('has-text', self.receive_text_signals) @@ -248,11 +250,11 @@ class CardEditor(gtk.EventBox): 'has-sound': (SIGNAL_RUN_FIRST, None, [TYPE_PYOBJECT]), } - def __init__(self): + def __init__(self,editor_index): gtk.EventBox.__init__(self) self.snd = None - + self.editor_index = editor_index self.temp_folder = None box = gtk.VBox() @@ -307,10 +309,86 @@ class CardEditor(gtk.EventBox): else: self.usespeak = None - box.pack_start(toolbar, False) + box.pack_start(self.create_font_selector(), True, True, 0) self.add(box) + def get_saved_font(self, editor_index): + fd = get_bundle_path() + "/data" + fn = fd + "/config.conf." + str(editor_index) + + if not os.path.exists(fd): + os.mkdir(fd) + + if not os.path.isfile(fn): + return "Monospace" + + f = open(fn,"r") + contents = f.read().strip() + f.close() + + if contents == "": + return "Monospace" + + return contents + + def set_saved_font(self, editor_index, font): + fd = get_bundle_path() + "/data" + fn = fd + "/config.conf." + str(editor_index) + + if not os.path.exists(fd): + os.mkdir(fd) + + f = open(fn,"w") + f.write(font) + f.close() + + + def create_font_selector(self): + """ Create font combobox + """ + font_selector = gtk.ComboBox() + font_renderer = gtk.CellRendererText() + font_selector.pack_start(font_renderer) + font_selector.add_attribute(font_renderer, 'text', 0) + font_selector.add_attribute(font_renderer, 'font', 0) + font_model = gtk.ListStore(str) + + context = self.get_pango_context() # Deja Vu Sans bold + font_index = 0 + count = 0 + faces = {} + selected_font = self.get_saved_font(self.editor_index) + + for i in context.list_families(): + name = i.get_name() + + if name == selected_font: + font_index = count + + count = count + 1 + font_model.append([name]) + font_faces = gtk.ListStore(str, str) + + for face in i.list_faces(): + face_name = face.get_face_name() + font_faces.append([face_name, "%s %s" % (name, face_name)]) + + faces[name] = font_faces + + font_selector.set_model(font_model) + font_selector.set_active(font_index) + font_selector.connect("changed", self.font_changed) + font_selector.show() + + return font_selector + + def font_changed(self,widget): + iter = widget.get_active_iter() + font = widget.get_model().get_value(iter, 0) + if font: + self.set_saved_font(self.editor_index,font) + def update_text(self, entry): self.card.change_text(entry.get_text()) if len(entry.get_text()) == 0: diff --git a/speak/voice.py b/speak/voice.py index 5fc732e..c45d108 100644 --- a/speak/voice.py +++ b/speak/voice.py @@ -7,12 +7,12 @@ # # Parts of Speak.activity are based on code from Measure.activity # Copyright (C) 2007 Arjun Sarwal - ar...@laptop.org -# +# # Speak.activity 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 3 of the License, or # (at your option) any later version. -# +# # Speak.activity 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 @@ -81,8 +81,36 @@ class Voice: friendlyname = friendlyname.replace('_test','') friendlyname = friendlyname.replace('en-','') friendlyname = friendlyname.replace('english-wisper','whisper') - friendlyname = friendlyname.capitalize() - self.friendlyname = _(friendlyname) + + friendlyname = friendlyname.replace('english-us', 'us') + + friendlynameRP = name # friendlyname for RP + friendlynameRP = friendlynameRP.replace('english_rp', 'rp') + friendlynameRP = friendlynameRP.replace('english_wmids', 'wmids') + + parts = re.split('[ _-]', friendlyname) + partsRP = re.split('[ _]', friendlynameRP) #RE for english_RP + self.short_name = _(parts[0].capitalize()) + self.friendlyname = ' '.join([self.short_name] + parts[1:]) + + friendlynameRP1 = None + if friendlynameRP == 'rp': + friendlynameRP1 = 'English (Received Pronunciation)' + self.friendlyname = 'English (Received Pronunciation)' + + friendlynameUS = None + if friendlyname == 'us': + friendlynameUS = 'English (USA)' + self.friendlyname = 'English (USA)' + + friendlynameWMIDS = None + if friendlynameRP == 'wmids': + friendlynameWMIDS = 'English (West Midlands)' + self.friendlyname = 'English (West Midlands)' + + def __cmp__(self, other): + return cmp(self.friendlyname, other.friendlyname if other else '') + def allVoices(): if _allVoices: @@ -110,9 +138,9 @@ def defaultVoice(): def fit(a,b): "Compare two language ids to see if they are similar." - as_ = re.split(r'[^a-z]+', a.lower()) - bs = re.split(r'[^a-z]+', b.lower()) - for count in range(0, min(len(as_),len(bs))): + as_ = re.split(r'[^a-z]+', a.lower()) + bs = re.split(r'[^a-z]+', b.lower()) + for count in range(0, min(len(as_),len(bs))): if as_[count] != bs[count]: count -= 1 break @@ -126,6 +154,12 @@ def defaultVoice(): for voice in voices.values(): voiceMetric = fit(voice.language, lang) bestMetric = fit(best.language, lang) + + if lang.startswith('en_AU'): + if voice.friendlyname=='English (Received Pronunciation)': + best = voice + break + if voiceMetric > bestMetric: best = voice diff --git a/svgcard.py b/svgcard.py index 7500f3f..5a87ac1 100644 --- a/svgcard.py +++ b/svgcard.py @@ -23,8 +23,9 @@ import re import gtk import pango import logging - from sugar.util import LRU +from sugar.activity.activity import get_bundle_path +import os import theme import face @@ -102,6 +103,26 @@ class SvgCard(gtk.EventBox): #gc.collect() + def get_saved_font(self, editor_index): + fd = get_bundle_path() + "/data" + fn = fd + "/config.conf." + str(editor_index) + + if not os.path.exists(fd): + os.mkdir(fd) + + if not os.path.isfile(fn): + return "Monospace" + + f = open(fn,"r") + contents = f.read().strip() + f.close() + + if contents == "": + return "Monospace" + + return contents + + def _realize_cb(self, widget): self.gc = widget.window.new_gc() @@ -288,9 +309,6 @@ class SvgCard(gtk.EventBox): def create_text_layout(self, text): key = (self.size, text) - if key in _text_layout_cache: - return _text_layout_cache[key] - max_lines_count = len([i for i in text.split(' ') if i]) for size in range(80, 66, -8) + range(66, 44, -6) + \ @@ -300,7 +318,12 @@ class SvgCard(gtk.EventBox): layout = self.create_pango_layout(text) layout.set_width(PIXELS_PANGO(card_size)) layout.set_wrap(pango.WRAP_WORD) - desc = pango.FontDescription('Deja Vu Sans bold ' + str(size)) + + font = "Monospace" + if self.id != -1: + font = self.get_saved_font(self.pprops['back_text']['card_text']) + + desc = pango.FontDescription(font + " " + str(size)) layout.set_font_description(desc) if layout.get_line_count() <= max_lines_count and \ -- 1.7.5.4 _______________________________________________ Sugar-devel mailing list Sugar-devel@lists.sugarlabs.org http://lists.sugarlabs.org/listinfo/sugar-devel