Browse code

Separate widget from window.

Jose.R.Fonseca authored on 03/01/2008 12:38:01
Showing 1 changed files

  • xdot.py index f67344b..cb05b5a 100644
... ...
@@ -470,83 +470,29 @@ class XDotParser:
470 470
 		return x, y
471 471
 
472 472
 
473
-class DotWindow(gtk.Window):
474
-
475
-	# TODO: Make a seperate, reusable widget
476
-
477
-	ui = '''
478
-	<ui>
479
-		<toolbar name="ToolBar">
480
-			<toolitem action="ZoomIn"/>
481
-			<toolitem action="ZoomOut"/>
482
-			<toolitem action="ZoomFit"/>
483
-			<toolitem action="Zoom100"/>
484
-		</toolbar>
485
-	</ui>
486
-	'''
473
+class DotWidget(gtk.DrawingArea):
487 474
 
488 475
 	def __init__(self):
489
-		gtk.Window.__init__(self)
476
+		gtk.DrawingArea.__init__(self)
490 477
 
491 478
 		self.graph = Graph()
492 479
 
493
-		window = self
480
+		self.connect("expose_event", self.on_expose)
494 481
 
495
-		window.set_title('Dot')
496
-		window.set_default_size(512, 512)
497
-		vbox = gtk.VBox()
498
-		window.add(vbox)
499
-
500
-		# Create a UIManager instance
501
-		uimanager = self.uimanager = gtk.UIManager()
482
+		self.set_flags(gtk.CAN_FOCUS)
502 483
 
503
-		# Add the accelerator group to the toplevel window
504
-		accelgroup = uimanager.get_accel_group()
505
-		window.add_accel_group(accelgroup)
506
-
507
-		# Create an ActionGroup
508
-		actiongroup = gtk.ActionGroup('Actions')
509
-		self.actiongroup = actiongroup
510
-
511
-		# Create actions
512
-		actiongroup.add_actions((
513
-			('ZoomIn', gtk.STOCK_ZOOM_IN, None, None, None, self.on_zoom_in),
514
-			('ZoomOut', gtk.STOCK_ZOOM_OUT, None, None, None, self.on_zoom_out),
515
-			('ZoomFit', gtk.STOCK_ZOOM_FIT, None, None, None, self.on_zoom_fit),
516
-			('Zoom100', gtk.STOCK_ZOOM_100, None, None, None, self.on_zoom_100),
517
-		))
518
-
519
-		# Add the actiongroup to the uimanager
520
-		uimanager.insert_action_group(actiongroup, 0)
521
-
522
-		# Add a UI description
523
-		uimanager.add_ui_from_string(self.ui)
524
-
525
-		# Create a Toolbar
526
-		toolbar = uimanager.get_widget('/ToolBar')
527
-		vbox.pack_start(toolbar, False)
528
-
529
-		self.area = gtk.DrawingArea()
530
-		self.area.connect("expose_event", self.on_expose)
531
-		vbox.pack_start(self.area)
532
-
533
-		self.area.set_flags(gtk.CAN_FOCUS)
534
-		self.set_focus(self.area)
535
-
536
-		self.area.add_events(gtk.gdk.BUTTON_PRESS_MASK | gtk.gdk.BUTTON_RELEASE_MASK)
537
-		self.area.connect("button-press-event", self.on_area_button_press)
538
-		self.area.connect("button-release-event", self.on_area_button_release)
539
-		self.area.add_events(gtk.gdk.POINTER_MOTION_MASK | gtk.gdk.POINTER_MOTION_HINT_MASK | gtk.gdk.BUTTON_RELEASE_MASK)
540
-		self.area.connect("motion-notify-event", self.on_area_motion_notify)
541
-		self.area.connect("scroll-event", self.on_area_scroll_event)
484
+		self.add_events(gtk.gdk.BUTTON_PRESS_MASK | gtk.gdk.BUTTON_RELEASE_MASK)
485
+		self.connect("button-press-event", self.on_area_button_press)
486
+		self.connect("button-release-event", self.on_area_button_release)
487
+		self.add_events(gtk.gdk.POINTER_MOTION_MASK | gtk.gdk.POINTER_MOTION_HINT_MASK | gtk.gdk.BUTTON_RELEASE_MASK)
488
+		self.connect("motion-notify-event", self.on_area_motion_notify)
489
+		self.connect("scroll-event", self.on_area_scroll_event)
542 490
 
