Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWalter Bender <walter@sugarlabs.org>2013-07-04 07:41:53 (GMT)
committer Walter Bender <walter@sugarlabs.org>2013-07-04 07:41:53 (GMT)
commit9e3b135307f0ce6a16a26b36883dd80fcb36c5a3 (patch)
treef07dee034b6ea1dac2c320f6e3961532c9ac8d63
parentfab378a1ad965963f941dc19bd3cc8ab199448bf (diff)
more tweaks
-rw-r--r--Dimensions.py37
-rw-r--r--activity/activity-dimensions.svg68
-rwxr-xr-xdimensions.py47
-rw-r--r--game.py169
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):
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)