Viewer.py
changeset 140 06d28f03f6f4
parent 138 9c74d00ce93e
child 144 b67a5de5a24a
--- a/Viewer.py	Mon Dec 31 13:36:11 2007 +0100
+++ b/Viewer.py	Wed Jan 02 18:15:31 2008 +0100
@@ -294,6 +294,7 @@
         self.Bind(wx.EVT_LEFT_UP, self.OnViewerLeftUp)
         self.Bind(wx.EVT_LEFT_DCLICK, self.OnViewerLeftDClick)
         self.Bind(wx.EVT_RIGHT_UP, self.OnViewerRightUp)
+        self.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeaveViewer)
         self.Bind(wx.EVT_MOTION, self.OnViewerMotion)
         self.Bind(wx.EVT_CHAR, self.OnChar)
         if wx.VERSION < (2, 7, 0):
@@ -389,6 +390,7 @@
         self.Wires = {}
         self.Comments = {}
         self.SelectedElement = None
+        self.HighlightedElement = None
     
     # Remove all elements
     def CleanView(self):
@@ -1147,21 +1149,41 @@
         event.Skip()
     
     def OnViewerMotion(self, event):
+        refresh = False
+        dc = self.GetLogicalDC()
+        pos = GetScaledEventPosition(event, dc, self.Scaling)
+        if not event.Dragging():
+            highlighted = self.FindElement(pos) 
+            if self.HighlightedElement is not None and self.HighlightedElement != highlighted:
+                self.HighlightedElement.SetHighlighted(False)
+                self.HighlightedElement = None
+                refresh = True
+            if highlighted is not None:
+                highlighted.SetHighlighted(True)
+                refresh = True
+            self.HighlightedElement = highlighted
         if self.rubberBand.IsShown():
-            self.rubberBand.OnMotion(event, self.GetLogicalDC(), self.Scaling)
+            self.rubberBand.OnMotion(event, dc, self.Scaling)
         elif self.Mode == MODE_SELECTION and self.SelectedElement:
             if self.DrawingWire:
-                dc = self.GetLogicalDC()
-                pos = GetScaledEventPosition(event, dc, self.Scaling)
                 connector = self.FindBlockConnector(pos, False)
                 if not connector or self.SelectedElement.EndConnected == None:
                     self.SelectedElement.ResetPoints()
                     self.SelectedElement.OnMotion(event, dc, self.Scaling)
                     self.SelectedElement.GeneratePoints()
-                    self.Refresh(False)
-            elif self.SelectedElement.OnMotion(event, self.GetLogicalDC(), self.Scaling):
-                self.Refresh(False)
+                    refresh = True
+            elif self.SelectedElement.OnMotion(event, dc, self.Scaling):
+                refresh = True
         self.UpdateScrollPos(event)
+        if refresh:
+            self.Refresh(False)
+        event.Skip()
+
+    def OnLeaveViewer(self, event):
+        if self.HighlightedElement is not None:
+            self.HighlightedElement.SetHighlighted(False)
+            self.HighlightedElement = None
+            self.Refresh(False)
         event.Skip()
 
     def UpdateScrollPos(self, event):
@@ -2133,6 +2155,16 @@
                 dc.DrawLine(i * self.Scaling[0], 0, i * self.Scaling[0], height)
             for i in xrange(1, height / self.Scaling[1] + 1):
                 dc.DrawLine(0, i * self.Scaling[1], width, i * self.Scaling[1])
+        
+        # Draw highlighted elements
+        for comment in self.Comments:
+            comment.DrawHighlightment(dc)
+        for wire in self.Wires:
+            wire.DrawHighlightment(dc)
+        for block in self.Blocks:
+            block.DrawHighlightment(dc)
+        
+        # Draw all elements
         for comment in self.Comments:
             if comment != self.SelectedElement:
                 comment.Draw(dc)
@@ -2144,6 +2176,7 @@
                 block.Draw(dc)
         if self.SelectedElement:
             self.SelectedElement.Draw(dc)
+        
         if self.rubberBand.IsShown():
             self.rubberBand.Draw(dc)
         dc.EndDrawing()