def __init__( self, parent = None ): super( ToolWindowManager, self ).__init__( parent ) self.lastUsedArea = None self.suggestions = [] self.wrappers = [] self.areas = [] self.draggedToolWindows = [] #---- self.borderSensitivity = 12 testSplitter = QSplitter() self.rubberBandLineWidth = testSplitter.handleWidth() self.dragIndicator = QtGui.QLabel( None, Qt.ToolTip) self.dragIndicator.setAttribute( Qt.WA_ShowWithoutActivating) mainLayout = QtGui.QVBoxLayout( self ) mainLayout.setContentsMargins( 0, 0, 0, 0 ) wrapper = ToolWindowManagerWrapper( self ) wrapper.setWindowFlags( wrapper.windowFlags() & ~Qt.Tool ) mainLayout.addWidget( wrapper ) self.dropSuggestionSwitchTimer = QtCore.QTimer( self ) self.dropSuggestionSwitchTimer.timeout.connect( self.showNextDropSuggestion ) self.dropSuggestionSwitchTimer.setInterval( 800 ) self.dropCurrentSuggestionIndex = 0 palette = QtGui.QPalette() color = QtGui.QColor( Qt.blue ) color.setAlpha(80) palette.setBrush( QtGui.QPalette.Highlight, QtGui.QBrush( color ) ) self.rectRubberBand = QtGui.QRubberBand( QtGui.QRubberBand.Rectangle, self ) self.lineRubberBand = QtGui.QRubberBand( QtGui.QRubberBand.Line, self ) self.rectRubberBand.setPalette( palette ) self.lineRubberBand.setPalette( palette ) self.toolWindowList = []
def restoreState( self, data ): if not isinstance( data, dict ): return if data[ 'toolWindowManagerStateFormat' ] != 1: qWarning( 'state format is not recognized' ) return self.moveToolWindows( self.toolWindowList, ToolWindowManager.NoArea ) mainWrapper = self.findChild( ToolWindowManagerWrapper ) if not mainWrapper: qWarning( 'can not find main wrapper' ) mainWrapper.restoreState( data['mainWrapper'] ) for windowData in data['floatingWindows']: wrapper = ToolWindowManagerWrapper( self ) wrapper.restoreState( windowData ) wrapper.show() self.simplifyLayout() for toolWindow in self.toolWindowList: self.toolWindowVisibilityChanged.emit( toolWindow, toolWindow.parentWidget() != None )
def moveToolWindows( self, toolWindows, area ): if type( area ) == int: area = AreaReference( area ) for toolWindow in toolWindows: if not self.hasToolWindow( toolWindow ): return if toolWindow.parentWidget(): self.releaseToolWindow( toolWindow ) areaType = area.type if areaType == ToolWindowManager.LastUsedArea and not self.lastUsedArea: foundArea = self.findChild( ToolWindowManagerArea ) if foundArea: area = AreaReference( ToolWindowManager.AddTo, foundArea ) else: area = ToolWindowManager.EmptySpace if areaType == ToolWindowManager.NoArea: #do nothing pass elif areaType == ToolWindowManager.NewFloatingArea: area = self.createArea() area.addToolWindows( toolWindows ) wrapper = ToolWindowManagerWrapper( self ) wrapper.layout().addWidget( area ) wrapper.move( QCursor.pos() ) wrapper.show() elif areaType == ToolWindowManager.AddTo: area.area().addToolWindows( toolWindows ) elif areaType in ( ToolWindowManager.LeftOf, ToolWindowManager.RightOf, ToolWindowManager.TopOf, ToolWindowManager.BottomOf ): parentSplitter = cast( area.widget.parentWidget(), QSplitter ) wrapper = cast( area.widget.parentWidget(), ToolWindowManagerWrapper ) if not ( parentSplitter or wrapper ): qWarning( 'unknown parent type' ) return # import pudb; pu.db useParentSplitter = False indexInParentSplitter = 0 if parentSplitter: indexInParentSplitter = parentSplitter.indexOf( area.widget ) if parentSplitter.orientation() == Qt.Vertical: useParentSplitter = areaType in ( ToolWindowManager.TopOf, ToolWindowManager.BottomOf ) else: useParentSplitter = areaType in ( ToolWindowManager.LeftOf, ToolWindowManager.RightOf ) if useParentSplitter: if areaType in ( ToolWindowManager.BottomOf , ToolWindowManager.RightOf ): indexInParentSplitter += 1 newArea = self.createArea() newArea.addToolWindows( toolWindows ) parentSplitter.insertWidget( indexInParentSplitter, newArea ) else: area.widget.hide() area.widget.setParent( None ) splitter = self.createSplitter() if areaType in ( ToolWindowManager.TopOf, ToolWindowManager.BottomOf ): splitter.setOrientation(Qt.Vertical) else: splitter.setOrientation(Qt.Horizontal) splitter.addWidget( area.widget ) area.widget.show() newArea = self.createArea() if areaType in ( ToolWindowManager.TopOf, ToolWindowManager.LeftOf ): splitter.insertWidget( 0, newArea ) else: splitter.addWidget( newArea ) if parentSplitter: parentSplitter.insertWidget( indexInParentSplitter, splitter ) else: wrapper.layout().addWidget( splitter ) newArea.addToolWindows( toolWindows ) elif areaType == ToolWindowManager.EmptySpace: wrapper = self.findChild( ToolWindowManagerWrapper ) if wrapper.isOccupied(): self.lastUsedArea.addToolWindows( toolWindows ) else: newArea = self.createArea() wrapper.layout().addWidget( newArea ) newArea.addToolWindows( toolWindows ) elif areaType == ToolWindowManager.LastUsedArea: self.lastUsedArea.addToolWindows( toolWindows ) else: qWarning( 'invalid type' ) self.simplifyLayout() for toolWindow in toolWindows: self.toolWindowVisibilityChanged.emit( toolWindow, toolWindow.parent() != None )