controls/DebugVariablePanel.py
changeset 945 c1159acb0886
parent 943 da7f80e04a54
child 946 9343740603f5
equal deleted inserted replaced
944:52a17be9c4d1 945:c1159acb0886
   333                 self.ParentWindow.InsertValue(values[0], row, force=True)
   333                 self.ParentWindow.InsertValue(values[0], row, force=True)
   334             elif self.ParentControl is not None:
   334             elif self.ParentControl is not None:
   335                 width, height = self.ParentControl.GetSize()
   335                 width, height = self.ParentControl.GetSize()
   336                 target_idx = self.ParentControl.GetIndex()
   336                 target_idx = self.ParentControl.GetIndex()
   337                 merge_type = GRAPH_PARALLEL
   337                 merge_type = GRAPH_PARALLEL
   338                 if self.ParentControl.Is3DCanvas():
   338                 if isinstance(self.ParentControl, DebugVariableGraphic):
       
   339                     if self.ParentControl.Is3DCanvas():
       
   340                         if y > height / 2:
       
   341                             target_idx += 1
       
   342                         if len(values) > 1 and values[2] == "move":
       
   343                             self.ParentWindow.MoveValue(values[0], target_idx)
       
   344                         else:
       
   345                             self.ParentWindow.InsertValue(values[0], target_idx, force=True)
       
   346                         
       
   347                     else:
       
   348                         rect = self.ParentControl.GetAxesBoundingBox()
       
   349                         if rect.InsideXY(x, y):
       
   350                             merge_rect = wx.Rect(rect.x, rect.y, rect.width / 2., rect.height)
       
   351                             if merge_rect.InsideXY(x, y):
       
   352                                 merge_type = GRAPH_ORTHOGONAL
       
   353                             wx.CallAfter(self.ParentWindow.MergeGraphs, values[0], target_idx, merge_type, force=True)
       
   354                         else:
       
   355                             if y > height / 2:
       
   356                                 target_idx += 1
       
   357                             if len(values) > 1 and values[2] == "move":
       
   358                                 self.ParentWindow.MoveValue(values[0], target_idx)
       
   359                             else:
       
   360                                 self.ParentWindow.InsertValue(values[0], target_idx, force=True)
       
   361                 else:
   339                     if y > height / 2:
   362                     if y > height / 2:
   340                         target_idx += 1
   363                         target_idx += 1
   341                     self.ParentWindow.InsertValue(values[0], target_idx, force=True)
   364                     if len(values) > 1 and values[2] == "move":
   342                 else:
   365                         self.ParentWindow.MoveValue(values[0], target_idx)
   343                     rect = self.ParentControl.GetAxesBoundingBox()
       
   344                     if rect.InsideXY(x, y):
       
   345                         merge_rect = wx.Rect(rect.x, rect.y, rect.width / 2., rect.height)
       
   346                         if merge_rect.InsideXY(x, y):
       
   347                             merge_type = GRAPH_ORTHOGONAL
       
   348                         wx.CallAfter(self.ParentWindow.MergeGraphs, values[0], target_idx, merge_type, force=True)
       
   349                     else:
   366                     else:
   350                         if y > height / 2:
       
   351                             target_idx += 1
       
   352                         self.ParentWindow.InsertValue(values[0], target_idx, force=True)
   367                         self.ParentWindow.InsertValue(values[0], target_idx, force=True)
   353             self.ParentWindow.InsertValue(values[0], force=True)
   368                     
       
   369             elif len(values) > 1 and values[2] == "move":
       
   370                 self.ParentWindow.MoveValue(values[0])
       
   371             else:
       
   372                 self.ParentWindow.InsertValue(values[0], force=True)
   354     
   373     
   355     def OnLeave(self):
   374     def OnLeave(self):
   356         self.ParentWindow.ResetHighlight()
   375         self.ParentWindow.ResetHighlight()
   357         return wx.TextDropTarget.OnLeave(self)
   376         return wx.TextDropTarget.OnLeave(self)
   358     
   377     
   376     
   395     
   377     GRAPH_PARALLEL, GRAPH_ORTHOGONAL = range(2)
   396     GRAPH_PARALLEL, GRAPH_ORTHOGONAL = range(2)
   378     
   397     
   379     SCROLLBAR_UNIT = 10
   398     SCROLLBAR_UNIT = 10
   380     
   399     
       
   400     #CANVAS_HIGHLIGHT_TYPES
       
   401     [HIGHLIGHT_NONE,
       
   402      HIGHLIGHT_BEFORE,
       
   403      HIGHLIGHT_AFTER,
       
   404      HIGHLIGHT_LEFT,
       
   405      HIGHLIGHT_RIGHT,
       
   406      HIGHLIGHT_RESIZE] = range(6)
       
   407     
       
   408     HIGHLIGHT_DROP_PEN = wx.Pen(wx.Colour(0, 128, 255))
       
   409     HIGHLIGHT_DROP_BRUSH = wx.Brush(wx.Colour(0, 128, 255, 128))
       
   410     HIGHLIGHT_RESIZE_PEN = wx.Pen(wx.Colour(200, 200, 200))
       
   411     HIGHLIGHT_RESIZE_BRUSH = wx.Brush(wx.Colour(200, 200, 200))
       
   412     
       
   413     #CANVAS_SIZE_TYPES
       
   414     [SIZE_MINI, SIZE_MIDDLE, SIZE_MAXI] = [0, 100, 200]
       
   415     
       
   416     DEFAULT_CANVAS_HEIGHT = 200.
       
   417     CANVAS_BORDER = (20., 10.)
       
   418     CANVAS_PADDING = 8.5
       
   419     VALUE_LABEL_HEIGHT = 17.
       
   420     AXES_LABEL_HEIGHT = 12.75
       
   421     
       
   422     def compute_mask(x, y):
       
   423         mask = []
       
   424         for xp, yp in zip(x, y):
       
   425             if xp == yp:
       
   426                 mask.append(xp)
       
   427             else:
       
   428                 mask.append("*")
       
   429         return mask
       
   430     
   381     def NextTick(variables):
   431     def NextTick(variables):
   382         next_tick = None
   432         next_tick = None
   383         for item, data in variables:
   433         for item, data in variables:
   384             if len(data) > 0:
   434             if len(data) > 0:
   385                 if next_tick is None:
   435                 if next_tick is None:
   396             range = max(1.0, max_value - min_value)
   446             range = max(1.0, max_value - min_value)
   397         else:
   447         else:
   398             center = 0.5
   448             center = 0.5
   399             range = 1.0
   449             range = 1.0
   400         return data, center - range * 0.55, center + range * 0.55
   450         return data, center - range * 0.55, center + range * 0.55
       
   451     
       
   452     class GraphButton():
       
   453         
       
   454         def __init__(self, x, y, bitmap, callback):
       
   455             self.Position = wx.Point(x, y)
       
   456             self.Bitmap = bitmap
       
   457             self.Shown = True
       
   458             self.Enabled = True
       
   459             self.Callback = callback
       
   460         
       
   461         def __del__(self):
       
   462             self.callback = None
       
   463         
       
   464         def GetSize(self):
       
   465             return self.Bitmap.GetSize()
       
   466         
       
   467         def SetPosition(self, x, y):
       
   468             self.Position = wx.Point(x, y)
       
   469         
       
   470         def Show(self):
       
   471             self.Shown = True
       
   472             
       
   473         def Hide(self):
       
   474             self.Shown = False
       
   475         
       
   476         def IsShown(self):
       
   477             return self.Shown
       
   478         
       
   479         def Enable(self):
       
   480             self.Enabled = True
       
   481         
       
   482         def Disable(self):
       
   483             self.Enabled = False
       
   484         
       
   485         def IsEnabled(self):
       
   486             return self.Enabled
       
   487         
       
   488         def HitTest(self, x, y):
       
   489             if self.Shown and self.Enabled:
       
   490                 w, h = self.Bitmap.GetSize()
       
   491                 rect = wx.Rect(self.Position.x, self.Position.y, w, h)
       
   492                 if rect.InsideXY(x, y):
       
   493                     return True
       
   494             return False
       
   495         
       
   496         def ProcessCallback(self):
       
   497             if self.Callback is not None:
       
   498                 wx.CallAfter(self.Callback)
       
   499                 
       
   500         def Draw(self, dc):
       
   501             if self.Shown and self.Enabled:
       
   502                 dc.DrawBitmap(self.Bitmap, self.Position.x, self.Position.y, True)
   401     
   503     
   402     class DebugVariableViewer:
   504     class DebugVariableViewer:
   403         
   505         
   404         def __init__(self, window, items=[]):
   506         def __init__(self, window, items=[]):
   405             self.ParentWindow = window
   507             self.ParentWindow = window
   611             DebugVariableViewer.__init__(self, window, items)
   713             DebugVariableViewer.__init__(self, window, items)
   612             
   714             
   613             wx.Panel.__init__(self, parent)
   715             wx.Panel.__init__(self, parent)
   614             self.SetBackgroundColour(wx.WHITE)
   716             self.SetBackgroundColour(wx.WHITE)
   615             self.SetDropTarget(DebugVariableDropTarget(window, self))
   717             self.SetDropTarget(DebugVariableDropTarget(window, self))
       
   718             self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown)
   616             self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp)
   719             self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp)
   617             self.Bind(wx.EVT_ENTER_WINDOW, self.OnEnter)
   720             self.Bind(wx.EVT_ENTER_WINDOW, self.OnEnter)
   618             self.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeave)
   721             self.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeave)
   619             self.Bind(wx.EVT_SIZE, self.OnResize)
   722             self.Bind(wx.EVT_SIZE, self.OnResize)
   620             self.Bind(wx.EVT_PAINT, self.OnPaint)
   723             self.Bind(wx.EVT_PAINT, self.OnPaint)
   640             
   743             
   641             gc = wx.GCDC(dc)
   744             gc = wx.GCDC(dc)
   642             
   745             
   643             item_name = self.Items[0].GetVariable(self.ParentWindow.GetVariableNameMask())
   746             item_name = self.Items[0].GetVariable(self.ParentWindow.GetVariableNameMask())
   644             w, h = gc.GetTextExtent(item_name)
   747             w, h = gc.GetTextExtent(item_name)
   645             gc.DrawText(item_name, 10, (height - h) / 2)
   748             gc.DrawText(item_name, 20, (height - h) / 2)
   646             
   749             
   647             if self.Items[0].IsForced():
   750             if self.Items[0].IsForced():
   648                 gc.SetTextForeground(wx.BLUE)
   751                 gc.SetTextForeground(wx.BLUE)
   649                 self.Buttons[0].Disable()
   752                 self.Buttons[0].Disable()
   650                 self.Buttons[1].Enable()
   753                 self.Buttons[1].Enable()
   659             
   762             
   660             self.DrawCommonElements(gc)
   763             self.DrawCommonElements(gc)
   661             
   764             
   662             gc.EndDrawing()
   765             gc.EndDrawing()
   663         
   766         
       
   767         def OnLeftDown(self, event):
       
   768             width, height = self.GetSize()
       
   769             item_name = self.Items[0].GetVariable(self.ParentWindow.GetVariableNameMask())
       
   770             w, h = self.GetTextExtent(item_name)
       
   771             x, y = event.GetPosition()
       
   772             rect = wx.Rect(20, (height - h) / 2, w, h)
       
   773             if rect.InsideXY(x, y):
       
   774                 data = wx.TextDataObject(str((self.Items[0].GetVariable(), "debug", "move")))
       
   775                 dragSource = wx.DropSource(self)
       
   776                 dragSource.SetData(data)
       
   777                 dragSource.DoDragDrop()
       
   778             else:
       
   779                 event.Skip()
       
   780         
   664         def OnLeftUp(self, event):
   781         def OnLeftUp(self, event):
   665             x, y = event.GetPosition()
   782             x, y = event.GetPosition()
   666             wx.CallAfter(self.HandleButtons, x, y)
   783             wx.CallAfter(self.HandleButtons, x, y)
   667             event.Skip()
   784             event.Skip()
   668         
   785         
   669         def OnPaint(self, event):
   786         def OnPaint(self, event):
   670             self.RefreshViewer()
   787             self.RefreshViewer()
   671             event.Skip()
   788             event.Skip()
   672     
       
   673     def compute_mask(x, y):
       
   674         mask = []
       
   675         for xp, yp in zip(x, y):
       
   676             if xp == yp:
       
   677                 mask.append(xp)
       
   678             else:
       
   679                 mask.append("*")
       
   680         return mask
       
   681     
       
   682     #CANVAS_HIGHLIGHT_TYPES
       
   683     [HIGHLIGHT_NONE,
       
   684      HIGHLIGHT_BEFORE,
       
   685      HIGHLIGHT_AFTER,
       
   686      HIGHLIGHT_LEFT,
       
   687      HIGHLIGHT_RIGHT,
       
   688      HIGHLIGHT_RESIZE] = range(6)
       
   689     
       
   690     HIGHLIGHT_DROP_PEN = wx.Pen(wx.Colour(0, 128, 255))
       
   691     HIGHLIGHT_DROP_BRUSH = wx.Brush(wx.Colour(0, 128, 255, 128))
       
   692     HIGHLIGHT_RESIZE_PEN = wx.Pen(wx.Colour(200, 200, 200))
       
   693     HIGHLIGHT_RESIZE_BRUSH = wx.Brush(wx.Colour(200, 200, 200))
       
   694     
       
   695     #CANVAS_SIZE_TYPES
       
   696     [SIZE_MINI, SIZE_MIDDLE, SIZE_MAXI] = [0, 100, 200]
       
   697     
       
   698     DEFAULT_CANVAS_HEIGHT = 200.
       
   699     CANVAS_BORDER = (20., 10.)
       
   700     CANVAS_PADDING = 8.5
       
   701     VALUE_LABEL_HEIGHT = 17.
       
   702     AXES_LABEL_HEIGHT = 12.75
       
   703     
       
   704     class GraphButton():
       
   705         
       
   706         def __init__(self, x, y, bitmap, callback):
       
   707             self.Position = wx.Point(x, y)
       
   708             self.Bitmap = bitmap
       
   709             self.Shown = True
       
   710             self.Enabled = True
       
   711             self.Callback = callback
       
   712         
       
   713         def __del__(self):
       
   714             self.callback = None
       
   715         
       
   716         def GetSize(self):
       
   717             return self.Bitmap.GetSize()
       
   718         
       
   719         def SetPosition(self, x, y):
       
   720             self.Position = wx.Point(x, y)
       
   721         
       
   722         def Show(self):
       
   723             self.Shown = True
       
   724             
       
   725         def Hide(self):
       
   726             self.Shown = False
       
   727         
       
   728         def IsShown(self):
       
   729             return self.Shown
       
   730         
       
   731         def Enable(self):
       
   732             self.Enabled = True
       
   733         
       
   734         def Disable(self):
       
   735             self.Enabled = False
       
   736         
       
   737         def IsEnabled(self):
       
   738             return self.Enabled
       
   739         
       
   740         def HitTest(self, x, y):
       
   741             if self.Shown and self.Enabled:
       
   742                 w, h = self.Bitmap.GetSize()
       
   743                 rect = wx.Rect(self.Position.x, self.Position.y, w, h)
       
   744                 if rect.InsideXY(x, y):
       
   745                     return True
       
   746             return False
       
   747         
       
   748         def ProcessCallback(self):
       
   749             if self.Callback is not None:
       
   750                 wx.CallAfter(self.Callback)
       
   751                 
       
   752         def Draw(self, dc):
       
   753             if self.Shown and self.Enabled:
       
   754                 dc.DrawBitmap(self.Bitmap, self.Position.x, self.Position.y, True)
       
   755     
   789     
   756     class DebugVariableGraphic(DebugVariableViewer, FigureCanvas):
   790     class DebugVariableGraphic(DebugVariableViewer, FigureCanvas):
   757         
   791         
   758         def __init__(self, parent, window, items, graph_type):
   792         def __init__(self, parent, window, items, graph_type):
   759             DebugVariableViewer.__init__(self, window, items)
   793             DebugVariableViewer.__init__(self, window, items)
  1675                 panel.ShowButtons(True)
  1709                 panel.ShowButtons(True)
  1676                 merge_type = GRAPH_PARALLEL
  1710                 merge_type = GRAPH_PARALLEL
  1677                 if isinstance(panel, DebugVariableText) or panel.Is3DCanvas():
  1711                 if isinstance(panel, DebugVariableText) or panel.Is3DCanvas():
  1678                     if y_mouse > yw + height / 2:
  1712                     if y_mouse > yw + height / 2:
  1679                         idx += 1
  1713                         idx += 1
  1680                     wx.CallAfter(self.MoveGraph, variable, idx)
  1714                     wx.CallAfter(self.MoveValue, variable, idx)
  1681                 else:
  1715                 else:
  1682                     rect = panel.GetAxesBoundingBox(True)
  1716                     rect = panel.GetAxesBoundingBox(True)
  1683                     if rect.InsideXY(x_mouse, y_mouse):
  1717                     if rect.InsideXY(x_mouse, y_mouse):
  1684                         merge_rect = wx.Rect(rect.x, rect.y, rect.width / 2., rect.height)
  1718                         merge_rect = wx.Rect(rect.x, rect.y, rect.width / 2., rect.height)
  1685                         if merge_rect.InsideXY(x_mouse, y_mouse):
  1719                         if merge_rect.InsideXY(x_mouse, y_mouse):
  1686                             merge_type = GRAPH_ORTHOGONAL
  1720                             merge_type = GRAPH_ORTHOGONAL
  1687                         wx.CallAfter(self.MergeGraphs, variable, idx, merge_type, force=True)
  1721                         wx.CallAfter(self.MergeGraphs, variable, idx, merge_type, force=True)
  1688                     else:
  1722                     else:
  1689                         if y_mouse > yw + height / 2:
  1723                         if y_mouse > yw + height / 2:
  1690                             idx += 1
  1724                             idx += 1
  1691                         wx.CallAfter(self.MoveGraph, variable, idx)
  1725                         wx.CallAfter(self.MoveValue, variable, idx)
  1692                 self.ForceRefresh()
  1726                 self.ForceRefresh()
  1693                 return 
  1727                 return 
  1694         width, height = self.GraphicsWindow.GetVirtualSize()
  1728         width, height = self.GraphicsWindow.GetVirtualSize()
  1695         rect = wx.Rect(0, 0, width, height)
  1729         rect = wx.Rect(0, 0, width, height)
  1696         if rect.InsideXY(x_mouse, y_mouse):
  1730         if rect.InsideXY(x_mouse, y_mouse):
  1697             wx.CallAfter(self.MoveGraph, variable, len(self.GraphicPanels))
  1731             wx.CallAfter(self.MoveValue, variable, len(self.GraphicPanels))
  1698         self.ForceRefresh()
  1732         self.ForceRefresh()
  1699     
  1733     
  1700     def RefreshView(self, only_values=False):
  1734     def RefreshView(self, only_values=False):
  1701         if USE_MPL:
  1735         if USE_MPL:
  1702             self.RefreshCanvasPosition()
  1736             self.RefreshCanvasPosition()
  2066             else:
  2100             else:
  2067                 self.Table.InsertItem(idx, item)
  2101                 self.Table.InsertItem(idx, item)
  2068             
  2102             
  2069             self.ForceRefresh()
  2103             self.ForceRefresh()
  2070     
  2104     
  2071     def MoveGraph(self, iec_path, idx = None):
  2105     def MoveValue(self, iec_path, idx = None):
  2072         if idx is None:
  2106         if idx is None:
  2073             idx = len(self.GraphicPanels)
  2107             idx = len(self.GraphicPanels)
  2074         source_panel = None
  2108         source_panel = None
  2075         item = None
  2109         item = None
  2076         for panel in self.GraphicPanels:
  2110         for panel in self.GraphicPanels:
  2084                 if source_panel.HasCapture():
  2118                 if source_panel.HasCapture():
  2085                     source_panel.ReleaseMouse()
  2119                     source_panel.ReleaseMouse()
  2086                 self.GraphicPanels.remove(source_panel)
  2120                 self.GraphicPanels.remove(source_panel)
  2087                 source_panel.Destroy()
  2121                 source_panel.Destroy()
  2088             
  2122             
  2089             panel = DebugVariableGraphic(self.GraphicsWindow, self, [item], GRAPH_PARALLEL)
  2123             if item.IsNumVariable():
  2090             if self.CursorTick is not None:
  2124                 panel = DebugVariableGraphic(self.GraphicsWindow, self, [item], GRAPH_PARALLEL)
  2091                 panel.SetCursorTick(self.CursorTick)
  2125                 if self.CursorTick is not None:
       
  2126                     panel.SetCursorTick(self.CursorTick)
       
  2127             else:
       
  2128                 panel = DebugVariableText(self.GraphicsWindow, self, [item])
  2092             self.GraphicPanels.insert(idx, panel)
  2129             self.GraphicPanels.insert(idx, panel)
  2093             self.ResetVariableNameMask()
  2130             self.ResetVariableNameMask()
  2094             self.RefreshGraphicsSizer()
  2131             self.RefreshGraphicsSizer()
  2095             self.ForceRefresh()
  2132             self.ForceRefresh()
  2096     
  2133     
  2106             item = VariableTableItem(self, source)
  2143             item = VariableTableItem(self, source)
  2107             if item.IsNumVariable():
  2144             if item.IsNumVariable():
  2108                 result = self.AddDataConsumer(source.upper(), item)
  2145                 result = self.AddDataConsumer(source.upper(), item)
  2109                 if result is not None or force:
  2146                 if result is not None or force:
  2110                     source_item = item
  2147                     source_item = item
  2111         if source_item is not None:
  2148         if source_item is not None and source_item.IsNumVariable():
  2112             target_panel = self.GraphicPanels[target_idx]
  2149             target_panel = self.GraphicPanels[target_idx]
  2113             graph_type = target_panel.GraphType
  2150             graph_type = target_panel.GraphType
  2114             if target_panel != source_panel:
  2151             if target_panel != source_panel:
  2115                 if (merge_type == GRAPH_PARALLEL and graph_type != merge_type or
  2152                 if (merge_type == GRAPH_PARALLEL and graph_type != merge_type or
  2116                     merge_type == GRAPH_ORTHOGONAL and 
  2153                     merge_type == GRAPH_ORTHOGONAL and