Codebase list sugar-memorize-activity / HEAD memorizetoolbar.py
HEAD

Tree @HEAD (Download .tar.gz)

memorizetoolbar.py @HEADraw · history · blame

# Copyright (C) 2006, 2007, 2008 One Laptop per Child
#
# 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 Street, Fifth Floor, Boston, MA 02110-1301 USA.

import logging
from os.path import join, dirname

from gi.repository import GObject
from gi.repository import GLib
from gi.repository import Gtk

from gettext import gettext as _
from sugar3.graphics.toolbutton import ToolButton
from sugar3.graphics.alert import Alert
from sugar3.graphics.icon import Icon
from sugar3.activity.widgets import RadioMenuButton
from sugar3.graphics.menuitem import MenuItem

from model import USE_ART4APPS, art4apps_data


class MemorizeToolbarBuilder(GObject.GObject):

    __gtype_name__ = 'MemoryToolbarBuilder'

    standard_game_names = ['addition',
                           'letters',
                           'sounds'
                           ]
    translated_game_names = [_('Addition'),
                             _('Letters'),
                             _('Sounds')
                             ]

    __gsignals__ = {
        'game_changed': (GObject.SignalFlags.RUN_FIRST, None,
                         5 * [GObject.TYPE_PYOBJECT])}

    def __init__(self, activity):
        GObject.GObject.__init__(self)
        self.activity = activity
        self.toolbar = self.activity.get_toolbar_box().toolbar
        self.jobject = None

        # Change demo games button
        self._demo_games = RadioMenuButton(icon_name='memorize-collection')
        self._demo_games.props.tooltip = _('Load demo games')

        for i, game in enumerate(self.translated_game_names):
            menu_item = MenuItem(game, icon_name=self.standard_game_names[i])
            menu_item.connect('activate', self.__activate_game_cb, i)
            self._demo_games.props.palette.menu.append(menu_item)
            menu_item.show()

        self.toolbar.insert(self._demo_games, -1)

        if USE_ART4APPS:
            for language in art4apps_data.get_languages():
                language_description = art4apps_data.get_language_name(
                    language)
                lang_menu_item = MenuItem(language_description,
                                          'activity-start')
                self._demo_games.props.palette.menu.append(lang_menu_item)
                lang_menu_item.show()
                categories_menu = Gtk.Menu()
                # create a submenu with the categories
                categories = {}
                for category in art4apps_data.get_categories():
                    if category in ['letters', 'other']:
                        continue
                    translated_category = art4apps_data.get_translation(
                        category, language)
                    if translated_category is not None:
                        label = translated_category
                    else:
                        label = category
                    categories[label] = category

                for label in sorted(categories):
                    cat_menu_item = MenuItem(label)
                    cat_menu_item.connect('activate',
                                          self.__activate_art4apps_game_cb,
                                          categories[label], language)
                    categories_menu.append(cat_menu_item)
                    cat_menu_item.show()
                lang_menu_item.set_submenu(categories_menu)

        self._selected_game = self.standard_game_names[0]

        # Change size combobox
        self._size_combo = RadioMenuButton(icon_name='change_size')
        self._size_combo.props.tooltip = _('Change size')
        self._sizes = ['4 X 4', '5 X 5', '6 X 6']

        for i, f in enumerate(self._sizes):
            menu_item = MenuItem(f, icon_name=self._sizes[i])
            menu_item.connect('activate', self._game_size_cb, i)
            self._size_combo.props.palette.menu.append(menu_item)
            menu_item.show()
        self.toolbar.insert(self._size_combo, -1)
        self._selected_game_size = self._sizes[0][0]

        # Reset Button
        self._restart_button = ToolButton('game-new')
        self._restart_button.connect('clicked', self._game_reset_cb)
        self._restart_button.set_tooltip(_('Restart Game'))
        self.toolbar.insert(self._restart_button, -1)
        self._restart_button.show()

    def _game_reset_cb(self, widget):
        self.activity.get_canvas().hide()

        def momentary_blank_timeout_cb():
            self.activity.game.model.count = 0
            self.emit('game_changed', None, None, 'reset', None, None)
            self.activity.get_canvas().show()
        GLib.timeout_add(100, momentary_blank_timeout_cb)

    def update_controls(self, active):
        self._size_combo.set_sensitive(active)
        self._demo_games.set_sensitive(active)
        self._restart_button.set_sensitive(active)

    def _game_size_cb(self, widget, i):
        self.activity.get_canvas().hide()

        def momentary_blank_timeout_cb():
            self._selected_game_size = int(self._sizes[i][0])
            self._size_combo.props.icon_name = self._sizes[i]
            self.emit('game_changed', None, self._selected_game_size,
                      'size', None, None)
            self.activity.get_canvas().show()
        GLib.timeout_add(100, momentary_blank_timeout_cb)

    def __activate_art4apps_game_cb(self, menu, category, language):
        self._art4apps_data = (category, language)
        if self.activity.game.model.is_demo:
            self._change_art4apps_game(category, language)
        else:
            alert = Alert()
            alert.props.title = _('Discard your modified game?')
            icon = Icon(icon_name='dialog-ok')
            alert.add_button(1, _('Discard'), icon)
            icon = Icon(icon_name='dialog-cancel')
            alert.add_button(0, _('Do not discard'), icon)
            alert.connect('response', self._change_art4apps_game_alert_cb)
            self.activity.add_alert(alert)

    def _change_art4apps_game_alert_cb(self, alert, response_id):
        if alert is not None:
            self.activity.remove_alert(alert)
        category, language = self._art4apps_data
        logging.error('Selected art4apps category %s language %s',
                      category, language)
        self._change_art4apps_game(category, language)

    def _change_art4apps_game(self, category, language):
        game_size = int(self._selected_game_size)
        self.emit('game_changed', category, game_size, 'art4apps', language,
                  None)

    def __activate_game_cb(self, menu, i):
        self._game_selected_index = i
        if self.activity.game.model.is_demo:
            self.activity.get_canvas().hide()

            def momentary_blank_timeout_cb():
                self._change_game()
                self.activity.get_canvas().show()
            GLib.timeout_add(100, momentary_blank_timeout_cb)
        else:
            alert = Alert()
            alert.props.title = _('Discard your modified game?')
            icon = Icon(icon_name='dialog-ok')
            alert.add_button(1, _('Discard'), icon)
            icon = Icon(icon_name='dialog-cancel')
            alert.add_button(0, _('Do not discard'), icon)
            alert.connect('response', self._change_game_alert_cb)
            self.activity.add_alert(alert)

    def _change_game_alert_cb(self, alert, response_id):
        if alert is not None:
            self.activity.remove_alert(alert)
        if response_id == 1:
            self._change_game()

    def _change_game(self):
        title = self.translated_game_names[self._game_selected_index]
        game_size = int(self._selected_game_size)

        game_name = self.standard_game_names[self._game_selected_index]
        self._demo_games.props.icon_name = game_name
        game_file = join(dirname(__file__), 'demos', game_name + '.zip')
        self.emit('game_changed', game_file, game_size, 'demo', title, None)

    def reset(self, widget):
        self._demo_games.props.icon_name = 'memorize-collection'

    def update_toolbar(self, widget, data, grid):
        size = data.get('size')
        self._size_combo.props.icon_name = size + ' X ' + size