Viewer.py
changeset 633 3536f4469cde
parent 625 b7062a7018ec
child 634 cc3335911c01
--- a/Viewer.py	Wed Jan 25 01:26:29 2012 +0100
+++ b/Viewer.py	Mon Jan 30 16:12:19 2012 +0100
@@ -539,6 +539,7 @@
         self.Editor.Bind(wx.EVT_SCROLLWIN_THUMBRELEASE, self.OnScrollStop)
         self.Editor.Bind(wx.EVT_MOUSEWHEEL, self.OnMouseWheelWindow)
         self.Editor.Bind(wx.EVT_SIZE, self.OnMoveWindow)
+        self.Editor.Bind(wx.EVT_MOUSE_EVENTS, self.OnViewerMouseEvent)
     
     def __del__(self):
         DebugViewer.__del__(self)
@@ -621,6 +622,9 @@
     def GetScale(self):
         return self.CurrentScale
 
+    def GetViewScale(self):
+        return self.ViewScale
+
     def GetLogicalDC(self, buffered=False):
         if buffered:
             bitmap = wx.EmptyBitmap(*self.Editor.GetClientSize())
@@ -781,6 +785,7 @@
         self.Subscribed = {}
         self.SelectedElement = None
         self.HighlightedElement = None
+        self.ToolTipElement = None
     
     def Flush(self):
         self.DeleteDataConsumers()
@@ -1130,14 +1135,14 @@
                 return wire
         return None
     
-    def FindElement(self, event, exclude_group = False):
+    def FindElement(self, event, exclude_group = False, connectors = True):
         dc = self.GetLogicalDC()
         pos = event.GetLogicalPosition(dc)
         if self.SelectedElement and not (exclude_group and isinstance(self.SelectedElement, Graphic_Group)):
-            if self.SelectedElement.HitTest(pos) or self.SelectedElement.TestHandle(event) != (0, 0):
+            if self.SelectedElement.HitTest(pos, connectors) or self.SelectedElement.TestHandle(event) != (0, 0):
                 return self.SelectedElement
         for element in self.GetElements():
-            if element.HitTest(pos) or element.TestHandle(event) != (0, 0):
+            if element.HitTest(pos, connectors) or element.TestHandle(event) != (0, 0):
                 return element
         return None
     
@@ -1400,6 +1405,21 @@
 #                          Mouse event functions
 #-------------------------------------------------------------------------------
 
+    def OnViewerMouseEvent(self, event):
+        if not event.Entering():
+            element = None
+            if not event.Leaving():
+                element = self.FindElement(event, True, False)
+            if self.ToolTipElement is not None:
+                self.ToolTipElement.ClearToolTip()
+            self.ToolTipElement = element
+            if self.ToolTipElement is not None:
+                tooltip_pos = self.Editor.ClientToScreen(event.GetPosition())
+                tooltip_pos.x += 10
+                tooltip_pos.y += 10
+                self.ToolTipElement.CreateToolTip(tooltip_pos)
+        event.Skip()
+
     def OnViewerLeftDown(self, event):
         if self.Mode == MODE_SELECTION:
             dc = self.GetLogicalDC()
@@ -1466,8 +1486,11 @@
                     if self.SelectedElement is not None:
                         self.SelectedElement.SetSelected(False)
                     self.SelectedElement = wire
+                    if self.HighlightedElement is not None:
+                        self.HighlightedElement.SetHighlighted(False)
+                    self.HighlightedElement = wire
                     self.RefreshVisibleElements()
-                    self.SelectedElement.Refresh()
+                    self.SelectedElement.SetHighlighted(True)
                 else:
                     if self.SelectedElement is not None and self.SelectedElement != element:
                         self.SelectedElement.SetSelected(False)
@@ -1556,12 +1579,8 @@
                     self.SelectedElement.OnMotion(event, dc, self.Scaling)
                     self.SelectedElement.GeneratePoints()
                     self.SelectedElement.RefreshModel()
-                    if self.HighlightedElement is not None:
-                        self.HighlightedElement.SetHighlighted(False)
-                        self.HighlightedElement = None
-                    self.SelectedElement.SetHighlighted(True)
-                    self.HighlightedElement = self.SelectedElement
                     self.SelectedElement.SetSelected(True)
+                    self.SelectedElement.HighlightPoint(pos)
                     self.RefreshBuffer()
                 elif connector is None or self.SelectedElement.GetDragging():
                     self.DrawingWire = False
@@ -1666,20 +1685,15 @@
                 self.RefreshVisibleElements()
         else:
             if not event.Dragging():
-                highlighted = self.FindElement(event) 
+                highlighted = self.FindElement(event, connectors=False) 
                 if self.HighlightedElement is not None and self.HighlightedElement != highlighted:
-                    self.HighlightedElement.ClearToolTip()
                     self.HighlightedElement.SetHighlighted(False)
                     self.HighlightedElement = None
                 if highlighted is not None:
-                    tooltip_pos = self.Editor.ClientToScreen(event.GetPosition())
-                    tooltip_pos.x += 10
-                    tooltip_pos.y += 10
+                    if isinstance(highlighted, (Wire, Graphic_Group)):
+                        highlighted.HighlightPoint(pos)
                     if self.HighlightedElement != highlighted:
-                        highlighted.CreateToolTip(tooltip_pos)
                         highlighted.SetHighlighted(True)
-                    else:
-                        highlighted.MoveToolTip(tooltip_pos)
                 self.HighlightedElement = highlighted
             if self.rubberBand.IsShown():
                 self.rubberBand.OnMotion(event, dc, self.Scaling)
@@ -1692,6 +1706,8 @@
                         self.SelectedElement.GeneratePoints()
                         if movex != 0 or movey != 0:
                             self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(movex, movey)), False)
+                    else:
+                        self.SelectedElement.HighlightPoint(pos)
                 else:
                     movex, movey = self.SelectedElement.OnMotion(event, dc, self.Scaling)
                     if movex != 0 or movey != 0:
@@ -1703,8 +1719,6 @@
                     if iec_path is not None:
                         self.StartMousePos = None
                         if self.HighlightedElement is not None:
-                            if isinstance(self.HighlightedElement, Wire):
-                                self.HighlightedElement.ClearToolTip()
                             self.HighlightedElement.SetHighlighted(False)
                             self.HighlightedElement = None
                         data = wx.TextDataObject(str((iec_path, "debug")))
@@ -1720,7 +1734,6 @@
         if self.SelectedElement is not None and self.SelectedElement.GetDragging():
             event.Skip()
         elif self.HighlightedElement is not None:
-            self.HighlightedElement.ClearToolTip()
             self.HighlightedElement.SetHighlighted(False)
             self.HighlightedElement = None
         event.Skip()