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 __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 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 )
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)