# -*- coding: utf-8 -*- #Copyright (c) 2009, Walter Bender #Permission is hereby granted, free of charge, to any person obtaining a copy #of this software and associated documentation files (the "Software"), to deal #in the Software without restriction, including without limitation the rights #to use, copy, modify, merge, publish, distribute, sublicense, and/or sell #copies of the Software, and to permit persons to whom the Software is #furnished to do so, subject to the following conditions: #The above copyright notice and this permission notice shall be included in #all copies or substantial portions of the Software. #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR #IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, #FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE #AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER #LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, #OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN #THE SOFTWARE. from constants import * import pygtk pygtk.require('2.0') import gtk from gettext import gettext as _ import math try: from sugar.graphics import style GRID_CELL_SIZE = style.GRID_CELL_SIZE except: GRID_CELL_SIZE = 0 from sprite_factory import * class srWindow: pass # # handle launch from both within and without of Sugar environment # def new_window(canvas, path, parent=None): # store class variables here tw = srWindow() 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.add_events(gtk.gdk.POINTER_MOTION_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.canvas.connect("motion-notify-event", _mouse_move_cb, tw) tw.width = gtk.gdk.screen_width() tw.height = gtk.gdk.screen_height()-GRID_CELL_SIZE tw.area = tw.canvas.window tw.gc = tw.area.new_gc() tw.cm = tw.gc.get_colormap() tw.msgcolor = tw.cm.alloc_color('black') tw.sprites = [] tw.scale = 1 # Open the sliders y = 50 tw.cards = [Sprite(tw,"CartaCristo",100,100,100,198,False),\ Sprite(tw,"CartaGranMuralla",250,100,100,198,False),\ Sprite(tw,"CartaMacchu",400,100,100,198,False)] tw.numbers = [Sprite(tw,"Carta1",100,100,100,198,False),\ Sprite(tw,"Carta2",250,100,100,198,False),\ Sprite(tw,"Carta3",400,100,100,198,False)] tw.cards[0].draw_slider_bottom() tw.cards[1].draw_slider_bottom() tw.cards[2].draw_slider_bottom() tw.numbers[0].draw_slider_top() tw.numbers[1].draw_slider_top() tw.numbers[2].draw_slider_top() # Start calculating tw.press = None tw.dragpos = 0,0 return tw # # Button press # def _button_press_cb(win, event, tw): win.grab_focus() x, y = map(int, event.get_coords()) tw.dragpos = x,y spr = findsprite(tw,(x,y)) tw.press = spr return True # # Mouse move # def _mouse_move_cb(win, event, tw): if tw.press is None: tw.dragpos = 0,0 return True win.grab_focus() x, y = map(int, event.get_coords()) dx = x-tw.dragpos[0] if tw.press == tw.cards[2].spr or tw.press == tw.numbers[2].spr: # everything moves move(tw.cards[0].spr,(tw.cards[0].spr.x+dx,tw.cards[0].spr.y)) move(tw.cards[1].spr,(tw.cards[1].spr.x+dx,tw.cards[1].spr.y)) move(tw.cards[2].spr,(tw.cards[2].spr.x+dx,tw.cards[2].spr.y)) move(tw.numbers[0].spr,(tw.numbers[0].spr.x+dx,tw.numbers[0].spr.y)) move(tw.numbers[1].spr,(tw.numbers[1].spr.x+dx,tw.numbers[1].spr.y)) move(tw.numbers[2].spr,(tw.numbers[2].spr.x+dx,tw.numbers[2].spr.y)) # reset drag position tw.dragpos = x,y # # Button release # def _button_release_cb(win, event, tw): print tw.press if tw.press == None: return True if tw.press == tw.cards[1].spr: x = tw.cards[2].spr.x move(tw.cards[2].spr,(tw.cards[1].spr.x,tw.cards[2].spr.y)) move(tw.cards[1].spr,(x,tw.cards[1].spr.y)) elif tw.press == tw.cards[0].spr: tw.cards[0].draw_slider_bottom() tw.cards[1].draw_slider_bottom() tw.cards[2].draw_slider_bottom() tw.numbers[0].draw_slider_top() tw.numbers[1].draw_slider_top() tw.numbers[2].draw_slider_top() elif tw.press == tw.numbers[1].spr: x = tw.numbers[2].spr.x move(tw.numbers[2].spr,(tw.numbers[1].spr.x,tw.numbers[2].spr.y)) move(tw.numbers[1].spr,(x,tw.numbers[1].spr.y)) elif tw.press == tw.numbers[0].spr: tw.cards[0].draw_slider_top() tw.cards[1].draw_slider_top() tw.cards[2].draw_slider_top() tw.numbers[0].draw_slider_bottom() tw.numbers[1].draw_slider_bottom() tw.numbers[2].draw_slider_bottom() tw.press = None update_label(tw) def update_label(tw): # calculate the values for D, C, and D*C (under the redicule) tw.activity.results_label.set_text( "my label changed " + str(tw.dragpos)) tw.activity.results_label.show() return True def _calc_C(tw): return "foo" def _calc_D(tw): return "bar" def _calc_DC(tw): return "usmp" def _expose_cb(win, event, tw): redrawsprites(tw) return True def _destroy_cb(win, event, tw): gtk.main_quit()