def __init__(self, parent=None): super(PyFlow, self).__init__(parent=parent) self.edHistory = EditorHistory(self) self.setWindowTitle("PyFlow v{0}".format(currentVersion().__str__())) self.undoStack = QUndoStack(self) self.setContentsMargins(1, 1, 1, 1) self.graphManager = GraphManagerSingleton() self.canvasWidget = CanvasWidget(self.graphManager.get(), self) self.canvasWidget.setObjectName("canvasWidget") self.setCentralWidget(self.canvasWidget) self.setTabPosition(QtCore.Qt.AllDockWidgetAreas, QTabWidget.North) self.setDockOptions(QMainWindow.AnimatedDocks | QMainWindow.AllowNestedDocks) self.menuBar = QMenuBar(self) self.menuBar.setGeometry(QtCore.QRect(0, 0, 863, 21)) self.menuBar.setObjectName("menuBar") self.setMenuBar(self.menuBar) self.toolBar = QToolBar(self) self.toolBar.setObjectName("toolBar") self.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar) self.setWindowIcon(QtGui.QIcon(":/LogoBpApp.png")) self._tools = set() self.currentTempDir = "" self.preferencesWindow = PreferencesWindow(self) self.setMouseTracking(True) self._lastClock = 0.0 self.fps = EDITOR_TARGET_FPS self.tick_timer = QtCore.QTimer() self._current_file_name = 'Untitled' self.populateMenu()
def __init__(self, parent=None): super(PyFlow, self).__init__(parent=parent) self._modified = False self.setFocusPolicy(QtCore.Qt.StrongFocus) self.currentSoftware = "" self.edHistory = EditorHistory(self) self.edHistory.statePushed.connect(self.historyStatePushed) self.setWindowTitle(winTitle()) self.undoStack = QUndoStack(self) self.setContentsMargins(1, 1, 1, 1) self.graphManager = GraphManagerSingleton() self.canvasWidget = BlueprintCanvasWidget(self.graphManager.get(), self) self.canvasWidget.setObjectName("canvasWidget") self.setCentralWidget(self.canvasWidget) self.setTabPosition(QtCore.Qt.AllDockWidgetAreas, QTabWidget.North) self.setDockOptions(QMainWindow.AnimatedDocks | QMainWindow.AllowNestedDocks) self.menuBar = QMenuBar(self) self.menuBar.setGeometry(QtCore.QRect(0, 0, 863, 21)) self.menuBar.setObjectName("menuBar") self.setMenuBar(self.menuBar) self.toolBar = QToolBar(self) self.toolBar.setObjectName("toolBar") self.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar) self.setWindowIcon(QtGui.QIcon(":/LogoBpApp.png")) self._tools = set() self.currentTempDir = "" self.preferencesWindow = PreferencesWindow(self) self.setMouseTracking(True) self._lastClock = 0.0 self.fps = EDITOR_TARGET_FPS self.tick_timer = QtCore.QTimer() self._currentFileName = '' self.currentFileName = None
def __init__(self, parent=None): super(PyFlow, self).__init__(parent=parent) self.setupUi(self) self.setWindowIcon(QtGui.QIcon(":/LogoBpApp.png")) self._tools = set() self.currentTempDir = "" self.preferencesWindow = PreferencesWindow(self) self.graphManager = GraphManager() self.canvasWidget = Canvas(self.graphManager, self) self.canvasWidget.requestFillProperties.connect( self.onRequestFillProperties) self.canvasWidget.requestClearProperties.connect( self.onRequestClearProperties) self.graphManager.graphChanged.connect(self.updateGraphTreeLocation) self.updateGraphTreeLocation() self.SceneLayout.addWidget(self.canvasWidget) rxLettersAndNumbers = QtCore.QRegExp('^[a-zA-Z0-9]*$') nameValidator = QtGui.QRegExpValidator(rxLettersAndNumbers, self.leCompoundName) self.leCompoundName.setValidator(nameValidator) self.leCompoundName.returnPressed.connect( self.onActiveCompoundNameAccepted) rxLetters = QtCore.QRegExp('^[a-zA-Z]*$') categoryValidator = QtGui.QRegExpValidator(rxLetters, self.leCompoundCategory) self.leCompoundCategory.setValidator(categoryValidator) self.leCompoundCategory.returnPressed.connect( self.onActiveCompoundCategoryAccepted) self.setMouseTracking(True) self._lastClock = 0.0 self.fps = EDITOR_TARGET_FPS self.tick_timer = QtCore.QTimer() self._current_file_name = 'Untitled' self.populateMenu()
def instance(parent=None): if PyFlow.appInstance is not None: return PyFlow.appInstance settings = ConfigManager().getSettings("APP_STATE") instance = PyFlow(parent) REGISTER_TOOL("PyFlowBase", LoggerTool) a = GET_TOOLS()["PyFlowBase"][0]() a.setAppInstance(instance) instance.registerToolInstance(a) instance.addDockWidget(a.defaultDockArea(), a) a.setAppInstance(instance) a.onShow() try: extraPackagePaths = [] extraPathsString = ConfigManager().getPrefsValue( "PREFS", "General/ExtraPackageDirs") if extraPathsString is not None: extraPathsString = extraPathsString.rstrip(";") extraPathsRaw = extraPathsString.split(";") for rawPath in extraPathsRaw: if os.path.exists(rawPath): extraPackagePaths.append(os.path.normpath(rawPath)) INITIALIZE(additionalPackageLocations=extraPackagePaths) except Exception as e: QMessageBox.critical(None, "Fatal error", str(e)) return instance.startMainLoop() # populate tools canvas = instance.getCanvas() toolbar = instance.getToolbar() geo = settings.value('Editor/geometry') if geo is not None: instance.restoreGeometry(geo) state = settings.value('Editor/state') if state is not None: instance.restoreState(state) settings.beginGroup("Tools") for packageName, registeredToolSet in GET_TOOLS().items(): for ToolClass in registeredToolSet: if issubclass(ToolClass, ShelfTool): ToolInstance = ToolClass() # prevent to be garbage collected instance.registerToolInstance(ToolInstance) ToolInstance.setAppInstance(instance) action = QAction(instance) action.setIcon(ToolInstance.getIcon()) action.setText(ToolInstance.name()) action.setToolTip(ToolInstance.toolTip()) action.setObjectName(ToolInstance.name()) action.triggered.connect(ToolInstance.do) # check if context menu data available menuBuilder = ToolInstance.contextMenuBuilder() if menuBuilder: menuGenerator = ContextMenuGenerator(menuBuilder) menu = menuGenerator.generate() action.setMenu(menu) toolbar.addAction(action) # step to ShelfTools/ToolName group and pass settings inside settings.beginGroup("ShelfTools") settings.beginGroup(ToolClass.name()) ToolInstance.restoreState(settings) settings.endGroup() settings.endGroup() if issubclass(ToolClass, DockTool): menus = instance.menuBar.findChildren(QMenu) pluginsMenuAction = [ m for m in menus if m.title() == "Plugins" ][0].menuAction() toolsMenu = getOrCreateMenu(instance.menuBar, "Tools") instance.menuBar.insertMenu(pluginsMenuAction, toolsMenu) packageSubMenu = getOrCreateMenu(toolsMenu, packageName) toolsMenu.addMenu(packageSubMenu) showToolAction = packageSubMenu.addAction(ToolClass.name()) icon = ToolClass.getIcon() if icon: showToolAction.setIcon(icon) showToolAction.triggered.connect( lambda pkgName=packageName, toolName=ToolClass.name( ): instance.invokeDockToolByName(pkgName, toolName)) settings.beginGroup("DockTools") childGroups = settings.childGroups() for dockToolGroupName in childGroups: # This dock tool data been saved on last shutdown settings.beginGroup(dockToolGroupName) if dockToolGroupName in [ t.uniqueName() for t in instance._tools ]: continue toolName = dockToolGroupName.split("::")[0] instance.invokeDockToolByName(packageName, toolName, settings) settings.endGroup() settings.endGroup() PyFlow.appInstance = instance EditorHistory().saveState("New file") for name, package in GET_PACKAGES().items(): prefsWidgets = package.PrefsWidgets() if prefsWidgets is not None: for categoryName, widgetClass in prefsWidgets.items(): PreferencesWindow().addCategory(categoryName, widgetClass()) PreferencesWindow().selectByName("General") return instance
def instance(parent=None, software=""): assert ( software != "" ), "Invalid arguments. Please pass you software name as second argument!" instance = PyFlow(parent) settings = ConfigManager().getSettings("APP_STATE") instance.currentSoftware = software SessionDescriptor().software = instance.currentSoftware if software == "standalone": editableStyleSheet(instance) try: extraPackagePaths = [] extraPathsString = ConfigManager().getPrefsValue( "PREFS", "General/ExtraPackageDirs") if extraPathsString is not None: extraPathsString = extraPathsString.rstrip(";") extraPathsRaw = extraPathsString.split(";") for rawPath in extraPathsRaw: if os.path.exists(rawPath): extraPackagePaths.append(os.path.normpath(rawPath)) INITIALIZE(additionalPackageLocations=extraPackagePaths, software=software) except Exception as e: QMessageBox.critical(None, "Fatal error", str(e)) return instance.startMainLoop() # populate tools canvas = instance.getCanvas() toolbar = instance.getToolbar() # populate menus instance.populateMenu() geo = settings.value('Editor/geometry') if geo is not None: instance.restoreGeometry(geo) state = settings.value('Editor/state') if state is not None: instance.restoreState(state) settings.beginGroup("Tools") for packageName, registeredToolSet in GET_TOOLS().items(): for ToolClass in registeredToolSet: if issubclass(ToolClass, ShelfTool): ToolInstance = ToolClass() # prevent to be garbage collected instance.registerToolInstance(ToolInstance) ToolInstance.setAppInstance(instance) action = QAction(instance) action.setIcon(ToolInstance.getIcon()) action.setText(ToolInstance.name()) action.setToolTip(ToolInstance.toolTip()) action.setObjectName(ToolInstance.name()) action.triggered.connect(ToolInstance.do) # check if context menu data available menuBuilder = ToolInstance.contextMenuBuilder() if menuBuilder: menuGenerator = ContextMenuGenerator(menuBuilder) menu = menuGenerator.generate() action.setMenu(menu) toolbar.addAction(action) # step to ShelfTools/ToolName group and pass settings inside settings.beginGroup("ShelfTools") settings.beginGroup(ToolClass.name()) ToolInstance.restoreState(settings) settings.endGroup() settings.endGroup() if issubclass(ToolClass, DockTool): menus = instance.menuBar.findChildren(QMenu) pluginsMenuAction = [ m for m in menus if m.title() == "Plugins" ][0].menuAction() toolsMenu = getOrCreateMenu(instance.menuBar, "Tools") instance.menuBar.insertMenu(pluginsMenuAction, toolsMenu) packageSubMenu = getOrCreateMenu(toolsMenu, packageName) toolsMenu.addMenu(packageSubMenu) showToolAction = packageSubMenu.addAction(ToolClass.name()) icon = ToolClass.getIcon() if icon: showToolAction.setIcon(icon) showToolAction.triggered.connect( lambda pkgName=packageName, toolName=ToolClass.name( ): instance.invokeDockToolByName(pkgName, toolName)) settings.beginGroup("DockTools") childGroups = settings.childGroups() for dockToolGroupName in childGroups: # This dock tool data been saved on last shutdown settings.beginGroup(dockToolGroupName) if dockToolGroupName in [ t.uniqueName() for t in instance._tools ]: settings.endGroup() continue toolName = dockToolGroupName.split("::")[0] instance.invokeDockToolByName(packageName, toolName, settings) settings.endGroup() settings.endGroup() PyFlow.appInstance = instance EditorHistory().saveState("New file") for name, package in GET_PACKAGES().items(): prefsWidgets = package.PrefsWidgets() if prefsWidgets is not None: for categoryName, widgetClass in prefsWidgets.items(): PreferencesWindow().addCategory(categoryName, widgetClass()) PreferencesWindow().selectByName("General") if ConfigManager().loadedDefaults: QMessageBox.information( None, "First-time tips", "Welcome to DepthAI GUI. To use this tool efficiently, please do the following:\n\n1. Maximize the window\n2. Enable NodeBox widget (Tools > PyFlowBase > NodeBox)\n3. Enable Properties widget (Tools > PyFlowBase > Properties)\n\nHave fun!" ) return instance