[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:
carlopav
2019-12-30 22:37:18 +01:00
committed by Yorik van Havre
parent 1bbfc71f79
commit e238a4b9fc
2 changed files with 101 additions and 38 deletions

View File

@@ -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:

View File

@@ -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))