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) |
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() |