Simplified UI; added support for arbitrary callbacks for edit of icon view provider - use that to open up job editor with appropriate page open (avoids back dependency from stock gui to job gui).

This commit is contained in:
Markus Lampert
2017-09-04 17:29:07 -07:00
committed by wmayer
parent 40d0f33422
commit bfa8d4ec53
3 changed files with 636 additions and 869 deletions

File diff suppressed because one or more lines are too long

View File

@@ -22,6 +22,8 @@
# * *
# ***************************************************************************
import importlib
__title__ = "Path Icon ViewProvider"
__author__ = "sliptonic (Brad Collette)"
__url__ = "http://www.freecadweb.org"
@@ -39,11 +41,34 @@ class ViewProvider(object):
self.obj = vobj.Object
def __getstate__(self):
return {'icon': self.icon }
attrs = {'icon': self.icon }
if hasattr(self, 'editModule'):
attrs['editModule'] = self.editModule
attrs['editCallback'] = self.editCallback
return attrs
def __setstate__(self, state):
self.icon = state['icon']
if state.get('editModule', None):
self.editModule = state['editModule']
self.editCallback = state['editCallback']
def getIcon(self):
return ":/icons/Path-{}.svg".format(self.icon)
def onEdit(self, callback):
self.editModule = callback.__module__
self.editCallback = callback.__name__
def _onEditCallback(self, edit):
if hasattr(self, 'editModule'):
mod = importlib.import_module(self.editModule)
callback = getattr(mod, self.editCallback)
callback(self.obj, self.vobj, edit)
def setEdit(self, vobj, mode=0):
self._onEditCallback(True)
def unsetEdit(self, arg1, arg2):
self._onEditCallback(False)

View File

