# 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 . from objectarea import Object from vector import Vector import gtk class DropTargetObject(Object): """Rectangular area into which other objects can be dropped.""" def __init__(self, pos, size, container): Object.__init__(self) self.pos = pos self.size = size self.draggable = False self.selectable = False self.hilite = False self.contents = None self.drop_origin = None self.drop_targets = None self.full = False self.shape1 = None self.shape2 = None self.objects = [] self.container = container def draw(self, cr): cr.rectangle(self.pos.x, self.pos.y, self.size.x, self.size.y) cr.set_source_rgb(0, 0, 0) cr.set_line_width(4.0) if self.hilite: cr.set_dash((10, 10), 0) cr.stroke() def add_object(self, obj): obj.container = self.container obj.pos += self.pos self.objects.append(obj) self.container.add_object(obj) def remove_object(self, obj): # Ignore failure to remove when an object has already been removed. try: self.objects.remove(obj) except: pass if self.container: self.container.remove_object(obj) def processDrop(self, draggable_object): pass def get_bounds(self): return self.pos, self.pos + self.size def contains(self, other_bounds): self_bounds_mn, self_bounds_mx = self.get_bounds() other_bounds_mn, other_bounds_mx = other_bounds if other_bounds_mn.x > self_bounds_mn.x \ and other_bounds_mx.x < self_bounds_mx.x \ and other_bounds_mn.y > self_bounds_mn.y \ and other_bounds_mx.y < self_bounds_mx.y : return True else: return False