diff options
Diffstat (limited to 'window.py')
-rw-r--r-- | window.py | 269 |
1 files changed, 132 insertions, 137 deletions
@@ -1,14 +1,13 @@ -#Copyright (c) 2009,10 Walter Bender +#Copyright (c) 2009-11 Walter Bender # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the -# Free Software Foundation, Inc., 59 Temple Place - Suite 330, -# Boston, MA 02111-1307, USA. +# You should have received a copy of the GNU General Public License +# along with this library; if not, write to the Free Software +# Foundation, 51 Franklin Street, Suite 500 Boston, MA 02110-1335 USA import pygtk pygtk.require('2.0') @@ -21,146 +20,142 @@ try: except: GRID_CELL_SIZE = 0 -from grid import * -from card import * +from grid import Grid from sprites import Sprites from math import sqrt CARD_DIM = 135 -class taWindow: pass - # # handle launch from both within and without of Sugar environment # -def new_window(canvas, path, parent=None): - tw = taWindow() - tw.path = path - tw.activity = parent - - # starting from command line - # we have to do all the work that was done in CardSortActivity.py - if parent is None: - tw.sugar = False - tw.canvas = canvas - - # starting from Sugar - else: - tw.sugar = True - tw.canvas = canvas - parent.show_all() - - tw.canvas.set_flags(gtk.CAN_FOCUS) - tw.canvas.add_events(gtk.gdk.BUTTON_PRESS_MASK) - tw.canvas.add_events(gtk.gdk.BUTTON_RELEASE_MASK) - tw.canvas.connect("expose-event", _expose_cb, tw) - tw.canvas.connect("button-press-event", _button_press_cb, tw) - tw.canvas.connect("button-release-event", _button_release_cb, tw) - tw.width = gtk.gdk.screen_width() - tw.height = gtk.gdk.screen_height()-GRID_CELL_SIZE - tw.card_dim = CARD_DIM - tw.scale = 0.8 * tw.height/(tw.card_dim*3) - - # Initialize the sprite repository - tw.sprites = Sprites(tw.canvas) - - # Initialize the grid - tw.grid = Grid(tw) - - # Start solving the puzzle - tw.press = -1 - tw.release = -1 - tw.start_drag = [0,0] - - return tw - -# -# Button press -# -def _button_press_cb(win, event, tw): - win.grab_focus() - x, y = map(int, event.get_coords()) - tw.start_drag = [x,y] - tw.grid.hide_masks() - spr = tw.sprites.find_sprite((x,y)) - if spr is None: - tw.press = -1 - tw.release = -1 - return True - # take note of card under button press - tw.press = int(spr.labels[0]) - return True - -# -# Button release -# -def _button_release_cb(win, event, tw): - win.grab_focus() - tw.grid.hide_masks() - x, y = map(int, event.get_coords()) - spr = tw.sprites.find_sprite((x,y)) - if spr is None: - tw.press = -1 - tw.release = -1 +class Game(): + + def __init__(self, canvas, path, parent=None): + self.activity = parent + self.path = path + + # starting from command line + # we have to do all the work that was done in CardSortActivity.py + if parent is None: + self.sugar = False + self.canvas = canvas + + # starting from Sugar + else: + self.sugar = True + self.canvas = canvas + parent.show_all() + + self.canvas.set_flags(gtk.CAN_FOCUS) + self.canvas.add_events(gtk.gdk.BUTTON_PRESS_MASK) + self.canvas.add_events(gtk.gdk.BUTTON_RELEASE_MASK) + self.canvas.connect("expose-event", self._expose_cb) + self.canvas.connect("button-press-event", self._button_press_cb) + self.canvas.connect("button-release-event", self._button_release_cb) + self.width = gtk.gdk.screen_width() + self.height = gtk.gdk.screen_height()-GRID_CELL_SIZE + self.card_dim = CARD_DIM + self.scale = 0.8 * self.height / (self.card_dim * 3) + + # Initialize the sprite repository + self.sprites = Sprites(self.canvas) + + # Initialize the grid + self.grid = Grid(self) + + # Start solving the puzzle + self.press = -1 + self.release = -1 + self.start_drag = [0, 0] + + # + # Button press + # + def _button_press_cb(self, win, event): + win.grab_focus() + x, y = map(int, event.get_coords()) + self.start_drag = [x, y] + self.grid.hide_masks() + spr = self.sprites.find_sprite((x,y)) + if spr is None: + self.press = -1 + self.release = -1 + return True + # take note of card under button press + self.press = int(spr.labels[0]) return True - # take note of card under button release - tw.release = int(spr.labels[0]) - # if the same card (click) then rotate - if tw.press == tw.release: - # check to see if it was an aborted move - if distance(tw.start_drag,[x,y]) < 20: - tw.grid.card_table[tw.press].rotate_ccw() - # tw.grid.card_table[tw.press].print_card() - # if different card (drag) then swap - else: - tw.grid.swap(tw.press,tw.release) - # tw.grid.print_grid() - tw.press = -1 - tw.release = -1 - if tw.test() == True: - if tw.sugar is True: - tw.activity.results_label.set_text(_("You solved the puzzle.")) - tw.activity.results_label.show() + + # + # Button release + # + def _button_release_cb(self, win, event): + win.grab_focus() + self.grid.hide_masks() + x, y = map(int, event.get_coords()) + spr = self.sprites.find_sprite((x, y)) + if spr is None: + self.press = -1 + self.release = -1 + return True + # take note of card under button release + self.release = int(spr.labels[0]) + # if the same card (click) then rotate + if self.press == self.release: + # check to see if it was an aborted move + if self.distance(self.start_drag, [x, y]) < 20: + self.grid.card_table[self.press].rotate_ccw() + # self.grid.card_table[self.press].print_card() + # if different card (drag) then swap else: - tw.win.set_title(_("CardSort") + ": " + \ - _("You solved the puzzle.")) - else: - if tw.sugar is True: - tw.activity.results_label.set_text(_("Keep trying.")) - tw.activity.results_label.show() + self.grid.swap(self.press,self.release) + # self.grid.print_grid() + self.press = -1 + self.release = -1 + if self.test() == True: + if self.sugar is True: + self.activity.results_label.set_text( + _("You solved the puzzle.")) + self.activity.results_label.show() + else: + self.win.set_title(_("CardSort") + ": " + \ + _("You solved the puzzle.")) else: - tw.win.set_title(_("CardSort") + ": " + _("Keep trying.")) - return True - -# -# Measure length of drag between button press and button release -# -def distance(start,stop): - dx = start[0]-stop[0] - dy = start[1]-stop[1] - return sqrt(dx*dx+dy*dy) - - -# -# Repaint -# -def _expose_cb(tw, win, event): - ''' Callback to handle window expose events ''' - tw.do_expose_event(event) - return True - -def do_expose_event(tw, event): - ''' Handle the expose-event by drawing ''' - # Restrict Cairo to the exposed area - cr = tw.canvas.window.cairo_create() - cr.rectangle(event.area.x, event.area.y, - event.area.width, event.area.height) - cr.clip() - # Refresh sprite list - tw.sprites.redraw_sprites(cr=cr) - -# -# callbacks -# -def _destroy_cb(win, event, tw): - gtk.main_quit() + if self.sugar is True: + self.activity.results_label.set_text(_("Keep trying.")) + self.activity.results_label.show() + else: + self.win.set_title(_("CardSort") + ": " + _("Keep trying.")) + return True + + # + # Measure length of drag between button press and button release + # + def distance(self, start, stop): + dx = start[0] - stop[0] + dy = start[1] - stop[1] + return sqrt(dx * dx + dy * dy) + + # + # Repaint + # + def _expose_cb(self, win, event): + ''' Callback to handle window expose events ''' + self.do_expose_event(event) + return True + + def do_expose_event(self, event): + ''' Handle the expose-event by drawing ''' + # Restrict Cairo to the exposed area + cr = self.canvas.window.cairo_create() + cr.rectangle(event.area.x, event.area.y, + event.area.width, event.area.height) + cr.clip() + # Refresh sprite list + self.sprites.redraw_sprites(cr=cr) + + # + # callbacks + # + def _destroy_cb(self, win, event): + gtk.main_quit() |