543 491
 		self.connect('key-press-event', self.on_key_press_event)
544 492
 
545 493
 		self.x, self.y = 0.0, 0.0
546 494
 		self.zoom_ratio = 1.0
547 495
 
548
-		self.show_all()
549
-
550 496
 	def set_dotcode(self, dotcode):
551 497
 		p = subprocess.Popen(
552 498
 			['dot', '-Txdot'],
... ...
@@ -577,7 +523,7 @@ class DotWindow(gtk.Window):
577 523
 		cr.set_source_rgba(1.0, 1.0, 1.0, 1.0)
578 524
 		cr.paint()
579 525
 
580
-		rect = self.area.get_allocation()
526
+		rect = self.get_allocation()
581 527
 		cr.translate(0.5*rect.width, 0.5*rect.height)
582 528
 		cr.scale(self.zoom_ratio, self.zoom_ratio)
583 529
 		cr.translate(-self.x, -self.y)
... ...
@@ -592,14 +538,14 @@ class DotWindow(gtk.Window):
592 538
 	def set_current_pos(self, x, y):
593 539
 		self.x = x
594 540
 		self.y = y
595
-		self.area.queue_draw()
541
+		self.queue_draw()
596 542
 
597 543
 	def zoom_image(self, zoom_ratio, center=False):
598 544
 		if center:
599 545
 			self.x = self.graph.width/2
600 546
 			self.y = self.graph.height/2
601 547
 		self.zoom_ratio = zoom_ratio
602
-		self.area.queue_draw()
548
+		self.queue_draw()
603 549
 
604 550
 	ZOOM_INCREMENT = 1.25
605 551
 
... ...
@@ -610,7 +556,7 @@ class DotWindow(gtk.Window):
610 556
 		self.zoom_image(self.zoom_ratio / self.ZOOM_INCREMENT)
611 557
 
612 558
 	def on_zoom_fit(self, action):
613
-		rect = self.area.get_allocation()
559
+		rect = self.get_allocation()
614 560
 		zoom_ratio = min(
615 561
 			float(rect.width)/float(self.graph.width),
616 562
 			float(rect.height)/float(self.graph.height)
... ...
@@ -625,27 +571,27 @@ class DotWindow(gtk.Window):
625 571
 	def on_key_press_event(self, widget, event):
626 572
 		if event.keyval == gtk.keysyms.Left:
627 573
 			self.x -= self.POS_INCREMENT/self.zoom_ratio
628
-			self.area.queue_draw()
574
+			self.queue_draw()
629 575
 			return True
630 576
 		if event.keyval == gtk.keysyms.Right:
631 577
 			self.x += self.POS_INCREMENT/self.zoom_ratio
632
-			self.area.queue_draw()
578
+			self.queue_draw()
633 579
 			return True
634 580
 		if event.keyval == gtk.keysyms.Up:
635 581
 			self.y -= self.POS_INCREMENT/self.zoom_ratio
636
-			self.area.queue_draw()
582
+			self.queue_draw()
637 583
 			return True
638 584
 		if event.keyval == gtk.keysyms.Down:
639 585
 			self.y += self.POS_INCREMENT/self.zoom_ratio
640
-			self.area.queue_draw()
586
+			self.queue_draw()
641 587
 			return True
642 588
 		if event.keyval == gtk.keysyms.Page_Up:
643 589
 			self.zoom_image(self.zoom_ratio * self.ZOOM_INCREMENT)
644
-			self.area.queue_draw()
590
+			self.queue_draw()
645 591
 			return True
646 592
 		if event.keyval == gtk.keysyms.Page_Down:
647 593
 			self.zoom_image(self.zoom_ratio / self.ZOOM_INCREMENT)
648
-			self.area.queue_draw()
594
+			self.queue_draw()
649 595
 			return True
650 596
 		return False
651 597
 
... ...
@@ -689,7 +635,7 @@ class DotWindow(gtk.Window):
689 635
 			# pan the image
690 636
 			self.x += (self.prevmousex - x)/self.zoom_ratio
691 637
 			self.y += (self.prevmousey - y)/self.zoom_ratio
692
-			self.area.queue_draw()
638
+			self.queue_draw()
693 639
 			self.prevmousex = x
694 640
 			self.prevmousey = y
695 641
 		else:
... ...
@@ -702,7 +648,7 @@ class DotWindow(gtk.Window):
702 648
 		return True
703 649
 
704 650
 	def get_url(self, x, y):
705
-		rect = self.area.get_allocation()
651
+		rect = self.get_allocation()
706 652
 		x -= 0.5*rect.width
707 653
 		y -= 0.5*rect.height
708 654
 		x /= self.zoom_ratio
... ...
@@ -716,6 +662,77 @@ class DotWindow(gtk.Window):
716 662
 		return False
717 663
 
718 664
 
665
+class DotWindow(gtk.Window):
666
+
667
+	ui = '''
668
+	<ui>
669
+		<toolbar name="ToolBar">
670
+			<toolitem action="ZoomIn"/>
671
+			<toolitem action="ZoomOut"/>
672
+			<toolitem action="ZoomFit"/>
673
+			<toolitem action="Zoom100"/>
674
+		</toolbar>
675
+	</ui>
676
+	'''
677
+
678
+	def __init__(self):
679
+		gtk.Window.__init__(self)
680
+
681
+		self.graph = Graph()
682
+
683
+		window = self
684
+
685
+		window.set_title('Dot')
686
+		window.set_default_size(512, 512)
687
+		vbox = gtk.VBox()
688
+		window.add(vbox)
689
+
690
+		self.widget = DotWidget()
691
+
692
+		# Create a UIManager instance
693
+		uimanager = self.uimanager = gtk.UIManager()
694
+
695
+		# Add the accelerator group to the toplevel window
696
+		accelgroup = uimanager.get_accel_group()
697
+		window.add_accel_group(accelgroup)
698
+
699
+		# Create an ActionGroup
700
+		actiongroup = gtk.ActionGroup('Actions')
701
+		self.actiongroup = actiongroup
702
+
703
+		# Create actions
704
+		actiongroup.add_actions((
705
+			('ZoomIn', gtk.STOCK_ZOOM_IN, None, None, None, self.widget.on_zoom_in),
706
+			('ZoomOut', gtk.STOCK_ZOOM_OUT, None, None, None, self.widget.on_zoom_out),
707
+			('ZoomFit', gtk.STOCK_ZOOM_FIT, None, None, None, self.widget.on_zoom_fit),
708
+			('Zoom100', gtk.STOCK_ZOOM_100, None, None, None, self.widget.on_zoom_100),
709
+		))
710
+
711
+		# Add the actiongroup to the uimanager
712
+		uimanager.insert_action_group(actiongroup, 0)
713
+
714
+		# Add a UI description
715
+		uimanager.add_ui_from_string(self.ui)
716
+
717
+		# Create a Toolbar
718
+		toolbar = uimanager.get_widget('/ToolBar')
719
+		vbox.pack_start(toolbar, False)
720
+
721
+		vbox.pack_start(self.widget)
722
+
723
+		self.set_focus(self.widget)
724
+
725
+		self.widget.on_url_clicked = self.on_url_clicked
726
+
727
+		self.show_all()
728
+
729
+	def set_dotcode(self, dotcode):
730
+		self.widget.set_dotcode(dotcode)
731
+
732
+	def on_url_clicked(self, url, event):
733
+		return False
734
+
735
+
719 736
 def main():
720 737
 	import optparse
721 738