27 from math import * |
27 from math import * |
28 from types import * |
28 from types import * |
29 import datetime |
29 import datetime |
30 from threading import Lock,Timer |
30 from threading import Lock,Timer |
31 |
31 |
32 from controls.CustomToolTip import CustomToolTip, TOOLTIP_WAIT_PERIOD |
32 from graphics.ToolTipProducer import ToolTipProducer |
33 |
33 |
34 #------------------------------------------------------------------------------- |
34 #------------------------------------------------------------------------------- |
35 # Common constants |
35 # Common constants |
36 #------------------------------------------------------------------------------- |
36 #------------------------------------------------------------------------------- |
37 |
37 |
592 |
592 |
593 """ |
593 """ |
594 Class that implements a generic graphic element |
594 Class that implements a generic graphic element |
595 """ |
595 """ |
596 |
596 |
597 class Graphic_Element: |
597 class Graphic_Element(ToolTipProducer): |
598 |
598 |
599 # Create a new graphic element |
599 # Create a new graphic element |
600 def __init__(self, parent, id = None): |
600 def __init__(self, parent, id = None): |
|
601 ToolTipProducer.__init__(self, parent) |
601 self.Parent = parent |
602 self.Parent = parent |
602 self.Id = id |
603 self.Id = id |
603 self.oldPos = None |
604 self.oldPos = None |
604 self.StartPos = None |
605 self.StartPos = None |
605 self.CurrentDrag = None |
606 self.CurrentDrag = None |
609 self.Highlighted = False |
610 self.Highlighted = False |
610 self.Pos = wx.Point(0, 0) |
611 self.Pos = wx.Point(0, 0) |
611 self.Size = wx.Size(0, 0) |
612 self.Size = wx.Size(0, 0) |
612 self.BoundingBox = wx.Rect(0, 0, 0, 0) |
613 self.BoundingBox = wx.Rect(0, 0, 0, 0) |
613 self.Visible = False |
614 self.Visible = False |
614 self.ToolTip = None |
|
615 self.ToolTipPos = None |
|
616 self.ToolTipTimer = wx.Timer(self.Parent, -1) |
|
617 self.Parent.Bind(wx.EVT_TIMER, self.OnToolTipTimer, self.ToolTipTimer) |
|
618 |
|
619 def __del__(self): |
|
620 self.ToolTipTimer.Stop() |
|
621 |
615 |
622 def GetDefinition(self): |
616 def GetDefinition(self): |
623 return [self.Id], [] |
617 return [self.Id], [] |
624 |
618 |
625 def TestVisible(self, screen): |
619 def TestVisible(self, screen): |
988 movey = self.StartPos.y + self.CurrentDrag.y - self.Pos.y |
982 movey = self.StartPos.y + self.CurrentDrag.y - self.Pos.y |
989 self.Move(movex, movey) |
983 self.Move(movex, movey) |
990 return movex, movey |
984 return movex, movey |
991 return 0, 0 |
985 return 0, 0 |
992 |
986 |
993 def OnToolTipTimer(self, event): |
|
994 value = self.GetToolTipValue() |
|
995 if value is not None and self.ToolTipPos is not None: |
|
996 self.ToolTip = CustomToolTip(self.Parent, value) |
|
997 self.ToolTip.MoveToolTip(self.ToolTipPos) |
|
998 self.ToolTip.Show() |
|
999 |
|
1000 def GetToolTipValue(self): |
|
1001 return None |
|
1002 |
|
1003 def CreateToolTip(self, pos): |
|
1004 value = self.GetToolTipValue() |
|
1005 if value is not None: |
|
1006 self.ToolTipPos = pos |
|
1007 self.ToolTipTimer.Start(int(TOOLTIP_WAIT_PERIOD * 1000), oneShot=True) |
|
1008 |
|
1009 def MoveToolTip(self, pos): |
|
1010 if self.ToolTip is not None: |
|
1011 self.ToolTip.MoveToolTip(pos) |
|
1012 elif self.ToolTipPos is not None: |
|
1013 self.ToolTipPos = pos |
|
1014 self.ToolTipTimer.Start(int(TOOLTIP_WAIT_PERIOD * 1000), oneShot=True) |
|
1015 |
|
1016 def ClearToolTip(self): |
|
1017 self.ToolTipTimer.Stop() |
|
1018 self.ToolTipPos = None |
|
1019 if self.ToolTip is not None: |
|
1020 self.ToolTip.Destroy() |
|
1021 self.ToolTip = None |
|
1022 |
|
1023 # Override this method for defining the method to call for adding an highlight to this element |
987 # Override this method for defining the method to call for adding an highlight to this element |
1024 def AddHighlight(self, infos, start, end, highlight_type): |
988 def AddHighlight(self, infos, start, end, highlight_type): |
1025 pass |
989 pass |
1026 |
990 |
1027 # Override this method for defining the method to call for removing an highlight from this element |
991 # Override this method for defining the method to call for removing an highlight from this element |
1398 |
1362 |
1399 """ |
1363 """ |
1400 Class that implements a connector for any type of block |
1364 Class that implements a connector for any type of block |
1401 """ |
1365 """ |
1402 |
1366 |
1403 class Connector(DebugDataConsumer): |
1367 class Connector(DebugDataConsumer, ToolTipProducer): |
1404 |
1368 |
1405 # Create a new connector |
1369 # Create a new connector |
1406 def __init__(self, parent, name, type, position, direction, negated = False, edge = "none", onlyone = False): |
1370 def __init__(self, parent, name, type, position, direction, negated = False, edge = "none", onlyone = False): |
1407 DebugDataConsumer.__init__(self) |
1371 DebugDataConsumer.__init__(self) |
|
1372 ToolTipProducer.__init__(self, parent.Parent) |
1408 self.ParentBlock = parent |
1373 self.ParentBlock = parent |
1409 self.Name = name |
1374 self.Name = name |
1410 self.Type = type |
1375 self.Type = type |
1411 self.Pos = position |
1376 self.Pos = position |
1412 self.Direction = direction |
1377 self.Direction = direction |
1524 def SetForced(self, forced): |
1489 def SetForced(self, forced): |
1525 if self.Forced != forced: |
1490 if self.Forced != forced: |
1526 self.Forced = forced |
1491 self.Forced = forced |
1527 if self.Visible: |
1492 if self.Visible: |
1528 self.Parent.ElementNeedRefresh(self) |
1493 self.Parent.ElementNeedRefresh(self) |
1529 |
1494 |
|
1495 def GetComputedValue(self): |
|
1496 if self.Value is not None and self.Value != "undefined" and not isinstance(self.Value, BooleanType): |
|
1497 wire_type = self.GetType() |
|
1498 if wire_type == "STRING": |
|
1499 return "'%s'"%self.Value |
|
1500 elif wire_type == "WSTRING": |
|
1501 return "\"%s\""%self.Value |
|
1502 else: |
|
1503 return str(self.Value) |
|
1504 return None |
|
1505 |
|
1506 def GetToolTipValue(self): |
|
1507 return self.GetComputedValue() |
|
1508 |
1530 def SetValue(self, value): |
1509 def SetValue(self, value): |
1531 if self.Value != value: |
1510 if self.Value != value: |
1532 self.Value = value |
1511 self.Value = value |
1533 if value is not None and not isinstance(value, BooleanType): |
1512 computed_value = self.GetComputedValue() |
1534 connector_type = self.GetType() |
1513 if computed_value is not None: |
1535 if connector_type == "STRING": |
1514 self.ComputedValue = computed_value |
1536 self.ComputedValue = "'%s'"%value |
1515 self.SetToolTipText(self.ComputedValue) |
1537 elif connector_type == "WSTRING": |
|
1538 self.ComputedValue = "\"%s\""%value |
|
1539 else: |
|
1540 self.ComputedValue = str(value) |
|
1541 #if self.ToolTip is not None: |
|
1542 # self.ToolTip.SetTip(self.ComputedValue) |
|
1543 if len(self.ComputedValue) > 4: |
1516 if len(self.ComputedValue) > 4: |
1544 self.ComputedValue = self.ComputedValue[:4] + "..." |
1517 self.ComputedValue = self.ComputedValue[:4] + "..." |
1545 self.ValueSize = None |
1518 self.ValueSize = None |
1546 if self.ParentBlock.Visible: |
1519 if self.ParentBlock.Visible: |
1547 self.ParentBlock.Parent.ElementNeedRefresh(self) |
1520 self.ParentBlock.Parent.ElementNeedRefresh(self) |
1943 |
1916 |
1944 def Flush(self): |
1917 def Flush(self): |
1945 self.StartConnected = None |
1918 self.StartConnected = None |
1946 self.EndConnected = None |
1919 self.EndConnected = None |
1947 |
1920 |
1948 def GetToolTipValue(self): |
|
1949 if self.Value is not None and self.Value != "undefined" and not isinstance(self.Value, BooleanType): |
|
1950 wire_type = self.GetEndConnectedType() |
|
1951 if wire_type == "STRING": |
|
1952 return "'%s'"%self.Value |
|
1953 elif wire_type == "WSTRING": |
|
1954 return "\"%s\""%self.Value |
|
1955 else: |
|
1956 return str(self.Value) |
|
1957 return None |
|
1958 |
|
1959 # Returns the RedrawRect |
1921 # Returns the RedrawRect |
1960 def GetRedrawRect(self, movex = 0, movey = 0): |
1922 def GetRedrawRect(self, movex = 0, movey = 0): |
1961 rect = Graphic_Element.GetRedrawRect(self, movex, movey) |
1923 rect = Graphic_Element.GetRedrawRect(self, movex, movey) |
1962 if self.StartConnected: |
1924 if self.StartConnected: |
1963 rect = rect.Union(self.StartConnected.GetRedrawRect(movex, movey)) |
1925 rect = rect.Union(self.StartConnected.GetRedrawRect(movex, movey)) |
2111 if self.EndConnected: |
2073 if self.EndConnected: |
2112 self.EndConnected.RefreshForced() |
2074 self.EndConnected.RefreshForced() |
2113 if self.Visible: |
2075 if self.Visible: |
2114 self.Parent.ElementNeedRefresh(self) |
2076 self.Parent.ElementNeedRefresh(self) |
2115 |
2077 |
|
2078 def GetComputedValue(self): |
|
2079 if self.Value is not None and self.Value != "undefined" and not isinstance(self.Value, BooleanType): |
|
2080 wire_type = self.GetEndConnectedType() |
|
2081 if wire_type == "STRING": |
|
2082 return "'%s'"%self.Value |
|
2083 elif wire_type == "WSTRING": |
|
2084 return "\"%s\""%self.Value |
|
2085 else: |
|
2086 return str(self.Value) |
|
2087 return None |
|
2088 |
|
2089 def GetToolTipValue(self): |
|
2090 return self.GetComputedValue() |
|
2091 |
2116 def SetValue(self, value): |
2092 def SetValue(self, value): |
2117 if self.Value != value: |
2093 if self.Value != value: |
2118 self.Value = value |
2094 self.Value = value |
2119 if value is not None and not isinstance(value, BooleanType): |
2095 computed_value = self.GetComputedValue() |
2120 wire_type = self.GetEndConnectedType() |
2096 if computed_value is not None: |
2121 if wire_type == "STRING": |
2097 self.ComputedValue = computed_value |
2122 self.ComputedValue = "'%s'"%value |
2098 self.SetToolTipText(self.ComputedValue) |
2123 elif wire_type == "WSTRING": |
|
2124 self.ComputedValue = "\"%s\""%value |
|
2125 else: |
|
2126 self.ComputedValue = str(value) |
|
2127 if self.ToolTip is not None: |
|
2128 self.ToolTip.SetTip(self.ComputedValue) |
|
2129 if len(self.ComputedValue) > 4: |
2099 if len(self.ComputedValue) > 4: |
2130 self.ComputedValue = self.ComputedValue[:4] + "..." |
2100 self.ComputedValue = self.ComputedValue[:4] + "..." |
2131 self.ValueSize = None |
2101 self.ValueSize = None |
2132 if self.StartConnected: |
2102 if self.StartConnected: |
2133 self.StartConnected.RefreshValue() |
2103 self.StartConnected.RefreshValue() |