git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@27447 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			161 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			161 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # -*- coding: iso-8859-1 -*-
 | |
| #----------------------------------------------------------------------------
 | |
| # Name:         diagram.py
 | |
| # Purpose:      Diagram class
 | |
| #
 | |
| # Author:       Pierre Hjälm (from C++ original by Julian Smart)
 | |
| #
 | |
| # Created:      20040508
 | |
| # RCS-ID:       
 | |
| # Copyright:    (c) 2004 Pierre Hjälm - 1998 Julian Smart
 | |
| # Licence:      wxWindows license
 | |
| #----------------------------------------------------------------------------
 | |
| 
 | |
| from __future__ import division
 | |
| 
 | |
| import wx
 | |
| 
 | |
| DEFAULT_MOUSE_TOLERANCE = 3
 | |
| 
 | |
| 
 | |
| 
 | |
| class Diagram(object):
 | |
|     """Encapsulates an entire diagram, with methods for drawing. A diagram has
 | |
|     an associated ShapeCanvas.
 | |
| 
 | |
|     Derived from:
 | |
|       Object
 | |
|     """
 | |
|     def __init__(self):
 | |
|         self._diagramCanvas = None
 | |
|         self._quickEditMode = False
 | |
|         self._snapToGrid = True
 | |
|         self._gridSpacing = 5.0
 | |
|         self._shapeList = []
 | |
|         self._mouseTolerance = DEFAULT_MOUSE_TOLERANCE
 | |
| 
 | |
|     def Redraw(self, dc):
 | |
|         """Draw the shapes in the diagram on the specified device context."""
 | |
|         if self._shapeList:
 | |
|             if self.GetCanvas():
 | |
|                 self.GetCanvas().SetCursor(wx.HOURGLASS_CURSOR)
 | |
|             for object in self._shapeList:
 | |
|                 object.Draw(dc)
 | |
|             if self.GetCanvas():
 | |
|                 self.GetCanvas().SetCursor(wx.STANDARD_CURSOR)
 | |
| 
 | |
|     def Clear(self, dc):
 | |
|         """Clear the specified device context."""
 | |
|         dc.Clear()
 | |
| 
 | |
|     def AddShape(self, object, addAfter = None):
 | |
|         """Adds a shape to the diagram. If addAfter is not None, the shape
 | |
|         will be added after addAfter.
 | |
|         """
 | |
|         if not object in self._shapeList:
 | |
|             if addAfter:
 | |
|                 self._shapeList.insert(self._shapeList.index(addAfter) + 1, object)
 | |
|             else:
 | |
|                 self._shapeList.append(object)
 | |
| 
 | |
|             object.SetCanvas(self.GetCanvas())
 | |
| 
 | |
|     def InsertShape(self, object):
 | |
|         """Insert a shape at the front of the shape list."""
 | |
|         self._shapeList.insert(0, object)
 | |
| 
 | |
|     def RemoveShape(self, object):
 | |
|         """Remove the shape from the diagram (non-recursively) but do not
 | |
|         delete it.
 | |
|         """
 | |
|         if object in self._shapeList:
 | |
|             self._shapeList.remove(object)
 | |
|             
 | |
|     def RemoveAllShapes(self):
 | |
|         """Remove all shapes from the diagram but do not delete the shapes."""
 | |
|         self._shapeList = []
 | |
| 
 | |
|     def DeleteAllShapes(self):
 | |
|         """Remove and delete all shapes in the diagram."""
 | |
|         for shape in self._shapeList[:]:
 | |
|             if not shape.GetParent():
 | |
|                 self.RemoveShape(shape)
 | |
|                 
 | |
|     def ShowAll(self, show):
 | |
|         """Call Show for each shape in the diagram."""
 | |
|         for shape in self._shapeList:
 | |
|             shape.Show()
 | |
| 
 | |
|     def DrawOutLine(self, dc, x1, y1, x2, y2):
 | |
|         """Draw an outline rectangle on the current device context."""
 | |
|         dc.SetPen(wx.Pen(wx.Color(0, 0, 0), 1, wx.DOT))
 | |
|         dc.SetBrush(wx.TRANSPARENT_BRUSH)
 | |
| 
 | |
|         dc.DrawLines([[x1, y1], [x2, y1], [x2, y2], [x1, y2], [x1, y1]])
 | |
| 
 | |
|     def RecentreAll(self, dc):
 | |
|         """Make sure all text that should be centred, is centred."""
 | |
|         for shape in self._shapeList:
 | |
|             shape.Recentre(dc)
 | |
| 
 | |
|     def SetCanvas(self, canvas):
 | |
|         """Set the canvas associated with this diagram."""
 | |
|         self._diagramCanvas = canvas
 | |
| 
 | |
|     def GetCanvas(self):
 | |
|         """Return the shape canvas associated with this diagram."""
 | |
|         return self._diagramCanvas
 | |
|         
 | |
|     def FindShape(self, id):
 | |
|         """Return the shape for the given identifier."""
 | |
|         for shape in self._shapeList:
 | |
|             if shape.GetId() == id:
 | |
|                 return shape
 | |
|         return None
 | |
| 
 | |
|     def Snap(self, x, y):
 | |
|         """'Snaps' the coordinate to the nearest grid position, if
 | |
|         snap-to-grid is on."""
 | |
|         if self._snapToGrid:
 | |
|             return self._gridSpacing * int(x / self._gridSpacing + 0.5), self._gridSpacing * int(y / self._gridSpacing + 0.5)
 | |
|         return x, y
 | |
| 
 | |
|     def GetGridSpacing(self):
 | |
|         """Return the grid spacing."""
 | |
|         return self._gridSpacing
 | |
| 
 | |
|     def GetSnapToGrid(self):
 | |
|         """Return snap-to-grid mode."""
 | |
|         return self._snapToGrid
 | |
| 
 | |
|     def SetQuickEditMode(self, mode):
 | |
|         """Set quick-edit-mode on of off.
 | |
| 
 | |
|         In this mode, refreshes are minimized, but the diagram may need
 | |
|         manual refreshing occasionally.
 | |
|         """
 | |
|         self._quickEditMode = mode
 | |
| 
 | |
|     def GetQuickEditMode(self):
 | |
|         """Return quick edit mode."""
 | |
|         return self._quickEditMode
 | |
| 
 | |
|     def SetMouseTolerance(self, tolerance):
 | |
|         """Set the tolerance within which a mouse move is ignored.
 | |
| 
 | |
|         The default is 3 pixels.
 | |
|         """
 | |
|         self._mouseTolerance = tolerance
 | |
| 
 | |
|     def GetMouseTolerance(self):
 | |
|         """Return the tolerance within which a mouse move is ignored."""
 | |
|         return self._mouseTolerance
 | |
| 
 | |
|     def GetShapeList(self):
 | |
|         """Return the internal shape list."""
 | |
|         return self._shapeList
 | |
| 
 | |
|     def GetCount(self):
 | |
|         """Return the number of shapes in the diagram."""
 | |
|         return len(self._shapeList)
 |