rendered paste body#!/usr/bin/pythonimport goocanvasimport gtkclass Stack: def __init__(self, canvas, x = 0, y = 0): self.dragging = False self.cards = [] self.x = 0 self.y = 0 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 ("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.parent_stack = False def append(self, card): self.cards.append(card) if not card.drawables: card.draw(self.drawables) else: # how can we just reparent this card instead of redrawing #card.drawables.remove() #card.draw(self.drawables) card.drawables.set_parent(self.drawables) for x in self.cards: x.drawables.translate(3,3) 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) return True def on_button_press (self, item, target, event): if event.button == 1: fleur = gtk.gdk.Cursor (gtk.gdk.FLEUR) if event.state & gtk.gdk.SHIFT_MASK: drug = self else: drug = Stack(self.canvas, self.x, self.y) drug.append(self.cards[len(self.cards)-1]) drug.drawables.raise_(None) drug.parent_stack = self 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 border = 12 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) goocanvas.Rect (parent = self.drawables, x = 0, y = 0, width = self.width, height = self.height, fill_color = self.border_color) if self.flipped: goocanvas.Rect (parent = self.drawables, x = self.border, y = self.border, width = self.width - (2 * self.border), height = self.height - (2 * self.border), fill_color = self.backside_color) else: goocanvas.Rect (parent = self.drawables, x = self.border, y = self.border, width = self.width - (2 * self.border), height = self.height - (2 * self.border), fill_color = self.background_color) if self.title is not None: text = goocanvas.Text(parent = self.drawables, text = self.title, x = self.border * 1.5, y = self.border * 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()