@@ -32,6 +32,7 @@ import PathScripts.PathStock as PathStock
import PathScripts.PathToolController as PathToolController
import PathScripts.PathToolLibraryManager as PathToolLibraryManager
import PathScripts.PathUtil as PathUtil
import PathScripts.PathUtils as PathUtils
import math
import sys
@@ -44,12 +45,20 @@ from pivy import coin
def translate(context, text, disambig=None):
return QtCore.QCoreApplication.translate(context, text, disambig)
if False:
if True:
PathLog.setLevel(PathLog.Level.DEBUG, PathLog.thisModule())
PathLog.trackModule(PathLog.thisModule())
else:
PathLog.setLevel(PathLog.Level.INFO, PathLog.thisModule())
def _OpenCloseResourceEditor(obj, vobj, edit):
job = PathUtils.findParentJob(obj)
if job and job.ViewObject and job.ViewObject.Proxy:
if edit:
job.ViewObject.Proxy.editObject(obj)
else:
job.ViewObject.Proxy.uneditObject(obj)
class ViewProvider:
def __init__(self, vobj):
@@ -104,13 +113,16 @@ class ViewProvider:
return hasattr(self, 'deleteOnReject') and self.deleteOnReject
def setEdit(self, vobj, mode=0):
self.taskPanel = TaskPanel(vobj, self.deleteObjectsOnReject())
self.openTaskPanel()
return True
def openTaskPanel(self, activate=None):
self.taskPanel = TaskPanel(self.vobj, self.deleteObjectsOnReject())
FreeCADGui.Control.closeDialog()
FreeCADGui.Control.showDialog(self.taskPanel)
self.taskPanel.setupUi()
self.taskPanel.setupUi(activate)
self.deleteOnReject = False
self.showOriginAxis(True)
return True
def resetTaskPanel(self):
self.showOriginAxis(False)
@@ -120,6 +132,18 @@ class ViewProvider:
if self.taskPanel:
self.taskPanel.reject(False)
def editObject(self, obj):
if obj:
if obj == self.obj.Base:
return self.openTaskPanel('Base')
if obj == self.obj.Stock:
return self.openTaskPanel('Stock')
PathLog.info("Expected a specific object to edit - %s not recognized" % obj.Label)
return self.openTaskPanel()
def uneditObject(self):
self.unsetEdit(None, None)
def getIcon(self):
return ":/icons/Path-Job.svg"
@@ -137,6 +161,14 @@ class ViewProvider:
self.obj.Proxy.onDelete(self.obj, arg2)
return True
def updateData(self, obj, prop):
PathLog.track(obj.Label, prop)
# make sure the resource view providers are setup properly
if prop == 'Base' and self.obj.Base and self.obj.Base.ViewObject and self.obj.Base.ViewObject.Proxy:
self.obj.Base.ViewObject.Proxy.onEdit(_OpenCloseResourceEditor)
if prop == 'Stock' and self.obj.Stock and self.obj.Stock.ViewObject and self.obj.Stock.ViewObject.Proxy:
self.obj.Stock.ViewObject.Proxy.onEdit(_OpenCloseResourceEditor)
class StockEdit(object):
def __init__(self, obj, form):
@@ -168,6 +200,8 @@ class StockEdit(object):
if obj.Stock:
obj.Document.removeObject(self.obj.Stock.Name)
obj.Stock = stock
if stock.ViewObject and stock.ViewObject.Proxy:
stock.ViewObject.Proxy.onEdit(OpenCloseResourceEditor)
def setLengthField(self, widget, prop):
widget.setText(FreeCAD.Units.Quantity(prop.Value, FreeCAD.Units.Length).UserString)
@@ -378,8 +412,8 @@ class TaskPanel:
for o in PathJob.ObjectJob.baseCandidates():
if o != self.obj.Base:
self.form.infoModel.addItem(o.Label, o)
self.selectComboBoxText(self.form.infoModel, self.obj.Proxy.baseObject(self.obj).Label)
self.form.jobModel.addItem(o.Label, o)
self.selectComboBoxText(self.form.jobModel, self.obj.Proxy.baseObject(self.obj).Label)
self.postProcessorDefaultTooltip = self.form.postProcessor.toolTip()
self.postProcessorArgsDefaultTooltip = self.form.postProcessorArguments.toolTip()
@@ -470,10 +504,11 @@ class TaskPanel:
self.obj.PostProcessorArgs = str(self.form.postProcessorArguments.displayText())
self.obj.PostProcessorOutputFile = str(self.form.postProcessorOutputFile.text())
self.obj.Label = str(self.form.infoLabel.text())
self.obj.Label = str(self.form.jobLabel.text())
self.obj.Description = str(self.form.jobDescription.toPlainText())
self.obj.Operations.Group = [self.form.operationsList.item(i).data(self.DataObject) for i in range(self.form.operationsList.count())]
selObj = self.form.infoModel.itemData(self.form.infoModel.currentIndex())
selObj = self.form.jobModel.itemData(self.form.jobModel.currentIndex())
if self.obj.Proxy.baseObject(self.obj) != selObj:
self.baseObjectRestoreVisibility(self.obj)
self.obj.Document.removeObject(self.obj.Base.Name)
@@ -551,9 +586,10 @@ class TaskPanel:
def setFields(self):
'''sets fields in the form to match the object'''
self.form.infoLabel.setText(self.obj.Label)
self.form.postProcessorOutputFile.setText(self.obj.PostProcessorOutputFile)
self.form.jobLabel.setText(self.obj.Label)
self.form.jobDescription.setPlainText(self.obj.Description)
self.form.postProcessorOutputFile.setText(self.obj.PostProcessorOutputFile)
self.selectComboBoxText(self.form.postProcessor, self.obj.PostProcessor)
self.form.postProcessorArguments.setText(self.obj.PostProcessorArgs)
#self.obj.Proxy.onChanged(self.obj, "PostProcessor")
@@ -567,12 +603,12 @@ class TaskPanel:
baseindex = -1
if self.obj.Base:
baseindex = self.form.infoModel.findText(self.obj.Base.Label, QtCore.Qt.MatchFixedString)
baseindex = self.form.jobModel.findText(self.obj.Base.Label, QtCore.Qt.MatchFixedString)
else:
for o in FreeCADGui.Selection.getCompleteSelection():
baseindex = self.form.infoModel.findText(o.Label, QtCore.Qt.MatchFixedString)
baseindex = self.form.jobModel.findText(o.Label, QtCore.Qt.MatchFixedString)
if baseindex >= 0:
self.form.infoModel.setCurrentIndex(baseindex)
self.form.jobModel.setCurrentIndex(baseindex)
self.updateToolController()
self.stockEdit.setFields(self.obj)
@@ -857,13 +893,13 @@ class TaskPanel:
self.form.centerInStockXY.setEnabled(False)
def setupUi(self):
def setupUi(self, activate):
self.updateStockEditor(-1)
self.setFields()
# Info
self.form.infoLabel.editingFinished.connect(self.getFields)
self.form.infoModel.currentIndexChanged.connect(self.getFields)
self.form.jobLabel.editingFinished.connect(self.getFields)
self.form.jobModel.currentIndexChanged.connect(self.getFields)
# Post Processor
self.form.postProcessor.currentIndexChanged.connect(self.getFields)
@@ -880,8 +916,6 @@ class TaskPanel:
self.form.operationEdit.hide() # not supported yet
self.form.activeToolGroup.hide() # not supported yet
self.form.tbWorkplan.widget(1).hide() # default values not supported yet
self.form.tbWorkplan.removeItem(1) # default values not supported yet
# Tool controller
self.form.toolControllerList.itemSelectionChanged.connect(self.toolControllerSelect)
@@ -907,6 +941,18 @@ class TaskPanel:
self.form.moveToOrigin.clicked.connect(self.alignMoveToOrigin)
self.updateSelection()
# set active page
if activate in ['General', 'Base']:
self.form.setCurrentIndex(0)
if activate in ['Output', 'Post Processor']:
self.form.setCurrentIndex(1)
if activate in ['Layout', 'Stock']:
self.form.setCurrentIndex(2)
if activate in ['Tools', 'Tool Controller']:
self.form.setCurrentIndex(3)
if activate in ['Workplan', 'Operations']:
self.form.setCurrentIndex(4)
def open(self):
FreeCADGui.Selection.addObserver(self)
@@ -929,6 +975,8 @@ def Create(base, template=None):
obj = PathJob.Create('Job', base, template)
ViewProvider(obj.ViewObject)
FreeCAD.ActiveDocument.commitTransaction()
obj.ViewObject.Proxy.editObject(obj.Stock)
return obj
except:
PathLog.error(sys.exc_info())
FreeCAD.ActiveDocument.abortTransaction()