def initUI(self): self.setWindowTitle(PROJECTMETA.__label__) #self.center() # center window position # create dummy widget (it will be selected if our node doesnot has ctrlWidget) self._dummyWidget = QtWidgets.QWidget(self) # init FlowChart self.initFlowchart() # connect on select QTreeWidgetItem > se text in QLineEdit self.treeWidget.itemActivated.connect( self.on_nodeLibTreeWidget_itemActivated) # init dock widgets css = "color: white; font-size: 12pt; font-weight: bold; background: rgb(102, 102, 204); qproperty-alignment: 'AlignVCenter | AlignHCenter';" label_1 = QtWidgets.QLabel("Node Library") label_1.setStyleSheet(css) self.dockWidget.setTitleBarWidget(label_1) label_2 = QtWidgets.QLabel("Node Controls") label_2.setStyleSheet(css) self.dockWidget_2.setTitleBarWidget(label_2) #init node selector tab, set autocompletion etc #self._nodeNameCompleter = QtWidgets.QCompleter(self) self._nodeNameCompleter = CustomQCompleter(self) self._nodeNameCompleter.setModel(self.uiData.nodeNamesModel()) self._nodeNameCompleter.setCaseSensitivity(QtCore.Qt.CaseInsensitive) self.lineEdit_nodeSelect.setCompleter(self._nodeNameCompleter) # set tree view of node library fill_widget(self.treeWidget, self.uiData.nodeNamesTree()) # create EMPTY Open Recent Actions self.recentFileActs = [] for i in xrange(GlobalOptions.n_recent_files): action = QtGui.QAction(self, visible=False, triggered=self.openRecentFile) self.menuOpen_Recent.addAction(action) self.recentFileActs.append(action) self.menuOpen_Recent.addSeparator() self.actionClearRecent = QtGui.QAction( 'Clear', self, visible=True, triggered=self.on_actionClearRecent) self.menuOpen_Recent.addAction(self.actionClearRecent) # create a tool bar menu button to open recent files and connect it to proper QMenu for widget in self.actionLoad_fc.associatedWidgets(): # loop over assosiated widgets and search for QToolButton, assuming that only one is connected. if isinstance(widget, QtWidgets.QToolButton): widget.setMenu(self.menuOpen_Recent) widget.setPopupMode(QtWidgets.QToolButton.MenuButtonPopup) # now populate recent files QMenu self.uiData.updateRecentFileActions()
def initUI(self): self.setWindowTitle(PROJECTMETA.__label__) #self.center() # center window position # create dummy widget (it will be selected if our node doesnot has ctrlWidget) self._dummyWidget = QtWidgets.QWidget(self) # init FlowChart self.initFlowchart() # connect on select QTreeWidgetItem > se text in QLineEdit self.treeWidget.itemActivated.connect(self.on_nodeLibTreeWidget_itemActivated) # init dock widgets css = "color: white; font-size: 12pt; font-weight: bold; background: rgb(102, 102, 204); qproperty-alignment: 'AlignVCenter | AlignHCenter';" label_1 = QtWidgets.QLabel("Node Library") label_1.setStyleSheet(css) self.dockWidget.setTitleBarWidget(label_1) label_2 = QtWidgets.QLabel("Node Controls") label_2.setStyleSheet(css) self.dockWidget_2.setTitleBarWidget(label_2) #init node selector tab, set autocompletion etc #self._nodeNameCompleter = QtWidgets.QCompleter(self) self._nodeNameCompleter = CustomQCompleter(self) self._nodeNameCompleter.setModel(self.uiData.nodeNamesModel()) self._nodeNameCompleter.setCaseSensitivity(QtCore.Qt.CaseInsensitive) self.lineEdit_nodeSelect.setCompleter(self._nodeNameCompleter) # set tree view of node library fill_widget(self.treeWidget, self.uiData.nodeNamesTree()) # create EMPTY Open Recent Actions self.recentFileActs = [] for i in xrange(GlobalOptions.n_recent_files): action = QtGui.QAction(self, visible=False, triggered=self.openRecentFile) self.menuOpen_Recent.addAction(action) self.recentFileActs.append(action) self.menuOpen_Recent.addSeparator() self.actionClearRecent = QtGui.QAction('Clear', self, visible=True, triggered=self.on_actionClearRecent) self.menuOpen_Recent.addAction(self.actionClearRecent) # create a tool bar menu button to open recent files and connect it to proper QMenu for widget in self.actionLoad_fc.associatedWidgets(): # loop over assosiated widgets and search for QToolButton, assuming that only one is connected. if isinstance(widget, QtWidgets.QToolButton): widget.setMenu(self.menuOpen_Recent) widget.setPopupMode(QtWidgets.QToolButton.MenuButtonPopup) # now populate recent files QMenu self.uiData.updateRecentFileActions()
class MainWindow(QtWidgets.QMainWindow): def __init__(self, app=None): super(MainWindow, self).__init__() self._unittestmode = False #set this to True if running a unittest self._application = app uic.loadUi(projectPath('resources/mainwindow.ui'), self) self.uiData = uiData(self) self.connectActions() self.initUI() self.initGlobalShortcuts() # everything has been inited. Now do some actions # 1) check crash status self.uiData.on_crash_LoadBakFile() def initGlobalShortcuts(self): # for some reason action shotcuts are not always working... change them to global shortcuts QtGui.QShortcut(QtGui.QKeySequence("F1"), self, self.on_actionDocumentation) QtGui.QShortcut(QtGui.QKeySequence("Ctrl+Alt+C"), self, self.on_actionCopy_Selected_Node) QtGui.QShortcut(QtGui.QKeySequence("Ctrl+Alt+V"), self, self.on_actionPaste_Node) def initUI(self): self.setWindowTitle(PROJECTMETA.__label__) #self.center() # center window position # create dummy widget (it will be selected if our node doesnot has ctrlWidget) self._dummyWidget = QtWidgets.QWidget(self) # init FlowChart self.initFlowchart() # connect on select QTreeWidgetItem > se text in QLineEdit self.treeWidget.itemActivated.connect(self.on_nodeLibTreeWidget_itemActivated) # init dock widgets css = "color: white; font-size: 12pt; font-weight: bold; background: rgb(102, 102, 204); qproperty-alignment: 'AlignVCenter | AlignHCenter';" label_1 = QtWidgets.QLabel("Node Library") label_1.setStyleSheet(css) self.dockWidget.setTitleBarWidget(label_1) label_2 = QtWidgets.QLabel("Node Controls") label_2.setStyleSheet(css) self.dockWidget_2.setTitleBarWidget(label_2) #init node selector tab, set autocompletion etc #self._nodeNameCompleter = QtWidgets.QCompleter(self) self._nodeNameCompleter = CustomQCompleter(self) self._nodeNameCompleter.setModel(self.uiData.nodeNamesModel()) self._nodeNameCompleter.setCaseSensitivity(QtCore.Qt.CaseInsensitive) self.lineEdit_nodeSelect.setCompleter(self._nodeNameCompleter) # set tree view of node library fill_widget(self.treeWidget, self.uiData.nodeNamesTree()) # create EMPTY Open Recent Actions self.recentFileActs = [] for i in xrange(GlobalOptions.n_recent_files): action = QtGui.QAction(self, visible=False, triggered=self.openRecentFile) self.menuOpen_Recent.addAction(action) self.recentFileActs.append(action) self.menuOpen_Recent.addSeparator() self.actionClearRecent = QtGui.QAction('Clear', self, visible=True, triggered=self.on_actionClearRecent) self.menuOpen_Recent.addAction(self.actionClearRecent) # create a tool bar menu button to open recent files and connect it to proper QMenu for widget in self.actionLoad_fc.associatedWidgets(): # loop over assosiated widgets and search for QToolButton, assuming that only one is connected. if isinstance(widget, QtWidgets.QToolButton): widget.setMenu(self.menuOpen_Recent) widget.setPopupMode(QtWidgets.QToolButton.MenuButtonPopup) # now populate recent files QMenu self.uiData.updateRecentFileActions() def resetNodeLibraryWidgets(self): #init node selector tab, set autocompletion etc self.uiData.nodeNamesModel().setStringList(self.uiData.nodeNamesList()) # set tree view of node library fill_widget(self.treeWidget, self.uiData.nodeNamesTree()) def connectActions(self): self.actionNew_fc.triggered.connect(self.on_actionNew_fc) self.actionSave_fc.triggered.connect(self.on_actionSave_fc) self.actionSave_As_fc.triggered.connect(self.on_actionSave_As_fc) self.actionLoad_fc.triggered.connect(self.on_actionLoad_fc) self.actionAdd_item_to_library.triggered.connect(self.on_actionAdd_item_to_library) self.actionLoadLibrary.triggered.connect(self.on_actionLoadLibrary) self.actionReloadDefaultLib.triggered.connect(self.on_actionReloadDefaultLib) self.actionCopy_Selected_Node.triggered.connect(self.on_actionCopy_Selected_Node) self.actionPaste_Node.triggered.connect(self.on_actionPaste_Node) self.actionDelete_Node.triggered.connect(self.on_actionDelete_Node) self.actionAbout.triggered.connect(self.on_actionAbout) self.actionDocumentation.triggered.connect(self.on_actionDocumentation) self.actionQuit.triggered.connect(self.closeEvent) def connectFCSignals(self): ''' self.fc.sigFileLoaded - file is loaded self.fc.sigFileSaved - file saved self.fc.sigChartChanged - flowchart is changed self.fc.sigChartLoaded - flowchart is loaded (restoreState finished with OK) ''' self.fc.sigFileLoaded.connect(self.uiData.setCurrentFileName) self.fc.sigFileLoaded.connect(self.on_sigFileLoaded) self.fc.sigFileSaved.connect(self.uiData.setCurrentFileName) self.fc.sigFileSaved.connect(self.on_sigFileSaved) self.fc.sigChartChanged.connect(self.on_sigChartChanged) # when the flowchart is loaded self.fc.sigChartLoaded.connect(self.on_sigChartLoaded) self.fc.scene.selectionChanged.connect(self.selectionChanged) self.lineEdit_nodeSelect.editingFinished.connect(self.on_lineEditNodeSelect_editingFinished) self.uiData.sigCurrentFilenameChanged.connect(self.renameFlowchartTab) def initFlowchart(self): # removing dummyWidget created with QtDesigner self.layoutTab1.removeWidget(self.flowChartWidget) del self.flowChartWidget # generating flowchart instance. Further we will work only with this instance, # simply saving/loading it's state. self.fc = Flowchart(parent=self, terminals={ 'dataIn': {'io': 'in'}, 'dataOut': {'io': 'out'}}, library=self.uiData.fclib()) # connecting standard signals of the flowchart self.connectFCSignals() # load default scheme self.on_actionNew_fc(init=True) # placing the real widget on the place of a dummy self.flowChartWidget = self.fc.widget().chartWidget #self.flowChartWidget = self.fc.widget_.chartWidget self.layoutTab1.addWidget(self.flowChartWidget) # now set flowchart canvas able to accept drops from QTreeWidget and create nodes. To do that # we will overwrite default dragEnterEvent and dropEvent with custom methods def dragEnterEvent(ev): ev.accept() def dropEvent(event): pos = event.pos() try: nodeType = event.source().currentItem().text(0) except AttributeError: try: nodeType = event.source().text() except: event.ignore() return #print( "Got drop at fcWidget.view:", nodeType, '. At coords:', pos) #print( self.flowChartWidget.view.viewBox().mapFromView(pos)) #print( self.flowChartWidget.view.viewBox().mapSceneToView(pos)) #print( self.flowChartWidget.view.viewBox().mapToView(pos)) #print( self.flowChartWidget.view.viewBox().mapViewToScene(pos)) mappedPos = self.flowChartWidget.view.viewBox().mapSceneToView(pos) if nodeType in self.uiData.nodeNamesList(): # to avoid drag'n'dropping Group-names self.fc.createNode(nodeType, pos=mappedPos) self.flowChartWidget.view.dragEnterEvent = dragEnterEvent self.flowChartWidget.view.viewBox().setAcceptDrops(True) self.flowChartWidget.view.viewBox().dropEvent = dropEvent def clearStackedWidget(self): """ function deletes all items from QStackWidget""" nItems = self.stackNodeCtrlStackedWidget.count() for i in xrange(nItems): widget = self.stackNodeCtrlStackedWidget.widget(i) self.stackNodeCtrlStackedWidget.removeWidget(widget) del widget # finally add dummy widget - to be selected with nodes that does not have any ctrlWidget() self.stackNodeCtrlStackedWidget.addWidget(self._dummyWidget) @QtCore.pyqtSlot(object, int) def on_nodeLibTreeWidget_itemActivated(self, item, column): self.lineEdit_nodeSelect.setText(item.text(0)) self.lineEdit_nodeSelect.selectAll() @QtCore.pyqtSlot() def on_actionNew_fc(self, init=False): if not init: #if we are not initing if not self.doActionIfUnsavedChanges(message='Are you sure to start new Flowchart from scratch without saving this one?'): return self.clearStackedWidget() self.fc.loadFile(fileName=self.uiData.defaultFlowchartFileName()) #fn = self.fc.ctrlWidget().currentFileName self.uiData.setCurrentFileName(None) self.uiData.setChangesUnsaved(False) @QtCore.pyqtSlot() def on_actionSave_fc(self): self.fc.saveFile(fileName=self.uiData.currentFileName()) return True @QtCore.pyqtSlot() def on_actionSave_As_fc(self, fileName=None): try: startDir = os.path.dirname(self.uiData.currentFileName()) except: startDir = None self.fc.saveFile(fileName=fileName, startDir=startDir) return True @QtCore.pyqtSlot() def on_actionDelete_Node(self): ''' simulate Delete Key Press event''' it = self.fc.getSelectedItem() if it[1] == 'connection': it[0].source.disconnect(it[0].target) elif it[1] == 'node': it[0].node.close() def on_sigFileSaved(self): ''' Executed after the Flowchart() has sended signal sigFileSaved ''' fn = self.fc.widget().currentFileName if fn != self.uiData.defaultFlowchartFileName(): self.uiData.setCurrentFileName(fn) self.uiData.setChangesUnsaved(False) self.uiData.addRecentFile(fn) self.statusBar().showMessage("File saved: "+fn, 5000) @QtCore.pyqtSlot() def on_actionLoad_fc(self, fileName=None): if self.doActionIfUnsavedChanges(message='Are you sure to load another Flowchart without saving this one?'): #directory = os.path.join(os.getcwd(), 'examples') try: startDir = os.path.dirname(self.uiData.currentFileName()) except: startDir = None self.fc.loadFile(startDir=startDir, fileName=fileName) def on_sigFileLoaded(self): ''' Executed after the Flowchart() has sended signal sigFileLoaded ''' fn = self.fc.widget().currentFileName if fn != self.uiData.defaultFlowchartFileName(): self.uiData.setCurrentFileName(fn) self.uiData.setChangesUnsaved(False) self.uiData.addRecentFile(fn) self.statusBar().showMessage("File loaded: "+fn, 5000) def openRecentFile(self): action = self.sender() if action: self.on_actionLoad_fc(fileName=action.data()) @QtCore.pyqtSlot() def on_actionAdd_item_to_library(self): fname = QtGui.QFileDialog.getOpenFileName(self, caption="Load Node Registration File", filter="(*.node)")[0] if not fname: return try: data = readNodeFile(fname) except Exception, err: ErrorPopupMessagBox(self, 'Add Item to Node Library', 'Cannot load information from file <i>{0}</i>'.format(fname)) return try: self.uiData.fclib().registerExternalNode(fname) self.resetNodeLibraryWidgets() QtWidgets.QMessageBox.information(self, "Add Item to Node Library", "Node <b>`{0}`</b> has been successflly added to the Library. Node information has been loaded from file <i>{1}</i>".format(data['classname'], fname)) except Exception, err: ErrorPopupMessagBox(self, 'Add Item to Node Library', 'Cannot load Node <b>`{0}`</b> from file <i>{1}</i>'.format(data['classname'], data['filename']))
class MainWindow(QtWidgets.QMainWindow): def __init__(self, app=None): super(MainWindow, self).__init__() self._unittestmode = False #set this to True if running a unittest self._application = app uic.loadUi(projectPath('resources/mainwindow.ui'), self) self.uiData = uiData(self) self.connectActions() self.initUI() self.initGlobalShortcuts() # everything has been inited. Now do some actions # 1) check crash status self.uiData.on_crash_LoadBakFile() def initGlobalShortcuts(self): # for some reason action shotcuts are not always working... change them to global shortcuts QtGui.QShortcut(QtGui.QKeySequence("F1"), self, self.on_actionDocumentation) QtGui.QShortcut(QtGui.QKeySequence("Ctrl+Alt+C"), self, self.on_actionCopy_Selected_Node) QtGui.QShortcut(QtGui.QKeySequence("Ctrl+Alt+V"), self, self.on_actionPaste_Node) def initUI(self): self.setWindowTitle(PROJECTMETA.__label__) #self.center() # center window position # create dummy widget (it will be selected if our node doesnot has ctrlWidget) self._dummyWidget = QtWidgets.QWidget(self) # init FlowChart self.initFlowchart() # connect on select QTreeWidgetItem > se text in QLineEdit self.treeWidget.itemActivated.connect( self.on_nodeLibTreeWidget_itemActivated) # init dock widgets css = "color: white; font-size: 12pt; font-weight: bold; background: rgb(102, 102, 204); qproperty-alignment: 'AlignVCenter | AlignHCenter';" label_1 = QtWidgets.QLabel("Node Library") label_1.setStyleSheet(css) self.dockWidget.setTitleBarWidget(label_1) label_2 = QtWidgets.QLabel("Node Controls") label_2.setStyleSheet(css) self.dockWidget_2.setTitleBarWidget(label_2) #init node selector tab, set autocompletion etc #self._nodeNameCompleter = QtWidgets.QCompleter(self) self._nodeNameCompleter = CustomQCompleter(self) self._nodeNameCompleter.setModel(self.uiData.nodeNamesModel()) self._nodeNameCompleter.setCaseSensitivity(QtCore.Qt.CaseInsensitive) self.lineEdit_nodeSelect.setCompleter(self._nodeNameCompleter) # set tree view of node library fill_widget(self.treeWidget, self.uiData.nodeNamesTree()) # create EMPTY Open Recent Actions self.recentFileActs = [] for i in xrange(GlobalOptions.n_recent_files): action = QtGui.QAction(self, visible=False, triggered=self.openRecentFile) self.menuOpen_Recent.addAction(action) self.recentFileActs.append(action) self.menuOpen_Recent.addSeparator() self.actionClearRecent = QtGui.QAction( 'Clear', self, visible=True, triggered=self.on_actionClearRecent) self.menuOpen_Recent.addAction(self.actionClearRecent) # create a tool bar menu button to open recent files and connect it to proper QMenu for widget in self.actionLoad_fc.associatedWidgets(): # loop over assosiated widgets and search for QToolButton, assuming that only one is connected. if isinstance(widget, QtWidgets.QToolButton): widget.setMenu(self.menuOpen_Recent) widget.setPopupMode(QtWidgets.QToolButton.MenuButtonPopup) # now populate recent files QMenu self.uiData.updateRecentFileActions() def resetNodeLibraryWidgets(self): #init node selector tab, set autocompletion etc self.uiData.nodeNamesModel().setStringList(self.uiData.nodeNamesList()) # set tree view of node library fill_widget(self.treeWidget, self.uiData.nodeNamesTree()) def connectActions(self): self.actionNew_fc.triggered.connect(self.on_actionNew_fc) self.actionSave_fc.triggered.connect(self.on_actionSave_fc) self.actionSave_As_fc.triggered.connect(self.on_actionSave_As_fc) self.actionLoad_fc.triggered.connect(self.on_actionLoad_fc) self.actionAdd_item_to_library.triggered.connect( self.on_actionAdd_item_to_library) self.actionLoadLibrary.triggered.connect(self.on_actionLoadLibrary) self.actionReloadDefaultLib.triggered.connect( self.on_actionReloadDefaultLib) self.actionCopy_Selected_Node.triggered.connect( self.on_actionCopy_Selected_Node) self.actionPaste_Node.triggered.connect(self.on_actionPaste_Node) self.actionDelete_Node.triggered.connect(self.on_actionDelete_Node) self.actionAbout.triggered.connect(self.on_actionAbout) self.actionDocumentation.triggered.connect(self.on_actionDocumentation) self.actionQuit.triggered.connect(self.closeEvent) def connectFCSignals(self): ''' self.fc.sigFileLoaded - file is loaded self.fc.sigFileSaved - file saved self.fc.sigChartChanged - flowchart is changed self.fc.sigChartLoaded - flowchart is loaded (restoreState finished with OK) ''' self.fc.sigFileLoaded.connect(self.uiData.setCurrentFileName) self.fc.sigFileLoaded.connect(self.on_sigFileLoaded) self.fc.sigFileSaved.connect(self.uiData.setCurrentFileName) self.fc.sigFileSaved.connect(self.on_sigFileSaved) self.fc.sigChartChanged.connect( self.on_sigChartChanged) # when the flowchart is loaded self.fc.sigChartLoaded.connect(self.on_sigChartLoaded) self.fc.scene.selectionChanged.connect(self.selectionChanged) self.lineEdit_nodeSelect.editingFinished.connect( self.on_lineEditNodeSelect_editingFinished) self.uiData.sigCurrentFilenameChanged.connect(self.renameFlowchartTab) def initFlowchart(self): # removing dummyWidget created with QtDesigner self.layoutTab1.removeWidget(self.flowChartWidget) del self.flowChartWidget # generating flowchart instance. Further we will work only with this instance, # simply saving/loading it's state. self.fc = Flowchart(parent=self, terminals={ 'dataIn': { 'io': 'in' }, 'dataOut': { 'io': 'out' } }, library=self.uiData.fclib()) # connecting standard signals of the flowchart self.connectFCSignals() # load default scheme self.on_actionNew_fc(init=True) # placing the real widget on the place of a dummy self.flowChartWidget = self.fc.widget().chartWidget #self.flowChartWidget = self.fc.widget_.chartWidget self.layoutTab1.addWidget(self.flowChartWidget) # now set flowchart canvas able to accept drops from QTreeWidget and create nodes. To do that # we will overwrite default dragEnterEvent and dropEvent with custom methods def dragEnterEvent(ev): ev.accept() def dropEvent(event): pos = event.pos() try: nodeType = event.source().currentItem().text(0) except AttributeError: try: nodeType = event.source().text() except: event.ignore() return #print( "Got drop at fcWidget.view:", nodeType, '. At coords:', pos) #print( self.flowChartWidget.view.viewBox().mapFromView(pos)) #print( self.flowChartWidget.view.viewBox().mapSceneToView(pos)) #print( self.flowChartWidget.view.viewBox().mapToView(pos)) #print( self.flowChartWidget.view.viewBox().mapViewToScene(pos)) mappedPos = self.flowChartWidget.view.viewBox().mapSceneToView(pos) if nodeType in self.uiData.nodeNamesList( ): # to avoid drag'n'dropping Group-names self.fc.createNode(nodeType, pos=mappedPos) self.flowChartWidget.view.dragEnterEvent = dragEnterEvent self.flowChartWidget.view.viewBox().setAcceptDrops(True) self.flowChartWidget.view.viewBox().dropEvent = dropEvent def clearStackedWidget(self): """ function deletes all items from QStackWidget""" nItems = self.stackNodeCtrlStackedWidget.count() for i in xrange(nItems): widget = self.stackNodeCtrlStackedWidget.widget(i) self.stackNodeCtrlStackedWidget.removeWidget(widget) del widget # finally add dummy widget - to be selected with nodes that does not have any ctrlWidget() self.stackNodeCtrlStackedWidget.addWidget(self._dummyWidget) @QtCore.pyqtSlot(object, int) def on_nodeLibTreeWidget_itemActivated(self, item, column): self.lineEdit_nodeSelect.setText(item.text(0)) self.lineEdit_nodeSelect.selectAll() @QtCore.pyqtSlot() def on_actionNew_fc(self, init=False): if not init: #if we are not initing if not self.doActionIfUnsavedChanges( message= 'Are you sure to start new Flowchart from scratch without saving this one?' ): return self.clearStackedWidget() self.fc.loadFile(fileName=self.uiData.defaultFlowchartFileName()) #fn = self.fc.ctrlWidget().currentFileName self.uiData.setCurrentFileName(None) self.uiData.setChangesUnsaved(False) @QtCore.pyqtSlot() def on_actionSave_fc(self): self.fc.saveFile(fileName=self.uiData.currentFileName()) return True @QtCore.pyqtSlot() def on_actionSave_As_fc(self, fileName=None): try: startDir = os.path.dirname(self.uiData.currentFileName()) except: startDir = None self.fc.saveFile(fileName=fileName, startDir=startDir) return True @QtCore.pyqtSlot() def on_actionDelete_Node(self): ''' simulate Delete Key Press event''' it = self.fc.getSelectedItem() if it[1] == 'connection': it[0].source.disconnect(it[0].target) elif it[1] == 'node': it[0].node.close() def on_sigFileSaved(self): ''' Executed after the Flowchart() has sended signal sigFileSaved ''' fn = self.fc.widget().currentFileName if fn != self.uiData.defaultFlowchartFileName(): self.uiData.setCurrentFileName(fn) self.uiData.setChangesUnsaved(False) self.uiData.addRecentFile(fn) self.statusBar().showMessage("File saved: " + fn, 5000) @QtCore.pyqtSlot() def on_actionLoad_fc(self, fileName=None): if self.doActionIfUnsavedChanges( message= 'Are you sure to load another Flowchart without saving this one?' ): #directory = os.path.join(os.getcwd(), 'examples') try: startDir = os.path.dirname(self.uiData.currentFileName()) except: startDir = None self.fc.loadFile(startDir=startDir, fileName=fileName) def on_sigFileLoaded(self): ''' Executed after the Flowchart() has sended signal sigFileLoaded ''' fn = self.fc.widget().currentFileName if fn != self.uiData.defaultFlowchartFileName(): self.uiData.setCurrentFileName(fn) self.uiData.setChangesUnsaved(False) self.uiData.addRecentFile(fn) self.statusBar().showMessage("File loaded: " + fn, 5000) def openRecentFile(self): action = self.sender() if action: self.on_actionLoad_fc(fileName=action.data()) @QtCore.pyqtSlot() def on_actionAdd_item_to_library(self): fname = QtGui.QFileDialog.getOpenFileName( self, caption="Load Node Registration File", filter="(*.node)")[0] if not fname: return try: data = readNodeFile(fname) except Exception, err: ErrorPopupMessagBox( self, 'Add Item to Node Library', 'Cannot load information from file <i>{0}</i>'.format(fname)) return try: self.uiData.fclib().registerExternalNode(fname) self.resetNodeLibraryWidgets() QtWidgets.QMessageBox.information( self, "Add Item to Node Library", "Node <b>`{0}`</b> has been successflly added to the Library. Node information has been loaded from file <i>{1}</i>" .format(data['classname'], fname)) except Exception, err: ErrorPopupMessagBox( self, 'Add Item to Node Library', 'Cannot load Node <b>`{0}`</b> from file <i>{1}</i>'.format( data['classname'], data['filename']))