rendered paste body#!/usr/bin/pythonimport goocanvasimport gtkclass Stack: def __init__(self, canvas, x = 0, y = 0): self.dragging = False self.cards = [] self.x = x self.y = y self.canvas = canvas self.root = canvas.get_root_item() self.drawables = goocanvas.Group(parent = self.root) self.drawables.set_canvas(self.canvas) self.drawables.connect ("leave_notify_event", self.on_leave_notify) self.drawables.connect ("enter_notify_event", self.on_enter_notify) self.drawables.connect ("motion_notify_event", self.on_motion_notify) self.drawables.connect ("button_press_event", self.on_button_press) self.drawables.connect ("button_release_event", self.on_button_release) self.drawables.stack = self self.parent_stack = False def on_leave_notify(self, item, target, event): card = self.cards[len(self.cards)-1] card.border.props.line_width = card.border_width def on_enter_notify(self, item, target, event): card = self.cards[len(self.cards)-1] card.border.props.line_width = 4 def append(self, card): if not card.drawables: for x in self.cards: x.drawables.translate(3, 3) card.draw(self.drawables) else: card.drawables.props.parent = self.drawables self.cards.append(card) def on_motion_notify (self, item, target, event): if self.dragging and event.state and gtk.gdk.BUTTON1_MASK: new_x = event.x new_y = event.y self.drawables.translate (new_x - self.drag_x, new_y - self.drag_y) #adj = gtk.Adjustment(30,30,30,30,5,5) #canvas.scrolled_win.get_hscrollbar(). #self.canvas.scrolled_win.get_hadjustment().set_value(30) below = self.canvas.get_items_at(event.x, event.y, False) if below is not None: for drawables in below: pass #print drawables #print hasattr(drawables.props.parent, "stack") return True def on_button_press (self, item, target, event): if event.button == 1: fleur = gtk.gdk.Cursor (gtk.gdk.FLEUR) # are we dragging a stack or a single card if event.state & gtk.gdk.SHIFT_MASK: drug = self else: # create a new stack for the single card to go into drug = Stack(self.canvas, self.x, self.y) moved_card = self.cards[len(self.cards)-1] bounds = moved_card.drawables.get_bounds() drug.append(moved_card) drug.drawables.raise_(None) drug.parent_stack = self drug.drawables.translate(bounds.x1 + moved_card.border_width, bounds.y1 + moved_card.border_width) self.canvas.pointer_grab (drug.drawables, gtk.gdk.POINTER_MOTION_MASK | gtk.gdk.BUTTON_RELEASE_MASK, fleur, event.time) drug.dragging = True drug.drag_x = event.x drug.drag_y = event.y def on_button_release (self, item, target, event): self.canvas.pointer_ungrab (self.drawables, event.time) self.dragging = False if self.parent_stack: self.parent_stack.cards.pop() self.parent_stack = False class Card: width = 200 height = 300 rim_width = 12 border_width = 2 border_color = "gray" background_color = "tan" backside_color = "brown" flipped = False title = None drawables = False def __init__(self, title = None): self.title = title def draw(self, root): self.drawables = goocanvas.Group(parent = root) self.border = goocanvas.Rect (parent = self.drawables, x = 0, y = 0, width = self.width, height = self.height, fill_color = self.border_color, radius_x = 10, radius_y = 10) if self.flipped: goocanvas.Rect (parent = self.drawables, x = self.rim_width, y = self.rim_width, width = self.width - (2 * self.rim_width), height = self.height - (2 * self.rim_width), fill_color = self.backside_color) else: goocanvas.Rect (parent = self.drawables, x = self.rim_width, y = self.rim_width, width = self.width - (2 * self.rim_width), height = self.height - (2 * self.rim_width), fill_color = self.background_color) if self.title is not None: text = goocanvas.Text(parent = self.drawables, text = self.title, x = self.rim_width * 1.5, y = self.rim_width * 1.5)def setup_canvas (canvas): s = Stack(canvas) for i in range(10): s.append(Card(title = "TEST " + str(i))) #s = Stack(canvas, 500, 500) #for i in range(10): # s.append(Card(title = "TEST " + str(i)))def zoom_changed (adj, canvas): canvas.set_scale (adj.get_value())def create_card_page (): canvas = goocanvas.Canvas () canvas.set_size_request (600, 450) canvas.set_bounds (0, 0, 1000, 1000) vbox = gtk.VBox (False, 4) vbox.set_border_width (4) hbox = gtk.HBox (False, 4) vbox.pack_start (hbox, False, False, 0) w = gtk.Label ("Zoom:") hbox.pack_start (w, False, False, 0) adj = gtk.Adjustment (1.00, 0.05, 1.00, 0.05, 0.50, 0.50) adj.connect("value_changed", zoom_changed, canvas) w = gtk.SpinButton (adj, 0.0, 2) w.set_size_request (50, -1) hbox.pack_start (w, False, False, 0) scrolled_win = gtk.ScrolledWindow () scrolled_win.set_shadow_type (gtk.SHADOW_IN) vbox.add (scrolled_win) canvas.scrolled_win = scrolled_win scrolled_win.add (canvas) setup_canvas (canvas) return vboxdef main (): v = create_card_page () w = gtk.Window() w.connect("destroy", gtk.main_quit) w.add(v) w.show_all() gtk.main()if __name__ == "__main__": main()