diff options
author | Walter Bender <walter@sugarlabs.org> | 2013-07-04 07:41:53 (GMT) |
---|---|---|
committer | Walter Bender <walter@sugarlabs.org> | 2013-07-04 07:41:53 (GMT) |
commit | 9e3b135307f0ce6a16a26b36883dd80fcb36c5a3 (patch) | |
tree | f07dee034b6ea1dac2c320f6e3961532c9ac8d63 | |
parent | fab378a1ad965963f941dc19bd3cc8ab199448bf (diff) |
more tweaks
-rw-r--r-- | Dimensions.py | 37 | ||||
-rw-r--r-- | activity/activity-dimensions.svg | 68 | ||||
-rwxr-xr-x | dimensions.py | 47 | ||||
-rw-r--r-- | game.py | 169 |
4 files changed, 181 insertions, 140 deletions
diff --git a/Dimensions.py b/Dimensions.py index 93cf3e9..f81ac3c 100644 --- a/Dimensions.py +++ b/Dimensions.py @@ -128,6 +128,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): @@ -426,6 +427,9 @@ class Dimensions(activity.Activity): ''' 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 +502,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 @@ -529,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. ''' diff --git a/activity/activity-dimensions.svg b/activity/activity-dimensions.svg index fa3f393..1ec20eb 100644 --- a/activity/activity-dimensions.svg +++ b/activity/activity-dimensions.svg @@ -4,45 +4,71 @@ <!ENTITY fill_color "#eee"> ]> <svg height="55px" viewBox="0 0 55 55" width="55px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" stroke-linecap="round" stroke-linejoin="round" stroke-width="3.5" stroke="&stroke_color;" fill="&fill_color;"> + <rect + width="19.728365" + height="9.0900669" + x="6.4656024" + y="5.933691" + id="rect3770-8" + style="fill:&fill_color;;fill-opacity:1;stroke:&fill_color;;stroke-width:6.86738014;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <rect + width="26.755812" + height="15.408295" + ry="3.4379132" + x="14.122096" + y="19.795855" + id="rect3770" + style="fill:none;stroke:&stroke_color;;stroke-width:1.61298168;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <rect + width="19.728365" + height="9.0900669" + x="28.806034" + y="39.976242" + id="rect3770-6" + style="fill:&fill_color;;fill-opacity:1;stroke:&fill_color;;stroke-width:6.86738014;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> <g - transform="matrix(0,-1,1,0,0.36636489,40.126411)" - id="g4036"> + transform="matrix(0,-0.82623498,0.82623498,0,-5.815689,34.298665)" + id="g4036" + style="fill:#ffffff;fill-opacity:1"> <g transform="matrix(0.41601289,0,0,0.40702804,13.297821,-6.9732022)" id="g2925" - style="fill:&stroke_color;;fill-opacity:1;stroke-width:3;stroke-miterlimit:4;stroke-dasharray:none"> + style="fill:#ffffff;fill-opacity:1"> <path - d="m 33.3585,62.5035 l 10.102,10.1 c 0.752,0.75 1.217,1.783 1.217,2.932 0,2.287 -1.855,4.143 -4.146,4.143 -1.145,0 -2.178,-0.463 -2.932,-1.211 l -10.102,-10.103 -10.1,10.1 c -0.75,0.75 -1.787,1.211 -2.934,1.211 -2.284,0 -4.143,-1.854 -4.143,-4.141 0,-1.146 0.465,-2.184 1.212,-2.934 l 10.104,-10.102 -10.102,-10.1 c -0.747,-0.748 -1.212,-1.785 -1.212,-2.93 0,-2.289 1.854,-4.146 4.146,-4.146 1.143,0 2.18,0.465 2.93,1.214 l 10.099,10.102 10.102,-10.103 c 0.754,-0.749 1.787,-1.214 2.934,-1.214 2.289,0 4.146,1.856 4.146,4.145 0,1.146 -0.467,2.18 -1.217,2.932 l -10.104,10.105 z" + d="m 33.3585,62.5035 10.102,10.1 c 0.752,0.75 1.217,1.783 1.217,2.932 0,2.287 -1.855,4.143 -4.146,4.143 -1.145,0 -2.178,-0.463 -2.932,-1.211 l -10.102,-10.103 -10.1,10.1 c -0.75,0.75 -1.787,1.211 -2.934,1.211 -2.284,0 -4.143,-1.854 -4.143,-4.141 0,-1.146 0.465,-2.184 1.212,-2.934 l 10.104,-10.102 -10.102,-10.1 c -0.747,-0.748 -1.212,-1.785 -1.212,-2.93 0,-2.289 1.854,-4.146 4.146,-4.146 1.143,0 2.18,0.465 2.93,1.214 l 10.099,10.102 10.102,-10.103 c 0.754,-0.749 1.787,-1.214 2.934,-1.214 2.289,0 4.146,1.856 4.146,4.145 0,1.146 -0.467,2.18 -1.217,2.932 l -10.104,10.105 z" transform="translate(10,1.5)" id="path2927" - style="fill:&stroke_color;;fill-opacity:1;stroke:&stroke_color;;stroke-width:3;stroke-miterlimit:4;stroke-dasharray:none" /> + style="fill:#ffffff;fill-opacity:1" /> </g> <g transform="matrix(0.41601289,0,0,0.40702804,13.297821,9.1408833)" id="g2925-4" - style="fill:&stroke_color;;fill-opacity:1;stroke-width:3;stroke-miterlimit:4;stroke-dasharray:none"> + style="fill:#ffffff;fill-opacity:1"> <path - d="m 33.3585,62.5035 l 10.102,10.1 c 0.752,0.75 1.217,1.783 1.217,2.932 0,2.287 -1.855,4.143 -4.146,4.143 -1.145,0 -2.178,-0.463 -2.932,-1.211 l -10.102,-10.103 -10.1,10.1 c -0.75,0.75 -1.787,1.211 -2.934,1.211 -2.284,0 -4.143,-1.854 -4.143,-4.141 0,-1.146 0.465,-2.184 1.212,-2.934 l 10.104,-10.102 -10.102,-10.1 c -0.747,-0.748 -1.212,-1.785 -1.212,-2.93 0,-2.289 1.854,-4.146 4.146,-4.146 1.143,0 2.18,0.465 2.93,1.214 l 10.099,10.102 10.102,-10.103 c 0.754,-0.749 1.787,-1.214 2.934,-1.214 2.289,0 4.146,1.856 4.146,4.145 0,1.146 -0.467,2.18 -1.217,2.932 l -10.104,10.105 z" + d="m 33.3585,62.5035 10.102,10.1 c 0.752,0.75 1.217,1.783 1.217,2.932 0,2.287 -1.855,4.143 -4.146,4.143 -1.145,0 -2.178,-0.463 -2.932,-1.211 l -10.102,-10.103 -10.1,10.1 c -0.75,0.75 -1.787,1.211 -2.934,1.211 -2.284,0 -4.143,-1.854 -4.143,-4.141 0,-1.146 0.465,-2.184 1.212,-2.934 l 10.104,-10.102 -10.102,-10.1 c -0.747,-0.748 -1.212,-1.785 -1.212,-2.93 0,-2.289 1.854,-4.146 4.146,-4.146 1.143,0 2.18,0.465 2.93,1.214 l 10.099,10.102 10.102,-10.103 c 0.754,-0.749 1.787,-1.214 2.934,-1.214 2.289,0 4.146,1.856 4.146,4.145 0,1.146 -0.467,2.18 -1.217,2.932 l -10.104,10.105 z" transform="translate(10,1.5)" - id="path2927-7" /> + id="path2927-7" + style="fill:#ffffff;fill-opacity:1" /> </g> </g> <g - transform="matrix(0.41155553,0,0,0.39886125,12.066668,1.454678)" + transform="matrix(0.41155553,0,0,0.39886125,22.320907,19.090757)" id="g3063" - style="fill:none;stroke-width:3;stroke-miterlimit:4;stroke-dasharray:none"> + style="fill:none;stroke:&stroke_color;;stroke-width:2.99882507;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"> <path - d="m 28.3575,70.160499 l -5.861,5.861 -5.861,-5.866001 -4.102,-4.1 c -0.747,-0.747999 -1.212,-1.784999 -1.212,-2.93 0,-2.288998 1.854,-4.145998 4.146,-4.145998 1.143,0 2.18,0.465 2.93,1.214 l 4.099,4.101999 14.102,-14.102998 c 0.754,-0.749 1.787,-1.214 2.934,-1.214 2.289,0 4.146,1.856001 4.146,4.145001 0,1.146 -0.467,2.18 -1.217,2.932 l -14.104,14.104997 z" + d="m 28.3575,70.160499 -5.861,5.861 -5.861,-5.866001 -4.102,-4.1 c -0.747,-0.747999 -1.212,-1.784999 -1.212,-2.93 0,-2.288998 1.854,-4.145998 4.146,-4.145998 1.143,0 2.18,0.465 2.93,1.214 l 4.099,4.101999 14.102,-14.102998 c 0.754,-0.749 1.787,-1.214 2.934,-1.214 2.289,0 4.146,1.856001 4.146,4.145001 0,1.146 -0.467,2.18 -1.217,2.932 l -14.104,14.104997 z" transform="translate(10,1.5)" id="path3065" - style="fill:none;stroke:&stroke_color;;stroke-width:3;stroke-miterlimit:4;stroke-dasharray:none" /> + style="fill:none;stroke:&stroke_color;;stroke-width:2.99882507;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> </g> <g - transform="matrix(0,-1,1,0,-0.19969225,55.000838)" - id="g4007"> + transform="matrix(0,-0.48182165,0.48182165,0,13.832955,32.704948)" + id="g4007" + style="fill:&fill_color;;fill-opacity:1;stroke-width:2.59432101;stroke-miterlimit:4;stroke-dasharray:none"> <g transform="translate(-0.52754307,0)" - id="g3997"> + id="g3997" + style="fill:&fill_color;;fill-opacity:1;stroke-width:2.59432101;stroke-miterlimit:4;stroke-dasharray:none"> <rect width="13.632148" height="13.750559" @@ -51,11 +77,12 @@ x="5.1309609" y="37.104614" id="rect14" - style="fill:&fill_color;;fill-opacity:1;fill-rule:evenodd;stroke-width:1.20515919;stroke-linecap:square;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + style="fill:&fill_color;;fill-opacity:1;stroke-width:2.59432101;stroke-miterlimit:4;stroke-dasharray:none" /> </g> <g transform="translate(4.7683716e-7,-0.01625347)" - id="g3979"> + id="g3979" + style="fill:&fill_color;;fill-opacity:1;stroke-width:2.59432101;stroke-miterlimit:4;stroke-dasharray:none"> <rect width="13.632148" height="13.750559" @@ -64,10 +91,11 @@ x="4.6034174" y="20.857771" id="rect14-5" - style="fill:&fill_color;;fill-opacity:1;fill-rule:evenodd;stroke-width:1.20515919;stroke-linecap:square;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + style="fill:&fill_color;;fill-opacity:1;stroke-width:2.59432101;stroke-miterlimit:4;stroke-dasharray:none" /> </g> <g - id="g3961"> + id="g3961" + style="fill:&fill_color;;fill-opacity:1;stroke-width:2.59432101;stroke-miterlimit:4;stroke-dasharray:none"> <rect width="13.632148" height="13.750559" @@ -76,7 +104,7 @@ x="4.6034179" y="4.5442114" id="rect14-7" - style="fill:&fill_color;;fill-opacity:1;fill-rule:evenodd;stroke-width:1.20515919;stroke-linecap:square;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + style="fill:&fill_color;;fill-opacity:1;stroke-width:2.59432101;stroke-miterlimit:4;stroke-dasharray:none" /> </g> </g> </svg> diff --git a/dimensions.py b/dimensions.py index 5f3acae..c0d9e70 100755 --- a/dimensions.py +++ b/dimensions.py @@ -30,16 +30,25 @@ 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) @@ -48,6 +57,7 @@ class DimensionsMain: 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') @@ -56,7 +66,8 @@ class DimensionsMain: 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,30 +76,31 @@ 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) + ''' menu3 = Gtk.Menu() menu_items = Gtk.MenuItem(_("Product")) menu3.append(menu_items) @@ -137,6 +149,7 @@ class DimensionsMain: num_menu = Gtk.MenuItem("Numbers") num_menu.show() num_menu.set_submenu(menu3) + ''' # A vbox to put a menu and the canvas in: vbox = Gtk.VBox(False, 0) @@ -154,7 +167,7 @@ class DimensionsMain: menu_bar.append(game_menu) menu_bar.append(level_menu) menu_bar.append(tool_menu) - menu_bar.append(num_menu) + # menu_bar.append(num_menu) self.win.show_all() # Join the activity @@ -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): @@ -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) |