[Draft] Context menu for EditTrackers
Initial support for context menu. Menu is triggered by Alt+Click or by pressin E Key. Menu is customized on the clicked object. Supported functions ATM: addPoint, deletePoint.
This commit is contained in:
committed by
Yorik van Havre
parent
1bbfc71f79
commit
e238a4b9fc
@@ -37,7 +37,7 @@ if FreeCAD.GuiUp:
|
||||
import FreeCADGui
|
||||
import DraftTools
|
||||
from DraftTrackers import *
|
||||
from PySide import QtCore
|
||||
from PySide import QtCore, QtGui
|
||||
from PySide.QtCore import QT_TRANSLATE_NOOP
|
||||
from DraftTools import translate
|
||||
|
||||
@@ -408,35 +408,39 @@ class Edit():
|
||||
"""
|
||||
event = event_callback.getEvent()
|
||||
if (event.getState() == coin.SoMouseButtonEvent.DOWN and
|
||||
event.getButton() == event.BUTTON1):#left click
|
||||
if self.ui.addButton.isChecked():
|
||||
self.addPoint(event)
|
||||
return
|
||||
if self.ui.delButton.isChecked():
|
||||
self.delPoint(event)
|
||||
return
|
||||
if Draft.getType(self.obj) == "BezCurve" and (self.ui.sharpButton.isChecked()
|
||||
or self.ui.tangentButton.isChecked() or
|
||||
self.ui.symmetricButton.isChecked()):
|
||||
pos = event.getPosition()
|
||||
node = self.getEditNode(pos)
|
||||
ep = self.getEditNodeIndex(node)
|
||||
if ep is None:
|
||||
event.getButton() == event.BUTTON1
|
||||
):#left click
|
||||
if not event.wasAltDown():
|
||||
if self.ui.addButton.isChecked():
|
||||
self.addPoint(event)
|
||||
return
|
||||
doc = FreeCAD.getDocument(str(node.documentName.getValue()))
|
||||
self.obj = doc.getObject(str(node.objectName.getValue()))
|
||||
if self.obj is None:
|
||||
if self.ui.delButton.isChecked():
|
||||
self.delPoint(event)
|
||||
return
|
||||
if self.ui.sharpButton.isChecked():
|
||||
return self.smoothBezPoint(self.obj, ep, 'Sharp')
|
||||
elif self.ui.tangentButton.isChecked():
|
||||
return self.smoothBezPoint(self.obj, ep, 'Tangent')
|
||||
elif self.ui.symmetricButton.isChecked():
|
||||
return self.smoothBezPoint(self.obj, ep, 'Symmetric')
|
||||
if self.editing is None:
|
||||
self.startEditing(event)
|
||||
else:
|
||||
self.endEditing(self.obj,self.editing, None)
|
||||
if Draft.getType(self.obj) == "BezCurve" and (self.ui.sharpButton.isChecked()
|
||||
or self.ui.tangentButton.isChecked() or
|
||||
self.ui.symmetricButton.isChecked()):
|
||||
pos = event.getPosition()
|
||||
node = self.getEditNode(pos)
|
||||
ep = self.getEditNodeIndex(node)
|
||||
if ep is None:
|
||||
return
|
||||
doc = FreeCAD.getDocument(str(node.documentName.getValue()))
|
||||
self.obj = doc.getObject(str(node.objectName.getValue()))
|
||||
if self.obj is None:
|
||||
return
|
||||
if self.ui.sharpButton.isChecked():
|
||||
return self.smoothBezPoint(self.obj, ep, 'Sharp')
|
||||
elif self.ui.tangentButton.isChecked():
|
||||
return self.smoothBezPoint(self.obj, ep, 'Tangent')
|
||||
elif self.ui.symmetricButton.isChecked():
|
||||
return self.smoothBezPoint(self.obj, ep, 'Symmetric')
|
||||
if self.editing is None:
|
||||
self.startEditing(event)
|
||||
else:
|
||||
self.endEditing(self.obj,self.editing)
|
||||
elif event.wasAltDown(): #left click with ctrl down
|
||||
self.display_tracker_menu(event)
|
||||
|
||||
def mouseMoved(self, event_callback):
|
||||
"mouse moved event handler, update tracker position and update preview ghost"
|
||||
@@ -1687,6 +1691,56 @@ class Edit():
|
||||
self.trackers[self.obj.Name][2].set(self.pl.multVec(FreeCAD.Vector(0,self.obj.Width,0)))
|
||||
self.trackers[self.obj.Name][3].set(self.pl.multVec(FreeCAD.Vector(0,0,self.obj.Height)))
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Context menu
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
def display_tracker_menu(self, event):
|
||||
self.tracker_menu = QtGui.QMenu()
|
||||
self.event = event
|
||||
actions = None
|
||||
if self.overNode:
|
||||
doc = self.overNode.getDocName()
|
||||
obj = FreeCAD.getDocument(doc).getObject(self.overNode.getObjName())
|
||||
# ep = self.getEditNodeIndex(self.overNode) TODO: Fix it
|
||||
if Draft.getType(obj) in ["Line", "Wire"]:
|
||||
actions = ["delete point"]
|
||||
elif Draft.getType(obj) in ["BezCurve"]:
|
||||
actions = ["make sharp", "make tangent", "make symmetric"]
|
||||
else:
|
||||
return
|
||||
else:
|
||||
pos = self.event.getPosition()
|
||||
selobjs = FreeCADGui.ActiveDocument.ActiveView.getObjectsInfo((pos[0],pos[1]))
|
||||
if not selobjs:
|
||||
return
|
||||
for info in selobjs:
|
||||
if not info:
|
||||
return
|
||||
for o in self.objs:
|
||||
if o.Name == info["Object"]:
|
||||
actions = ["add point"]
|
||||
if actions is None:
|
||||
return
|
||||
for a in actions:
|
||||
self.tracker_menu.addAction(a)
|
||||
self.tracker_menu.popup(FreeCADGui.getMainWindow().cursor().pos())
|
||||
QtCore.QObject.connect(self.tracker_menu,QtCore.SIGNAL("triggered(QAction *)"),self.evaluate_menu_action)
|
||||
|
||||
def evaluate_menu_action(self,labelname):
|
||||
action_label = str(labelname.text())
|
||||
if action_label == "make sharp":
|
||||
pass
|
||||
elif action_label == "make tangent":
|
||||
pass
|
||||
elif action_label == "make symmetric":
|
||||
pass
|
||||
elif action_label == "delete point":
|
||||
self.delPoint(self.event)
|
||||
elif action_label == "add point":
|
||||
self.addPoint(self.event)
|
||||
del self.event
|
||||
|
||||
|
||||
|
||||
if FreeCAD.GuiUp:
|
||||
|
||||
@@ -717,19 +717,19 @@ class editTracker(Tracker):
|
||||
self.coords = coin.SoCoordinate3() # this is the coordinate
|
||||
self.coords.point.setValue((pos.x,pos.y,pos.z))
|
||||
if inactive:
|
||||
selnode = coin.SoSeparator()
|
||||
self.selnode = coin.SoSeparator()
|
||||
else:
|
||||
selnode = coin.SoType.fromName("SoFCSelection").createInstance()
|
||||
self.selnode = coin.SoType.fromName("SoFCSelection").createInstance()
|
||||
if name:
|
||||
selnode.useNewSelection = False
|
||||
selnode.documentName.setValue(FreeCAD.ActiveDocument.Name)
|
||||
selnode.objectName.setValue(name)
|
||||
selnode.subElementName.setValue("EditNode"+str(idx))
|
||||
self.selnode.useNewSelection = False
|
||||
self.selnode.documentName.setValue(FreeCAD.ActiveDocument.Name)
|
||||
self.selnode.objectName.setValue(name)
|
||||
self.selnode.subElementName.setValue("EditNode"+str(idx))
|
||||
node = coin.SoAnnotation()
|
||||
selnode.addChild(self.coords)
|
||||
selnode.addChild(self.color)
|
||||
selnode.addChild(self.marker)
|
||||
node.addChild(selnode)
|
||||
self.selnode.addChild(self.coords)
|
||||
self.selnode.addChild(self.color)
|
||||
self.selnode.addChild(self.marker)
|
||||
node.addChild(self.selnode)
|
||||
ontop = not inactive
|
||||
Tracker.__init__(self,children=[node],ontop=ontop,name="editTracker")
|
||||
self.on()
|
||||
@@ -741,6 +741,15 @@ class editTracker(Tracker):
|
||||
p = self.coords.point.getValues()[0]
|
||||
return Vector(p[0],p[1],p[2])
|
||||
|
||||
def getDocName(self):
|
||||
return str(self.selnode.documentName.getValue())
|
||||
|
||||
def getObjName(self):
|
||||
return str(self.selnode.objectName.getValue())
|
||||
|
||||
def getSubelementName(self):
|
||||
return str(self.selnode.subElementName.getValue())
|
||||
|
||||
def move(self,delta):
|
||||
self.set(self.get().add(delta))
|
||||
|
||||
|
||||
Reference in New Issue
Block a user