summaryrefslogtreecommitdiff
path: root/Build/source/utils/asymptote/GUI/xasyActions.py
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/utils/asymptote/GUI/xasyActions.py')
-rwxr-xr-xBuild/source/utils/asymptote/GUI/xasyActions.py387
1 files changed, 387 insertions, 0 deletions
diff --git a/Build/source/utils/asymptote/GUI/xasyActions.py b/Build/source/utils/asymptote/GUI/xasyActions.py
new file mode 100755
index 00000000000..38aae1d5c7e
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/xasyActions.py
@@ -0,0 +1,387 @@
+#!/usr/bin/env python
+###########################################################################
+#
+# xasyActions implements the possible actions and their inverses
+# for the undo/redo stack in xasy
+#
+# Author: Orest Shardt
+# Created: July 23, 2007
+#
+###########################################################################
+import math
+import UndoRedoStack
+import xasy2asy
+from Tkinter import *
+
+class translationAction(UndoRedoStack.action):
+ def __init__(self,owner,itemList,indexList,translation):
+ self.translation = translation
+ self.owner = owner
+ self.itemList = itemList
+ self.indexList = indexList
+ UndoRedoStack.action.__init__(self,self.transF,self.unTransF)
+
+ def transF(self):
+ mag = self.owner.magnification
+ for i in range(len(self.itemList)):
+ for index in self.indexList[i]:
+ self.owner.translateSomething(-1,(self.translation[0]/mag,self.translation[1]/mag),self.itemList[i],index)
+ if index==None:
+ index = 0
+ try:
+ self.owner.mainCanvas.move(self.itemList[i].imageList[index].IDTag,self.translation[0]*mag,-self.translation[1]*mag)
+ except:
+ self.owner.mainCanvas.move(self.itemList[i].IDTag,self.translation[0]*mag,-self.translation[1]*mag)
+ self.owner.updateSelection()
+ self.owner.updateCanvasSize()
+
+ def unTransF(self):
+ mag = self.owner.magnification
+ for i in range(len(self.itemList)):
+ for index in self.indexList[i]:
+ self.owner.translateSomething(-1,(-self.translation[0]/mag,-self.translation[1]/mag),self.itemList[i],index)
+ try:
+ self.owner.mainCanvas.move(self.itemList[i].imageList[index].IDTag,-self.translation[0]*mag,self.translation[1]*mag)
+ except:
+ self.owner.mainCanvas.move(self.itemList[i].IDTag,-self.translation[0]*mag,self.translation[1]*mag)
+ self.owner.updateSelection()
+ self.owner.updateCanvasSize()
+
+ def __str__(self):
+ return "Translation of "+str(self.itemList)+str(self.indexList)+" by "+str(self.translation)
+
+class rotationAction(UndoRedoStack.action):
+ def __init__(self,owner,itemList,indexList,angle,origin):
+ self.owner = owner
+ self.itemList = itemList
+ self.indexList = indexList
+ self.angle = angle
+ self.origin = origin
+ UndoRedoStack.action.__init__(self,self.rotF,self.unRotF)
+
+ def rotF(self):
+ for i in range(len(self.itemList)):
+ for index in self.indexList[i]:
+ self.owner.rotateSomething(-1,self.angle,self.origin,self.itemList[i],index)
+ for item in self.itemList:
+ item.drawOnCanvas(self.owner.mainCanvas,self.owner.magnification)
+ self.owner.bindItemEvents(item)
+ self.owner.updateSelection()
+ self.owner.updateCanvasSize()
+
+ def unRotF(self):
+ for i in range(len(self.itemList)):
+ for index in self.indexList[i]:
+ self.owner.rotateSomething(-1,-self.angle,self.origin,self.itemList[i],index)
+ for item in self.itemList:
+ item.drawOnCanvas(self.owner.mainCanvas,self.owner.magnification)
+ self.owner.bindItemEvents(item)
+ self.owner.updateSelection()
+ self.owner.updateCanvasSize()
+
+ def __str__(self):
+ return "Rotation of "+str(self.itemList)+str(self.indexList)+" by "+"%.3f"%(self.angle*180.0/math.pi)+" about "+str(self.origin)
+
+class addLabelAction(UndoRedoStack.action):
+ def __init__(self,owner,label):
+ self.owner = owner
+ self.label = label
+ UndoRedoStack.action.__init__(self,self.addF,self.unAddF)
+
+ def addF(self):
+ self.owner.addItemToFile(self.label)
+ self.label.drawOnCanvas(self.owner.mainCanvas,self.owner.magnification)
+ self.owner.bindItemEvents(self.label)
+
+ def unAddF(self):
+ self.label.removeFromCanvas()
+ del self.owner.fileItems[-1]
+ self.owner.propList.delete(0)
+ self.owner.clearSelection()
+
+ def __str__(self):
+ return "Addition of a label"
+
+class deleteLabelAction(UndoRedoStack.action):
+ def __init__(self,owner,label,index):
+ self.owner = owner
+ self.label = label
+ self.index = index
+ UndoRedoStack.action.__init__(self,self.delF,self.unDelF)
+
+ def delF(self):
+ self.owner.fileItems[self.index].removeFromCanvas()
+ self.owner.propList.delete(len(self.owner.fileItems)-self.index-1)
+ del self.owner.fileItems[self.index]
+
+ def unDelF(self):
+ self.owner.fileItems.insert(self.index,self.label)
+ self.owner.fileItems[self.index].drawOnCanvas(self.owner.mainCanvas,self.owner.magnification)
+ self.owner.propList.insert(len(self.owner.fileItems)-self.index-1,self.owner.describeItem(self.label))
+ self.owner.bindItemEvents(self.label)
+
+ def __str__(self):
+ return "Deletion of a label"
+
+class editLabelTextAction(UndoRedoStack.action):
+ def __init__(self,owner,label,newText,oldText):
+ self.owner = owner
+ self.label = label
+ self.newText = newText
+ self.oldText = oldText
+ UndoRedoStack.action.__init__(self,self.modT,self.unModT)
+
+ def modT(self):
+ self.label.label.setText(self.newText)
+ self.label.drawOnCanvas(self.owner.mainCanvas,self.owner.magnification)
+ self.owner.bindItemEvents(self.label)
+
+ def unModT(self):
+ self.label.label.setText(self.oldText)
+ self.label.drawOnCanvas(self.owner.mainCanvas,self.owner.magnification)
+ self.owner.bindItemEvents(self.label)
+
+ def __str__(self):
+ return "Editing a label's text"
+
+class editLabelPenAction(UndoRedoStack.action):
+ def __init__(self,owner,oldPen,newPen,index):
+ self.owner = owner
+ self.newPen = newPen
+ self.oldPen = oldPen
+ self.index = index
+ UndoRedoStack.action.__init__(self,self.editF,self.unEditF)
+
+ def editF(self):
+ self.owner.fileItems[self.index].removeFromCanvas()
+ self.owner.fileItems[self.index].label.pen = self.newPen
+ self.owner.fileItems[self.index].drawOnCanvas(self.owner.mainCanvas,self.owner.magnification)
+ self.owner.bindItemEvents(self.owner.fileItems[self.index])
+
+ def unEditF(self):
+ self.owner.fileItems[self.index].removeFromCanvas()
+ self.owner.fileItems[self.index].label.pen = self.oldPen
+ self.owner.fileItems[self.index].drawOnCanvas(self.owner.mainCanvas,self.owner.magnification)
+ self.owner.bindItemEvents(self.owner.fileItems[self.index])
+
+ def __str__(self):
+ return "Changing a label's pen"
+
+class addScriptAction(UndoRedoStack.action):
+ def __init__(self,owner,script):
+ self.owner = owner
+ self.script = script
+ UndoRedoStack.action.__init__(self,self.addF,self.unAddF)
+
+ def addF(self):
+ self.owner.addItemToFile(self.script)
+ self.script.drawOnCanvas(self.owner.mainCanvas,self.owner.magnification)
+ self.owner.bindItemEvents(self.script)
+
+ def unAddF(self):
+ self.script.removeFromCanvas()
+ del self.owner.fileItems[-1]
+ self.owner.propList.delete(0)
+ self.owner.clearSelection()
+
+ def __str__(self):
+ return "Addition of a script"
+
+class deleteScriptAction(UndoRedoStack.action):
+ def __init__(self,owner,script,index):
+ self.owner = owner
+ self.script = script
+ self.index = index
+ UndoRedoStack.action.__init__(self,self.delF,self.unDelF)
+
+ def delF(self):
+ self.owner.fileItems[self.index].removeFromCanvas()
+ self.owner.propList.delete(len(self.owner.fileItems)-self.index-1)
+ del self.owner.fileItems[self.index]
+
+ def unDelF(self):
+ self.owner.fileItems.insert(self.index,self.script)
+ self.owner.fileItems[self.index].drawOnCanvas(self.owner.mainCanvas,self.owner.magnification)
+ self.owner.propList.insert(len(self.owner.fileItems)-self.index-1,self.owner.describeItem(self.script))
+ self.owner.bindItemEvents(self.script)
+
+ def __str__(self):
+ return "Deletion of a script"
+
+class deleteScriptItemAction(UndoRedoStack.action):
+ def __init__(self,owner,script,indices,oldTransforms):
+ self.owner = owner
+ self.script = script
+ self.indices = indices[:]
+ UndoRedoStack.action.__init__(self,self.delI,self.unDelI)
+ def delI(self):
+ for index in self.indices:
+ self.script.transform[index].deleted = True
+ self.owner.mainCanvas.delete(self.script.imageList[index].IDTag)
+
+ def unDelI(self):
+ for i in range(len(self.indices)):
+ index = self.indices[i]
+ self.script.transform[index].deleted = False
+ bbox = self.script.imageList[index].originalImage.bbox
+ self.script.imageList[index].IDTag = self.owner.mainCanvas.create_image(bbox[0],-bbox[3],anchor=NW,tags=("image"),image=self.script.imageList[index].itk)
+ self.owner.bindEvents(self.script.imageList[index].IDTag)
+ self.owner.resetStacking()
+
+ def __str__(self):
+ return "Deletion of item "+str(self.indices)+" in "+str(self.script)
+
+class editScriptAction(UndoRedoStack.action):
+ def __init__(self,owner,script,newText,oldText):
+ self.owner = owner
+ self.script = script
+ self.newText = newText
+ self.oldText = oldText
+ UndoRedoStack.action.__init__(self,self.modS,self.unModS)
+
+ def modS(self):
+ self.script.setScript(self.newText)
+ self.script.drawOnCanvas(self.owner.mainCanvas,self.owner.magnification)
+ self.owner.bindItemEvents(self.script)
+
+ def unModS(self):
+ self.script.setScript(self.oldText)
+ self.script.drawOnCanvas(self.owner.mainCanvas,self.owner.magnification)
+ self.owner.bindItemEvents(self.script)
+
+ def __str__(self):
+ return "Modification of a script"
+
+class clearItemTransformsAction(UndoRedoStack.action):
+ def __init__(self,owner,item,oldTransforms):
+ self.owner = owner
+ self.item = item
+ self.oldTransforms = oldTransforms
+ UndoRedoStack.action.__init__(self,self.clearF,self.unClearF)
+
+ def clearF(self):
+ for i in range(len(self.oldTransforms)):
+ self.item.transform[i] = xasy2asy.identity()
+ self.item.drawOnCanvas(self.owner.mainCanvas,self.owner.magnification)
+
+ def unClearF(self):
+ for i in range(len(self.oldTransforms)):
+ self.item.transform[i] = self.oldTransforms[i]
+ self.item.drawOnCanvas(self.owner.mainCanvas,self.owner.magnification)
+
+ def __str__(self):
+ return "Clear the transforms of "+str(self.item)+" from "+str(self.oldTransforms)
+
+class itemRaiseAction(UndoRedoStack.action):
+ def __init__(self,owner,items,oldPositions):
+ self.owner = owner
+ self.items = items[:]
+ self.oldPositions = oldPositions[:]
+ UndoRedoStack.action.__init__(self,self.raiseI,self.unRaiseI)
+
+ def raiseI(self):
+ for item in self.items:
+ self.owner.raiseSomething(item)
+
+ def unRaiseI(self):
+ length = len(self.owner.fileItems)
+ indices = self.oldPositions[:]
+ indices = [length-i-1 for i in indices]
+ indices.reverse()
+ for index in indices:
+ for i in range(index):
+ self.owner.raiseSomething(self.owner.fileItems[length-index-1])
+
+ def __str__(self):
+ return "Raise items "+str(self.items)+" from positions "+str(self.oldPositions)
+
+class itemLowerAction(UndoRedoStack.action):
+ def __init__(self,owner,items,oldPositions):
+ self.owner = owner
+ self.items = items[:]
+ self.oldPositions = oldPositions[:]
+ UndoRedoStack.action.__init__(self,self.lowerI,self.unLowerI)
+
+ def lowerI(self):
+ for item in self.items:
+ self.owner.lowerSomething(item)
+
+ def unLowerI(self):
+ indices = self.oldPositions[:]
+ indices.reverse()
+ for index in indices:
+ for i in range(index):
+ self.owner.lowerSomething(self.owner.fileItems[index])
+
+ def __str__(self):
+ return "Lower items "+str(self.items)+" from positions "+str(self.oldPositions)
+
+class addDrawnItemAction(UndoRedoStack.action):
+ def __init__(self,owner,item):
+ self.owner = owner
+ self.item = item
+ UndoRedoStack.action.__init__(self,self.drawF,self.unDrawF)
+
+ def drawF(self):
+ self.owner.addItemToFile(self.item)
+ self.item.drawOnCanvas(self.owner.mainCanvas,self.owner.magnification,forceAddition=True)
+ self.owner.bindItemEvents(self.item)
+
+ def unDrawF(self):
+ self.item.removeFromCanvas(self.owner.mainCanvas)
+ del self.owner.fileItems[-1]
+ self.owner.propList.delete(0)
+ self.owner.clearSelection()
+
+ def __str__(self):
+ return "Drawing of an item"
+
+class deleteDrawnItemAction(UndoRedoStack.action):
+ def __init__(self,owner,item,index):
+ self.owner = owner
+ self.item = item
+ self.index = index
+ UndoRedoStack.action.__init__(self,self.delF,self.unDelF)
+
+ def delF(self):
+ self.owner.fileItems[self.index].removeFromCanvas(self.owner.mainCanvas)
+ self.owner.propList.delete(len(self.owner.fileItems)-self.index-1)
+ del self.owner.fileItems[self.index]
+
+ def unDelF(self):
+ self.owner.fileItems.insert(self.index,self.item)
+ self.owner.fileItems[self.index].drawOnCanvas(self.owner.mainCanvas,self.owner.magnification,forceAddition=True)
+ self.owner.propList.insert(len(self.owner.fileItems)-self.index-1,self.owner.describeItem(self.item))
+ self.owner.bindItemEvents(self.item)
+
+ def __str__(self):
+ return "Deletion of a drawn item"
+
+class editDrawnItemAction(UndoRedoStack.action):
+ def __init__(self,owner,oldItem,newItem,index):
+ self.owner = owner
+ self.oldItem = oldItem
+ self.newItem = newItem
+ self.index = index
+ UndoRedoStack.action.__init__(self,self.editF,self.unEditF)
+
+ def editF(self):
+ self.owner.fileItems[self.index].removeFromCanvas(self.owner.mainCanvas)
+ self.owner.fileItems[self.index].path = self.newItem.path
+ self.owner.fileItems[self.index].pen = self.newItem.pen
+ self.owner.fileItems[self.index].transform = self.newItem.transform
+ self.owner.fileItems[self.index].IDTag = self.newItem.IDTag
+ self.owner.fileItems[self.index].drawOnCanvas(self.owner.mainCanvas,self.owner.magnification,forceAddition=True)
+ self.owner.bindItemEvents(self.owner.fileItems[self.index])
+
+ def unEditF(self):
+ self.owner.fileItems[self.index].removeFromCanvas(self.owner.mainCanvas)
+ self.owner.fileItems[self.index].path = self.oldItem.path
+ self.owner.fileItems[self.index].pen = self.oldItem.pen
+ self.owner.fileItems[self.index].transform = self.oldItem.transform
+ self.owner.fileItems[self.index].IDTag = self.oldItem.IDTag
+ self.owner.fileItems[self.index].drawOnCanvas(self.owner.mainCanvas,self.owner.magnification,forceAddition=True)
+ self.owner.bindItemEvents(self.owner.fileItems[self.index])
+
+ def __str__(self):
+ return "Modification of a drawn item"