Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Dimensions.py86
-rw-r--r--activity/activity-dimensions.svg121
-rw-r--r--activity/activity.info6
-rwxr-xr-xdimensions.py47
-rw-r--r--game.py169
5 files changed, 212 insertions, 217 deletions
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 @@
<!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.4656048"
+ y="5.9336901"
+ 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" />
+ <path
+ d="M 11.195099,16.903549 16.802535,3.5718138 20.300802,17.385633 9.4579926,8.0369522 23.201581,9.524765 z"
+ id="path3034"
+ style="fill:none;stroke:&stroke_color;;stroke-width:2.01501012;stroke-linecap:round;stroke-opacity:1" />
+ <rect
+ width="26.755812"
+ height="15.408295"
+ ry="3.4379132"
+ x="14.122094"
+ 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" />
<g
- transform="matrix(0,-1,1,0,0.36636489,40.126411)"
- id="g4036">
+ 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">
<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">
+ 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">
<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"
- 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" />
- </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">
+ 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" />
<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"
- transform="translate(10,1.5)"
- id="path2927-7" />
+ 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" />
</g>
- </g>
- <g
- transform="matrix(0.41155553,0,0,0.39886125,12.066668,1.454678)"
- id="g3063"
- style="fill:none;stroke-width:3;stroke-miterlimit:4;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"
- transform="translate(10,1.5)"
- id="path3065"
- style="fill:none;stroke:&stroke_color;;stroke-width:3;stroke-miterlimit:4;stroke-dasharray:none" />
- </g>
- <g
- transform="matrix(0,-1,1,0,-0.19969225,55.000838)"
- id="g4007">
- <g
- transform="translate(-0.52754307,0)"
- id="g3997">
- <rect
- width="13.632148"
- height="13.750559"
- rx="8.0620232"
- ry="8.9985275"
- 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" />
- </g>
- <g
- transform="translate(4.7683716e-7,-0.01625347)"
- id="g3979">
- <rect
- width="13.632148"
- height="13.750559"
- rx="8.0620232"
- ry="8.9985275"
- 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" />
- </g>
- <g
- id="g3961">
- <rect
- width="13.632148"
- height="13.750559"
- rx="8.0620232"
- ry="8.9985275"
- 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" />
- </g>
+ 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" />
</g>
+ <rect
+ width="19.728365"
+ height="9.0900669"
+ x="28.80603"
+ 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" />
+ <text
+ x="28.077969"
+ y="48.588619"
+ transform="scale(0.94463905,1.0586054)"
+ id="text3030"
+ xml:space="preserve"
+ style="font-size:23.8940773px;font-style:normal;font-weight:bold;line-height:125%;letter-spacing:0px;word-spacing:0px;stroke:none"><tspan
+ x="28.077969"
+ y="48.588619"
+ id="tspan3032"
+ style="font-size:17.92055893px;font-style:normal;font-weight:bold;fill:&stroke_color;;fill-opacity:1;stroke:none;-inkscape-font-specification:Sans Bold">11</tspan></text>
</svg>
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)