diff --git a/src/Mod/Path/PathScripts/PathToolBitEdit.py b/src/Mod/Path/PathScripts/PathToolBitEdit.py index c3e0120149..318229b19a 100644 --- a/src/Mod/Path/PathScripts/PathToolBitEdit.py +++ b/src/Mod/Path/PathScripts/PathToolBitEdit.py @@ -42,26 +42,31 @@ def translate(context, text, disambig=None): class ToolBitEditor(object): '''UI and controller for editing a ToolBit. - The controller embeds the UI to the parentWidget which has to have a layout attached to it. + The controller embeds the UI to the parentWidget which has to have a + layout attached to it. ''' - def __init__(self, tool, parentWidget=None, ondone=None): + def __init__(self, tool, parentWidget=None, loadBitBody=True): + PathLog.track() self.form = FreeCADGui.PySideUic.loadUi(":/panels/ToolBitEditor.ui") if parentWidget: self.form.setParent(parentWidget) parentWidget.layout().addWidget(self.form) - self.ondone = ondone - self.tool = tool + self.loadbitbody = loadBitBody if not tool.BitShape: self.tool.BitShape = 'endmill.fcstd' - self.tool.Proxy.loadBitBody(self.tool) + + if self.loadbitbody: + self.tool.Proxy.loadBitBody(self.tool) + self.setupTool(self.tool) self.setupAttributes(self.tool) def setupTool(self, tool): + PathLog.track() layout = self.form.bitParams.layout() for i in range(layout.rowCount() - 1, -1, -1): layout.removeRow(i) @@ -71,7 +76,8 @@ class ToolBitEditor(object): if tool.getGroupOfProperty(name) == PathToolBit.PropertyGroupBit: qsb = ui.createWidget('Gui::QuantitySpinBox') editor[name] = PathGui.QuantitySpinBox(qsb, tool, name) - label = QtGui.QLabel(re.sub('([A-Z][a-z]+)', r' \1', re.sub('([A-Z]+)', r' \1', name))) + label = QtGui.QLabel(re.sub('([A-Z][a-z]+)', r' \1', + re.sub('([A-Z]+)', r' \1', name))) layout.addRow(label, qsb) self.bitEditor = editor img = tool.Proxy.getBitThumbnail(tool) @@ -81,6 +87,7 @@ class ToolBitEditor(object): self.form.image.setPixmap(QtGui.QPixmap()) def setupAttributes(self, tool): + PathLog.track() self.proto = PathToolBit.AttributePrototype() self.props = sorted(self.proto.properties) self.delegate = PathSetupSheetGui.Delegate(self.form) @@ -101,10 +108,15 @@ class ToolBitEditor(object): else: - self.model.setData(self.model.index(i, 0), isset, QtCore.Qt.EditRole) - self.model.setData(self.model.index(i, 1), name, QtCore.Qt.EditRole) - self.model.setData(self.model.index(i, 2), prop, PathSetupSheetGui.Delegate.PropertyRole) - self.model.setData(self.model.index(i, 2), prop.displayString(), QtCore.Qt.DisplayRole) + self.model.setData(self.model.index(i, 0), isset, + QtCore.Qt.EditRole) + self.model.setData(self.model.index(i, 1), name, + QtCore.Qt.EditRole) + self.model.setData(self.model.index(i, 2), prop, + PathSetupSheetGui.Delegate.PropertyRole) + self.model.setData(self.model.index(i, 2), + prop.displayString(), + QtCore.Qt.DisplayRole) self.model.item(i, 0).setCheckable(True) self.model.item(i, 0).setText('') @@ -143,13 +155,15 @@ class ToolBitEditor(object): self.model.dataChanged.connect(self.updateData) def updateData(self, topLeft, bottomRight): - # pylint: disable=unused-argument + PathLog.track() if 0 == topLeft.column(): - isset = self.model.item(topLeft.row(), 0).checkState() == QtCore.Qt.Checked + isset = self.model.item(topLeft.row(), + 0).checkState() == QtCore.Qt.Checked self.model.item(topLeft.row(), 1).setEnabled(isset) self.model.item(topLeft.row(), 2).setEnabled(isset) def accept(self): + PathLog.track() self.refresh() self.tool.Proxy.unloadBitBody(self.tool) @@ -158,11 +172,14 @@ class ToolBitEditor(object): prop = self.proto.getProperty(name) enabled = self.model.item(i, 0).checkState() == QtCore.Qt.Checked if enabled and not prop.getValue() is None: - prop.setupProperty(self.tool, name, PathToolBit.PropertyGroupAttribute, prop.getValue()) + prop.setupProperty(self.tool, name, + PathToolBit.PropertyGroupAttribute, + prop.getValue()) elif hasattr(self.tool, name): self.tool.removeProperty(name) def reject(self): + PathLog.track() self.tool.Proxy.unloadBitBody(self.tool) def updateUI(self): @@ -174,6 +191,7 @@ class ToolBitEditor(object): self.bitEditor[editor].updateSpinBox() def updateShape(self): + PathLog.track() self.tool.BitShape = str(self.form.shapePath.text()) self.setupTool(self.tool) self.form.toolName.setText(self.tool.Label) @@ -182,7 +200,6 @@ class ToolBitEditor(object): self.bitEditor[editor].updateSpinBox() def updateTool(self): - # pylint: disable=protected-access PathLog.track() self.tool.Label = str(self.form.toolName.text()) self.tool.BitShape = str(self.form.shapePath.text()) @@ -190,7 +207,7 @@ class ToolBitEditor(object): for editor in self.bitEditor: self.bitEditor[editor].updateProperty() - self.tool.Proxy._updateBitShape(self.tool) + # self.tool.Proxy._updateBitShape(self.tool) def refresh(self): PathLog.track() @@ -200,21 +217,19 @@ class ToolBitEditor(object): self.form.blockSignals(False) def selectShape(self): + PathLog.track() path = self.tool.BitShape if not path: path = PathPreferences.lastPathToolShape() foo = QtGui.QFileDialog.getOpenFileName(self.form, - "Path - Tool Shape", - path, - "*.fcstd") + "Path - Tool Shape", + path, + "*.fcstd") if foo and foo[0]: PathPreferences.setLastPathToolShape(os.path.dirname(foo[0])) self.form.shapePath.setText(foo[0]) self.updateShape() - def ok(self): - self.form.close() - def setupUI(self): PathLog.track() self.updateUI() @@ -222,8 +237,3 @@ class ToolBitEditor(object): self.form.toolName.editingFinished.connect(self.refresh) self.form.shapePath.editingFinished.connect(self.updateShape) self.form.shapeSet.clicked.connect(self.selectShape) - self.form.buttonBox.accepted.connect(self.ok) - self.form.buttonBox.rejected.connect(self.ok) - if self.ondone is not None: - self.form.buttonBox.rejected.connect(self.ondone) - diff --git a/src/Mod/Path/PathScripts/PathToolBitGui.py b/src/Mod/Path/PathScripts/PathToolBitGui.py index 9242dfc033..35deff9db2 100644 --- a/src/Mod/Path/PathScripts/PathToolBitGui.py +++ b/src/Mod/Path/PathScripts/PathToolBitGui.py @@ -36,12 +36,14 @@ __author__ = "sliptonic (Brad Collette)" __url__ = "https://www.freecadweb.org" __doc__ = "Task panel editor for a ToolBit" + # Qt translation handling def translate(context, text, disambig=None): return QtCore.QCoreApplication.translate(context, text, disambig) -#PathLog.setLevel(PathLog.Level.DEBUG, PathLog.thisModule()) -#PathLog.trackModule(PathLog.thisModule()) +# PathLog.setLevel(PathLog.Level.DEBUG, PathLog.thisModule()) +# PathLog.trackModule(PathLog.thisModule()) + class ViewProvider(object): '''ViewProvider for a ToolBit. @@ -58,7 +60,7 @@ class ViewProvider(object): def attach(self, vobj): PathLog.track(vobj.Object) self.vobj = vobj - self.obj = vobj.Object + self.obj = vobj.Object def getIcon(self): png = self.obj.Proxy.getBitThumbnail(self.obj) @@ -113,6 +115,7 @@ class ViewProvider(object): def doubleClicked(self, vobj): self.setEdit(vobj) + class TaskPanel: '''TaskPanel for the SetupSheet - if it is being edited directly.''' @@ -123,14 +126,16 @@ class TaskPanel: self.editor = PathToolBitEdit.ToolBitEditor(self.obj) self.form = self.editor.form self.deleteOnReject = deleteOnReject - FreeCAD.ActiveDocument.openTransaction(translate('PathToolBit', 'Edit ToolBit')) + FreeCAD.ActiveDocument.openTransaction(translate('PathToolBit', + 'Edit ToolBit')) def reject(self): FreeCAD.ActiveDocument.abortTransaction() self.editor.reject() FreeCADGui.Control.closeDialog() if self.deleteOnReject: - FreeCAD.ActiveDocument.openTransaction(translate('PathToolBit', 'Uncreate ToolBit')) + FreeCAD.ActiveDocument.openTransaction(translate('PathToolBit', + 'Uncreate ToolBit')) self.editor.reject() FreeCAD.ActiveDocument.removeObject(self.obj.Name) FreeCAD.ActiveDocument.commitTransaction() @@ -155,132 +160,47 @@ class TaskPanel: self.editor.setupUI() -class ToolBitSelector(object): - ToolRole = QtCore.Qt.UserRole + 1 - - def __init__(self): - self.buttons = None - self.editor = None - self.dialog = None - self.form = FreeCADGui.PySideUic.loadUi(':/panels/ToolBitSelector.ui') - self.setupUI() - - def updateTools(self, selected=None): - PathLog.track() - selItem = None - self.form.tools.setUpdatesEnabled(False) - if selected is None and self.form.tools.currentItem(): - selected = self.form.tools.currentItem().text() - self.form.tools.clear() - for tool in sorted(self.loadedTools(), key=lambda t: t.Label): - icon = None - if tool.ViewObject and tool.ViewObject.Proxy: - icon = tool.ViewObject.Proxy.getIcon() - if icon and isinstance(icon, QtGui.QIcon): - item = QtGui.QListWidgetItem(icon, tool.Label) - else: - item = QtGui.QListWidgetItem(tool.Label) - item.setData(self.ToolRole, tool) - if selected == tool.Label: - selItem = item - self.form.tools.addItem(item) - if selItem: - self.form.tools.setCurrentItem(selItem) - self.updateSelection() - self.form.tools.setUpdatesEnabled(True) - - def getTool(self): - PathLog.track() - self.updateTools() - res = self.form.exec_() - if 1 == res and self.form.tools.currentItem(): - return self.form.tools.currentItem().data(self.ToolRole) - return None - - def loadedTools(self): - PathLog.track() - if FreeCAD.ActiveDocument: - return [o for o in FreeCAD.ActiveDocument.Objects if hasattr(o, 'Proxy') and isinstance(o.Proxy, PathToolBit.ToolBit)] - return [] - - def loadTool(self): - PathLog.track() - tool = LoadTool(self.form) - if tool: - self.updateTools(tool.Label) - - def createTool(self): - PathLog.track() - tool = PathToolBit.Factory.Create() - - def accept(): - self.editor.accept() - self.dialog.done(1) - self.updateTools(tool.Label) - - def reject(): - FreeCAD.ActiveDocument.openTransaction(translate('PathToolBit', 'Uncreate ToolBit')) - self.editor.reject() - self.dialog.done(0) - FreeCAD.ActiveDocument.removeObject(tool.Name) - FreeCAD.ActiveDocument.commitTransaction() - - self.dialog = QtGui.QDialog(self.form) - layout = QtGui.QVBoxLayout(self.dialog) - self.editor = PathToolBitEdit.ToolBitEditor(tool, self.dialog) - self.editor.setupUI() - self.buttons = QtGui.QDialogButtonBox( - QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.Cancel, - QtCore.Qt.Horizontal, self.dialog) - layout.addWidget(self.buttons) - self.buttons.accepted.connect(accept) - self.buttons.rejected.connect(reject) - print(self.dialog.exec_()) - - def updateSelection(self): - PathLog.track() - if self.form.tools.selectedItems(): - self.form.buttonBox.button(QtGui.QDialogButtonBox.Ok).setEnabled(True) - else: - self.form.buttonBox.button(QtGui.QDialogButtonBox.Ok).setEnabled(False) - - def setupUI(self): - PathLog.track() - self.form.toolCreate.clicked.connect(self.createTool) - self.form.toolLoad.clicked.connect(self.loadTool) - self.form.tools.itemSelectionChanged.connect(self.updateSelection) - self.form.tools.doubleClicked.connect(self.form.accept) - class ToolBitGuiFactory(PathToolBit.ToolBitFactory): def Create(self, name='ToolBit', shapeFile=None): - '''Create(name = 'ToolBit') ... creates a new tool bit. - It is assumed the tool will be edited immediately so the internal bit body is still attached.''' - FreeCAD.ActiveDocument.openTransaction(translate('PathToolBit', 'Create ToolBit')) + ''' + Create(name = 'ToolBit') ... creates a new tool bit. + It is assumed the tool will be edited immediately so the internal + bit body is still attached. + ''' + FreeCAD.ActiveDocument.openTransaction(translate('PathToolBit', + 'Create ToolBit')) tool = PathToolBit.ToolBitFactory.Create(self, name, shapeFile) PathIconViewProvider.Attach(tool.ViewObject, name) FreeCAD.ActiveDocument.commitTransaction() return tool -def GetToolFile(parent = None): + +def GetToolFile(parent=None): if parent is None: parent = QtGui.QApplication.activeWindow() - foo = QtGui.QFileDialog.getOpenFileName(parent, 'Tool', PathPreferences.lastPathToolBit(), '*.fctb') + foo = QtGui.QFileDialog.getOpenFileName(parent, 'Tool', + PathPreferences.lastPathToolBit(), + '*.fctb') if foo and foo[0]: PathPreferences.setLastPathToolBit(os.path.dirname(foo[0])) return foo[0] return None -def GetToolFiles(parent = None): + +def GetToolFiles(parent=None): if parent is None: parent = QtGui.QApplication.activeWindow() - foo = QtGui.QFileDialog.getOpenFileNames(parent, 'Tool', PathPreferences.lastPathToolBit(), '*.fctb') + foo = QtGui.QFileDialog.getOpenFileNames(parent, 'Tool', + PathPreferences.lastPathToolBit(), + '*.fctb') if foo and foo[0]: PathPreferences.setLastPathToolBit(os.path.dirname(foo[0][0])) return foo[0] return [] -def GetToolShapeFile(parent = None): + +def GetToolShapeFile(parent=None): if parent is None: parent = QtGui.QApplication.activeWindow() @@ -290,7 +210,8 @@ def GetToolShapeFile(parent = None): elif not os.path.isdir(location): location = PathPreferences.filePath() - fname = QtGui.QFileDialog.getOpenFileName(parent, 'Select Tool Shape', location, '*.fcstd') + fname = QtGui.QFileDialog.getOpenFileName(parent, 'Select Tool Shape', + location, '*.fcstd') if fname and fname[0]: if fname != location: PathPreferences.setLastPathToolShape(location) @@ -298,15 +219,22 @@ def GetToolShapeFile(parent = None): else: return None -def LoadTool(parent = None): - '''LoadTool(parent=None) ... Open a file dialog to load a tool from a file.''' + +def LoadTool(parent=None): + ''' + LoadTool(parent=None) ... Open a file dialog to load a tool from a file. + ''' foo = GetToolFile(parent) return PathToolBit.Factory.CreateFrom(foo) if foo else foo -def LoadTools(parent = None): - '''LoadTool(parent=None) ... Open a file dialog to load a tool from a file.''' + +def LoadTools(parent=None): + ''' + LoadTool(parent=None) ... Open a file dialog to load a tool from a file. + ''' return [PathToolBit.Factory.CreateFrom(foo) for foo in GetToolFiles(parent)] + # Set the factory so all tools are created with UI PathToolBit.Factory = ToolBitGuiFactory() diff --git a/src/Mod/Path/PathScripts/PathToolBitLibraryGui.py b/src/Mod/Path/PathScripts/PathToolBitLibraryGui.py index 07a826ee16..e0fa02a275 100644 --- a/src/Mod/Path/PathScripts/PathToolBitLibraryGui.py +++ b/src/Mod/Path/PathScripts/PathToolBitLibraryGui.py @@ -40,8 +40,8 @@ import traceback import uuid as UUID from functools import partial -PathLog.setLevel(PathLog.Level.DEBUG, PathLog.thisModule()) -PathLog.trackModule(PathLog.thisModule()) +# PathLog.setLevel(PathLog.Level.DEBUG, PathLog.thisModule()) +# PathLog.trackModule(PathLog.thisModule()) _UuidRole = PySide.QtCore.Qt.UserRole + 1 _PathRole = PySide.QtCore.Qt.UserRole + 2 @@ -355,6 +355,7 @@ class ToolBitLibrary(object): def __init__(self): PathLog.track() self.factory = ModelFactory() + self.temptool = None self.toolModel = PySide.QtGui.QStandardItemModel(0, len(self.columnNames())) self.listModel = PySide.QtGui.QStandardItemModel() self.form = FreeCADGui.PySideUic.loadUi(':/panels/ToolBitLibraryEdit.ui') @@ -415,7 +416,6 @@ class ToolBitLibrary(object): self.toolModel.removeRows(row, 1) def toolSelect(self, selected, deselected): - # pylint: disable=unused-argument sel = len(self.toolTableView.selectedIndexes()) > 0 self.form.toolDelete.setEnabled(sel) @@ -440,26 +440,70 @@ class ToolBitLibrary(object): PathPreferences.setLastPathToolLibrary(path) self.loadData() + def cleanupDocument(self): + # This feels like a hack. Remove the toolbit object + # remove the editor from the dialog + # re-enable all the controls + self.temptool.Document.removeObject(self.temptool.Name) + self.temptool = None + widget = self.form.toolTableGroup.children()[-1] + widget.setParent(None) + self.editor = None + self.lockoff() + + def accept(self): + self.temptool.Proxy.saveToFile(self.temptool, self.temptool.File) + self.loadData() + self.cleanupDocument() + + def reject(self): + self.cleanupDocument() + + def lockon(self): + self.toolTableView.setEnabled(False) + self.form.toolCreate.setEnabled(False) + self.form.toolDelete.setEnabled(False) + self.form.toolAdd.setEnabled(False) + self.form.TableList.setEnabled(False) + self.form.libraryOpen.setEnabled(False) + self.form.libraryExport.setEnabled(False) + self.form.addToolTable.setEnabled(False) + self.form.librarySave.setEnabled(False) + + def lockoff(self): + self.toolTableView.setEnabled(True) + self.form.toolCreate.setEnabled(True) + self.form.toolDelete.setEnabled(True) + self.form.toolAdd.setEnabled(True) + self.form.toolTable.setEnabled(True) + self.form.TableList.setEnabled(True) + self.form.libraryOpen.setEnabled(True) + self.form.libraryExport.setEnabled(True) + self.form.addToolTable.setEnabled(True) + self.form.librarySave.setEnabled(True) + def toolEdit(self, selected): item = self.toolModel.item(selected.row(), 0) + + if self.temptool is not None: + self.temptool.Document.removeObject(self.temptool.Name) + if selected.column() == 0: # editing Nr pass else: tbpath = item.data(_PathRole) - - temptool = PathToolBit.ToolBitFactory().CreateFrom(tbpath, 'temptool') - self.editor = PathToolBitEdit.ToolBitEditor(temptool, - self.form.toolTableGroup, ondone=self.toolEditDone) + self.temptool = PathToolBit.ToolBitFactory().CreateFrom(tbpath, 'temptool') + self.editor = PathToolBitEdit.ToolBitEditor(self.temptool, self.form.toolTableGroup, loadBitBody=False) QBtn = QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.Cancel - buttonBox = QtGui.QDialogButtonBox(QBtn) - # self.buttonBox.accepted.connect(self.accept) - # self.buttonBox.rejected.connect(self.reject) + buttonBox.accepted.connect(self.accept) + buttonBox.rejected.connect(self.reject) - layout = self.editor.form.layout() #QVBoxLayout() + layout = self.editor.form.layout() layout.addWidget(buttonBox) - #self.setLayout(self.layout) + self.lockon() + self.editor.setupUI() def toolEditDone(self, success=True): FreeCAD.ActiveDocument.removeObject("temptool")