From e32d68b174e93125ee2048745e493541b57e84ab Mon Sep 17 00:00:00 2001 From: Walter Bender Date: Thu, 04 Jul 2013 07:36:34 +0000 Subject: more tweaks --- diff --git a/Dimensions.py b/Dimensions.py index 7becc82..313b5a3 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.numbers_toolbar_button.set_expanded(False) self.vmw.new_game() def _robot_cb(self, button=None): @@ -175,7 +177,7 @@ class Dimensions(activity.Activity): return self.vmw.numberO = numberO self.vmw.card_type = 'number' - self._load_new_game() + # self._load_new_game() def _number_card_C_cb(self, button, numberC): ''' Choose between C-card list for numbers game. ''' @@ -183,7 +185,7 @@ class Dimensions(activity.Activity): return self.vmw.numberC = numberC self.vmw.card_type = 'number' - self._load_new_game() + # self._load_new_game() def _edit_words_cb(self, button): ''' Edit the word list. ''' @@ -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', 0)) 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', 'number') self._low_score = [int(self._read_metadata('low_score_beginner', -1)), int(self._read_metadata('low_score_intermediate', -1)), @@ -263,20 +265,22 @@ class Dimensions(activity.Activity): 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, icon_name='view-source') tools_toolbar.show() toolbox.toolbar.insert(self.tools_toolbar_button, -1) 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']) + self.button_number = button_factory( + 'new-number-game', toolbox.toolbar, self._select_game_cb, + cb_arg='number', tooltip=PROMPT_DICT['number']) self._set_extras(toolbox.toolbar) @@ -306,9 +310,6 @@ class Dimensions(activity.Activity): self.button_pattern = button_factory( 'new-pattern-game', games_toolbar, self._select_game_cb, cb_arg='pattern', tooltip=PROMPT_DICT['pattern']) - self.button_number = button_factory( - 'new-number-game', games_toolbar, self._select_game_cb, - cb_arg='number', tooltip=PROMPT_DICT['number']) self.button_word = button_factory( 'new-word-game', games_toolbar, self._select_game_cb, cb_arg='word', tooltip=PROMPT_DICT['word']) @@ -321,7 +322,6 @@ class Dimensions(activity.Activity): 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, @@ -330,8 +330,8 @@ class Dimensions(activity.Activity): self.button_custom = button_factory( 'no-custom-game', tools_toolbar, self._select_game_cb, cb_arg='custom', tooltip=PROMPT_DICT['custom']) - ''' + self.product_button = radio_factory( 'product', numbers_toolbar, @@ -381,7 +381,7 @@ class Dimensions(activity.Activity): group=self.product_button) NUMBER_O_BUTTONS[INCAN] = self.incan_button - separator_factory(numbers_toolbar, False, True) + self._sep.append(separator_factory(numbers_toolbar, False, True)) self.hash_button = radio_factory( 'hash', @@ -423,9 +423,11 @@ class Dimensions(activity.Activity): tooltip=_('dots in a line'), group=self.hash_button) NUMBER_C_BUTTONS[LINES] = self.lines_button - ''' def _configure_cb(self, event): + self._vbox.set_size_request(Gdk.Screen.width(), Gdk.Screen.height()) + self._vbox.show() + if Gdk.Screen.width() < Gdk.Screen.height(): for sep in self._sep: sep.hide() @@ -498,15 +500,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 @@ -531,7 +552,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. ''' @@ -650,9 +671,10 @@ class Dimensions(activity.Activity): ''' Set up a help palette for the main toolbars ''' 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, PROMPT_DICT['number'], icon='new-number-game') + add_paragraph(help_box, _('Numbers'), icon='number-tools') + #add_paragraph(help_box, _('Tools'), icon='view-source') + #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, _('Numbers'), icon='number-tools') add_paragraph(help_box, _('Play with the computer'), icon='robot-off') @@ -665,12 +687,11 @@ class Dimensions(activity.Activity): add_paragraph(help_box, _('Export scores to clipboard'), icon='score-copy') - 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, _('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_section(help_box, _('Numbers'), icon='number-tools') add_paragraph(help_box, _('product'), icon='product') add_paragraph(help_box, _('Roman numerals'), icon='roman') @@ -683,7 +704,6 @@ class Dimensions(activity.Activity): add_paragraph(help_box, _('points on a star'), icon='star') add_paragraph(help_box, _('dice'), icon='dice') add_paragraph(help_box, _('dots in a line'), icon='lines') - ''' def _setup_presence_service(self): ''' Setup the Presence Service. ''' diff --git a/activity/activity-dimensions.svg b/activity/activity-dimensions.svg index fa3f393..69d4317 100644 --- a/activity/activity-dimensions.svg +++ b/activity/activity-dimensions.svg @@ -4,79 +4,64 @@ ]> + + + + transform="matrix(0.75023334,0,0,0.75023334,13.433126,-3.8162464)" + id="g3841" + style="fill:&fill_color;;fill-opacity:1;stroke:&fill_color;;stroke-width:3.33229661;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"> + id="g3837" + style="fill:&fill_color;;fill-opacity:1;stroke:&fill_color;;stroke-width:3.33229661;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"> - - + d="m 25.25,33.125 a 3.4375,3.375 0 1 1 -6.875,0 3.4375,3.375 0 1 1 6.875,0 z" + transform="matrix(1.0119826,0,0,1.030723,1.9261296,4.3573002)" + id="path3036" + style="fill:&fill_color;;fill-opacity:1;stroke:&fill_color;;stroke-width:3.26276755;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + d="m 25.25,33.125 a 3.4375,3.375 0 1 1 -6.875,0 3.4375,3.375 0 1 1 6.875,0 z" + transform="matrix(1.0119826,0,0,1.030723,-8.5738705,4.3573002)" + id="path3036-4" + style="fill:&fill_color;;fill-opacity:1;stroke:&fill_color;;stroke-width:3.26276755;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> - - - - - - - - - - - - - + d="m 8.75,48.5 20,0" + id="path3835" + style="fill:&fill_color;;fill-opacity:1;stroke:&fill_color;;stroke-width:3.33229661;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + + 11 diff --git a/activity/activity.info b/activity/activity.info index ace83db..129a2d1 100644 --- a/activity/activity.info +++ b/activity/activity.info @@ -1,9 +1,9 @@ [Activity] -name = Dimensions +name = Prime Dimensions activity_version = 51 license = GPLv3 -bundle_id = org.sugarlabs.Dimensions +bundle_id = org.sugarlabs.PrimeDimensions exec = sugar-activity Dimensions.Dimensions icon = activity-dimensions show_launcher = yes -summary = a pattern-matching game +summary = a number-matching game diff --git a/dimensions.py b/dimensions.py index 5f3acae..38900a3 100755 --- a/dimensions.py +++ b/dimensions.py @@ -30,33 +30,46 @@ class DimensionsMain: # create a new window self.win = Gtk.Window(type=Gtk.WindowType.TOPLEVEL) self.win.maximize() - self.win.set_title("%s: %s" % (_("Visual Match"), + self.win.set_title("%s: %s" % (_("Dimensions"), _("Click on cards to create sets of three."))) self.win.connect("delete_event", lambda w, e: Gtk.main_quit()) menu0 = Gtk.Menu() - menu_items = Gtk.MenuItem(_("Toggle level")) + menu_items = Gtk.MenuItem(_("beginner")) menu0.append(menu_items) - menu_items.connect("activate", self._level_cb) + menu_items.connect("activate", self._level_cb, 0) menu_items.show() - level_menu = Gtk.MenuItem("Level") + menu_items = Gtk.MenuItem(_("intermediate")) + menu0.append(menu_items) + menu_items.connect("activate", self._level_cb, 1) + menu_items.show() + menu_items = Gtk.MenuItem(_("expert")) + menu0.append(menu_items) + menu_items.connect("activate", self._level_cb, 2) + menu_items.show() + #TRANS: Level of difficulty + level_menu = Gtk.MenuItem(_("Level")) level_menu.show() level_menu.set_submenu(menu0) menu1 = Gtk.Menu() + ''' menu_items = Gtk.MenuItem(_("New pattern game")) menu1.append(menu_items) menu_items.connect("activate", self._new_game_cb, 'pattern') menu_items.show() + ''' menu_items = Gtk.MenuItem(_("New number game")) menu1.append(menu_items) menu_items.connect("activate", self._new_game_cb, 'number') menu_items.show() + ''' menu_items = Gtk.MenuItem(_("New word game")) menu1.append(menu_items) menu_items.connect("activate", self._new_game_cb, 'word') menu_items.show() - game_menu = Gtk.MenuItem("Games") + ''' + game_menu = Gtk.MenuItem(_("Game")) game_menu.show() game_menu.set_submenu(menu1) @@ -65,27 +78,27 @@ class DimensionsMain: menu2.append(menu_items) menu_items.connect("activate", self._robot_cb) menu_items.show() - menu_items = Gtk.MenuItem(_("90 sec.")) + menu_items = Gtk.MenuItem(_("5 minutes")) menu2.append(menu_items) - menu_items.connect("activate", self._robot_time_cb, 90) + menu_items.connect("activate", self._robot_time_cb, 300) menu_items.show() - menu_items = Gtk.MenuItem(_("60 sec.")) + menu_items = Gtk.MenuItem(_("2 minutes")) menu2.append(menu_items) - menu_items.connect("activate", self._robot_time_cb, 60) + menu_items.connect("activate", self._robot_time_cb, 120) menu_items.show() - menu_items = Gtk.MenuItem(_("45 sec.")) + menu_items = Gtk.MenuItem(_("1 minute")) menu2.append(menu_items) - menu_items.connect("activate", self._robot_time_cb, 45) + menu_items.connect("activate", self._robot_time_cb, 60) menu_items.show() - menu_items = Gtk.MenuItem(_("30 sec.")) + menu_items = Gtk.MenuItem(_("30 seconds")) menu2.append(menu_items) menu_items.connect("activate", self._robot_time_cb, 30) menu_items.show() - menu_items = Gtk.MenuItem(_("15 sec.")) + menu_items = Gtk.MenuItem(_("15 seconds")) menu2.append(menu_items) menu_items.connect("activate", self._robot_time_cb, 15) menu_items.show() - tool_menu = Gtk.MenuItem("Robot") + tool_menu = Gtk.MenuItem(_('Play with the computer')) tool_menu.show() tool_menu.set_submenu(menu2) @@ -161,7 +174,7 @@ class DimensionsMain: self.vmw = Game(canvas) self.vmw.win = self.win self.vmw.activity = self - self.vmw.card_type = 'pattern' + self.vmw.card_type = 'number' self.vmw.level = 1 self.vmw.robot = False self.vmw.robot_time = 60 @@ -202,8 +215,8 @@ class DimensionsMain: self.vmw.new_game() return True - def _level_cb(self, widget): - self.vmw.level = 1 - self.vmw.level + def _level_cb(self, widget, level): + self.vmw.level = level self.vmw.new_game() def _robot_cb(self, widget): 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) -- cgit v0.9.1