Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWade Brainerd <wadetb@gmail.com>2009-04-06 02:50:59 (GMT)
committer Wade Brainerd <wadetb@gmail.com>2009-04-06 02:50:59 (GMT)
commitaba7e1f7a4964132bd27c53cbd84ffd28d10245b (patch)
tree10d7813d9cd1581d46fe7c0351d0b3181c852520
parent0696a3efd09f557da92fafcba986dc6cc89c61f0 (diff)
Switch AmountProblem to use new AmountObject instead of ShapeObject.
-rw-r--r--amountobject.py143
-rw-r--r--amountproblem.py42
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)