5 |
import vob |
import vob |
6 |
from org.fenfire.swamp import Nodes |
from org.fenfire.swamp import Nodes |
7 |
from org import fenfire as ff |
from org import fenfire as ff |
8 |
import java |
import java, jarray |
9 |
|
import org.nongnu.libvob.vobs.SelectItemVob as Item |
10 |
|
|
11 |
def p(*s): |
def p(*s): |
12 |
print 'ff.fenpdf.events.mousemenu::', s |
print 'ff.fenpdf.events.mousemenu::', s |
13 |
|
|
14 |
|
dbg = 0 |
15 |
|
|
16 |
class MouseMenu: |
class MouseMenu: |
17 |
|
def __init__(self, fenPDF, states, eventHandler): |
|
def __init__(self, fenPDF, states): |
|
18 |
self.fenPDF = fenPDF |
self.fenPDF = fenPDF |
19 |
self.states = states |
self.states = states |
20 |
|
self.eventHandler = eventHandler |
21 |
self.style = vob.GraphicsAPI.getInstance().getTextStyle('sans', 0, 12) |
self.style = vob.GraphicsAPI.getInstance().getTextStyle('sans', 0, 12) |
22 |
self.makeMainList() |
self.makeMainList() |
23 |
self.hideList() |
self.hideList() |
24 |
|
|
25 |
def makeMainList(self): |
def makeMainList(self): |
26 |
self.selectListVob = vob.vobs.SelectListVob(self.style) |
list = [] |
27 |
if self.states.selection.hasSelection(): |
if self.states.selection.hasSelection(): |
28 |
self.selectListVob.add('Transclude selection (PDF to canvas only)', |
list.append(Item('Transclude selection (PDF to canvas only)', |
29 |
lambda: self.fenPDF.actions.menu.transclude()) |
lambda: self.fenPDF.actions.menu.transclude())) |
30 |
if self.fenPDF.uistate.menu.originatingNode: |
if self.fenPDF.uistate.menu.originatingNode: |
31 |
self.selectListVob.add('<----- Link node to left', |
list.append(Item('<----- Link node to left', |
32 |
lambda: self.fenPDF.actions.menu.structLinkNodes(-1)) |
lambda: self.fenPDF.actions.menu.structLinkNodes(-1))) |
33 |
self.selectListVob.add('Link node to right ----->', |
list.append(Item('Link node to right ----->', |
34 |
lambda: self.fenPDF.actions.menu.structLinkNodes(1)) |
lambda: self.fenPDF.actions.menu.structLinkNodes(1))) |
35 |
self.selectListVob.add('Delete this node', |
list.append(Item('Delete this node', |
36 |
lambda: self.fenPDF.actions.menu.deleteNode()) |
lambda: self.fenPDF.actions.menu.deleteNode())) |
37 |
|
|
38 |
|
list.append(Item('Destroy this canvas', |
39 |
|
lambda: self.fenPDF.actions.menu.killPlane())) |
40 |
|
|
41 |
self.selectListVob.add('Destroy this canvas', |
self.selectListVob = vob.vobs.SelectListVob(list) |
|
lambda: self.fenPDF.actions.menu.killPlane()) |
|
42 |
|
|
43 |
def makeBuoyList(self): |
def makeBuoyList(self): |
44 |
self.selectListVob = vob.vobs.SelectListVob(self.style) |
list = [] |
45 |
self.selectListVob.add('Unlink buoy', |
list.append(Item('Unlink buoy', |
46 |
lambda: self.fenPDF.actions.menu.unlinkBuoy()) |
lambda: self.fenPDF.actions.menu.unlinkBuoy())) |
47 |
|
self.selectListVob = vob.vobs.SelectListVob(list) |
48 |
|
|
49 |
def render(self, vs): |
def render(self, vs): |
50 |
cs = vs.orthoBoxCS(0, 'MOUSE_MENU',-100, self.x, self.y-self.h/2, |
cs = vs.orthoBoxCS(0, 'MOUSE_MENU',-100, self.x, self.y-self.h/2, |
52 |
vs.put(self.selectListVob, cs) |
vs.put(self.selectListVob, cs) |
53 |
|
|
54 |
def showList(self, x, y, who): |
def showList(self, x, y, who): |
55 |
|
self.eventHandler.eventStoler = self.mouse |
56 |
p("showList") |
p("showList") |
57 |
if who == 'buoymenu': |
if who == 'buoymenu': |
58 |
self.makeBuoyList() |
self.makeBuoyList() |
64 |
return |
return |
65 |
|
|
66 |
self.w, self.h = self.selectListVob.width, self.selectListVob.height |
self.w, self.h = self.selectListVob.width, self.selectListVob.height |
67 |
|
self.w *= 2.5 |
68 |
|
self.h *= 2.5 |
69 |
self.x, self.y = x, y |
self.x, self.y = x, y |
|
self.fenPDF.uistate.menu.shown = 1 |
|
70 |
|
|
71 |
def hideList(self): |
def hideList(self): |
72 |
|
self.eventHandler.eventStoler = None |
73 |
p("Hidelist") |
p("Hidelist") |
74 |
if hasattr(self.states, 'lastEvent'): |
if hasattr(self.states, 'lastEvent'): |
75 |
self.x, self.y = self.states.lastEvent.getX(), self.states.lastEvent.getY() |
self.x, self.y = self.states.lastEvent.getX(), self.states.lastEvent.getY() |
76 |
else: self.x, self.y = 0,0 |
else: self.x, self.y = 0,0 |
77 |
self.w, self.h = .0, .0 |
self.w, self.h = .0, .0 |
|
self.fenPDF.uistate.menu.shown = 0 |
|
|
self.fenPDF.animation.regenerateVS() |
|
|
self.fenPDF.animation.noAnimation() |
|
|
vob.AbstractUpdateManager.chg() |
|
|
|
|
|
def getCSKey(self, ev): |
|
|
if not self.fenPDF.uistate.menu.shown : return None |
|
|
vs = self.fenPDF.animation.lastVs |
|
|
|
|
|
cs = vs.matcher.getCS(0, 'MOUSE_MENU') |
|
|
p('cs:', cs) |
|
|
key = vs.getKeyAt(cs, ev.getX(), ev.getY(), None) |
|
|
return key |
|
|
|
|
|
def mousePressed(self, ev): |
|
|
"""A mouse pressed event was received. |
|
|
|
|
|
If it's outside the menu, pop the menu away. |
|
|
|
|
|
Returns: 1 if it was inside a menu, |
|
|
and should be eaten. |
|
|
""" |
|
|
key = self.getCSKey(ev) |
|
|
if self.fenPDF.uistate.menu.shown: |
|
|
if key == None: |
|
|
self.hideList() |
|
|
return 1 |
|
|
else: |
|
|
return 1 |
|
|
else: |
|
|
return 0 |
|
|
|
|
|
def mouseClicked(self, ev): |
|
|
"""A mouse clicked event was received. |
|
|
If it's in the menu, react, otherwise |
|
|
remove the menu. |
|
|
|
|
|
Returns: 1 if the event was consumed. |
|
|
""" |
|
|
key = self.getCSKey(ev) |
|
|
if key != None: |
|
|
try: |
|
|
p('context menu hit!') |
|
|
self.selectListVob.colorize(key, java.awt.Color.red) |
|
|
key = key.object |
|
|
key() |
|
|
self.hideList() |
|
|
finally: # If there's an error, we still need a new scene |
|
|
self.fenPDF.animation.regenerateVS() |
|
|
return 1 |
|
|
else: |
|
|
if self.fenPDF.uistate.menu.shown: |
|
|
self.hideList() |
|
|
# We return 1 here too, since the button press |
|
|
# outside the menu should be eaten. |
|
|
return 1 |
|
|
return 0 |
|
78 |
|
|
79 |
|
# what are these?! |
80 |
|
#self.fenPDF.animation.regenerateVS() |
81 |
|
#self.fenPDF.animation.noAnimation() |
82 |
|
#vob.AbstractUpdateManager.chg() |
83 |
|
|
84 |
|
def mouse(self, ev, oldVS): |
85 |
|
""" Should be called only through eventHandler.eventStoler |
86 |
|
""" |
87 |
|
cs = oldVS.matcher.getCS(0, 'MOUSE_MENU') |
88 |
|
key = oldVS.getKeyAt(cs, ev.getX(), ev.getY(), None) |
89 |
|
p('cs', cs, key) |
90 |
|
if cs < 0: |
91 |
|
p('Something WRONG!!, should not happend! How can ',oldvs,'be *WRONG* vobscene??? should not be reused!') |
92 |
|
return |
93 |
|
|
94 |
|
pts = jarray.zeros(3, 'f') |
95 |
|
if dbg: p('mouse', ev.getX(), ev.getY()) |
96 |
|
oldVS.coords.inverseTransformPoints3(cs, [ev.getX(), ev.getY(), 0.], pts) |
97 |
|
if dbg: p('transformed', pts) |
98 |
|
|
99 |
|
if ev.getType() in [ev.MOUSE_PRESSED, ev.MOUSE_DRAGGED]: |
100 |
|
self.selectListVob.preSelect(pts[0], pts[1]) |
101 |
|
if ev.getType() in [ev.MOUSE_RELEASED, ev.MOUSE_CLICKED]: |
102 |
|
self.selectListVob.postSelect(pts[0], pts[1]) |
103 |
|
|
104 |
|
if key: |
105 |
|
key.run() |
106 |
|
else: |
107 |
|
p('nothing', key) |
108 |
|
self.eventHandler.eventStoler = None |
109 |
|
|
110 |
|
vob.AbstractUpdateManager.setNoAnimation() |
111 |
|
vob.AbstractUpdateManager.chg() |
112 |
|
|