From 7dd86f8462c7bfa9625b53d974ea5f0a9b86c10e Mon Sep 17 00:00:00 2001 From: Walter Bender Date: Wed, 03 Jul 2013 18:56:09 +0000 Subject: more fine-tuning --- diff --git a/Dimensions.py b/Dimensions.py index 7becc82..d2612d6 100644 --- a/Dimensions.py +++ b/Dimensions.py @@ -95,10 +95,11 @@ class Dimensions(activity.Activity): self._saved_state = None self.vmw.new_game(self._saved_state, self._deck_index) self.ready_to_play = True + ''' if self._saved_state == None: # Launch animated help self.vmw.help_animation() - + ''' if self._editing_word_list: self.vmw.editing_word_list = True self.vmw.edit_word_list() @@ -128,6 +129,7 @@ class Dimensions(activity.Activity): if card_type == 'custom' and self.vmw.custom_paths[0] is None: self.image_import_cb() else: + self.tools_toolbar_button.set_expanded(False) self.vmw.new_game() def _robot_cb(self, button=None): @@ -202,9 +204,9 @@ class Dimensions(activity.Activity): def _read_journal_data(self): ''' There may be data from a previous instance. ''' - self._play_level = int(self._read_metadata('play_level', 2)) + self._play_level = int(self._read_metadata('play_level', 1)) self._robot_time = int(self._read_metadata('robot_time', 60)) - self._card_type = self._read_metadata('cardtype', 'pattern') + self._card_type = self._read_metadata('cardtype', 'word') self._low_score = [int(self._read_metadata('low_score_beginner', -1)), int(self._read_metadata('low_score_intermediate', -1)), @@ -260,12 +262,14 @@ class Dimensions(activity.Activity): toolbox.toolbar.insert(self.activity_toolbar_button, 0) self.activity_toolbar_button.show() + ''' self.numbers_toolbar_button = ToolbarButton( page=numbers_toolbar, icon_name='number-tools') - # numbers_toolbar.show() - # toolbox.toolbar.insert(self.numbers_toolbar_button, -1) - # self.numbers_toolbar_button.show() + numbers_toolbar.show() + toolbox.toolbar.insert(self.numbers_toolbar_button, -1) + self.numbers_toolbar_button.show() + ''' self.tools_toolbar_button = ToolbarButton( page=tools_toolbar, @@ -275,8 +279,8 @@ class Dimensions(activity.Activity): self.tools_toolbar_button.show() self.button_pattern = button_factory( - 'new-pattern-game', toolbox.toolbar, self._select_game_cb, - cb_arg='pattern', tooltip=PROMPT_DICT['pattern']) + 'new-word-game', toolbox.toolbar, self._select_game_cb, + cb_arg='word', tooltip=PROMPT_DICT['word']) self._set_extras(toolbox.toolbar) @@ -318,11 +322,12 @@ class Dimensions(activity.Activity): self._set_extras(games_toolbar) + ''' self.words_tool_button = button_factory( 'word-tools', tools_toolbar, self._edit_words_cb, tooltip=_('Edit word lists.')) - ''' + ''' self.import_button = button_factory( 'image-tools', tools_toolbar, self.image_import_cb, tooltip=_('Import custom cards')) @@ -331,7 +336,6 @@ class Dimensions(activity.Activity): 'no-custom-game', tools_toolbar, self._select_game_cb, cb_arg='custom', tooltip=PROMPT_DICT['custom']) - ''' self.product_button = radio_factory( 'product', numbers_toolbar, @@ -426,6 +430,12 @@ class Dimensions(activity.Activity): ''' def _configure_cb(self, event): + self._vbox.set_size_request(Gdk.Screen.width(), Gdk.Screen.height()) + self._vbox.show() + self._canvas.set_size_request(int(Gdk.Screen.width()), + int(Gdk.Screen.height())) + self._canvas.show() + if Gdk.Screen.width() < Gdk.Screen.height(): for sep in self._sep: sep.hide() @@ -498,15 +508,34 @@ class Dimensions(activity.Activity): group=self.beginner_button) LEVEL_BUTTONS[EXPERT] = self.expert_button + def _fixed_resize_cb(self, widget=None, rect=None): + ''' If a toolbar opens or closes, we need to resize the vbox + holding out scrolling window. ''' + self._vbox.set_size_request(rect.width, rect.height) + def _setup_canvas(self): - ''' Create a canvas.. ''' - canvas = Gtk.DrawingArea() - canvas.set_size_request(Gdk.Screen.width(), Gdk.Screen.height()) - self.set_canvas(canvas) - canvas.show() + ''' Create a canvas in a Gtk.Fixed ''' + self.fixed = Gtk.Fixed() + self.fixed.connect('size-allocate', self._fixed_resize_cb) + self.fixed.show() + self.set_canvas(self.fixed) + + self._vbox = Gtk.VBox(False, 0) + self._vbox.set_size_request(Gdk.Screen.width(), Gdk.Screen.height()) + self.fixed.put(self._vbox, 0, 0) + self._vbox.show() + + self._canvas = Gtk.DrawingArea() + self._canvas.set_size_request(int(Gdk.Screen.width()), + int(Gdk.Screen.height())) + self._canvas.show() + self.show_all() + self._vbox.pack_end(self._canvas, True, True, 0) + self._vbox.show() + self.show_all() - self.vmw = Game(canvas, self) + self.vmw = Game(self._canvas, self) self.vmw.level = self._play_level LEVEL_BUTTONS[self._play_level].set_active(True) self.vmw.card_type = self._card_type @@ -515,9 +544,9 @@ class Dimensions(activity.Activity): self.vmw.low_score = self._low_score self.vmw.all_scores = self._all_scores self.vmw.numberO = self._numberO - NUMBER_O_BUTTONS[self._numberO].set_active(True) + # NUMBER_O_BUTTONS[self._numberO].set_active(True) self.vmw.numberC = self._numberC - NUMBER_C_BUTTONS[self._numberC].set_active(True) + # NUMBER_C_BUTTONS[self._numberC].set_active(True) self.vmw.matches = self._matches self.vmw.robot_matches = self._robot_matches self.vmw.total_time = self._total_time @@ -531,7 +560,7 @@ class Dimensions(activity.Activity): self._custom_jobject[i] is not None: self.vmw.custom_paths[i] = datastore.get( self._custom_jobject[i]) - return canvas + return self._canvas def write_file(self, file_path): ''' Write data to the Journal. ''' @@ -651,9 +680,9 @@ class Dimensions(activity.Activity): help_box = self._new_help_box('main-toolbar') add_section(help_box, _('Dimensions'), icon='activity-dimensions') add_paragraph(help_box, _('Tools'), icon='view-source') - add_paragraph(help_box, _('Game'), icon='new-pattern-game') + # add_paragraph(help_box, _('Game'), icon='new-pattern-game') # add_paragraph(help_box, PROMPT_DICT['number'], icon='new-number-game') - # add_paragraph(help_box, PROMPT_DICT['word'], icon='new-word-game') + add_paragraph(help_box, PROMPT_DICT['word'], icon='new-word-game') # add_paragraph(help_box, _('Numbers'), icon='number-tools') add_paragraph(help_box, _('Play with the computer'), icon='robot-off') add_paragraph(help_box, _('robot pause time'), icon='timer-60') @@ -667,8 +696,8 @@ class Dimensions(activity.Activity): add_section(help_box, _('Tools'), icon='view-source') add_section(help_box, _('Import image cards'), icon='image-tools') - add_paragraph(help_box, PROMPT_DICT['custom'], icon='new-custom-game') - # add_section(help_box, _('Edit word lists.'), icon='word-tools') + # add_paragraph(help_box, PROMPT_DICT['custom'], icon='new-custom-game') + add_section(help_box, _('Edit word lists.'), icon='word-tools') ''' add_section(help_box, _('Numbers'), icon='number-tools') diff --git a/activity/activity-dimensions.svg b/activity/activity-dimensions.svg index fa3f393..058e3af 100644 --- a/activity/activity-dimensions.svg +++ b/activity/activity-dimensions.svg @@ -5,78 +5,44 @@ ]> + transform="translate(0,0.23305116)" + id="g4015"> + transform="matrix(0.02002748,0,0,-0.02002748,-120.39314,91.425426)" + id="g27729" + style="fill:&fill_color;;fill-opacity:1;stroke:none"> + d="m 7745.7123,3650.2039 c -3.6036,-1.6517 -13.0632,-10.0601 -23.5738,-20.871 -19.9701,-20.7209 -29.5798,-27.778 -42.4928,-31.0814 -20.7209,-5.2553 -37.8381,-1.5015 -74.9255,16.9671 -21.4716,10.6608 -26.8771,12.9131 -33.0333,12.9131 -6.7568,0.1501 -7.8078,-0.3004 -10.8109,-4.8049 -4.3544,-6.3063 -5.8559,-18.0181 -4.5045,-35.4357 1.2012,-19.0692 5.1051,-34.9853 17.4175,-72.3729 12.0121,-36.637 15.1653,-49.55 15.4656,-63.6642 0.3003,-14.1142 -2.8528,-23.4236 -10.0601,-30.781 -8.2583,-8.1082 -15.4656,-10.3604 -52.7031,-16.5167 -57.3578,-9.6096 -94.4452,-20.5707 -129.7308,-38.1384 -69.9705,-34.9852 -122.6736,-97.298 -155.5567,-184.0855 -8.4085,-22.2224 -14.5647,-42.7931 -27.9282,-93.5443 -17.4175,-66.2167 -18.919,-69.52 -45.646,-97.4482 -34.6849,-36.3366 -60.9614,-53.3037 -121.7727,-78.5291 -31.2315,-12.913 -44.7451,-20.4206 -54.6551,-30.0303 -13.3634,-12.913 -18.4686,-25.3755 -20.4205,-48.7991 -2.2523,-28.3786 13.6637,-51.5019 47.4478,-68.9195 7.0571,-3.6036 17.1172,-7.8079 22.5227,-9.1592 13.964,-3.6037 25.5257,-1.5015 25.5257,4.6547 0,1.2012 -7.0571,9.6096 -15.6157,18.7689 -21.772,22.9731 -27.0273,35.1354 -21.3215,50.1505 4.6547,11.862 25.2254,28.0783 49.7001,39.0394 11.7118,5.2553 80.6312,32.7329 96.0968,38.4387 38.8892,14.2644 55.8563,13.6638 75.8264,-3.1532 l 7.2073,-6.006 146.848,0.3003 146.9981,0.4504 -0.4505,11.2614 c -1.3513,29.2795 -9.009,35.1354 -48.7991,37.3876 -11.2614,0.6007 -21.0212,1.5016 -21.3215,1.952 -1.3514,1.2012 4.5045,15.0151 14.2644,34.2345 17.4175,34.0844 41.2916,66.517 54.9553,74.4751 6.1562,3.6036 7.8079,3.9039 19.0693,3.3033 14.1142,-0.7508 22.0722,-4.0541 29.2795,-12.3124 6.006,-6.907 7.6577,-12.6127 10.0601,-35.5859 1.5015,-13.964 3.1532,-21.9221 6.6067,-30.6308 17.1172,-44.2947 68.1687,-93.244 96.6974,-92.4933 9.7598,0.1502 14.1142,3.1532 19.5197,13.6638 4.8048,9.4595 5.4054,20.1203 1.6516,27.4777 -1.3513,2.7027 -9.1592,11.7118 -17.1172,20.1203 -35.5859,36.9372 -46.5469,66.2167 -46.5469,124.4754 0,59.1596 11.5616,102.5534 36.9372,138.2894 3.6036,5.1051 15.7659,19.2193 27.0272,31.5318 35.8862,39.1894 42.9433,54.3547 42.9433,92.0427 -0.1501,21.772 -1.6516,33.3336 -7.958,56.7572 -10.6607,40.3907 -7.0571,59.9104 15.4656,85.1358 15.3154,17.2674 16.6668,23.2735 11.2613,51.9524 -6.006,31.3816 -8.2583,45.1955 -11.4115,72.6732 -4.0541,34.5348 -7.0571,42.1925 -17.7178,46.6971 -6.6067,2.8528 -13.5136,2.5525 -20.7209,-0.7508 z" + id="path27731" + style="fill:&fill_color;;fill-opacity:1" /> + transform="translate(-0.55652425,0)" + id="g3238"> - - - - - - - - - - - + d="m 12.392264,51.759088 c -3.9956525,0 -7.2463775,-3.250725 -7.2463775,-7.246377 0,-3.995652 3.250725,-7.246377 7.2463775,-7.246377 0.695797,0 1.387681,0.100145 2.056232,0.297681 l 1.741884,0.514783 -1.741884,0.514783 c -2.602899,0.76913 -4.42087,3.203188 -4.42087,5.91913 0,2.715797 1.817971,5.14971 4.420725,5.918841 l 1.741304,0.514347 -1.741159,0.515218 c -0.668696,0.197681 -1.360435,0.297971 -2.056232,0.297971 l 0,0 z m 0,-13.419276 c -3.4037685,0 -6.1727545,2.769276 -6.1727545,6.172899 0,3.403623 2.768986,6.172899 6.1727545,6.172899 0.0062,0 0.01246,0 0.01884,0 -2.099711,-1.298261 -3.4569575,-3.630435 -3.4569575,-6.172899 0,-2.542319 1.3572465,-4.874348 3.4566675,-6.172899 -0.0064,0 -0.01246,0 -0.01855,0 l 0,0 z" + id="path5631" + style="fill:&stroke_color;;fill-opacity:1;stroke-width:0.50724638" /> + + - + transform="translate(0.72186404,0)" + id="g3243"> + + diff --git a/activity/activity.info b/activity/activity.info index ace83db..b934833 100644 --- a/activity/activity.info +++ b/activity/activity.info @@ -1,9 +1,9 @@ [Activity] -name = Dimensions +name = Word Dimensions activity_version = 51 license = GPLv3 -bundle_id = org.sugarlabs.Dimensions +bundle_id = org.sugarlabs.WordDimensions exec = sugar-activity Dimensions.Dimensions icon = activity-dimensions show_launcher = yes -summary = a pattern-matching game +summary = a word pattern-matching game diff --git a/game.py b/game.py index bbcb884..b2ed270 100644 --- a/game.py +++ b/game.py @@ -18,6 +18,8 @@ from gi.repository import Gtk from gi.repository import Gdk from gi.repository import GdkPixbuf from gi.repository import GObject +from gi.repository import Pango + import os from gettext import gettext as _ @@ -25,6 +27,7 @@ from gettext import gettext as _ from math import sqrt from sugar3.graphics.objectchooser import ObjectChooser +from sugar3.graphics import style from sugar3.datastore import datastore from sugar3 import mime from sugar3.activity import activity @@ -32,7 +35,6 @@ from sugar3.activity import activity import logging _logger = logging.getLogger('dimensions-activity') -from sugar3.graphics import style GRID_CELL_SIZE = style.GRID_CELL_SIZE from constants import (LOW, MEDIUM, HIGH, MATCHMASK, ROW, COL, CARD_WIDTH, @@ -41,7 +43,6 @@ from constants import (LOW, MEDIUM, HIGH, MATCHMASK, ROW, COL, CARD_WIDTH, DIFFICULTY_LEVEL, BACKGROUNDMASK, DECKSIZE, CUSTOM_CARD_INDICIES, SHAPES, COLORS, NUMBER, FILLS, CARDS_IN_A_MATCH, LABELH) - from grid import Grid from deck import Deck from card import Card @@ -122,7 +123,6 @@ class Game(): self._canvas.add_events(Gdk.EventMask.BUTTON_PRESS_MASK) self._canvas.add_events(Gdk.EventMask.BUTTON_RELEASE_MASK) self._canvas.add_events(Gdk.EventMask.BUTTON_MOTION_MASK) - self._canvas.add_events(Gdk.EventMask.KEY_PRESS_MASK) self._canvas.connect('event', self.__event_cb) self._canvas.connect('draw', self.__draw_cb) @@ -298,11 +298,23 @@ class Game(): deck_stop = deck_start + self.deck.count() self._restore_word_list(self._saved_state[deck_stop + 3 * self.matches:]) - self.deck.restore(self._saved_state[deck_start: deck_stop]) - self.grid.restore(self.deck, self._saved_state[0: ROW * COL]) - self._restore_matches(self._saved_state[deck_stop: deck_stop + - 3 * self.matches]) - self._restore_clicked(self._saved_state[ROW * COL: ROW * COL + 3]) + if self._saved_state[deck_start] is not None: + self.deck.restore(self._saved_state[deck_start: deck_stop]) + self.grid.restore(self.deck, self._saved_state[0: ROW * COL]) + self._restore_matches( + self._saved_state[deck_stop: deck_stop + 3 * self.matches]) + self._restore_clicked( + self._saved_state[ROW * COL: ROW * COL + 3]) + else: + self.deck.hide() + self.deck.shuffle() + self.grid.deal(self.deck) + if not self._find_a_match(): + self.grid.deal_extra_cards(self.deck) + self.matches = 0 + self.robot_matches = 0 + self.match_list = [] + self.total_time = 0 elif not self.joiner(): _logger.debug('Starting new game.') @@ -400,6 +412,9 @@ class Game(): def edit_word_list(self): ''' Update the word cards ''' if not self.editing_word_list: + if hasattr(self, 'text_entry'): + self.text_entry.hide() + self.text_entry.disconnect(self.text_event_id) return # Set the card type to words, and generate a new deck. @@ -425,6 +440,38 @@ class Game(): self.set_label('clock', '') self.set_label('status', _('Edit the word cards.')) + if not hasattr(self, 'text_entry'): + self.text_entry = Gtk.TextView() + self.text_entry.set_wrap_mode(Gtk.WrapMode.WORD) + self.text_entry.set_pixels_above_lines(0) + self.text_entry.set_size_request(self._card_width, + self._card_height) + ''' + rgba = Gdk.RGBA() + rgba.red, rgba.green, rgba.blue = rgb(self._colors[1]) + rgba.alpha = 1. + self.text_entry.override_background_color( + Gtk.StateFlags.NORMAL, rgba) + ''' + font_text = Pango.font_description_from_string('24') + self.text_entry.modify_font(font_text) + self.activity.fixed.put(self.text_entry, 0, 0) + + def _text_focus_out_cb(self, widget=None, event=None): + if self._edit_card is None: + self.text_entry.hide() + self.text_entry.disconnect(self.text_event_id) + self._update_word_card() + self.text_entry.hide() + + def _update_word_card(self): + bounds = self.text_buffer.get_bounds() + text = self.text_buffer.get_text(bounds[0], bounds[1], True) + self._edit_card.spr.set_label(text) + (i, j) = WORD_CARD_MAP[self._edit_card.index] + self.word_lists[i][j] = text + self._edit_card = None + def __event_cb(self, widget, event): ''' Handle touch events ''' if event.type in (Gdk.EventType.TOUCH_BEGIN, @@ -444,10 +491,6 @@ class Game(): elif event.type == Gdk.EventType.TOUCH_END or \ event.type == Gdk.EventType.BUTTON_RELEASE: self._button_release(x, y) - elif event.type == Gdk.EventType.KEY_PRESS: - k = Gdk.keyval_name(event.keyval) - u = Gdk.keyval_to_unicode(event.keyval) - self._keypress(k, u) def _button_press_cb(self, win, event): ''' Look for a card under the button press and save its position. ''' @@ -562,6 +605,8 @@ class Game(): def _button_release(self, x, y): # Maybe there is nothing to do. if self._press is None: + if self.editing_word_list: + self._text_focus_out_cb() self._drag_pos = [0, 0] return True @@ -581,13 +626,12 @@ class Game(): if move == 'click': if self.editing_word_list: - if self.editing_word_list: - # Only edit one card at a time, so unselect other cards - for i, c in enumerate(self.clicked): - if c.spr is not None and c.spr != self._press: - c.spr.set_label( - c.spr.labels[0].replace(CURSOR, '')) - c.spr = None # Unselect + # Only edit one card at a time, so unselect other cards + for i, c in enumerate(self.clicked): + if c.spr is not None and c.spr != self._press: + c.spr.set_label( + c.spr.labels[0].replace(CURSOR, '')) + c.spr = None # Unselect elif self.editing_custom_cards: pass else: @@ -716,8 +760,17 @@ class Game(): def process_selection(self, spr): ''' After a card has been selected... ''' if self.editing_word_list: # Edit label of selected card + x, y = spr.get_xy() + if self._edit_card is not None: + self._update_word_card() self._edit_card = self.deck.spr_to_card(spr) - spr.set_label(spr.labels[0] + CURSOR) + self.text_buffer = self.text_entry.get_buffer() + self.text_entry.show() + self.text_buffer.set_text(self._edit_card.spr.labels[0]) + self.activity.fixed.move(self.text_entry, x, y) + self.text_event_id = self.text_entry.connect( + 'focus-out-event', self._text_focus_out_cb) + self.text_entry.grab_focus() elif self.editing_custom_cards: # Only edit one card at a time, so unselect other cards for i, c in enumerate(self.clicked): @@ -891,82 +944,6 @@ class Game(): self._failure = None self._dealing = False - def _keypress_cb(self, area, event): - ''' Keypress: editing word cards or selecting cards to play ''' - k = Gdk.keyval_name(event.keyval) - u = Gdk.keyval_to_unicode(event.keyval) - self._keypress(k, u) - - def _keypress(self, k, u): - if self.editing_word_list and self._edit_card is not None: - if k in NOISE_KEYS: - self._dead_key = None - return True - if k[0:5] == 'dead_': - self._dead_key = k - return True - label = self._edit_card.spr.labels[0] - if len(label) > 0: - c = label.count(CURSOR) - if c == 0: - oldleft = label - oldright = '' - elif len(label) == 1: # Only CURSOR - oldleft = '' - oldright = '' - else: - try: # Why are getting a ValueError on occasion? - oldleft, oldright = label.split(CURSOR) - except ValueError: - oldleft = label - oldright = '' - else: - oldleft = '' - oldright = '' - newleft = oldleft - if k == 'BackSpace': - if len(oldleft) > 1: - newleft = oldleft[:len(oldleft) - 1] - else: - newleft = '' - elif k == 'Delete': - if len(oldright) > 0: - oldright = oldright[1:] - elif k == 'Home': - oldright = oldleft + oldright - newleft = '' - elif k == 'Left': - if len(oldleft) > 0: - oldright = oldleft[len(oldleft) - 1:] + oldright - newleft = oldleft[:len(oldleft) - 1] - elif k == 'Right': - if len(oldright) > 0: - newleft = oldleft + oldright[0] - oldright = oldright[1:] - elif k == 'End': - newleft = oldleft + oldright - oldright = '' - elif k == 'Return': - newleft = oldleft + RETURN - else: - if self._dead_key is not None: - u = DEAD_DICTS[DEAD_KEYS.index(self._dead_key[5:])][k] - if k in WHITE_SPACE: - u = 32 - if unichr(u) != '\x00': - newleft = oldleft + unichr(u) - else: - newleft = oldleft + k - label = newleft + CURSOR + oldright - self._edit_card.spr.set_label(label) - (i, j) = WORD_CARD_MAP[self._edit_card.index] - self.word_lists[i][j] = label.replace(CURSOR, '') - self._dead_key = None - else: - if k in KEYMAP: - self.process_selection(self.grid.grid_to_spr(KEYMAP.index(k))) - return True - def __draw_cb(self, canvas, cr): self._sprites.redraw_sprites(cr=cr) diff --git a/gencards.py b/gencards.py index ab501a0..fd52e5b 100755 --- a/gencards.py +++ b/gencards.py @@ -828,11 +828,11 @@ def generate_word_card(shape, color, number, fill, scale): svg = SVG() svg._set_scale(scale) if number == 0: - _stroke = DARK_COLOR[color] + _stroke = COLOR_PAIRS[color][1] # DARK_COLOR[color] elif number == 1: _stroke = COLOR_PAIRS[color][1] else: - _stroke = COLOR_PAIRS[color][0] + _stroke = COLOR_PAIRS[color][1] # COLOR_PAIRS[color][0] if fill == 0: _fill = COLOR_PAIRS[color][1] elif fill == 1: @@ -865,6 +865,7 @@ def generate_selected_card(scale): svg_string += svg._footer() return svg_string + def generate_label(width, height): svg = SVG() svg._set_scale(1.0) -- cgit v0.9.1