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