wxWidgets/wxPython/wx/lib/ogl/_diagram.py

168 lines
5.2 KiB
Python
Raw Normal View History

# -*- coding: iso-8859-1 -*-
#----------------------------------------------------------------------------
# Name: diagram.py
# Purpose: Diagram class
#
# Author: Pierre Hj<48>lm (from C++ original by Julian Smart)
#
# Created: 2004-05-08
# RCS-ID: $Id$
# Copyright: (c) 2004 Pierre Hj<48>lm - 1998 Julian Smart
# Licence: wxWindows license
#----------------------------------------------------------------------------
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)
shape.Delete()
def ShowAll(self, show):
"""Call Show for each shape in the diagram."""
for shape in self._shapeList:
shape.Show(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 SetGridSpacing(self, spacing):
"""Sets grid spacing."""
self._gridSpacing = spacing
def SetSnapToGrid(self, snap):
"""Sets snap-to-grid mode."""
self._snapToGrid = snap
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)