Exemple #1
0
    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()
Exemple #2
0
    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()
Exemple #3
0
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']))
Exemple #4
0
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']))