35 |
|
|
36 |
######## Actions to control pan of main nodes etc. |
######## Actions to control pan of main nodes etc. |
37 |
|
|
38 |
class MovePanFast(AbstractContextController): |
class MovePanFast(ff.util.ControlBinding.AbstractController): |
|
def __init__(self, context, select): |
|
|
AbstractContextController.__init__(self, context) |
|
|
self.select = select |
|
39 |
def isChangeable(self): return 1 |
def isChangeable(self): return 1 |
40 |
def change(self, x, y): |
def change(self, x, y): |
41 |
if dbg: p('move pan fast') |
if dbg: p('move pan fast') |
44 |
f.setPan( fX-x/f.zoom, fY-y/f.zoom) |
f.setPan( fX-x/f.zoom, fY-y/f.zoom) |
45 |
self.obj.chgFast(self.oldVS) |
self.obj.chgFast(self.oldVS) |
46 |
|
|
|
if dbg: self.context.states.p() |
|
|
if self.context.states.hasCtrl(): |
|
|
xy = self.context.states.getPressPans() |
|
|
self.obj.setSelection(xy[0], xy[1], f.getPanX(), f.getPanY()) |
|
|
else: self.obj.setSelection(0,0,0,0) |
|
|
|
|
|
|
|
|
|
|
47 |
class MovePanSlow(ff.util.ControlBinding.AbstractController): |
class MovePanSlow(ff.util.ControlBinding.AbstractController): |
48 |
def isChangeable(self): return 0 |
def isChangeable(self): return 0 |
49 |
def controlPoint(self, x, y, scale): |
def controlPoint(self, x, y, scale): |
91 |
oy = ff.util.RDFUtil.getInt(g, node, CANVAS2D.y) |
oy = ff.util.RDFUtil.getInt(g, node, CANVAS2D.y) |
92 |
self.obj[3].moveNote(node, int(ox+x/f.zoom), int(oy+y/f.zoom) ) |
self.obj[3].moveNote(node, int(ox+x/f.zoom), int(oy+y/f.zoom) ) |
93 |
|
|
94 |
|
####### Actions to control selection |
95 |
|
|
96 |
|
class SelectArea(AbstractContextController): |
97 |
|
def isChangeable(self): return 0 |
98 |
|
def tryFast(self): return 0 |
99 |
|
def controlPoint(self, x, y, scale): |
100 |
|
if dbg: self.context.states.p() |
101 |
|
xy = self.obj.getXYHit(self.oldVS, x,y) |
102 |
|
oldXY = self.context.states.getPressPans() |
103 |
|
self.context.selection.setArea(oldXY[0], oldXY[1], xy[0], xy[1]) |
104 |
|
|
105 |
|
|
106 |
####### Dispatcher for plane events |
####### Dispatcher for plane events etc. |
107 |
|
|
108 |
class PlaneDispatcher(ff.util.ControlBinding): |
class ControlsDispatcher(ff.util.ControlBinding): |
109 |
def __init__(self, main, plane, graph, pp): |
def __init__(self, main, plane, withCtrl, graph, pp): |
110 |
self.m = main |
self.m = main |
111 |
self.p = plane |
self.p = plane |
112 |
self.all = [ main, plane ] |
self.c = withCtrl |
113 |
|
self.all = [ main, plane, withCtrl ] |
114 |
self.last = main |
self.last = main |
115 |
|
self.args = main |
116 |
self.graph = graph |
self.graph = graph |
117 |
self.pp = pp |
self.pp = pp |
118 |
|
|
119 |
def handleEvent(self, main, ev, vs): |
def handleEvent(self, main, ev, vs): |
|
|
|
120 |
if ev.getID() == ev.MOUSE_DRAGGED: |
if ev.getID() == ev.MOUSE_DRAGGED: |
121 |
if dbg: p('drag') |
if dbg: p('drag') |
122 |
return self.last.handleEvent(self.args, ev, vs) |
return self.last.handleEvent(self.args, ev, vs) |
123 |
elif ev.getID() == ev.MOUSE_PRESSED: |
elif ev.getID() == ev.MOUSE_PRESSED: |
124 |
xy = main.getXYHitOnPlane(vs, ev.getX(), ev.getY()) |
xy = main.getXYHit(vs, ev.getX(), ev.getY()) |
125 |
self.context.states.setPressPans(xy[0], xy[1]) |
self.context.states.setPressPans(xy[0], xy[1]) |
126 |
|
if dbg: self.context.states.p() |
127 |
|
|
128 |
if dbg: p('event', ev) |
if dbg: p('event', ev) |
129 |
obj = main.getNodeOnPlane(vs, ev.getX(), ev.getY()) |
obj = main.getNodeOnPlane(vs, ev.getX(), ev.getY()) |
130 |
if dbg: p(obj) |
if dbg: p(obj) |
|
if ev.getID() == ev.MOUSE_CLICKED: |
|
|
if obj != None and self.p.hasBinding(ev): |
|
|
p('object on plane click') |
|
|
self.last = self.p |
|
|
self.args = [main, obj, self.graph, self.pp] |
|
|
return self.p.handleEvent(self.args, ev, vs) |
|
131 |
|
|
132 |
# Drag if something under mouse pointer is accursed! |
self.context.selection.setCurrentPlane(main.getPlane()) |
133 |
if obj != None and self.p.hasBinding(ev) and self.context.isAccursed(obj): |
|
134 |
self.last = self.p |
# Special case if user has pressed 'Ctrl' |
135 |
self.args = [main, obj, self.graph, self.pp] |
if self.context.states.hasCtrl(): |
136 |
else: |
self.last = self.c |
|
p('something else') |
|
|
self.last = self.m |
|
137 |
self.args = main |
self.args = main |
138 |
|
else: |
139 |
|
if ev.getID() == ev.MOUSE_CLICKED: |
140 |
|
if obj != None and self.p.hasBinding(ev): |
141 |
|
self.last = self.p |
142 |
|
self.args = [main, obj, self.graph, self.pp] |
143 |
|
return self.p.handleEvent(self.args, ev, vs) |
144 |
|
|
145 |
|
# Drag if something under mouse pointer is accursed! |
146 |
|
if obj != None and self.p.hasBinding(ev) and self.context.isAccursed(obj): |
147 |
|
self.last = self.p |
148 |
|
self.args = [main, obj, self.graph, self.pp] |
149 |
|
else: |
150 |
|
self.last = self.m |
151 |
|
self.args = main |
152 |
|
|
153 |
|
if 0 and ev.getID() != ev.MOUSE_PRESSED and not self.last.hasPressState(): |
154 |
|
self.removePressState() |
155 |
|
self.last.setPressStateByForce(ev) |
156 |
|
raise 'set press state by force - should not happen', ev |
157 |
return self.last.handleEvent(self.args, ev, vs) |
return self.last.handleEvent(self.args, ev, vs) |
158 |
def removePressState(self): |
def removePressState(self): |
159 |
for c in self.all: |
for c in self.all: |