diff options
author | Wade Brainerd <wadetb@gmail.com> | 2009-04-06 02:50:59 (GMT) |
---|---|---|
committer | Wade Brainerd <wadetb@gmail.com> | 2009-04-06 02:50:59 (GMT) |
commit | aba7e1f7a4964132bd27c53cbd84ffd28d10245b (patch) | |
tree | 10d7813d9cd1581d46fe7c0351d0b3181c852520 | |
parent | 0696a3efd09f557da92fafcba986dc6cc89c61f0 (diff) |
Switch AmountProblem to use new AmountObject instead of ShapeObject.
-rw-r--r-- | amountobject.py | 143 | ||||
-rw-r--r-- | amountproblem.py | 42 |
2 files changed, 157 insertions, 28 deletions
diff --git a/amountobject.py b/amountobject.py new file mode 100644 index 0000000..7d434ed --- /dev/null +++ b/amountobject.py @@ -0,0 +1,143 @@ +# Copyright 2008 by Peter Moxhay and Wade Brainerd. +# This file is part of Math. +# +# Math 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. +# +# Math is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Math. If not, see <http://www.gnu.org/licenses/>. +from objectarea import Object +from vector import Vector +from movableobject import MovableObject + +import gtk, math, rsvg + +MOON_SVG = rsvg.Handle('moon.svg') +OVAL_SVG = rsvg.Handle('oval.svg') + +class AmountObject(MovableObject): + """Draggable discrete shape.""" + + def __init__(self, pos, color, shape_name, container): + MovableObject.__init__(self) + + self.pos = pos + + self.selectable = True + self.rotatable = False + + self.color = color + + self.shape = shape_name + + self.container = container + + def draw(self, cr): + if self.shape == 'circle': + self.draw_circle(cr, self.color) + elif self.shape == 'square': + self.draw_square(cr, self.color) + else: + self.draw_triangle(cr, self.color) + + def is_in_container(self): + bounds_inner, bounds_outer = self.get_bounds() + + GRID_SIZE = 25 + + DRAGGING_RECT_WIDTH = 48*GRID_SIZE + DRAGGING_RECT_HEIGHT = 32*GRID_SIZE + + if bounds_inner.x < -2 or bounds_outer.x > DRAGGING_RECT_WIDTH + 2 \ + or bounds_inner.y < -1 or bounds_outer.y > DRAGGING_RECT_HEIGHT: + #print "GroupObject: is_in_container returning False" + return False + #print "GroupObject: is_in_container returning True" + return True + + def move(self, pos): + self.queue_draw() + + # Tentatively place in the object in the new position + last_pos = self.pos + self.pos = pos + + # If any point is out of bounds, move object back to last position. + if not self.is_in_container(): + self.pos = last_pos + + self.queue_draw() + + def get_bounds(self): + return self.pos + Vector(-50, -50), self.pos + Vector(50, 50) + + def draw_circle(self, cr, color): + cr.arc(self.pos.x, self.pos.y, 35, 0.0, 2.0 * math.pi) + + if self.selected: + cr.set_source_rgb(color[0]*1.6, color[1]*1.6, color[2]*1.6) + else: + cr.set_source_rgb(color[0], color[1], color[2]) + cr.fill_preserve() + + # Draw the outline. + cr.set_source_rgb(color[0]*0.75, color[1]*0.75, color[2]*0.75) + if self.selected: + cr.set_dash((10, 10), 0) + cr.set_line_width(4.0) + cr.stroke() + + def draw_square(self, cr, color): + square_side = 65 + SQUARE = [ Vector(0, 0), Vector(square_side, 0), Vector(square_side, square_side), Vector(0, square_side) ] + + # Draw the fill. + cr.move_to(self.pos.x + SQUARE[0].x, self.pos.y + SQUARE[0].y) + cr.line_to(self.pos.x + SQUARE[1].x, self.pos.y + SQUARE[1].y) + cr.line_to(self.pos.x + SQUARE[2].x, self.pos.y + SQUARE[2].y) + cr.line_to(self.pos.x + SQUARE[3].x, self.pos.y + SQUARE[3].y) + cr.close_path() + + if self.selected: + cr.set_source_rgb(color[0]*1.6, color[1]*1.6, color[2]*1.6) + else: + cr.set_source_rgb(color[0], color[1], color[2]) + cr.fill_preserve() + + # Draw the outline. + cr.set_source_rgb(color[0]*0.75, color[1]*0.75, color[2]*0.75) + if self.selected: + cr.set_dash((10, 10), 0) + cr.set_line_width(4.0) + cr.stroke() + + def draw_triangle(self, cr, color): + triangle_side = 80 + TRIANGLE = [ Vector(0, 0), Vector(triangle_side/2, -triangle_side * math.sqrt(3)/2), Vector(triangle_side, 0) ] + + # Draw the fill. + cr.move_to(self.pos.x + TRIANGLE[0].x, self.pos.y + TRIANGLE[0].y) + cr.line_to(self.pos.x + TRIANGLE[1].x, self.pos.y + TRIANGLE[1].y) + cr.line_to(self.pos.x + TRIANGLE[2].x, self.pos.y + TRIANGLE[2].y) + cr.close_path() + + if self.selected: + cr.set_source_rgb(color[0]*1.6, color[1]*1.6, color[2]*1.6) + else: + cr.set_source_rgb(color[0], color[1], color[2]) + cr.fill_preserve() + + # Draw the outline. + cr.set_source_rgb(color[0]*0.75, color[1]*0.75, color[2]*0.75) + if self.selected: + cr.set_dash((10, 10), 0) + cr.set_line_width(4.0) + cr.stroke() + diff --git a/amountproblem.py b/amountproblem.py index ab9b8eb..bee8f95 100644 --- a/amountproblem.py +++ b/amountproblem.py @@ -16,13 +16,13 @@ from objectarea import ObjectArea, Color from vector import Vector -from shapeobject import ShapeObject from symbolobject import SymbolObject from instructionsobject import InstructionsObject from modelobject import ModelObject from problem import Problem from vector import Vector from groupobject import GroupObject +from amountobject import AmountObject import gtk, math, random @@ -56,10 +56,10 @@ class AmountProblem(Problem): CIRCLE = [ Vector(0, 0), Vector(square_side, 0), Vector(square_side, square_side), Vector(0, square_side) ] # Choose two random letter to represent the two quantities - letter1 = random.choice(['A', 'B', 'C', 'D', 'G', 'H', 'K', 'L', 'M', 'N', 'P', 'S', 'T']) - letter2 = letter1 - while letter2 == letter1: - letter2 = random.choice(['A', 'B', 'C', 'D', 'G', 'H', 'K', 'L', 'M', 'N', 'P', 'S', 'T']) + self.letter1 = random.choice(['A', 'B', 'C', 'D', 'G', 'H', 'K', 'L', 'M', 'N', 'P', 'S', 'T']) + self.letter2 = self.letter1 + while self.letter2 == self.letter1: + self.letter2 = random.choice(['A', 'B', 'C', 'D', 'G', 'H', 'K', 'L', 'M', 'N', 'P', 'S', 'T']) # Standard initial positions for the shapes. upper_left_position = Vector(150, 150) @@ -196,41 +196,27 @@ class AmountProblem(Problem): self.shape2_model = [] for i in range(0, self.n_shape1): - self.shape1.append(ShapeObject(color1, letter1, object1, original_position1 + Vector(i*75, i % 2 *75), 0, centroid_shift_1, self)) - self.shape1[i].symbol_visible = False - if object1 == CIRCLE: - self.shape1[i].draw_as_circle = True - self.shape1[i].symbol_visible = False + self.shape1.append(AmountObject(original_position1 + Vector(i*75, i % 2 *75), color1, self.shape1_name, self)) for i in range(0, self.n_shape1_model): - self.shape1_model.append(ShapeObject(color1, letter1, object1, original_position1_model + Vector(i*100, 0), 0, centroid_shift_1, self)) + self.shape1_model.append(AmountObject(original_position1_model + Vector(i*100, 0), color1, self.shape1_name, self)) self.shape1_model[i].draggable = False self.shape1_model[i].selectable = False - self.shape1_model[i].symbol_visible = False - if object1 == CIRCLE: - self.shape1_model[i].draw_as_circle = True for i in range(0, self.n_shape2): - self.shape2.append(ShapeObject(color2, letter2, object2, original_position2 + Vector(i*75, i % 2 *75), 0, centroid_shift_2, self)) + self.shape2.append(AmountObject(original_position2 + Vector(i*75, i % 2 *75), color2, self.shape2_name, self)) self.shape2[i].symbol_visible = False if object2 == CIRCLE: self.shape2[i].draw_as_circle = True for i in range(0, self.n_shape2_model): - self.shape2_model.append(ShapeObject(color2, letter2, object2, original_position2_model + Vector(i*100, 0), 0, centroid_shift_2, self)) + self.shape2_model.append(AmountObject(original_position2_model + Vector(i*100, 0), color2, self.shape2_name, self)) self.shape2_model[i].draggable = False self.shape2_model[i].selectable = False self.shape2_model[i].symbol_visible = False if object2 == CIRCLE: self.shape2_model[i].draw_as_circle = True - for i in range(0, self.n_shape1): - self.shape1[i].rotatable = False - for i in range(0, self.n_shape2): - self.shape2[i].rotatable = False - - return - def show_problem(self): self.container.instructions = InstructionsObject(Vector(50, 25), 'Compare the things in amount') self.container.add_object(self.container.instructions) @@ -255,8 +241,8 @@ class AmountProblem(Problem): self.container.select_object(self.shape2[0]) # Add letter symbols. - self.container.letter1 = SymbolObject(Vector(850, 650), self.shape1[0].symbol, None, None, size=100) - self.container.letter2 = SymbolObject(Vector(1050, 650), self.shape2[0].symbol, None, None, size=100) + self.container.letter1 = SymbolObject(Vector(850, 650), self.letter1, None, None, size=100) + self.container.letter2 = SymbolObject(Vector(1050, 650), self.letter2, None, None, size=100) self.container.letter1.draggable = False self.container.letter1.selectable = False @@ -273,8 +259,8 @@ class AmountProblem(Problem): self.container.add_object(self.container.questionmark) # Add letter symbols next to amounts. - self.amount_letter1 = SymbolObject(Vector(55, 235), self.shape1[0].symbol, None, None, size=50) - self.amount_letter2 = SymbolObject(Vector(155, 690), self.shape2[0].symbol, None, None, size=50) + self.amount_letter1 = SymbolObject(Vector(55, 235), self.letter1, None, None, size=50) + self.amount_letter2 = SymbolObject(Vector(155, 690), self.letter2, None, None, size=50) self.amount_letter1.draggable = False self.amount_letter1.selectable = False @@ -318,7 +304,7 @@ class AmountProblem(Problem): j = 0 for o in self.container.objects: - if isinstance(o, ShapeObject): + if isinstance(o, AmountObject): if self.shape1_in_pair: o.scale = 0.65 o.pos = Vector(x_initial + i * 250 + 75 + j * 250, 450 + 225) |