44 |
def isCanvas(self, mainNode, fenPDF): |
def isCanvas(self, mainNode, fenPDF): |
45 |
return mainNode != None and fenPDF.structure.canvas2d.isCanvas(mainNode.getPlane()) |
return mainNode != None and fenPDF.structure.canvas2d.isCanvas(mainNode.getPlane()) |
46 |
|
|
47 |
|
def getNodeCSbyNode(self, mainNode, fenPDF, vs, node): |
48 |
|
box2screen = mainNode.getBox2Screen() |
49 |
|
plane = mainNode.getPlane() |
50 |
|
if mainNode.getView2D().getContentView2D() == None: |
51 |
|
return None |
52 |
|
return mainNode.getView2D()(). \ |
53 |
|
getContentView2D().getNodeCS(vs,\ |
54 |
|
node, plane, box2screen, box2screen, 0) |
55 |
|
|
56 |
|
|
57 |
|
|
58 |
class NodeMoverActionGrabber(Grabber): |
class NodeMoverActionGrabber(Grabber): |
59 |
def __init__(self, fenpdf, x,y,node, canvas): |
def __init__(self, fenpdf, x,y,node, canvas): |
60 |
self.fenPDF = fenpdf |
self.fenPDF = fenpdf |
120 |
self.node = node |
self.node = node |
121 |
self.x, self.y = x,y |
self.x, self.y = x,y |
122 |
|
|
123 |
|
""" tipNode has content for a tip, i.e., dragged text |
124 |
|
cloud inserted into the underlying node's text. |
125 |
|
'Final content if you drop the text now' |
126 |
|
""" |
127 |
self.tipNode = ff.swamp.Nodes.N() |
self.tipNode = ff.swamp.Nodes.N() |
128 |
self.tipOffset = None |
self.tipOffset = None |
129 |
|
|
131 |
self.drewMainNode = None |
self.drewMainNode = None |
132 |
|
|
133 |
|
|
134 |
## def getNodeCS(self, vs, ev, ignoreNode): |
def getNodeOnPlane(self, vs, ev, ignoreNode): |
135 |
## mainNode = self.mainNodeOfEvent(vs, ev, self.fenPDF) |
mainNode = self.mainNodeOfEvent(vs, ev, self.fenPDF) |
136 |
## if self.isCanvas(mainNode, self.fenPDF): |
if self.isCanvas(mainNode, self.fenPDF): |
137 |
## canvasCS = ff.view.CanvasView2D.getContainerCS(vs, mainNode.getBox2Screen()) |
cs = mainNode.getBox2Screen() |
138 |
## canvasCS = mainNode.getBox2Screen() |
ints = vs.coords.getAllCSAt(cs, ev.getX(), ev.getY()) |
139 |
## p('canvasCS', canvasCS) |
#p('ints:', ints) |
140 |
## ints = vs.coords.getAllCSAt(canvasCS, ev.getX(), ev.getY()) |
for i in ints: |
141 |
## #p(vs.coords.getCSAt( |
node = vs.matcher.getKey(i) |
142 |
## p('ints:', ints) |
if node != ignoreNode: |
143 |
## else: |
return node |
144 |
## raise 'not on canvas' |
else: |
145 |
|
raise 'not on canvas' |
146 |
|
|
147 |
def draw(self, vs): |
def draw(self, vs): |
148 |
if self.ev == None: return |
if self.ev == None: return |
152 |
self.createFlyingNode(vs, self.node, self.ev, self.fenPDF) |
self.createFlyingNode(vs, self.node, self.ev, self.fenPDF) |
153 |
self.drewMainNode = mainNode |
self.drewMainNode = mainNode |
154 |
|
|
155 |
|
viewFunction = self.fenPDF.views.getMultiplexerNodeContentFunction() |
156 |
|
placeable = viewFunction.f(self.fenPDF.fen.graph, self.tipNode) |
157 |
|
cs = vs.orthoBoxCS(0, 'TipNode', -1000,50,50, 1,1, |
158 |
|
placeable.getWidth(), placeable.getHeight()) |
159 |
|
placeable.place(vs, cs) |
160 |
|
|
161 |
|
|
162 |
def eventGrabber(self, ev, vs): |
def eventGrabber(self, ev, vs): |
163 |
self.ev = ev |
self.ev = ev |
170 |
if self.isCanvas(mainNode, self.fenPDF): |
if self.isCanvas(mainNode, self.fenPDF): |
171 |
canvas = mainNode.getPlane() |
canvas = mainNode.getPlane() |
172 |
self.fenPDF.structure.canvas2d.placeOnCanvas(canvas, self.node, self.x, self.y) |
self.fenPDF.structure.canvas2d.placeOnCanvas(canvas, self.node, self.x, self.y) |
173 |
|
p('regenerate') |
174 |
self.fenPDF.animation.regenerateVS() |
self.fenPDF.animation.regenerateVS() |
175 |
else: |
else: |
176 |
if self.isCanvas(mainNode, self.fenPDF): |
if self.isCanvas(mainNode, self.fenPDF): |
184 |
self.fenPDF.animation.reuseVS = 1 |
self.fenPDF.animation.reuseVS = 1 |
185 |
self.fenPDF.animation.animate = 0 |
self.fenPDF.animation.animate = 0 |
186 |
|
|
187 |
if ev.getType() != ev.MOUSE_DRAGGED: |
# if there are a change by offset! |
188 |
if not self.isCanvas(mainNode, self.fenPDF): |
if self.isCanvas(mainNode, self.fenPDF): |
189 |
self.fenPDF.structure.canvas2d.removeNode(self.node) |
node = self.getNodeOnPlane(vs, ev, self.node) |
|
# XXX others also |
|
|
self.fenPDF.structure.canvas2d.placeOnCanvas(self.canvas, self.node, self.x, self.y) |
|
|
p('placed on fen, using default') |
|
|
# temporarily solution, flush drags away... |
|
|
self.fenPDF.events.mouse.mainMouse.flush() |
|
|
self.fenPDF.events.eventHandler.eventGrabber = None |
|
|
self.fenPDF.animation.regenerateVS() |
|
|
|
|
|
vob.AbstractUpdateManager.chg() |
|
|
|
|
|
if 1: return |
|
|
|
|
190 |
|
|
191 |
|
if node != None: |
192 |
|
#p('there\'s a node') |
193 |
|
viewFunction = self.fenPDF.views.getMultiplexerNodeContentFunction() |
194 |
|
placeable = viewFunction.f(self.fenPDF.fen.graph, node) |
195 |
|
if isinstance(placeable, vob.lava.placeable.TextPlaceable): |
196 |
|
#p('textplaceable') |
197 |
|
cs = self.getNodeCSbyNode(mainNode, self.fenPDF, vs, node) |
198 |
|
ptsIn = jarray.array([ev.getX(),ev.getY(),0], 'f') |
199 |
|
ptsOut = jarray.zeros(3, 'f') |
200 |
|
vs.coords.inverseTransformPoints3(cs, ptsIn, ptsOut) |
201 |
|
offset = placeable.getCursorPos(ptsOut[0], ptsOut[1]) |
202 |
|
if self.tipOffset != offset: |
203 |
|
p('regenerate') |
204 |
|
self.fenPDF.animation.regenerateVS() |
205 |
|
self.tipOffset = offset |
206 |
|
|
207 |
|
self.fenPDF.structure.ff.setContent(self.tipNode, \ |
208 |
|
self.fenPDF.structure.ff.getContent(node)) |
209 |
|
self.fenPDF.structure.ff.insert(self.tipNode, offset, \ |
210 |
|
self.fenPDF.structure.ff.getContent(self.node)) |
211 |
|
else: self.hideTipNode(vs) |
212 |
|
else: self.hideTipNode(vs) |
213 |
|
|
|
self.getNodeCS(vs, ev, None) |
|
|
cs = vs.matcher.getCS('NODE_CS') |
|
|
if cs < 2: |
|
|
self.createFlyingNode(vs, self.node, ev, self.fenPDF) |
|
|
return |
|
|
self.transCS = cs |
|
|
|
|
|
if ev.getType() == ev.MOUSE_DRAGGED: |
|
|
# tip panel activism |
|
|
self.showTipPanel(vs, ev) |
|
|
|
|
|
vs.coords.setTranslateParams(self.transCS, ev.getX(), ev.getY()) |
|
214 |
|
|
215 |
self.setFlyingNodeZoom(vs, self.node, self.fenPDF, ev) |
if ev.getType() != ev.MOUSE_DRAGGED: |
216 |
self.fenPDF.animation.reuseVS = 1 |
# XXX others also ? |
217 |
self.fenPDF.animation.animate = 0 |
self.fenPDF.structure.canvas2d.removeNode(self.node) |
218 |
else: |
if not self.isCanvas(mainNode, self.fenPDF): |
|
self.hideTipPanel(vs) |
|
|
buoymanager = self.fenPDF.views.getBuoyManager() |
|
|
mainNode = buoymanager.findTopmostMainNode(vs, ev.getX(), ev.getY()) |
|
|
# if no focus or not canvas view |
|
|
if mainNode == None or not self.fenPDF.structure.canvas2d.isCanvas(mainNode.getPlane()): |
|
219 |
self.fenPDF.structure.ff.insert(self.originalNode, self.originalOffset, |
self.fenPDF.structure.ff.insert(self.originalNode, self.originalOffset, |
220 |
self.fenPDF.structure.ff.getContent(self.node)) |
self.fenPDF.structure.ff.getContent(self.node)) |
221 |
else: |
else: |
222 |
|
node = self.getNodeOnPlane(vs, ev, self.node) |
|
node = mainNode.getNodeOnPlane(vs, ev.getX(), ev.getY()) |
|
223 |
viewFunction = self.fenPDF.views.getMultiplexerNodeContentFunction() |
viewFunction = self.fenPDF.views.getMultiplexerNodeContentFunction() |
224 |
placeable = viewFunction.f(self.fenPDF.fen.graph, node) |
placeable = viewFunction.f(self.fenPDF.fen.graph, node) |
225 |
|
|
226 |
# check if there are text under the mouse cursor |
# check if there are text under the mouse cursor |
227 |
if node != None and isinstance(placeable, vob.lava.placeable.TextPlaceable): |
if node != None and isinstance(placeable, vob.lava.placeable.TextPlaceable): |
228 |
cs = mainNode.getNodeCS(vs, node) |
self.fenPDF.structure.canvas2d.removeNode(self.node) |
229 |
|
cs = self.getNodeCSbyNode(mainNode, self.fenPDF, vs, node) |
230 |
ptsIn = jarray.array([ev.getX(),ev.getY(),0], 'f') |
ptsIn = jarray.array([ev.getX(),ev.getY(),0], 'f') |
231 |
ptsOut = jarray.zeros(3, 'f') |
ptsOut = jarray.zeros(3, 'f') |
232 |
vs.coords.inverseTransformPoints3(cs, ptsIn, ptsOut) |
vs.coords.inverseTransformPoints3(cs, ptsIn, ptsOut) |
238 |
else: |
else: |
239 |
xy = mainNode.getXYHit(vs, ev.getX(), ev.getY()) |
xy = mainNode.getXYHit(vs, ev.getX(), ev.getY()) |
240 |
self.fenPDF.structure.canvas2d.placeOnCanvas(mainNode.getPlane(), self.node, xy[0], xy[1]) |
self.fenPDF.structure.canvas2d.placeOnCanvas(mainNode.getPlane(), self.node, xy[0], xy[1]) |
241 |
|
|
242 |
|
|
243 |
# temporarily solution, flush drags away... |
# temporarily solution, flush drags away... |
244 |
self.fenPDF.events.mouse.mainMouse.flush() |
self.fenPDF.events.mouse.mainMouse.flush() |
245 |
self.fenPDF.events.eventHandler.eventGrabber = None |
self.fenPDF.events.eventHandler.eventGrabber = None |
246 |
self.fenPDF.animation.regenerateVS() |
self.fenPDF.animation.regenerateVS() |
247 |
|
|
248 |
vob.AbstractUpdateManager.chg() |
vob.AbstractUpdateManager.chg() |
249 |
|
|
250 |
|
def hideTipNode(self, vs): |
251 |
def hideTipPanel(self, vs): |
cs = vs.matcher.getCS('TipNode') |
252 |
cs = vs.matcher.getCS('TipPanel') |
if cs < 2: return |
|
if cs < 2: |
|
|
cs = vs.orthoBoxCS(0, 'TipPanel', 0,0,0, 1,1, 0,0) |
|
253 |
vs.coords.setOrthoBoxParams(cs, 0, 0,0,0,0,0,0) |
vs.coords.setOrthoBoxParams(cs, 0, 0,0,0,0,0,0) |
254 |
|
|
|
def showTipPanel(self, vs, ev): |
|
|
self.hideTipPanel(vs) |
|
|
|
|
|
buoymanager = self.fenPDF.views.getBuoyManager() |
|
|
mainNode = buoymanager.findTopmostMainNode(vs, ev.getX(), ev.getY()) |
|
|
if mainNode == None: return |
|
|
node = mainNode.getNodeOnPlane(vs, ev.getX(), ev.getY()) |
|
|
if node == None: return |
|
|
viewFunction = self.fenPDF.views.getMultiplexerNodeContentFunction() |
|
|
placeable = viewFunction.f(self.fenPDF.fen.graph, node) |
|
|
if not isinstance(placeable, vob.lava.placeable.TextPlaceable): return |
|
|
|
|
|
cs = mainNode.getNodeCS(vs, node) |
|
|
ptsIn = jarray.array([ev.getX(),ev.getY(),0], 'f') |
|
|
ptsOut = jarray.zeros(3, 'f') |
|
|
vs.coords.inverseTransformPoints3(cs, ptsIn, ptsOut) |
|
|
offset = placeable.getCursorPos(ptsOut[0], ptsOut[1]) |
|
|
if self.tipOffset != offset: |
|
|
self.fenPDF.animation.regenerateVS() |
|
|
self.tipOffset = offset |
|
|
|
|
|
self.fenPDF.structure.ff.setContent(self.tipNode, \ |
|
|
self.fenPDF.structure.ff.getContent(node)) |
|
|
self.fenPDF.structure.ff.insert(self.tipNode, offset, \ |
|
|
self.fenPDF.structure.ff.getContent(self.node)) |
|
|
|
|
|
viewFunction = self.fenPDF.views.getMultiplexerNodeContentFunction() |
|
|
placeable = viewFunction.f(self.fenPDF.fen.graph, self.tipNode) |
|
|
cs = vs.matcher.getCS('TipPanel') |
|
|
vs.coords.setOrthoBoxParams(cs, -1000,50,50, 1,1, |
|
|
placeable.getWidth(), placeable.getHeight()) |
|
|
placeable.place(vs, cs) |
|
|
vob.AbstractUpdateManager.setNoAnimation() |
|
|
vob.AbstractUpdateManager.chg() |
|
|
|
|
|
|
|
|
|
|