Viewer.py
changeset 319 efe0671df286
parent 302 43e10dccc16a
child 323 fd3a3a002bce
equal deleted inserted replaced
318:2a5421d0f286 319:efe0671df286
   335         self._init_coll_ContextualMenu_Items(self.ContextualMenu)
   335         self._init_coll_ContextualMenu_Items(self.ContextualMenu)
   336     
   336     
   337     # Create a new Viewer
   337     # Create a new Viewer
   338     def __init__(self, parent, tagname, window, controler, debug = False, instancepath = ""):
   338     def __init__(self, parent, tagname, window, controler, debug = False, instancepath = ""):
   339         wx.ScrolledWindow.__init__(self, parent, pos=wx.Point(0, 0), size=wx.Size(0, 0), 
   339         wx.ScrolledWindow.__init__(self, parent, pos=wx.Point(0, 0), size=wx.Size(0, 0), 
   340             style=wx.HSCROLL | wx.VSCROLL)
   340             style=wx.HSCROLL | wx.VSCROLL | wx.ALWAYS_SHOW_SB)
   341         self._init_menus()
   341         self._init_menus()
   342         # Adding a rubberband to Viewer
   342         # Adding a rubberband to Viewer
   343         self.rubberBand = RubberBand(drawingSurface=self)
   343         self.rubberBand = RubberBand(drawingSurface=self)
   344         self.SetBackgroundColour(wx.Colour(255,255,255))
   344         self.SetBackgroundColour(wx.Colour(255,255,255))
   345         self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
   345         self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
   353         self.current_id = 0
   353         self.current_id = 0
   354         self.TagName = tagname
   354         self.TagName = tagname
   355         self.Errors = []
   355         self.Errors = []
   356         self.Debug = debug
   356         self.Debug = debug
   357         self.InstancePath = instancepath
   357         self.InstancePath = instancepath
       
   358         self.StartMousePos = None
       
   359         self.StartScreenPos = None
   358         
   360         
   359         # Initialize Block, Wire and Comment numbers
   361         # Initialize Block, Wire and Comment numbers
   360         self.block_id = self.wire_id = self.comment_id = 0
   362         self.block_id = self.wire_id = self.comment_id = 0
   361         
   363         
   362         # Initialize Viewer mode to Selection mode
   364         # Initialize Viewer mode to Selection mode
   388         self.Bind(wx.EVT_LEFT_DOWN, self.OnViewerLeftDown)
   390         self.Bind(wx.EVT_LEFT_DOWN, self.OnViewerLeftDown)
   389         self.Bind(wx.EVT_LEFT_UP, self.OnViewerLeftUp)
   391         self.Bind(wx.EVT_LEFT_UP, self.OnViewerLeftUp)
   390         self.Bind(wx.EVT_LEFT_DCLICK, self.OnViewerLeftDClick)
   392         self.Bind(wx.EVT_LEFT_DCLICK, self.OnViewerLeftDClick)
   391         self.Bind(wx.EVT_RIGHT_DOWN, self.OnViewerRightDown)
   393         self.Bind(wx.EVT_RIGHT_DOWN, self.OnViewerRightDown)
   392         self.Bind(wx.EVT_RIGHT_UP, self.OnViewerRightUp)
   394         self.Bind(wx.EVT_RIGHT_UP, self.OnViewerRightUp)
       
   395         self.Bind(wx.EVT_MIDDLE_DOWN, self.OnViewerMiddleDown)
       
   396         self.Bind(wx.EVT_MIDDLE_UP, self.OnViewerMiddleUp)
   393         self.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeaveViewer)
   397         self.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeaveViewer)
   394         self.Bind(wx.EVT_MOTION, self.OnViewerMotion)
   398         self.Bind(wx.EVT_MOTION, self.OnViewerMotion)
   395         self.Bind(wx.EVT_CHAR, self.OnChar)
   399         self.Bind(wx.EVT_CHAR, self.OnChar)
   396         self.Bind(wx.EVT_SCROLLWIN, self.OnScrollWindow)
   400         self.Bind(wx.EVT_SCROLLWIN, self.OnScrollWindow)
       
   401         self.Bind(wx.EVT_SCROLLWIN_THUMBRELEASE, self.OnScrollStop)
   397         self.Bind(wx.EVT_MOUSEWHEEL, self.OnMouseWheelWindow)
   402         self.Bind(wx.EVT_MOUSEWHEEL, self.OnMouseWheelWindow)
   398         self.Bind(wx.EVT_SIZE, self.OnMoveWindow)
   403         self.Bind(wx.EVT_SIZE, self.OnMoveWindow)
   399     
   404     
   400     def GetScrolledRect(self, rect):
   405     def GetScrolledRect(self, rect):
   401         rect.x, rect.y = self.CalcScrolledPosition(rect.x, rect.y)
   406         rect.x, rect.y = self.CalcScrolledPosition(rect.x, rect.y)
   691             bbox = element.GetBoundingBox()
   696             bbox = element.GetBoundingBox()
   692             maxx = max(maxx, bbox.x + bbox.width)
   697             maxx = max(maxx, bbox.x + bbox.width)
   693             maxy = max(maxy, bbox.y + bbox.height)
   698             maxy = max(maxy, bbox.y + bbox.height)
   694         return maxx, maxy
   699         return maxx, maxy
   695     
   700     
   696     def RefreshScrollBars(self):
   701     def RefreshScrollBars(self, width_incr=0, height_incr=0):
   697         xstart, ystart = self.GetViewStart()
   702         xstart, ystart = self.GetViewStart()
   698         window_size = self.GetClientSize()
   703         window_size = self.GetClientSize()
   699         maxx, maxy = self.GetMaxSize()
   704         maxx, maxy = self.GetMaxSize()
   700         maxx = max(maxx + WINDOW_BORDER, xstart * SCROLLBAR_UNIT + window_size[0])
   705         maxx = max(maxx + WINDOW_BORDER, xstart * SCROLLBAR_UNIT + window_size[0])
   701         maxy = max(maxy + WINDOW_BORDER, ystart * SCROLLBAR_UNIT + window_size[1])
   706         maxy = max(maxy + WINDOW_BORDER, ystart * SCROLLBAR_UNIT + window_size[1])
   702         if self.rubberBand.IsShown():
   707         if self.rubberBand.IsShown():
   703             extent = self.rubberBand.GetCurrentExtent()
   708             extent = self.rubberBand.GetCurrentExtent()
   704             maxx = max(maxx, extent.x + extent.width)
   709             maxx = max(maxx, extent.x + extent.width)
   705             maxy = max(maxy, extent.y + extent.height)
   710             maxy = max(maxy, extent.y + extent.height)
   706         self.SetScrollbars(SCROLLBAR_UNIT, SCROLLBAR_UNIT, 
   711         self.SetScrollbars(SCROLLBAR_UNIT, SCROLLBAR_UNIT, 
   707             round(maxx / SCROLLBAR_UNIT), round(maxy / SCROLLBAR_UNIT), 
   712             round(maxx / SCROLLBAR_UNIT) + width_incr, round(maxy / SCROLLBAR_UNIT) + height_incr, 
   708             xstart, ystart, True)
   713             xstart, ystart, True)
   709         
   714         
   710     # Load instance from given informations
   715     # Load instance from given informations
   711     def loadInstance(self, instance, ids):
   716     def loadInstance(self, instance, ids):
   712         ids.append(instance["id"])
   717         ids.append(instance["id"])
  1224         event.Skip()
  1229         event.Skip()
  1225 
  1230 
  1226     def OnAddBranchMenu(self, event):
  1231     def OnAddBranchMenu(self, event):
  1227         if self.SelectedElement is not None and self.IsBlock(self.SelectedElement):
  1232         if self.SelectedElement is not None and self.IsBlock(self.SelectedElement):
  1228             self.AddDivergenceBranch(self.SelectedElement)
  1233             self.AddDivergenceBranch(self.SelectedElement)
  1229             self.RefreshBuffer()
       
  1230         event.Skip()
  1234         event.Skip()
  1231 
  1235 
  1232     def OnDeleteBranchMenu(self, event):
  1236     def OnDeleteBranchMenu(self, event):
  1233         if self.SelectedElement is not None and self.IsBlock(self.SelectedElement):
  1237         if self.SelectedElement is not None and self.IsBlock(self.SelectedElement):
  1234             self.RemoveDivergenceBranch(self.SelectedElement)
  1238             self.RemoveDivergenceBranch(self.SelectedElement)
  1235             self.RefreshBuffer()
       
  1236         event.Skip()
  1239         event.Skip()
  1237 
  1240 
  1238     def OnEditBlockMenu(self, event):
  1241     def OnEditBlockMenu(self, event):
  1239         if self.SelectedElement is not None:
  1242         if self.SelectedElement is not None:
  1240             self.ParentWindow.EditProjectElement(ITEM_POU, "P::%s"%self.SelectedElement.GetType())
  1243             self.ParentWindow.EditProjectElement(ITEM_POU, "P::%s"%self.SelectedElement.GetType())
  1423                 wx.CallAfter(self.SetCursor, wx.NullCursor)
  1426                 wx.CallAfter(self.SetCursor, wx.NullCursor)
  1424         if self.Mode != MODE_SELECTION and not self.SavedMode:
  1427         if self.Mode != MODE_SELECTION and not self.SavedMode:
  1425             wx.CallAfter(self.ParentWindow.ResetCurrentMode)
  1428             wx.CallAfter(self.ParentWindow.ResetCurrentMode)
  1426         event.Skip()
  1429         event.Skip()
  1427     
  1430     
       
  1431     def OnViewerMiddleDown(self, event):
       
  1432         self.StartMousePos = event.GetPosition()
       
  1433         self.StartScreenPos = self.GetScrollPos(wx.HORIZONTAL), self.GetScrollPos(wx.VERTICAL)
       
  1434         event.Skip()
       
  1435         
       
  1436     def OnViewerMiddleUp(self, event):
       
  1437         self.StartMousePos = None
       
  1438         self.StartScreenPos = None
       
  1439         event.Skip()
       
  1440     
  1428     def OnViewerRightDown(self, event):
  1441     def OnViewerRightDown(self, event):
  1429         if self.Mode == MODE_SELECTION:
  1442         if self.Mode == MODE_SELECTION:
  1430             dc = self.GetLogicalDC()
  1443             dc = self.GetLogicalDC()
  1431             pos = event.GetLogicalPosition(dc)
  1444             pos = event.GetLogicalPosition(dc)
  1432             element = self.FindElement(pos)
  1445             element = self.FindElement(pos)
  1466     
  1479     
  1467     def OnViewerMotion(self, event):
  1480     def OnViewerMotion(self, event):
  1468         refresh = False
  1481         refresh = False
  1469         dc = self.GetLogicalDC()
  1482         dc = self.GetLogicalDC()
  1470         pos = GetScaledEventPosition(event, dc, self.Scaling)
  1483         pos = GetScaledEventPosition(event, dc, self.Scaling)
  1471         if not event.Dragging():
  1484         if event.LeftIsDown():
  1472             highlighted = self.FindElement(pos) 
  1485             if not event.Dragging():
  1473             if self.HighlightedElement is not None and self.HighlightedElement != highlighted:
  1486                 highlighted = self.FindElement(pos) 
  1474                 self.HighlightedElement.SetHighlighted(False)
  1487                 if self.HighlightedElement is not None and self.HighlightedElement != highlighted:
  1475                 self.HighlightedElement = None
  1488                     self.HighlightedElement.SetHighlighted(False)
  1476             if highlighted is not None and self.HighlightedElement != highlighted:
  1489                     self.HighlightedElement = None
  1477                 highlighted.SetHighlighted(True)
  1490                 if highlighted is not None and self.HighlightedElement != highlighted:
  1478             self.HighlightedElement = highlighted
  1491                     highlighted.SetHighlighted(True)
  1479         if self.rubberBand.IsShown():
  1492                 self.HighlightedElement = highlighted
  1480             self.rubberBand.OnMotion(event, dc, self.Scaling)
  1493             if self.rubberBand.IsShown():
  1481         elif not self.Debug and self.Mode == MODE_SELECTION and self.SelectedElement is not None:
  1494                 self.rubberBand.OnMotion(event, dc, self.Scaling)
  1482             if self.DrawingWire:
  1495             elif not self.Debug and self.Mode == MODE_SELECTION and self.SelectedElement is not None:
  1483                 connector = self.FindBlockConnector(pos, self.SelectedElement.GetConnectionDirection(), self.SelectedElement.EndConnected)
  1496                 if self.DrawingWire:
  1484                 if not connector or self.SelectedElement.EndConnected == None:
  1497                     connector = self.FindBlockConnector(pos, self.SelectedElement.GetConnectionDirection(), self.SelectedElement.EndConnected)
  1485                     self.SelectedElement.ResetPoints()
  1498                     if not connector or self.SelectedElement.EndConnected == None:
       
  1499                         self.SelectedElement.ResetPoints()
       
  1500                         movex, movey = self.SelectedElement.OnMotion(event, dc, self.Scaling)
       
  1501                         self.SelectedElement.GeneratePoints()
       
  1502                         if movex != 0 or movey != 0:
       
  1503                             self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(movex, movey)), False)
       
  1504                 else:
  1486                     movex, movey = self.SelectedElement.OnMotion(event, dc, self.Scaling)
  1505                     movex, movey = self.SelectedElement.OnMotion(event, dc, self.Scaling)
  1487                     self.SelectedElement.GeneratePoints()
       
  1488                     if movex != 0 or movey != 0:
  1506                     if movex != 0 or movey != 0:
  1489                         self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(movex, movey)), False)
  1507                         self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(movex, movey)), False)
  1490             else:
  1508             self.UpdateScrollPos(event)
  1491                 movex, movey = self.SelectedElement.OnMotion(event, dc, self.Scaling)
  1509         elif event.MiddleIsDown():
  1492                 if movex != 0 or movey != 0:
  1510             if self.StartMousePos is not None and self.StartScreenPos is not None:
  1493                     self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(movex, movey)), False)
  1511                 new_pos = event.GetPosition()
  1494         self.UpdateScrollPos(event)
  1512                 xmax = self.GetScrollRange(wx.HORIZONTAL) - self.GetScrollThumb(wx.HORIZONTAL)
       
  1513                 ymax = self.GetScrollRange(wx.VERTICAL) - self.GetScrollThumb(wx.VERTICAL)
       
  1514                 scrollx = max(0, self.StartScreenPos[0] + (new_pos[0] - self.StartMousePos[0]) / SCROLLBAR_UNIT)
       
  1515                 scrolly = max(0, self.StartScreenPos[1] + (new_pos[1] - self.StartMousePos[1]) / SCROLLBAR_UNIT)
       
  1516                 if scrollx > xmax or scrolly > ymax:
       
  1517                     self.RefreshScrollBars(max(0, scrollx - xmax), max(0, scrolly - ymax))
       
  1518                     self.Scroll(scrollx, scrolly)
       
  1519                 else:
       
  1520                     self.Scroll(scrollx, scrolly)
       
  1521                     self.RefreshScrollBars()
       
  1522                 self.RefreshVisibleElements()
  1495         event.Skip()
  1523         event.Skip()
  1496 
  1524 
  1497     def OnLeaveViewer(self, event):
  1525     def OnLeaveViewer(self, event):
  1498         if self.SelectedElement is not None and self.SelectedElement.GetDragging():
  1526         if self.SelectedElement is not None and self.SelectedElement.GetDragging():
  1499             event.Skip()
  1527             event.Skip()
  1545         elif not self.Debug and keycode == wx.WXK_RETURN and self.SelectedElement is not None:
  1573         elif not self.Debug and keycode == wx.WXK_RETURN and self.SelectedElement is not None:
  1546             self.SelectedElement.OnLeftDClick(event, self.GetLogicalDC(), self.Scaling)
  1574             self.SelectedElement.OnLeftDClick(event, self.GetLogicalDC(), self.Scaling)
  1547         elif keycode == wx.WXK_LEFT:
  1575         elif keycode == wx.WXK_LEFT:
  1548             if event.ControlDown() and event.ShiftDown():
  1576             if event.ControlDown() and event.ShiftDown():
  1549                 self.Scroll(0, ypos)
  1577                 self.Scroll(0, ypos)
       
  1578                 self.RefreshVisibleElements()
  1550             elif event.ControlDown():
  1579             elif event.ControlDown():
  1551                 event.Skip()
  1580                 self.Scroll(xpos - 1, ypos)
       
  1581                 self.RefreshScrollBars()
       
  1582                 self.RefreshVisibleElements()
  1552             elif not self.Debug and self.SelectedElement is not None:
  1583             elif not self.Debug and self.SelectedElement is not None:
  1553                 self.SelectedElement.Move(-scaling[0], 0)
  1584                 self.SelectedElement.Move(-scaling[0], 0)
  1554                 self.SelectedElement.RefreshModel()
  1585                 self.SelectedElement.RefreshModel()
  1555                 self.RefreshBuffer()
  1586                 self.RefreshBuffer()
  1556                 self.RefreshScrollBars()
  1587                 self.RefreshScrollBars()
  1557                 self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(-scaling[0], 0)), False)
  1588                 self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(-scaling[0], 0)), False)
  1558         elif keycode == wx.WXK_RIGHT:
  1589         elif keycode == wx.WXK_RIGHT:
  1559             if event.ControlDown() and event.ShiftDown():
  1590             if event.ControlDown() and event.ShiftDown():
  1560                 self.Scroll(xmax, ypos)
  1591                 self.Scroll(xmax, ypos)
       
  1592                 self.RefreshVisibleElements()
  1561             elif event.ControlDown():
  1593             elif event.ControlDown():
  1562                 event.Skip()
  1594                 self.RefreshScrollBars(width_incr=max(0, xpos + 1 - xmax))
       
  1595                 self.Scroll(xpos + 1, ypos)
       
  1596                 self.RefreshVisibleElements()
  1563             elif not self.Debug and self.SelectedElement is not None:
  1597             elif not self.Debug and self.SelectedElement is not None:
  1564                 self.SelectedElement.Move(scaling[0], 0)
  1598                 self.SelectedElement.Move(scaling[0], 0)
  1565                 self.SelectedElement.RefreshModel()
  1599                 self.SelectedElement.RefreshModel()
  1566                 self.RefreshBuffer()
  1600                 self.RefreshBuffer()
  1567                 self.RefreshScrollBars()
  1601                 self.RefreshScrollBars()
  1568                 self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(scaling[0], 0)), False)
  1602                 self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(scaling[0], 0)), False)
  1569         elif keycode == wx.WXK_UP:
  1603         elif keycode == wx.WXK_UP:
  1570             if event.ControlDown() and event.ShiftDown():
  1604             if event.ControlDown() and event.ShiftDown():
  1571                 self.Scroll(xpos, 0)
  1605                 self.Scroll(xpos, 0)
       
  1606                 self.RefreshVisibleElements()
  1572             elif event.ControlDown():
  1607             elif event.ControlDown():
  1573                 event.Skip()
  1608                 self.Scroll(xpos, ypos - 1)
       
  1609                 self.RefreshScrollBars()
       
  1610                 self.RefreshVisibleElements()
  1574             elif not self.Debug and self.SelectedElement is not None:
  1611             elif not self.Debug and self.SelectedElement is not None:
  1575                 self.SelectedElement.Move(0, -scaling[1])
  1612                 self.SelectedElement.Move(0, -scaling[1])
  1576                 self.SelectedElement.RefreshModel()
  1613                 self.SelectedElement.RefreshModel()
  1577                 self.RefreshBuffer()
  1614                 self.RefreshBuffer()
  1578                 self.RefreshScrollBars()
  1615                 self.RefreshScrollBars()
  1579                 self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(0, -scaling[1])), False)
  1616                 self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(0, -scaling[1])), False)
  1580         elif keycode == wx.WXK_DOWN:
  1617         elif keycode == wx.WXK_DOWN:
  1581             if event.ControlDown() and event.ShiftDown():
  1618             if event.ControlDown() and event.ShiftDown():
  1582                 self.Scroll(xpos, ymax)
  1619                 self.Scroll(xpos, ymax)
       
  1620                 self.RefreshVisibleElements()
  1583             elif event.ControlDown():
  1621             elif event.ControlDown():
  1584                 event.Skip()
  1622                 self.RefreshScrollBars(height_incr=max(0, ypos + 1 - ymax))
       
  1623                 self.Scroll(xpos, ypos + 1)
       
  1624                 self.RefreshVisibleElements()
  1585             elif not self.Debug and self.SelectedElement is not None:
  1625             elif not self.Debug and self.SelectedElement is not None:
  1586                 self.SelectedElement.Move(0, scaling[1])
  1626                 self.SelectedElement.Move(0, scaling[1])
  1587                 self.SelectedElement.RefreshModel()
  1627                 self.SelectedElement.RefreshModel()
  1588                 self.RefreshBuffer()
  1628                 self.RefreshBuffer()
  1589                 self.RefreshScrollBars()
  1629                 self.RefreshScrollBars()
  2614             self.RefreshVisibleElements(xp = event.GetPosition())
  2654             self.RefreshVisibleElements(xp = event.GetPosition())
  2615         else:
  2655         else:
  2616             self.RefreshVisibleElements(yp = event.GetPosition())
  2656             self.RefreshVisibleElements(yp = event.GetPosition())
  2617         event.Skip()
  2657         event.Skip()
  2618 
  2658 
       
  2659     def OnScrollStop(self, event):
       
  2660         self.RefreshScrollBars()
       
  2661         event.Skip()
       
  2662 
  2619     def OnMouseWheelWindow(self, event):
  2663     def OnMouseWheelWindow(self, event):
  2620         x, y = self.GetViewStart()
  2664         if self.StartMousePos is None or self.StartScreenPos is None:
  2621         yp = max(0, min(y - event.GetWheelRotation() / event.GetWheelDelta() * 3, self.GetVirtualSize()[1] / self.GetScrollPixelsPerUnit()[1]))
  2665             x, y = self.GetViewStart()
  2622         self.RefreshVisibleElements(yp = yp)
  2666             yp = max(0, min(y - event.GetWheelRotation() / event.GetWheelDelta() * 3, self.GetVirtualSize()[1] / self.GetScrollPixelsPerUnit()[1]))
  2623         self.Scroll(x, yp)
  2667             self.RefreshVisibleElements(yp = yp)
       
  2668             self.Scroll(x, yp)
  2624         
  2669         
  2625     def OnMoveWindow(self, event):
  2670     def OnMoveWindow(self, event):
  2626         if not USE_AUI:
  2671         if not USE_AUI:
  2627             self.GetBestSize()
  2672             self.GetBestSize()
  2628         self.RefreshScrollBars()
  2673         self.RefreshScrollBars()