diff options
-rw-r--r-- | createcardpanel.py | 40 | ||||
-rw-r--r-- | fontcombobox.py | 132 | ||||
-rw-r--r-- | icons/font-text.svg | 32 |
3 files changed, 143 insertions, 61 deletions
diff --git a/createcardpanel.py b/createcardpanel.py index 0b7a17b..031b393 100644 --- a/createcardpanel.py +++ b/createcardpanel.py @@ -31,14 +31,14 @@ from sugar.graphics.icon import Icon from sugar.graphics.palette import Palette from sugar.graphics.toggletoolbutton import ToggleToolButton from sugar.graphics.toolcombobox import ToolComboBox -from fontcombobox import FontComboBox +from fontcombobox import FontButton from port import chooser import theme import speak.espeak import speak.widgets import speak.face -from port.roundbox import RoundBox +#from port.roundbox import RoundBox import model _logger = logging.getLogger('memorize-activity') @@ -112,12 +112,8 @@ class CreateCardPanel(gtk.EventBox): if not self._activity.portrait_mode: self.card_box = gtk.HBox() - self.cardeditor1.show_labels() - self.cardeditor2.show_labels() else: self.card_box = gtk.VBox() - self.cardeditor1.hide_labels() - self.cardeditor2.hide_labels() self.card_box.pack_start(self.cardeditor1) self.card_box.pack_start(self.cardeditor2) @@ -137,12 +133,8 @@ class CreateCardPanel(gtk.EventBox): if not self._activity.portrait_mode: self.card_box = gtk.HBox() - self.cardeditor1.show_labels() - self.cardeditor2.show_labels() else: self.card_box = gtk.VBox() - self.cardeditor1.hide_labels() - self.cardeditor2.hide_labels() self.card_box.pack_start(self.cardeditor1) self.card_box.pack_start(self.cardeditor2) @@ -343,7 +335,7 @@ class CardEditor(gtk.EventBox): self.textentry.connect('changed', self.update_text) box.pack_start(self.textentry, False) - toolbar = RoundBox() + toolbar = gtk.HBox() browsepicture = ToolButton( icon_name='import_picture', @@ -367,24 +359,14 @@ class CardEditor(gtk.EventBox): else: self.usespeak = None - self.font_combo = FontComboBox() - self.id_font_changed = self.font_combo.connect("changed", - self.__font_changed_cb) - self.font_combo.set_font_name(model.DEFAULT_FONT) - - box.pack_start(self.font_combo, True, True, 0) + self.fontbutton = FontButton() + toolbar.add(self.fontbutton) + self.id_font_changed = self.fontbutton.connect( + 'changed', self.__font_changed_cb) box.pack_start(toolbar, True, True, 0) self.add(box) - def hide_labels(self): - self.previewlabel.hide() - self.textlabel.hide() - - def show_labels(self): - self.previewlabel.show() - self.textlabel.show() - def __font_changed_cb(self, widget): font = widget.get_font_name() logging.error('Selected font %s', font) @@ -393,9 +375,9 @@ class CardEditor(gtk.EventBox): self.emit('change-font', font) def set_font_name(self, font_name): - self.font_combo.handler_block(self.id_font_changed) - self.font_combo.set_font_name(font_name) - self.font_combo.handler_unblock(self.id_font_changed) + self.fontbutton.handler_block(self.id_font_changed) + self.fontbutton.set_font_name(font_name) + self.fontbutton.handler_unblock(self.id_font_changed) def update_text(self, entry): self.card.change_text(entry.get_text()) @@ -503,7 +485,7 @@ class CardEditor(gtk.EventBox): return self.snd def get_font_name(self): - return self.font_combo.get_font_name() + return self.fontbutton.get_font_name() def clean(self): self.textentry.set_text('') diff --git a/fontcombobox.py b/fontcombobox.py index 58f9140..62e79e8 100644 --- a/fontcombobox.py +++ b/fontcombobox.py @@ -15,51 +15,119 @@ # 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 -import gtk -FONT_BLACKLIST = ['cmex10', 'cmmi10', 'cmr10', 'cmsy10', 'esint10', 'eufm10', - 'msam10', 'msbm10', 'rsfs10', 'wasy10'] +import os +from gettext import gettext as _ +from gobject import SIGNAL_RUN_FIRST, TYPE_PYOBJECT +import gio -class FontComboBox(gtk.ComboBox): +from sugar.graphics.menuitem import MenuItem +from sugar.graphics.toolbutton import ToolButton +from sugar import env + +DEFAULT_FONTS = ['Sans', 'Serif', 'Monospace'] +USER_FONTS_FILE_PATH = env.get_profile_path('fonts') +GLOBAL_FONTS_FILE_PATH = '/etc/sugar_fonts' + + +class FontButton(ToolButton): + + __gsignals__ = { + 'changed': (SIGNAL_RUN_FIRST, None, []), + } def __init__(self): - gtk.ComboBox.__init__(self) - font_renderer = gtk.CellRendererText() - self.pack_start(font_renderer) - self.add_attribute(font_renderer, 'text', 0) - self.add_attribute(font_renderer, 'font', 0) - font_model = gtk.ListStore(str) + ToolButton.__init__(self, icon_name='font-text', + tooltip=_('Select font')) + self.connect('clicked', self.__font_selection_cb) context = self.get_pango_context() font_index = 0 - self.faces = {} + self._init_font_list() + + self._font_name = 'Sans' + font_names = [] for family in context.list_families(): name = family.get_name() - if name not in FONT_BLACKLIST: - font_model.append([name]) - font_faces = [] - for face in family.list_faces(): - face_name = face.get_face_name() - font_faces.append(face_name) - self.faces[name] = font_faces - - sorter = gtk.TreeModelSort(font_model) - sorter.set_sort_column_id(0, gtk.SORT_ASCENDING) - self.set_model(sorter) + if name in self._font_white_list: + font_names.append(name) + + for font_name in sorted(font_names): + menu_item = MenuItem(font_name) + markup = '<span font="%s">%s</span>' % (font_name, font_name) + menu_item.get_children()[0].set_markup(markup) + menu_item.connect('activate', self.__menu_activated, font_name) + self.props.palette.menu.append(menu_item) + menu_item.show() + self.show() + def __font_selection_cb(self, widget): + if self.props.palette: + if not self.props.palette.is_up(): + self.props.palette.popup(immediate=True, + state=self.props.palette.SECONDARY) + else: + self.props.palette.popdown(immediate=True) + return + + def __menu_activated(self, menu, font_name): + self._font_name = font_name + self.emit('changed') + def set_font_name(self, font_name): - count = 0 - tree_iter = self.get_model().get_iter_first() - while tree_iter is not None: - value = self.get_model().get_value(tree_iter, 0) - if value == font_name: - self.set_active(count) - count = count + 1 - tree_iter = self.get_model().iter_next(tree_iter) + self._font_name = font_name def get_font_name(self): - tree_iter = self.get_active_iter() - return self.get_model().get_value(tree_iter, 0) + return self._font_name + + def _init_font_list(self): + self._font_white_list = [] + self._font_white_list.extend(DEFAULT_FONTS) + + # check if there are a user configuration file + if not os.path.exists(USER_FONTS_FILE_PATH): + # verify if exists a file in /etc + if os.path.exists(GLOBAL_FONTS_FILE_PATH): + shutil.copy(GLOBAL_FONTS_FILE_PATH, USER_FONTS_FILE_PATH) + + if os.path.exists(USER_FONTS_FILE_PATH): + # get the font names in the file to the white list + fonts_file = open(USER_FONTS_FILE_PATH) + # get the font names in the file to the white list + for line in fonts_file: + self._font_white_list.append(line.strip()) + # monitor changes in the file + gio_fonts_file = gio.File(USER_FONTS_FILE_PATH) + self.monitor = gio_fonts_file.monitor_file() + self.monitor.set_rate_limit(5000) + self.monitor.connect('changed', self._reload_fonts) + + def _reload_fonts(self, monitor, gio_file, other_file, event): + if event != gio.FILE_MONITOR_EVENT_CHANGES_DONE_HINT: + return + self._font_white_list = [] + self._font_white_list.extend(DEFAULT_FONTS) + fonts_file = open(USER_FONTS_FILE_PATH) + for line in fonts_file: + self._font_white_list.append(line.strip()) + # update the menu + for child in self.props.palette.menu.get_children(): + self.props.palette.menu.remove(child) + child = None + context = self.get_pango_context() + tmp_list = [] + for family in context.list_families(): + name = family.get_name() + if name in self._font_white_list: + tmp_list.append(name) + for font_name in sorted(tmp_list): + menu_item = MenuItem(font_name) + markup = '<span font="%s">%s</span>' % (font_name, font_name) + menu_item.get_children()[0].set_markup(markup) + menu_item.connect('activate', self.__menu_activated, font_name) + self.props.palette.menu.append(menu_item) + menu_item.show() + return False diff --git a/icons/font-text.svg b/icons/font-text.svg new file mode 100644 index 0000000..ad3f9fa --- /dev/null +++ b/icons/font-text.svg @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + version="1.1" + width="55" + height="54.695999" + viewBox="0 0 55 54.696" + id="svg2" + xml:space="preserve"><metadata + id="metadata22"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs + id="defs20" /><text + x="-2.6176355" + y="43.461388" + transform="scale(0.90891499,1.1002129)" + id="text3591" + xml:space="preserve" + style="font-size:49.5765152px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Verdana;-inkscape-font-specification:Verdana"><tspan + x="-2.6176355" + y="43.461388" + id="tspan3593" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Serif;-inkscape-font-specification:Serif"><tspan + id="tspan2992" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Sans;-inkscape-font-specification:Sans">F</tspan>F</tspan></text> +</svg>
\ No newline at end of file |