All pastes #431296 Raw Edit

rcaskey

public text v1 · immutable
·published 2007-04-09 15:56 UTC
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.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)		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()