def createLayerWidget(self): self.loadLayers() self.dockL = QtGui.QDockWidget(self.tr("Layers"), self) self.dockL.setObjectName('layerDock') self.docks.add(self.dockL) #self.dockL.setTitleBarWidget(None) #self.dockL.setFeatures(QtGui.QDockWidget.DockWidgetVerticalTitleBar) self.layerModel = LayerModel(self.layersView) self.layerWidget = LayerWidget(self) self.layerWidget.setSourceModel(self.layerModel) #self.hierarchyWidget.setModel(self.hierarchyProxyModel) #self.hierarchyWidget.setSortingEnabled(True) self.dockL.setWidget(self.layerWidget) self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, self.dockL)
class PWindow(QtGui.QMainWindow): def __init__(self): QtGui.QMainWindow.__init__(self) self.docks = set() self.hiddenDocks = set() self._currentView = None self._databaseTimer = None self.database = Database.createDatabase(self) #print os.path.join(os.getcwd(), 'pschem.ini') self.settings = QtCore.QSettings('pschem', 'pschem') self.actions = QtCore.QSettings( os.path.join(os.getcwd(), 'pschem_actions.ini'), QtCore.QSettings.IniFormat) #self.settings.setPath( # QtCore.QSettings.NativeFormat, # QtCore.QSettings.UserScope, # sys.argv[0]) val = self.settings.value('window/geometry') ##if (val.canConvert(QtCore.QVariant.ByteArray)): ## self.restoreGeometry(val.toByteArray()) self.createConsole() self.createToolOptions() self.createLibraryHierarchyWidget() self.createDesignHierarchyWidget() self.createLayerWidget() self.createEditorWidget() self.createActions() self.createMenus() self.createToolBars() self.createStatusBar() #self.setCorner(QtCore.Qt.TopLeftCorner, # QtCore.Qt.LeftDockWidgetArea) #self.setCorner(QtCore.Qt.BottomLeftCorner, # QtCore.Qt.LeftDockWidgetArea) #self.setCorner(QtCore.Qt.TopRightCorner, # QtCore.Qt.RightDockWidgetArea) #self.setCorner(QtCore.Qt.BottomRightCorner, # QtCore.Qt.RightDockWidgetArea) self.tabifyDockWidget(self.dockTool, self.dockH) self.tabifyDockWidget(self.dockH, self.dockD) #val = self.settings.value('window/state') #if (val.canConvert(QtCore.QVariant.ByteArray)): # self.restoreState(val.toByteArray()) def show(self): QtGui.QMainWindow.show(self) #self.controller.repl() def createConsole(self): self.consoleWidget = ConsoleWidget(self) self.controller = Controller(self) #self.controller.setConsole(self.consoleWidget) #self.setCentralWidget(self.consoleWidget) self.dockC = QtGui.QDockWidget(self.tr("Console"), self) self.dockC.setObjectName('consoleDock') self.docks.add(self.dockC) self.dockC.setWidget(self.consoleWidget) self.addDockWidget(QtCore.Qt.BottomDockWidgetArea, self.dockC) def createLibraryHierarchyWidget(self): self.dockD = QtGui.QDockWidget(self.tr("Libraries"), self) self.dockD.setObjectName('librariesDock') self.docks.add(self.dockD) self.libraryHierarchyModel = LibraryHierarchyModel(self.database.libraries) self.libraryHierarchyWidget = LibraryHierarchyWidget(self, self.libraryHierarchyModel) self.dockD.setWidget(self.libraryHierarchyWidget) self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, self.dockD) #self.tabifyDockWidget(QtCore.Qt.LeftDockWidgetArea, dock) def createDesignHierarchyWidget(self): self.dockH = QtGui.QDockWidget(self.tr("Designs"), self) self.dockH.setObjectName('designsDock') self.docks.add(self.dockH) self.designHierarchyModel = DesignHierarchyModel(self.database.designs) self.designHierarchyWidget = DesignHierarchyWidget(self, self.designHierarchyModel) self.dockH.setWidget(self.designHierarchyWidget) self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, self.dockH) def loadLayers(self): self.layers = Layers(self.database) self.layersView = LayersView(self.layers) l = Layer() l.name = 'background' l.type = 'drawing' l.linePattern = LinePattern(LinePattern.Solid, 0, 0) l.fillPattern = FillPattern(FillPattern.Solid) #l.fillPattern = FillPattern(FillPattern.DiagCross) l.color = Color(Color.Black) l.zValue = 0 self.layers.addLayer(l) l = Layer() l.name = 'gridminor' l.type = 'drawing' l.linePattern = LinePattern(LinePattern.Solid, 0, 0) l.fillPattern = FillPattern(FillPattern.Solid) l.color = Color([40, 40, 40]) l.zValue = 1 self.layers.addLayer(l) l = Layer() l.name = 'gridmajor' l.type = 'drawing' l.linePattern = LinePattern(LinePattern.Solid, 0, 0) l.fillPattern = FillPattern(FillPattern.Solid) l.color = Color([50, 50, 50]) l.zValue = 2 self.layers.addLayer(l) l = Layer() l.name = 'axes' l.type = 'drawing' l.linePattern = LinePattern(LinePattern.Solid, 0, 0) l.fillPattern = FillPattern(FillPattern.Solid) l.color = Color([60, 60, 60]) l.zValue = 3 self.layers.addLayer(l) l = Layer() l.name = 'net' l.type = 'drawing' p = LinePattern(LinePattern.Solid, 0.1, 1) p.setEndStyle = LinePattern.RoundEnd l.linePattern = p l.fillPattern = FillPattern(FillPattern.Solid) l.color = Color(Color.Cyan) l.zValue = 100 self.layers.addLayer(l) l = Layer() l.name = 'bus' l.type = 'drawing' p = LinePattern(LinePattern.Solid, 0.5, 1) p.setEndStyle = LinePattern.RoundEnd l.linePattern = p l.fillPattern = FillPattern(FillPattern.Solid) l.color = Color(Color.Cyan) l.zValue = 100 self.layers.addLayer(l) l = Layer() l.name = 'pin' l.type = 'drawing' p = LinePattern(LinePattern.Solid, 0.1, 1) #p.setEndStyle = LinePattern.SquareEnd p.setEndStyle = LinePattern.FlatEnd l.linePattern = p l.fillPattern = FillPattern(FillPattern.Solid) l.color = Color(Color.Red) l.zValue = 200 self.layers.addLayer(l) l = Layer() l.name = 'annotation' #no fill l.type = 'drawing' p = LinePattern(LinePattern.Solid, 0.1, 1) p.setEndStyle = LinePattern.RoundEnd l.linePattern = p l.color = Color(Color.Green) l.zValue = 50 self.layers.addLayer(l) l = Layer() l.name = 'annotation2' l.type = 'drawing' p = LinePattern(LinePattern.Solid, 0.1, 1) p.setEndStyle = LinePattern.RoundEnd l.linePattern = p #l.fillPattern = FillPattern(FillPattern.Solid) l.fillPattern = FillPattern(FillPattern.Dense4) l.color = Color(Color.Green) l.zValue = 55 self.layers.addLayer(l) l = Layer() l.name = 'attribute' l.type = 'drawing' p = LinePattern(LinePattern.Solid, 0.1, 1) p.setEndStyle = LinePattern.RoundEnd l.linePattern = p l.fillPattern = FillPattern(FillPattern.Solid) l.color = Color(Color.Yellow) l.zValue = 400 self.layers.addLayer(l) l = Layer() l.name = 'instance' l.type = 'drawing' p = LinePattern(LinePattern.NoLine, 0, 0) p.setEndStyle = LinePattern.RoundEnd l.linePattern = p l.color = Color(Color.White) l.zValue = 1000 self.layers.addLayer(l) l = Layer() l.name = 'selection' l.type = 'drawing' p = LinePattern(LinePattern.Solid, 0, 1) p.setEndStyle = LinePattern.RoundEnd l.linePattern = p #l.fillPattern = FillPattern(FillPattern.Solid) l.color = Color(Color.Red) l.zValue = 900000 self.layers.addLayer(l) l = Layer() l.name = 'preselection' l.type = 'drawing' p = LinePattern(LinePattern.Dash, 0, 1) p.setEndStyle = LinePattern.FlatEnd l.linePattern = p #l.fillPattern = FillPattern(FillPattern.Solid) l.color = Color(Color.Yellow) l.zValue = 900010 self.layers.addLayer(l) l = Layer() l.name = 'lasso' l.type = 'drawing' p = LinePattern(LinePattern.Dash, 0, 1) p.setEndStyle = LinePattern.FlatEnd l.linePattern = p #l.fillPattern = FillPattern(FillPattern.Solid) l.color = Color(Color.White) l.zValue = 900020 self.layers.addLayer(l) l = Layer() l.name = 'cursor' l.type = 'drawing' p = LinePattern(LinePattern.Solid, 0, 1) l.linePattern = p #l.fillPattern = FillPattern(FillPattern.Solid) l.color = Color(Color.Yellow) l.zValue = 1000000 self.layers.addLayer(l) self.database.layers = self.layers def createLayerWidget(self): self.loadLayers() self.dockL = QtGui.QDockWidget(self.tr("Layers"), self) self.dockL.setObjectName('layerDock') self.docks.add(self.dockL) #self.dockL.setTitleBarWidget(None) #self.dockL.setFeatures(QtGui.QDockWidget.DockWidgetVerticalTitleBar) self.layerModel = LayerModel(self.layersView) self.layerWidget = LayerWidget(self) self.layerWidget.setSourceModel(self.layerModel) #self.hierarchyWidget.setModel(self.hierarchyProxyModel) #self.hierarchyWidget.setSortingEnabled(True) self.dockL.setWidget(self.layerWidget) self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, self.dockL) def createToolOptions(self): self.dockTool = QtGui.QDockWidget(self.tr("Tool Options"), self) self.dockTool.setObjectName('toolOptionsDock') self.docks.add(self.dockTool) #self.selectToolOptions = SelectToolOptions() self.selectToolOptions = ToolOptions() self.dockTool.setWidget(self.selectToolOptions) #self.consoleWidget.setObjectName('') self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, self.dockTool) def createEditorWidget(self): self.mdiArea = QtGui.QMdiArea() #self.mdiArea = QtGui.QTabWidget() #self.mdiArea.addTab(None, '') #versionMaj = QtCore.QT_VERSION / 256 / 256 #versionMin = QtCore.QT_VERSION / 256 % 256 #if versionMaj >= 4 and versionMin >=6: # self.mdiArea.setMovable(True) # self.mdiArea.setTabsClosable(True) self.mdiArea.setViewMode(QtGui.QMdiArea.TabbedView) #self.mdiArea.setTabShape(QtGui.QTabWidget.Triangular) self.setCentralWidget(self.mdiArea) self.connect(self.mdiArea, QtCore.SIGNAL("subWindowActivated(QMdiSubWindow *)"), self.updateMdi); def writeActionsArray(self, array, prefix): self.actions.beginWriteArray(prefix) for i in range(len(array)): self.actions.setArrayIndex(i) if array[i].has_key('type'): self.actions.setValue('type', QtCore.QVariant(array[i]['type'])) if array[i].has_key('text'): self.actions.setValue('text', QtCore.QVariant(array[i]['text'])) if array[i].has_key('longText'): self.actions.setValue('longText', QtCore.QVariant(array[i]['longText'])) if array[i].has_key('icon'): self.actions.setValue('icon', QtCore.QVariant(array[i]['icon'])) if array[i].has_key('shortcut'): self.actions.setValue('shortcut', QtCore.QVariant(array[i]['shortcut'])) if array[i].has_key('command'): self.actions.setValue('command', QtCore.QVariant(array[i]['command'])) self.actions.endArray() def readActionsArray(self, array, prefix): size = self.actions.beginReadArray(prefix) for i in range(size): #print i self.actions.setArrayIndex(i) array.append({}) if self.actions.contains('type'): array[i]['type'] = str(self.actions.value('type').toString()) array[i]['text'] = str(self.actions.value('text').toString()) array[i]['longText'] = str(self.actions.value('longText').toString()) array[i]['longText'] = str(self.actions.value('longText').toString()) array[i]['icon'] = str(self.actions.value('icon').toString()) array[i]['shortcut'] = str(self.actions.value('shortcut').toString()) array[i]['command'] = str(self.actions.value('command').toString()) self.actions.endArray() def createActions(self): #val = self.settings.value('window/state') #if (val.canConvert(QtCore.QVariant.ByteArray)): # self.restoreState(val.toByteArray()) #self.actions.beginGroup('actions') #self.databaseActions = [] #self.schematicActions = [] #self.symbolActions = [] #self.windowsActions = [] #self.helpActions = [] #self.readActionsArray(self.databaseActions, 'actions/database') #self.readActionsArray(self.schematicActions, 'actions/schematic') #self.readActionsArray(self.symbolActions, 'actions/symbol') #self.readActionsArray(self.windowsActions, 'actions/windows') #self.readActionsArray(self.helpActions, 'actions/help') self.openCellViewAct = QtGui.QAction(self.tr("&Open cellview"), self) self.openCellViewAct.setShortcut(self.tr("Ctrl+O")) self.openCellViewAct.setStatusTip(self.tr("Open selected cellview")) self.openCellViewCmd = Command("window.openCellView(window.libraryHierarchyWidget.selectedCellView())") self.connect(self.openCellViewAct, QtCore.SIGNAL("triggered()"), lambda: self.controller.execute(self.openCellViewCmd)) self.exitAct = QtGui.QAction(self.tr("E&xit"), self) self.exitAct.setShortcut(self.tr("Ctrl+Q")) self.exitAct.setStatusTip(self.tr("Exit the application")) self.exitCmd = Command("window.close()") self.connect(self.exitAct, QtCore.SIGNAL("triggered()"), lambda: self.controller.execute(self.exitCmd)) self.toggleDocksAct = QtGui.QAction(self.tr("Toggle Docks"), self) self.toggleDocksAct.setShortcut(self.tr("F11")) self.toggleDocksAct.setStatusTip(self.tr("Toggle visibility of the main window docks")) self.toggleDocksCmd = Command("window.toggleDocks()") self.connect(self.toggleDocksAct, QtCore.SIGNAL("triggered()"), lambda: self.controller.execute(self.toggleDocksCmd)) self.aboutAct = QtGui.QAction(self.tr("&About"), self) self.aboutAct.setStatusTip(self.tr("Show the application's About box")) #self.aboutCmd = Command("About.about()") #self.connect(self.aboutAct, QtCore.SIGNAL("triggered()"), # lambda: self.controller.execute(self.aboutCmd)) self.aboutQtAct = QtGui.QAction(self.tr("About &Qt"), self) self.aboutQtAct.setStatusTip(self.tr("Show the Qt library's About box")) self.aboutQtCmd = Command("QtGui.qApp.aboutQt()") self.connect(self.aboutQtAct, QtCore.SIGNAL("triggered()"), lambda: self.controller.execute(self.aboutQtCmd)) self.tileWindowsAct = QtGui.QAction(self.tr("Tile Windows"), self) self.tileWindowsAct.setStatusTip(self.tr("Tile Windows")) self.tileWindowsCmd = Command("window.mdiArea.tileSubWindows()") self.connect(self.tileWindowsAct, QtCore.SIGNAL("triggered()"), lambda: self.controller.execute(self.tileWindowsCmd)) self.cascadeWindowsAct = QtGui.QAction(self.tr("Cascade Windows"), self) self.cascadeWindowsAct.setStatusTip(self.tr("Cascade Windows")) self.cascadeWindowsCmd = Command("window.mdiArea.cascadeSubWindows()") self.connect(self.cascadeWindowsAct, QtCore.SIGNAL("triggered()"), lambda: self.controller.execute(self.cascadeWindowsCmd)) self.closeWindowsAct = QtGui.QAction(self.tr("Close All Windows"), self) self.closeWindowsAct.setStatusTip(self.tr("Close All Windows")) self.closeWindowsCmd = Command("window.mdiArea.closeAllSubWindow()") self.connect(self.closeWindowsAct, QtCore.SIGNAL("triggered()"), lambda: self.controller.execute(self.closeWindowsCmd)) self.closeWindowAct = QtGui.QAction(self.tr("Close Window"), self) self.closeWindowAct.setStatusTip(self.tr("Close Window")) self.closeWindowCmd = Command("window.mdiArea.closeActiveSubWindow()") self.connect(self.closeWindowAct, QtCore.SIGNAL("triggered()"), lambda: self.controller.execute(self.closeWindowCmd)) self.maximizeWindowAct = QtGui.QAction(self.tr("Maximize Window"), self) self.maximizeWindowAct.setStatusTip(self.tr("Maximize Current Window")) self.maximizeWindowCmd = Command("window.mdiArea.activeSubWindow().showMaximized()") self.connect(self.maximizeWindowAct, QtCore.SIGNAL("triggered()"), lambda: self.controller.execute(self.maximizeWindowCmd)) self.minimizeWindowAct = QtGui.QAction(self.tr("Minimize Window"), self) self.minimizeWindowAct.setStatusTip(self.tr("Minimize Current Window")) self.minimizeWindowCmd = Command("window.mdiArea.activeSubWindow().showMinimized()") self.connect(self.minimizeWindowAct, QtCore.SIGNAL("triggered()"), lambda: self.controller.execute(self.minimizeWindowCmd)) self.zoomInAct = QtGui.QAction(self.tr("Zoom In"), self) self.zoomInAct.setStatusTip(self.tr("Zoom In Mode")) self.zoomInAct.setShortcut(self.tr("Z")) self.zoomInCmd = Command("currentView().modeStack.pushZoomInMode()") self.connect(self.zoomInAct, QtCore.SIGNAL("triggered()"), lambda: self.controller.execute(self.zoomInCmd)) self.moveAct = QtGui.QAction(self.tr("Move"), self) self.moveAct.setStatusTip(self.tr("Move Mode")) self.moveAct.setShortcut(self.tr("M")) self.moveCmd = Command("currentView().modeStack.pushMoveMode()") self.connect(self.moveAct, QtCore.SIGNAL("triggered()"), lambda: self.controller.execute(self.moveCmd)) self.zoomPrevAct = QtGui.QAction(self.tr("Previews View"), self) self.zoomPrevAct.setStatusTip(self.tr("Previews View")) self.zoomPrevAct.setShortcut(self.tr("Shift+Z")) self.zoomPrevCmd = Command("currentView().undoViewStack.popView()") self.connect(self.zoomPrevAct, QtCore.SIGNAL("triggered()"), lambda: self.controller.execute(self.zoomPrevCmd)) self.quitModeAct = QtGui.QAction(self.tr("Quit Mode"), self) self.quitModeAct.setStatusTip(self.tr("Return to Previous Editing Mode")) self.quitModeAct.setShortcut(self.tr("Esc")) self.quitModeCmd = Command("currentView().modeStack.popMode()") self.connect(self.quitModeAct, QtCore.SIGNAL("triggered()"), lambda: self.controller.execute(self.quitModeCmd)) self.panLeftAct = QtGui.QAction(self.tr("Pan Left"), self) self.panLeftAct.setStatusTip(self.tr("Pan the current view left")) self.panLeftAct.setShortcut(self.tr("Left")) self.panLeftCmd = Command("currentView().move(-0.25, 0)") self.connect(self.panLeftAct, QtCore.SIGNAL("triggered()"), lambda: self.controller.execute(self.panLeftCmd)) self.panRightAct = QtGui.QAction(self.tr("Pan Right"), self) self.panRightAct.setStatusTip(self.tr("Pan the current view right")) self.panRightAct.setShortcut(self.tr("Right")) self.panRightCmd = Command("currentView().move(0.25, 0)") self.connect(self.panRightAct, QtCore.SIGNAL("triggered()"), lambda: self.controller.execute(self.panRightCmd)) self.panUpAct = QtGui.QAction(self.tr("Pan Up"), self) self.panUpAct.setStatusTip(self.tr("Pan the current view up")) self.panUpAct.setShortcut(self.tr("Up")) self.panUpCmd = Command("currentView().move(0, 0.25)") self.connect(self.panUpAct, QtCore.SIGNAL("triggered()"), lambda: self.controller.execute(self.panUpCmd)) self.panDownAct = QtGui.QAction(self.tr("Pan Down"), self) self.panDownAct.setStatusTip(self.tr("Pan the current view down")) self.panDownAct.setShortcut(self.tr("Down")) self.panDownCmd = Command("currentView().move(0, -0.25)") self.connect(self.panDownAct, QtCore.SIGNAL("triggered()"), lambda: self.controller.execute(self.panDownCmd)) self.zoomIn2Act = QtGui.QAction(self.tr("Zoom In"), self) self.zoomIn2Act.setStatusTip(self.tr("Zoom the current view in")) self.zoomIn2Act.setShortcut(self.tr(']')) self.zoomIn2Cmd = Command("currentView().zoom(2.0)") self.connect(self.zoomIn2Act, QtCore.SIGNAL("triggered()"), lambda: self.controller.execute(self.zoomIn2Cmd)) #lambda: self.controller.parse("window.currentView().scale(1.41421356237)")) self.zoomOut2Act = QtGui.QAction(self.tr("Zoom Out"), self) self.zoomOut2Act.setStatusTip(self.tr("Zoom the current view out")) self.zoomOut2Act.setShortcut(self.tr('[')) self.zoomOut2Cmd = Command("currentView().zoom(0.5)") self.connect(self.zoomOut2Act, QtCore.SIGNAL("triggered()"), lambda: self.controller.execute(self.zoomOut2Cmd)) self.fitAct = QtGui.QAction(self.tr("Fit"), self) self.fitAct.setStatusTip(self.tr("Fit contents to the current view")) self.fitAct.setShortcut(self.tr('f')) self.fitCmd = Command("currentView().fit()") self.connect(self.fitAct, QtCore.SIGNAL("triggered()"), lambda: self.controller.execute(self.fitCmd)) self.newSchematicAct = QtGui.QAction(self.tr("&New Schematic"), self) self.newSchematicAct.setStatusTip(self.tr("&New Schematic")) self.newSchematicAct.setShortcut(self.tr('Ctrl+N')) self.newSchematicAct.setIcon(QtGui.QIcon(':/images/new.png')) self.newSchematicCmd = Command("window.newSchematic()") self.connect(self.newSchematicAct, QtCore.SIGNAL("triggered()"), lambda: self.controller.execute(self.newSchematicCmd)) #2\text=&New Schematic #2\longText=&New Schematic #2\icon=:/images/new.png #2\shortcut=Ctrl+N #2\command=window.newSchematic() #self.actions.append({}) #self.actions[0]['text'] = 'About &Qt' #self.actions[0]['longText'] = 'About &Qt' #self.actions[0]['command'] = 'QtGui.qApp.aboutQt()' #self.actions.append({}) #self.actions[1]['text'] = '&New Schematic' #self.actions[1]['longText'] = '&New Schematic' #self.actions[1]['icon'] = ':/images/new.png' #self.actions[1]['shortcut'] = ':/images/new.png' #self.actions[1]['command'] = 'window.newSchematic()' def makeLambda(self, arg): "Workaround for Python's lack of decent closures" return lambda : self.controller.parse(arg) def createMenus(self): size = self.actions.beginReadArray('database') self.databaseMenu = self.menuBar().addMenu(self.tr("&Database")) self.databaseToolBar = self.addToolBar(self.tr("File")) self.databaseToolBar.setObjectName('fileToolbar') for i in range(size): self.actions.setArrayIndex(i) if (self.actions.contains('type') and self.actions.value('type').toString() == 'separator'): self.databaseMenu.addSeparator() else: if self.actions.contains('text'): if self.actions.contains('icon'): action = QtGui.QAction( QtGui.QIcon(str(self.actions.value('icon').toString())), str(self.actions.value('text').toString()), self) else: action = QtGui.QAction( str(self.actions.value('text').toString()), self) if self.actions.contains('shortcut'): action.setShortcut( str(self.actions.value('shortcut').toString())) if self.actions.contains('longText'): action.setStatusTip( str(self.actions.value('longText').toString())) if self.actions.contains('command'): self.connect( action, QtCore.SIGNAL('triggered()'), self.makeLambda(str(self.actions.value('command').toString()))) self.databaseMenu.addAction(action) if self.actions.contains('icon'): self.databaseToolBar.addAction(action) self.actions.endArray() self.databaseMenu.addAction(self.openCellViewAct) self.databaseMenu.addAction(self.newSchematicAct) self.databaseMenu.addAction(self.toggleDocksAct) self.databaseMenu.addAction(self.zoomInAct) self.databaseMenu.addAction(self.zoomPrevAct) self.databaseMenu.addAction(self.moveAct) self.databaseMenu.addAction(self.quitModeAct) self.windowsMenu = QtGui.QMenu(self.tr("&Windows")) self.windowsAct = self.menuBar().addMenu(self.windowsMenu) self.menuBar().removeAction(self.windowsAct) self.windowsMenu.addAction(self.tileWindowsAct) self.windowsMenu.addAction(self.cascadeWindowsAct) self.windowsMenu.addSeparator(); self.windowsMenu.addAction(self.closeWindowsAct) self.windowsMenu.addSeparator(); self.windowsMenu.addAction(self.maximizeWindowAct) self.windowsMenu.addAction(self.minimizeWindowAct) self.windowsMenu.addSeparator(); self.windowsMenu.addAction(self.closeWindowAct) self.menuBar().addSeparator() self.helpMenu = self.menuBar().addMenu(self.tr("&Help")) self.helpMenu.addAction(self.aboutAct) self.helpMenu.addAction(self.aboutQtAct) def createToolBars(self): self.databaseToolBar = self.addToolBar(self.tr("File")) self.databaseToolBar.setObjectName('fileToolbar') self.databaseToolBar.addAction(self.newSchematicAct) #self.databaseToolBar.addAction(self.openAct) #self.databaseToolBar.addAction(self.saveAct) self.editToolBar = self.addToolBar(self.tr("Edit")) self.editToolBar.setObjectName('editToolbar') def createStatusBar(self): self.statusBar().showMessage(self.tr("Ready")) def closeEvent(self, event): self.settings.setValue('window/geometry', self.saveGeometry()) self.settings.setValue('window/state', self.saveState()) QtGui.QWidget.closeEvent(self, event) def currentView(self): #return self._currentWindow return self._currentView def currentCellView(self): if self._currentView and self._currentView.scene(): return self._currentView.scene().cellView() #def keyPressEvent(self, event): #key = event.key() #print key #if key == QtCore.Qt.Key_Up: # self.currentWindow().moveView(0, -0.25) #self.centerNode.moveBy(0, -20) #BrushMatrix.translate(0,-20) #elif key == QtCore.Qt.Key_Down: # self.currentWindow().moveView(0, 0.25) #self.centerNode.moveBy(0, 20) #BrushMatrix.translate(0,20) #elif key == QtCore.Qt.Key_Left: # self.currentWindow().moveView(0.25, 0) #self.centerNode.moveBy(-20, 0) #BrushMatrix.translate(-20,0) #elif key == QtCore.Qt.Key_Right: # self.currentWindow().moveView(-0.25, 0) #self.centerNode.moveBy(20, 0) #BrushMatrix.translate(20,0) #elif key == QtCore.Qt.Key_F: # self.currentWindow().fitInView() #sr = self.scene.sceneRect() #self.middlePoint = QPointF(sr.x() + sr.width()/2, sr.y() + sr.height()/2) #self.moveView(0, 0, 1) #elif key == QtCore.Qt.Key_Plus or key == QtCore.Qt.Key_BracketRight: # self.currentWindow().scaleView(2.0) #elif key == QtCore.Qt.Key_Minus or key == QtCore.Qt.Key_BracketLeft: # self.currentWindow().scaleView(1 / 2.0) #else: # QtGui.QMainWindow.keyPressEvent(self, event) #m = self.matrix() #print "matrix ", m.dx(), m.dy(), m.m11() def toggleDocks(self): if len(self.hiddenDocks) > 0: for d in self.hiddenDocks: #print d d.show() self.hiddenDocks = set() else: for d in self.docks: #print d if d.isVisible(): d.hide() self.hiddenDocks.add(d) def detachCurrentView(self): subwin = self.mdiArea.activeSubWindow() if subwin: widget = subwin.widget() widget.setWindowFlags(QtCore.Qt.Window) #subwin.hide() #widget.setParent(self) widget.show() #subwin.removeWidget(widget) #win = QtGui.QWidget(self, QtCore.Qt.Window) #layout = QtGui.QVBoxLayout() #layout.setSpacing(0) #layout.addWidget(subwin.widget()) #win.setLayout(layout) #self.mdiArea.removeSubWindow(subwin) #print subwin, subwin.widget().getContentsMargins(), subwin.isWindow() #widget.setWindowFlags(QtCore.Qt.Window) #win.show() #subwin.widget().setWindow def updateMdi(self): subwin = self.mdiArea.activeSubWindow() if subwin: self.setCurrentView(subwin.widget()) #self.controller.parse("window.setCurrentWindow(window.currentWindow)") self.updateWindowsMenu() winNo = len(self.mdiArea.subWindowList()) def updateWindowsMenu(self): subWins = self.mdiArea.subWindowList() if len(subWins) > 0: self.menuBar().addAction(self.windowsAct) #self.windowsMenu = self.menuBar().addMenu(self.tr("&Windows")) #self.addDatabaseMenu = self.databaseMenu.addMenu(self.tr("&Add Database")) #self.databaseMenu.addAction(self.relDAct) #self.databaseMenu.addSeparator(); #self.databaseMenu.addAction(self.exitAct) #self.addDatabaseMenu.addAction(self.addGnucapDAct) #self.optionsMenu = self.menuBar().addMenu(self.tr("&Options")) #self.optionsMenu.addAction(self.openWWAct) #self.menuBar().addSeparator() #self.helpMenu = self.menuBar().addMenu(self.tr("&Help")) #self.helpMenu.addAction(self.aboutAct) #self.helpMenu.addAction(self.aboutQtAct) else: self.menuBar().removeAction(self.windowsAct) def setCurrentView(self, view): if self._currentView: self._currentView.uninstallActions() self._currentView = view view.installActions() def newSchematic(self): #lib = self.database.makeLibrary('work') #self.database.addLibrary(lib) gEDA_Symbols = '../geda/symbols' gEDA_Examples = '../geda/examples' spnet = '../spNet' flicker = '../flicker' gsim = '../gsim' SXI = '../SXI' importer = Reader.GedaImporter(self.database.libraries) importer.importLibraryList( [ ['spnet.latch', spnet + '/latch'], ['spnet.sym.analog', spnet + '/sym/analog'], ['spnet.sym.titleblock', spnet + '/sym/titleblock'], ['spnet.sym.spice', spnet + '/sym/spice'], # ['sym.4000', gEDA_Symbols + '/4000'], # ['sym.74', gEDA_Symbols + '/74'], # ['sym.allegro', gEDA_Symbols + '/allegro'], # ['sym.altera', gEDA_Symbols + '/altera'], # ['sym.amphenol', gEDA_Symbols + '/amphenol'], ['sym.analog', gEDA_Symbols + '/analog'], # ['sym.apex', gEDA_Symbols + '/apex'], ['sym.asic', gEDA_Symbols + '/asic'], ['sym.asicpads', gEDA_Symbols + '/asicpads'], ['sym.bus', gEDA_Symbols + '/bus'], ['sym.cascade', gEDA_Symbols + '/cascade'], ['sym.connector', gEDA_Symbols + '/connector'], # ['sym.dec', gEDA_Symbols + '/dec'], ['sym.diode', gEDA_Symbols + '/diode'], # ['sym.ecl', gEDA_Symbols + '/ecl'], ## ['sym.gnetman', gEDA_Symbols + '/gnetman'], # ['sym.idt', gEDA_Symbols + '/idt'], ['sym.IEC417', gEDA_Symbols + '/IEC417'], ['sym.io', gEDA_Symbols + '/io'], # ['sym.irf', gEDA_Symbols + '/irf'], # ['sym.lattice', gEDA_Symbols + '/lattice'], # ['sym.linear', gEDA_Symbols + '/linear'], # ['sym.maxim', gEDA_Symbols + '/maxim'], # ['sym.memory', gEDA_Symbols + '/memory'], # ['sym.micro', gEDA_Symbols + '/micro'], # ['sym.minicircuits', gEDA_Symbols + '/minicircuits'], ['sym.misc', gEDA_Symbols + '/misc'], # ['sym.national', gEDA_Symbols + '/national'], # ['sym.opto', gEDA_Symbols + '/opto'], # ['sym.philips', gEDA_Symbols + '/philips'], # ['sym.pla', gEDA_Symbols + '/pla'], ['sym.power', gEDA_Symbols + '/power'], # ['sym.radio', gEDA_Symbols + '/radio'], # ['sym.relay', gEDA_Symbols + '/relay'], # ['sym.rf', gEDA_Symbols + '/rf'], ['sym.spice', gEDA_Symbols + '/spice'], # ['sym.st', gEDA_Symbols + '/st'], # ['sym.supervisor', gEDA_Symbols + '/supervisor'], # ['sym.switcap', gEDA_Symbols + '/switcap'], ['sym.switch', gEDA_Symbols + '/switch'], ['sym.titleblock', gEDA_Symbols + '/titleblock'], # ['sym.transistor', gEDA_Symbols + '/transistor'], # ['sym.tube', gEDA_Symbols + '/tube'], # ['sym.verilog', gEDA_Symbols + '/verilog'], # ['sym.vhdl', gEDA_Symbols + '/vhdl'], # ['sym.xilinx', gEDA_Symbols + '/xilinx'], ## ['sym.font', gEDA_Symbols + '/font'], ['examples.lightning_detector', gEDA_Examples + '/lightning_detector/sym'], ['examples.gTAG', gEDA_Examples + '/gTAG'], ['flicker', flicker + '/ee/sym'], ['flicker.openIP', flicker + '/ee/openIP'], ['gsim.sym', gsim + '/sym/capacitor'], ['gsim.sym', gsim + '/sym/diode'], ['gsim.sym', gsim + '/sym/ic-analog'], ['gsim.sym', gsim + '/sym/inductor'], ['gsim.sym', gsim + '/sym/power'], ['gsim.sym', gsim + '/sym/resistor'], ['gsim.sym', gsim + '/sym/signal'], ['gsim.sym', gsim + '/sym/spice_commands'], ['gsim.sym', gsim + '/sym/spice_generic'], ['gsim.sym', gsim + '/sym/transformer'], ['gsim.sym', gsim + '/sym/transistor'], ['gsim.sym', gsim + '/sym/xspice_analog'], ['gsim.sym', gsim + '/sym/xspice_digital'], ['gsim.sym', gsim + '/sym/xspice_mixed'], ['gsim.sym', gsim + '/sym/xspice_model'], ['SXI.SXI-EM-DriverBoard', SXI + '/SXI-EM-DriverBoard/Symbols'], ], [ ['spnet.latch', spnet + '/latch'], ['examples.lightning_detector', gEDA_Examples + '/lightning_detector'], ['examples.gTAG', gEDA_Examples + '/gTAG'], ['flicker', flicker + '/ee'], ['gsim.examples.0010_basic', gsim + '/examples/0010_basic'], ['gsim.examples.0020_rlc', gsim + '/examples/0020_rlc'], ['gsim.examples.0030_diode_bjt', gsim + '/examples/0030_diode_bjt'], ['gsim.examples.0040_digital', gsim + '/examples/0040_digital'], ['gsim.examples.0050_xspice', gsim + '/examples/0050_xspice'], ['gsim.examples.0060_adc', gsim + '/examples/0060_adc'], ['gsim.examples.0070_hybrid', gsim + '/examples/0070_hybrid'], ['gsim.examples.0080_filtre', gsim + '/examples/0080_filtre'], ['gsim.examples.0100_script', gsim + '/examples/0100_script'], ['SXI.SXI-EM-DriverBoard', SXI + '/SXI-EM-DriverBoard'], ]) def openCellView(self, cellView, design = None): if cellView: if not design: design = Design(cellView, self.database.designs) scene = GraphicsScene(design) #self.database.addDesign(design) dView = DesignView(self, scene) subWin = SubWindow(self) subWin.setWidget(dView) subWin.setAttribute(QtCore.Qt.WA_DeleteOnClose) subWin.setWindowFilePath( cellView.cell.name) subWin.setWindowModified(True) self.mdiArea.addSubWindow(subWin) #self.mdiArea.addTab(dView, cellView.cell.name) subWin.showMaximized() #subWin.setWindowState(subWin.windowState() | QtCore.Qt.WindowMaximized) #subWin.show() #dView.showMaximized() #subWin.show() #self.setCurrentView(dView) def openCellViewByName(self, libPath, cellName, viewName): cellView = self.database.cellViewByName(libPath, cellName, viewName) print self.__class__.__name__, cellView self.openCellView(cellView) def openDatabaseObjectByPathName(self, pathName): path = Path.createFromPathName(pathName) cellView = self.database.libraries.objectByPath(path) print self.__class__.__name__, cellView self.openCellView(cellView) def openDesignUnitByPathName(self, pathName): (cellViewPathName, sep, instancePathName) = pathName.partition(':') cellViewPath = Path.createFromPathName(cellViewPathName) cellView = self.database.libraries.objectByPath(cellViewPath) design = self.database.designs.designUnitByPath(cellViewPathName) print self.__class__.__name__, cellView, design self.openCellView(cellView, design) #def runDeferred(self): # print self.thread() # self.database.runDeferredProcesses() def deferredProcessingRequested(self): #print self.thread() if self._databaseTimer and self._databaseTimer.isActive(): #self._databaseTimer.start(50) QtGui.qApp.processEvents() else: self._databaseTimer = QtCore.QTimer() self._databaseTimer.setSingleShot(True) self.connect(self._databaseTimer, QtCore.SIGNAL("timeout()"), self.database.runDeferredProcesses) self._databaseTimer.start(500) #.singleShot(5000, self.database.runDeferredProcesses) def leaveCPU(self): QtGui.qApp.processEvents()
class PWindow(QtGui.QMainWindow): def __init__(self): QtGui.QMainWindow.__init__(self) self.docks = set() self.hiddenDocks = set() self._currentView = None self.database = Database() #print os.path.join(os.getcwd(), 'pschem.ini') self.settings = QtCore.QSettings('pschem', 'pschem') self.actions = QtCore.QSettings( os.path.join(os.getcwd(), 'pschem_actions.ini'), QtCore.QSettings.IniFormat) #self.settings.setPath( # QtCore.QSettings.NativeFormat, # QtCore.QSettings.UserScope, # sys.argv[0]) val = self.settings.value('window/geometry') if (val.canConvert(QtCore.QVariant.ByteArray)): self.restoreGeometry(val.toByteArray()) self.createConsole() self.createToolOptions() self.createDatabaseView() self.createHierarchyView() self.createLayerView() self.createEditorWidget() self.createActions() self.createMenus() self.createToolBars() self.createStatusBar() #self.setCorner(QtCore.Qt.TopLeftCorner, # QtCore.Qt.LeftDockWidgetArea) #self.setCorner(QtCore.Qt.BottomLeftCorner, # QtCore.Qt.LeftDockWidgetArea) #self.setCorner(QtCore.Qt.TopRightCorner, # QtCore.Qt.RightDockWidgetArea) #self.setCorner(QtCore.Qt.BottomRightCorner, # QtCore.Qt.RightDockWidgetArea) self.tabifyDockWidget(self.dockTool, self.dockH) self.tabifyDockWidget(self.dockH, self.dockD) val = self.settings.value('window/state') if (val.canConvert(QtCore.QVariant.ByteArray)): self.restoreState(val.toByteArray()) def show(self): QtGui.QMainWindow.show(self) #self.controller.repl() def createConsole(self): self.consoleWidget = ConsoleWidget(self) self.controller = Controller(self) #self.controller.setConsole(self.consoleWidget) #self.setCentralWidget(self.consoleWidget) self.dockC = QtGui.QDockWidget(self.tr("Console"), self) self.dockC.setObjectName('consoleDock') self.docks.add(self.dockC) #self.databaseWidget = DatabaseWidget.DatabaseWidget(self) self.dockC.setWidget(self.consoleWidget) self.addDockWidget(QtCore.Qt.BottomDockWidgetArea, self.dockC) def createDatabaseView(self): self.dockD = QtGui.QDockWidget(self.tr("Database"), self) self.dockD.setObjectName('databaseCellsDock') self.docks.add(self.dockD) self.databaseModel = DatabaseModel(self.database) self.databaseWidget = DatabaseWidget(self) self.databaseWidget.setSourceModel(self.databaseModel) self.dockD.setWidget(self.databaseWidget) self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, self.dockD) #self.tabifyDockWidget(QtCore.Qt.LeftDockWidgetArea, dock) def createHierarchyView(self): self.dockH = QtGui.QDockWidget(self.tr("Hierarchy"), self) self.dockH.setObjectName('hierarchyDock') self.docks.add(self.dockH) self.hierarchyModel = HierarchyModel(self.database.designs()) self.hierarchyWidget = HierarchyWidget(self) self.hierarchyWidget.setSourceModel(self.hierarchyModel) #self.hierarchyWidget.setModel(self.hierarchyProxyModel) #self.hierarchyWidget.setSortingEnabled(True) self.dockH.setWidget(self.hierarchyWidget) self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, self.dockH) def loadLayers(self): self.layers = Layers() self.layersView = LayersView(self.layers) l = Layer() l.setName('background') l.setType('drawing') l.setLinePattern(LinePattern(LinePattern.Solid, 0, 0)) l.setFillPattern(FillPattern(FillPattern.Solid)) #l.setFillPattern(FillPattern(FillPattern.DiagCross)) l.setColor(Color(Color.Black)) l.setZValue(0) self.layers.addLayer(l) l = Layer() l.setName('gridminor') l.setType('drawing') l.setLinePattern(LinePattern(LinePattern.Solid, 0, 0)) l.setFillPattern(FillPattern(FillPattern.Solid)) l.setColor(Color([40, 40, 40])) l.setZValue(1) self.layers.addLayer(l) l = Layer() l.setName('gridmajor') l.setType('drawing') l.setLinePattern(LinePattern(LinePattern.Solid, 0, 0)) l.setFillPattern(FillPattern(FillPattern.Solid)) l.setColor(Color([50, 50, 50])) l.setZValue(2) self.layers.addLayer(l) l = Layer() l.setName('axes') l.setType('drawing') l.setLinePattern(LinePattern(LinePattern.Solid, 0, 0)) l.setFillPattern(FillPattern(FillPattern.Solid)) l.setColor(Color([60, 60, 60])) l.setZValue(3) self.layers.addLayer(l) l = Layer() l.setName('net') l.setType('drawing') p = LinePattern(LinePattern.Solid, 0.1, 1) p.setEndStyle(LinePattern.RoundEnd) l.setLinePattern(p) l.setFillPattern(FillPattern(FillPattern.Solid)) l.setColor(Color(Color.Cyan)) l.setZValue(100) self.layers.addLayer(l) l = Layer() l.setName('pin') l.setType('drawing') p = LinePattern(LinePattern.Solid, 0.1, 1) #p.setEndStyle(LinePattern.SquareEnd) p.setEndStyle(LinePattern.FlatEnd) l.setLinePattern(p) l.setFillPattern(FillPattern(FillPattern.Solid)) l.setColor(Color(Color.Red)) l.setZValue(200) self.layers.addLayer(l) l = Layer() l.setName('annotation') #no fill l.setType('drawing') p = LinePattern(LinePattern.Solid, 0.1, 1) p.setEndStyle(LinePattern.RoundEnd) l.setLinePattern(p) l.setColor(Color(Color.Green)) l.setZValue(50) self.layers.addLayer(l) l = Layer() l.setName('annotation2') l.setType('drawing') p = LinePattern(LinePattern.Solid, 0.1, 1) p.setEndStyle(LinePattern.RoundEnd) l.setLinePattern(p) #l.setFillPattern(FillPattern(FillPattern.Solid)) l.setFillPattern(FillPattern(FillPattern.Dense4)) l.setColor(Color(Color.Green)) l.setZValue(55) self.layers.addLayer(l) l = Layer() l.setName('attribute') l.setType('drawing') p = LinePattern(LinePattern.Solid, 0.1, 1) p.setEndStyle(LinePattern.RoundEnd) l.setLinePattern(p) l.setFillPattern(FillPattern(FillPattern.Solid)) l.setColor(Color(Color.Yellow)) l.setZValue(400) self.layers.addLayer(l) l = Layer() l.setName('instance') l.setType('drawing') p = LinePattern(LinePattern.NoLine, 0, 0) p.setEndStyle(LinePattern.RoundEnd) l.setLinePattern(p) l.setColor(Color(Color.White)) l.setZValue(1000) self.layers.addLayer(l) l = Layer() l.setName('selection') l.setType('drawing') p = LinePattern(LinePattern.Solid, 0, 1) p.setEndStyle(LinePattern.RoundEnd) l.setLinePattern(p) #l.setFillPattern(FillPattern(FillPattern.Solid)) l.setColor(Color(Color.Red)) l.setZValue(900000) self.layers.addLayer(l) l = Layer() l.setName('preselection') l.setType('drawing') p = LinePattern(LinePattern.Dash, 0, 1) p.setEndStyle(LinePattern.FlatEnd) l.setLinePattern(p) #l.setFillPattern(FillPattern(FillPattern.Solid)) l.setColor(Color(Color.Yellow)) l.setZValue(900010) self.layers.addLayer(l) l = Layer() l.setName('lasso') l.setType('drawing') p = LinePattern(LinePattern.Dash, 0, 1) p.setEndStyle(LinePattern.FlatEnd) l.setLinePattern(p) #l.setFillPattern(FillPattern(FillPattern.Solid)) l.setColor(Color(Color.White)) l.setZValue(900020) self.layers.addLayer(l) l = Layer() l.setName('cursor') l.setType('drawing') p = LinePattern(LinePattern.Solid, 0, 1) l.setLinePattern(p) #l.setFillPattern(FillPattern(FillPattern.Solid)) l.setColor(Color(Color.Yellow)) l.setZValue(1000000) self.layers.addLayer(l) self.database.setLayers(self.layers) def createLayerView(self): self.loadLayers() self.dockL = QtGui.QDockWidget(self.tr("Layers"), self) self.dockL.setObjectName('layerDock') self.docks.add(self.dockL) #self.dockL.setTitleBarWidget(None) #self.dockL.setFeatures(QtGui.QDockWidget.DockWidgetVerticalTitleBar) self.layerModel = LayerModel(self.layersView) self.layerWidget = LayerWidget(self) self.layerWidget.setSourceModel(self.layerModel) #self.hierarchyWidget.setModel(self.hierarchyProxyModel) #self.hierarchyWidget.setSortingEnabled(True) self.dockL.setWidget(self.layerWidget) self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, self.dockL) def createToolOptions(self): self.dockTool = QtGui.QDockWidget(self.tr("Tool Options"), self) self.dockTool.setObjectName('toolOptionsDock') self.docks.add(self.dockTool) #self.databaseWidget = DatabaseWidget.DatabaseWidget(self) self.selectToolOptions = SelectToolOptions() self.dockTool.setWidget(self.selectToolOptions) #self.consoleWidget.setObjectName('') self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, self.dockTool) def createEditorWidget(self): self.mdiArea = QtGui.QMdiArea() #self.mdiArea = QtGui.QTabWidget() #self.mdiArea.addTab(None, '') versionMaj = QtCore.QT_VERSION / 256 / 256 versionMin = QtCore.QT_VERSION / 256 % 256 #if versionMaj >= 4 and versionMin >=6: # self.mdiArea.setMovable(True) # self.mdiArea.setTabsClosable(True) self.mdiArea.setViewMode(QtGui.QMdiArea.TabbedView) #self.mdiArea.setTabShape(QtGui.QTabWidget.Triangular) self.setCentralWidget(self.mdiArea) self.connect(self.mdiArea, QtCore.SIGNAL("subWindowActivated(QMdiSubWindow *)"), self.updateMdi); def writeActionsArray(self, array, prefix): self.actions.beginWriteArray(prefix) for i in range(len(array)): self.actions.setArrayIndex(i) if array[i].has_key('type'): self.actions.setValue('type', QtCore.QVariant(array[i]['type'])) if array[i].has_key('text'): self.actions.setValue('text', QtCore.QVariant(array[i]['text'])) if array[i].has_key('longText'): self.actions.setValue('longText', QtCore.QVariant(array[i]['longText'])) if array[i].has_key('icon'): self.actions.setValue('icon', QtCore.QVariant(array[i]['icon'])) if array[i].has_key('shortcut'): self.actions.setValue('shortcut', QtCore.QVariant(array[i]['shortcut'])) if array[i].has_key('command'): self.actions.setValue('command', QtCore.QVariant(array[i]['command'])) self.actions.endArray() def readActionsArray(self, array, prefix): size = self.actions.beginReadArray(prefix) for i in range(size): #print i self.actions.setArrayIndex(i) array.append({}) if self.actions.contains('type'): array[i]['type'] = str(self.actions.value('type').toString()) array[i]['text'] = str(self.actions.value('text').toString()) array[i]['longText'] = str(self.actions.value('longText').toString()) array[i]['longText'] = str(self.actions.value('longText').toString()) array[i]['icon'] = str(self.actions.value('icon').toString()) array[i]['shortcut'] = str(self.actions.value('shortcut').toString()) array[i]['command'] = str(self.actions.value('command').toString()) self.actions.endArray() def createActions(self): #val = self.settings.value('window/state') #if (val.canConvert(QtCore.QVariant.ByteArray)): # self.restoreState(val.toByteArray()) #self.actions.beginGroup('actions') #self.databaseActions = [] #self.schematicActions = [] #self.symbolActions = [] #self.windowsActions = [] #self.helpActions = [] #self.readActionsArray(self.databaseActions, 'actions/database') #self.readActionsArray(self.schematicActions, 'actions/schematic') #self.readActionsArray(self.symbolActions, 'actions/symbol') #self.readActionsArray(self.windowsActions, 'actions/windows') #self.readActionsArray(self.helpActions, 'actions/help') self.openCellViewAct = QtGui.QAction(self.tr("&Open cellview"), self) self.openCellViewAct.setShortcut(self.tr("Ctrl+O")) self.openCellViewAct.setStatusTip(self.tr("Open selected cellview")) self.openCellViewCmd = Command("window.openCellView(window.databaseWidget.selectedCellView())") self.connect(self.openCellViewAct, QtCore.SIGNAL("triggered()"), lambda: self.controller.execute(self.openCellViewCmd)) self.exitAct = QtGui.QAction(self.tr("E&xit"), self) self.exitAct.setShortcut(self.tr("Ctrl+Q")) self.exitAct.setStatusTip(self.tr("Exit the application")) self.exitCmd = Command("window.close()") self.connect(self.exitAct, QtCore.SIGNAL("triggered()"), lambda: self.controller.execute(self.exitCmd)) self.toggleDocksAct = QtGui.QAction(self.tr("Toggle Docks"), self) self.toggleDocksAct.setShortcut(self.tr("F11")) self.toggleDocksAct.setStatusTip(self.tr("Toggle visibility of the main window docks")) self.toggleDocksCmd = Command("window.toggleDocks()") self.connect(self.toggleDocksAct, QtCore.SIGNAL("triggered()"), lambda: self.controller.execute(self.toggleDocksCmd)) self.aboutAct = QtGui.QAction(self.tr("&About"), self) self.aboutAct.setStatusTip(self.tr("Show the application's About box")) #self.aboutCmd = Command("About.about()") #self.connect(self.aboutAct, QtCore.SIGNAL("triggered()"), # lambda: self.controller.execute(self.aboutCmd)) self.aboutQtAct = QtGui.QAction(self.tr("About &Qt"), self) self.aboutQtAct.setStatusTip(self.tr("Show the Qt library's About box")) self.aboutQtCmd = Command("QtGui.qApp.aboutQt()") self.connect(self.aboutQtAct, QtCore.SIGNAL("triggered()"), lambda: self.controller.execute(self.aboutQtCmd)) self.tileWindowsAct = QtGui.QAction(self.tr("Tile Windows"), self) self.tileWindowsAct.setStatusTip(self.tr("Tile Windows")) self.tileWindowsCmd = Command("window.mdiArea.tileSubWindows()") self.connect(self.tileWindowsAct, QtCore.SIGNAL("triggered()"), lambda: self.controller.execute(self.tileWindowsCmd)) self.cascadeWindowsAct = QtGui.QAction(self.tr("Cascade Windows"), self) self.cascadeWindowsAct.setStatusTip(self.tr("Cascade Windows")) self.cascadeWindowsCmd = Command("window.mdiArea.cascadeSubWindows()") self.connect(self.cascadeWindowsAct, QtCore.SIGNAL("triggered()"), lambda: self.controller.execute(self.cascadeWindowsCmd)) self.closeWindowsAct = QtGui.QAction(self.tr("Close All Windows"), self) self.closeWindowsAct.setStatusTip(self.tr("Close All Windows")) self.closeWindowsCmd = Command("window.mdiArea.closeAllSubWindow()") self.connect(self.closeWindowsAct, QtCore.SIGNAL("triggered()"), lambda: self.controller.execute(self.closeWindowsCmd)) self.closeWindowAct = QtGui.QAction(self.tr("Close Window"), self) self.closeWindowAct.setStatusTip(self.tr("Close Window")) self.closeWindowCmd = Command("window.mdiArea.closeActiveSubWindow()") self.connect(self.closeWindowAct, QtCore.SIGNAL("triggered()"), lambda: self.controller.execute(self.closeWindowCmd)) self.maximizeWindowAct = QtGui.QAction(self.tr("Maximize Window"), self) self.maximizeWindowAct.setStatusTip(self.tr("Maximize Current Window")) self.maximizeWindowCmd = Command("window.mdiArea.activeSubWindow().showMaximized()") self.connect(self.maximizeWindowAct, QtCore.SIGNAL("triggered()"), lambda: self.controller.execute(self.maximizeWindowCmd)) self.minimizeWindowAct = QtGui.QAction(self.tr("Minimize Window"), self) self.minimizeWindowAct.setStatusTip(self.tr("Minimize Current Window")) self.minimizeWindowCmd = Command("window.mdiArea.activeSubWindow().showMinimized()") self.connect(self.minimizeWindowAct, QtCore.SIGNAL("triggered()"), lambda: self.controller.execute(self.minimizeWindowCmd)) self.zoomInAct = QtGui.QAction(self.tr("Zoom In"), self) self.zoomInAct.setStatusTip(self.tr("Zoom In Mode")) self.zoomInAct.setShortcut(self.tr("Z")) self.zoomInCmd = Command("currentView().modeStack.pushZoomInMode()") self.connect(self.zoomInAct, QtCore.SIGNAL("triggered()"), lambda: self.controller.execute(self.zoomInCmd)) self.moveAct = QtGui.QAction(self.tr("Move"), self) self.moveAct.setStatusTip(self.tr("Move Mode")) self.moveAct.setShortcut(self.tr("M")) self.moveCmd = Command("currentView().modeStack.pushMoveMode()") self.connect(self.moveAct, QtCore.SIGNAL("triggered()"), lambda: self.controller.execute(self.moveCmd)) self.zoomPrevAct = QtGui.QAction(self.tr("Previews View"), self) self.zoomPrevAct.setStatusTip(self.tr("Previews View")) self.zoomPrevAct.setShortcut(self.tr("Shift+Z")) self.zoomPrevCmd = Command("currentView().undoViewStack.popView()") self.connect(self.zoomPrevAct, QtCore.SIGNAL("triggered()"), lambda: self.controller.execute(self.zoomPrevCmd)) self.quitModeAct = QtGui.QAction(self.tr("Quit Mode"), self) self.quitModeAct.setStatusTip(self.tr("Return to Previous Editing Mode")) self.quitModeAct.setShortcut(self.tr("Esc")) self.quitModeCmd = Command("currentView().modeStack.popMode()") self.connect(self.quitModeAct, QtCore.SIGNAL("triggered()"), lambda: self.controller.execute(self.quitModeCmd)) self.panLeftAct = QtGui.QAction(self.tr("Pan Left"), self) self.panLeftAct.setStatusTip(self.tr("Pan the current view left")) self.panLeftAct.setShortcut(self.tr("Left")) self.panLeftCmd = Command("currentView().move(-0.25, 0)") self.connect(self.panLeftAct, QtCore.SIGNAL("triggered()"), lambda: self.controller.execute(self.panLeftCmd)) self.panRightAct = QtGui.QAction(self.tr("Pan Right"), self) self.panRightAct.setStatusTip(self.tr("Pan the current view right")) self.panRightAct.setShortcut(self.tr("Right")) self.panRightCmd = Command("currentView().move(0.25, 0)") self.connect(self.panRightAct, QtCore.SIGNAL("triggered()"), lambda: self.controller.execute(self.panRightCmd)) self.panUpAct = QtGui.QAction(self.tr("Pan Up"), self) self.panUpAct.setStatusTip(self.tr("Pan the current view up")) self.panUpAct.setShortcut(self.tr("Up")) self.panUpCmd = Command("currentView().move(0, 0.25)") self.connect(self.panUpAct, QtCore.SIGNAL("triggered()"), lambda: self.controller.execute(self.panUpCmd)) self.panDownAct = QtGui.QAction(self.tr("Pan Down"), self) self.panDownAct.setStatusTip(self.tr("Pan the current view down")) self.panDownAct.setShortcut(self.tr("Down")) self.panDownCmd = Command("currentView().move(0, -0.25)") self.connect(self.panDownAct, QtCore.SIGNAL("triggered()"), lambda: self.controller.execute(self.panDownCmd)) self.zoomIn2Act = QtGui.QAction(self.tr("Zoom In"), self) self.zoomIn2Act.setStatusTip(self.tr("Zoom the current view in")) self.zoomIn2Act.setShortcut(self.tr(']')) self.zoomIn2Cmd = Command("currentView().zoom(2.0)") self.connect(self.zoomIn2Act, QtCore.SIGNAL("triggered()"), lambda: self.controller.execute(self.zoomIn2Cmd)) #lambda: self.controller.parse("window.currentView().scale(1.41421356237)")) self.zoomOut2Act = QtGui.QAction(self.tr("Zoom Out"), self) self.zoomOut2Act.setStatusTip(self.tr("Zoom the current view out")) self.zoomOut2Act.setShortcut(self.tr('[')) self.zoomOut2Cmd = Command("currentView().zoom(0.5)") self.connect(self.zoomOut2Act, QtCore.SIGNAL("triggered()"), lambda: self.controller.execute(self.zoomOut2Cmd)) self.fitAct = QtGui.QAction(self.tr("Fit"), self) self.fitAct.setStatusTip(self.tr("Fit contents to the current view")) self.fitAct.setShortcut(self.tr('f')) self.fitCmd = Command("currentView().fit()") self.connect(self.fitAct, QtCore.SIGNAL("triggered()"), lambda: self.controller.execute(self.fitCmd)) self.newSchematicAct = QtGui.QAction(self.tr("&New Schematic"), self) self.newSchematicAct.setStatusTip(self.tr("&New Schematic")) self.newSchematicAct.setShortcut(self.tr('Ctrl+N')) self.newSchematicAct.setIcon(QtGui.QIcon(':/images/new.png')) self.newSchematicCmd = Command("window.newSchematic()") self.connect(self.newSchematicAct, QtCore.SIGNAL("triggered()"), lambda: self.controller.execute(self.newSchematicCmd)) #2\text=&New Schematic #2\longText=&New Schematic #2\icon=:/images/new.png #2\shortcut=Ctrl+N #2\command=window.newSchematic() #self.actions.append({}) #self.actions[0]['text'] = 'About &Qt' #self.actions[0]['longText'] = 'About &Qt' #self.actions[0]['command'] = 'QtGui.qApp.aboutQt()' #self.actions.append({}) #self.actions[1]['text'] = '&New Schematic' #self.actions[1]['longText'] = '&New Schematic' #self.actions[1]['icon'] = ':/images/new.png' #self.actions[1]['shortcut'] = ':/images/new.png' #self.actions[1]['command'] = 'window.newSchematic()' def makeLambda(self, arg): "Workaround for Python's lack of decent closures" return lambda : self.controller.parse(arg) def createMenus(self): size = self.actions.beginReadArray('database') self.databaseMenu = self.menuBar().addMenu(self.tr("&Database")) self.databaseToolBar = self.addToolBar(self.tr("File")) self.databaseToolBar.setObjectName('fileToolbar') for i in range(size): self.actions.setArrayIndex(i) if (self.actions.contains('type') and self.actions.value('type').toString() == 'separator'): self.databaseMenu.addSeparator() else: if self.actions.contains('text'): if self.actions.contains('icon'): action = QtGui.QAction( QtGui.QIcon(str(self.actions.value('icon').toString())), str(self.actions.value('text').toString()), self) else: action = QtGui.QAction( str(self.actions.value('text').toString()), self) if self.actions.contains('shortcut'): action.setShortcut( str(self.actions.value('shortcut').toString())) if self.actions.contains('longText'): action.setStatusTip( str(self.actions.value('longText').toString())) if self.actions.contains('command'): self.connect( action, QtCore.SIGNAL('triggered()'), self.makeLambda(str(self.actions.value('command').toString()))) self.databaseMenu.addAction(action) if self.actions.contains('icon'): self.databaseToolBar.addAction(action) self.actions.endArray() self.databaseMenu.addAction(self.openCellViewAct) self.databaseMenu.addAction(self.newSchematicAct) self.databaseMenu.addAction(self.toggleDocksAct) self.databaseMenu.addAction(self.zoomInAct) self.databaseMenu.addAction(self.zoomPrevAct) self.databaseMenu.addAction(self.moveAct) self.databaseMenu.addAction(self.quitModeAct) self.windowsMenu = QtGui.QMenu(self.tr("&Windows")) self.windowsAct = self.menuBar().addMenu(self.windowsMenu) self.menuBar().removeAction(self.windowsAct) self.windowsMenu.addAction(self.tileWindowsAct) self.windowsMenu.addAction(self.cascadeWindowsAct) self.windowsMenu.addSeparator(); self.windowsMenu.addAction(self.closeWindowsAct) self.windowsMenu.addSeparator(); self.windowsMenu.addAction(self.maximizeWindowAct) self.windowsMenu.addAction(self.minimizeWindowAct) self.windowsMenu.addSeparator(); self.windowsMenu.addAction(self.closeWindowAct) self.menuBar().addSeparator() self.helpMenu = self.menuBar().addMenu(self.tr("&Help")) self.helpMenu.addAction(self.aboutAct) self.helpMenu.addAction(self.aboutQtAct) def createToolBars(self): self.databaseToolBar = self.addToolBar(self.tr("File")) self.databaseToolBar.setObjectName('fileToolbar') self.databaseToolBar.addAction(self.newSchematicAct) #self.databaseToolBar.addAction(self.openAct) #self.databaseToolBar.addAction(self.saveAct) self.editToolBar = self.addToolBar(self.tr("Edit")) self.editToolBar.setObjectName('editToolbar') def createStatusBar(self): self.statusBar().showMessage(self.tr("Ready")) def closeEvent(self, event): self.settings.setValue('window/geometry', QtCore.QVariant(self.saveGeometry())) self.settings.setValue('window/state', QtCore.QVariant(self.saveState())) QtGui.QWidget.closeEvent(self, event) def currentView(self): #return self._currentWindow return self._currentView def currentCellView(self): if self._currentView and self._currentView.scene(): return self._currentView.scene().cellView() #def keyPressEvent(self, event): #key = event.key() #print key #if key == QtCore.Qt.Key_Up: # self.currentWindow().moveView(0, -0.25) #self.centerNode.moveBy(0, -20) #BrushMatrix.translate(0,-20) #elif key == QtCore.Qt.Key_Down: # self.currentWindow().moveView(0, 0.25) #self.centerNode.moveBy(0, 20) #BrushMatrix.translate(0,20) #elif key == QtCore.Qt.Key_Left: # self.currentWindow().moveView(0.25, 0) #self.centerNode.moveBy(-20, 0) #BrushMatrix.translate(-20,0) #elif key == QtCore.Qt.Key_Right: # self.currentWindow().moveView(-0.25, 0) #self.centerNode.moveBy(20, 0) #BrushMatrix.translate(20,0) #elif key == QtCore.Qt.Key_F: # self.currentWindow().fitInView() #sr = self.scene.sceneRect() #self.middlePoint = QPointF(sr.x() + sr.width()/2, sr.y() + sr.height()/2) #self.moveView(0, 0, 1) #elif key == QtCore.Qt.Key_Plus or key == QtCore.Qt.Key_BracketRight: # self.currentWindow().scaleView(2.0) #elif key == QtCore.Qt.Key_Minus or key == QtCore.Qt.Key_BracketLeft: # self.currentWindow().scaleView(1 / 2.0) #else: # QtGui.QMainWindow.keyPressEvent(self, event) #m = self.matrix() #print "matrix ", m.dx(), m.dy(), m.m11() def toggleDocks(self): if len(self.hiddenDocks) > 0: for d in self.hiddenDocks: #print d d.show() self.hiddenDocks = set() else: for d in self.docks: #print d if d.isVisible(): d.hide() self.hiddenDocks.add(d) def detachCurrentView(self): subwin = self.mdiArea.activeSubWindow() if subwin: widget = subwin.widget() widget.setWindowFlags(QtCore.Qt.Window) #subwin.hide() #widget.setParent(self) widget.show() #subwin.removeWidget(widget) #win = QtGui.QWidget(self, QtCore.Qt.Window) #layout = QtGui.QVBoxLayout() #layout.setSpacing(0) #layout.addWidget(subwin.widget()) #win.setLayout(layout) #self.mdiArea.removeSubWindow(subwin) #print subwin, subwin.widget().getContentsMargins(), subwin.isWindow() #widget.setWindowFlags(QtCore.Qt.Window) #win.show() #subwin.widget().setWindow def updateMdi(self): subwin = self.mdiArea.activeSubWindow() if subwin: self.setCurrentView(subwin.widget()) #self.controller.parse("window.setCurrentWindow(window.currentWindow)") self.updateWindowsMenu() winNo = len(self.mdiArea.subWindowList()) def updateWindowsMenu(self): subWins = self.mdiArea.subWindowList() if len(subWins) > 0: self.menuBar().addAction(self.windowsAct) #self.windowsMenu = self.menuBar().addMenu(self.tr("&Windows")) #self.addDatabaseMenu = self.databaseMenu.addMenu(self.tr("&Add Database")) #self.databaseMenu.addAction(self.relDAct) #self.databaseMenu.addSeparator(); #self.databaseMenu.addAction(self.exitAct) #self.addDatabaseMenu.addAction(self.addGnucapDAct) #self.optionsMenu = self.menuBar().addMenu(self.tr("&Options")) #self.optionsMenu.addAction(self.openWWAct) #self.menuBar().addSeparator() #self.helpMenu = self.menuBar().addMenu(self.tr("&Help")) #self.helpMenu.addAction(self.aboutAct) #self.helpMenu.addAction(self.aboutQtAct) else: self.menuBar().removeAction(self.windowsAct) def setCurrentView(self, view): if self._currentView: self._currentView.uninstallActions() self._currentView = view view.installActions() def newSchematic(self): #lib = self.database.makeLibrary('work') #self.database.addLibrary(lib) importer = Reader.GedaImporter(self.database) importer.importLibraryList( [ ['/spnet/latch', '../spNet/latch'], ['/spnet/sym/analog', '../spNet/sym/analog'], ['/spnet/sym/titleblock', '../spNet/sym/titleblock'], ['/spnet/sym/spice', '../spNet/sym/spice'], ['/sym/analog', '../geda/symbols/analog'], ['/sym/diode', '../geda/symbols/diode'], ['/sym/io', '../geda/symbols/io'], ['/sym/font', '../geda/symbols/font'], ['/sym/spice', '../geda/symbols/spice'], ['/sym/power', '../geda/symbols/power'], ['/sym/titleblock', '../geda/symbols/titleblock'], ['/examples/lightning_detector', '../geda/examples/lightning_detector/sym'], ['/examples/gTAG', '../geda/examples/gTAG'], ], [ ['/spnet/latch', '../spNet/latch'], ['/examples/lightning_detector', '../geda/examples/lightning_detector'], ['/examples/gTAG', '../geda/examples/gTAG'], ]) def openCellView(self, cellView): if cellView: design = Design(cellView, self.database.designs()) scene = GraphicsScene(design) #self.database.addDesign(design) dView = DesignView(self, scene) subWin = SubWindow(self) subWin.setWidget(dView) subWin.setAttribute(QtCore.Qt.WA_DeleteOnClose) subWin.setWindowFilePath( cellView.cell().name()) subWin.setWindowModified(True) self.mdiArea.addSubWindow(subWin) #self.mdiArea.addTab(dView, cellView.cell().name()) subWin.showMaximized() #subWin.setWindowState(subWin.windowState() | QtCore.Qt.WindowMaximized) #subWin.show() #dView.showMaximized() #subWin.show() #self.setCurrentView(dView) def openCellViewByName(self, libPath, cellName, viewName): cellView = self.database.cellViewByName(libPath, cellName, viewName) print self.__class__.__name__, cellView self.openCellView(cellView)