# 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 . DEBUG = False from objectarea import Object from draggableobject import DraggableObject from vector import Vector import gtk class LineSegmentObject(DraggableObject): """Draggable vertical line segment.""" def __init__(self, pos, length, drop_targets, container): DraggableObject.__init__(self) self.pos = pos self.length = length if self.length == 200: self.line_segment_length = 162 else: self.line_segment_length = self.length self.selectable = True self.rotatable = False self.drop_target = None self.drop_targets = drop_targets self.container = container def draw(self, cr): #cr.set_source_rgb(1, 0, 1) #self_bounds_mn, self_bounds_mx = self.get_bounds() #cr.rectangle(self_bounds_mn.x, self_bounds_mn.y, self_bounds_mx.x - self_bounds_mn.x, self_bounds_mx.y - self_bounds_mn.y) #cr.fill() cr.move_to(self.pos.x - 25, self.pos.y + self.length - self.line_segment_length) cr.line_to(self.pos.x + 25, self.pos.y+ self.length - self.line_segment_length) cr.move_to(self.pos.x - 25, self.pos.y + self.length) cr.line_to(self.pos.x + 25, self.pos.y + self.length) cr.move_to(self.pos.x, self.pos.y + self.length - self.line_segment_length) cr.line_to(self.pos.x, self.pos.y + self.length) if self.dragged: # The line segment gets transparent when dragged. cr.set_source_rgba(0, 0, 0, 0.5) else: # Otherwise, it's black. cr.set_source_rgb(0, 0, 0) cr.set_line_width(8.0) cr.stroke() if self.selected: cr.rectangle(self.pos.x - 30, self.pos.y - 10 + self.length - self.line_segment_length, 60, self.line_segment_length + 20) cr.set_line_width(1.0) # Draw a different dashed outline if the object is not only selected but dragged. if self.dragged or self.moving_by_key_press: cr.set_dash((2, 2, 0)) else: cr.set_dash((10, 10), 0) cr.set_source_rgb(0, 0, 0) cr.stroke() def get_bounds(self): mn = Vector(self.pos.x - 30, self.pos.y - 10 + self.length - self.line_segment_length) mx = mn + Vector(60, self.line_segment_length + 20) return mn, mx