class QuadView(QWidget): def __init__(self, parent, view1, view2, view3, view4=None): QWidget.__init__(self, parent) self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.installEventFilter(self) self.dockableContainer = [] self.layout = QVBoxLayout() self.setLayout(self.layout) self.layout.setContentsMargins(0, 0, 0, 0) self.layout.setSpacing(0) self.splitVertical = QSplitter(Qt.Vertical, self) self.layout.addWidget(self.splitVertical) self.splitHorizontal1 = QSplitter(Qt.Horizontal, self.splitVertical) self.splitHorizontal1.setObjectName("splitter1") self.splitHorizontal2 = QSplitter(Qt.Horizontal, self.splitVertical) self.splitHorizontal2.setObjectName("splitter2") self.splitHorizontal1.splitterMoved.connect( self.horizontalSplitterMoved) self.splitHorizontal2.splitterMoved.connect( self.horizontalSplitterMoved) self.imageView2D_1 = view1 self.imageView2D_2 = view2 self.imageView2D_3 = view3 self.dock1_ofSplitHorizontal1 = ImageView2DDockWidget( self.imageView2D_1) self.dock1_ofSplitHorizontal1.connectHud() self.dockableContainer.append(self.dock1_ofSplitHorizontal1) self.dock1_ofSplitHorizontal1.onDockButtonClicked.connect( lambda arg=self.dock1_ofSplitHorizontal1: self.on_dock(arg)) self.dock1_ofSplitHorizontal1.onMaxButtonClicked.connect( lambda arg=self.dock1_ofSplitHorizontal1: self.on_max(arg)) self.dock1_ofSplitHorizontal1.onMinButtonClicked.connect( lambda arg=self.dock1_ofSplitHorizontal1: self.on_min(arg)) self.splitHorizontal1.addWidget(self.dock1_ofSplitHorizontal1) self.dock2_ofSplitHorizontal1 = ImageView2DDockWidget( self.imageView2D_2) self.dock2_ofSplitHorizontal1.onDockButtonClicked.connect( lambda arg=self.dock2_ofSplitHorizontal1: self.on_dock(arg)) self.dock2_ofSplitHorizontal1.onMaxButtonClicked.connect( lambda arg=self.dock2_ofSplitHorizontal1: self.on_max(arg)) self.dock2_ofSplitHorizontal1.onMinButtonClicked.connect( lambda arg=self.dock2_ofSplitHorizontal1: self.on_min(arg)) self.dock2_ofSplitHorizontal1.connectHud() self.dockableContainer.append(self.dock2_ofSplitHorizontal1) self.splitHorizontal1.addWidget(self.dock2_ofSplitHorizontal1) self.dock1_ofSplitHorizontal2 = ImageView2DDockWidget( self.imageView2D_3) self.dock1_ofSplitHorizontal2.onDockButtonClicked.connect( lambda arg=self.dock1_ofSplitHorizontal2: self.on_dock(arg)) self.dock1_ofSplitHorizontal2.onMaxButtonClicked.connect( lambda arg=self.dock1_ofSplitHorizontal2: self.on_max(arg)) self.dock1_ofSplitHorizontal2.onMinButtonClicked.connect( lambda arg=self.dock1_ofSplitHorizontal2: self.on_min(arg)) self.dock1_ofSplitHorizontal2.connectHud() self.dockableContainer.append(self.dock1_ofSplitHorizontal2) self.splitHorizontal2.addWidget(self.dock1_ofSplitHorizontal2) self.dock2_ofSplitHorizontal2 = ImageView2DDockWidget(view4) self.dockableContainer.append(self.dock2_ofSplitHorizontal2) self.splitHorizontal2.addWidget(self.dock2_ofSplitHorizontal2) #this is a hack: with 0 ms it does not work... QTimer.singleShot(250, self._resizeEqual) def _resizeEqual(self): if not all([dock.isVisible() for dock in self.dockableContainer]): return assert sys.version_info.major == 2, "Alert! This function has not been tested "\ "under python 3. Please remove this assetion and be wary of any strnage behavior you encounter" w, h = self.size().width() - self.splitHorizontal1.handleWidth( ), self.size().height() - self.splitVertical.handleWidth() self.splitVertical.setSizes([h / 2, h / 2]) if self.splitHorizontal1.count() == 2 and self.splitHorizontal2.count( ) == 2: #docks = [self.imageView2D_1, self.imageView2D_2, self.imageView2D_3, self.testView4] docks = [] for splitter in [self.splitHorizontal1, self.splitHorizontal2]: for i in range(splitter.count()): docks.append(splitter.widget(i).graphicsView) w1 = [docks[i].minimumSize().width() for i in [0, 2]] w2 = [docks[i].minimumSize().width() for i in [1, 3]] wLeft = max(w1) wRight = max(w2) if wLeft > wRight and wLeft > w // 2: wRight = w - wLeft elif wRight >= wLeft and wRight > w // 2: wLeft = w - wRight else: wLeft = w // 2 wRight = w // 2 self.splitHorizontal1.setSizes([wLeft, wRight]) self.splitHorizontal2.setSizes([wLeft, wRight]) def eventFilter(self, obj, event): if (event.type() in [QEvent.WindowActivate, QEvent.Show]): self._synchronizeSplitter() return False def _synchronizeSplitter(self): sizes1 = self.splitHorizontal1.sizes() sizes2 = self.splitHorizontal2.sizes() if len(sizes1) > 0 and sizes1[0] > 0: self.splitHorizontal2.setSizes(sizes1) elif len(sizes2) > 0 and sizes2[0] > 0: self.splitHorizontal1.setSizes(sizes2) def resizeEvent(self, event): QWidget.resizeEvent(self, event) self._synchronizeSplitter() def horizontalSplitterMoved(self, x, y): if self.splitHorizontal1.count() != 2 or self.splitHorizontal2.count( ) != 2: return sizes = self.splitHorizontal1.sizes() #What. Nr2 if self.splitHorizontal2.closestLegalPosition( x, y) < self.splitHorizontal2.closestLegalPosition(x, y): sizeLeft = self.splitHorizontal1.closestLegalPosition(x, y) else: sizeLeft = self.splitHorizontal2.closestLegalPosition(x, y) sizeRight = sizes[0] + sizes[1] - sizeLeft sizes = [sizeLeft, sizeRight] self.splitHorizontal1.setSizes(sizes) self.splitHorizontal2.setSizes(sizes) def addStatusBar(self, bar): self.statusBar = bar self.layout.addLayout(self.statusBar) def setGrayScaleToQuadStatusBar(self, gray): self.quadViewStatusBar.setGrayScale(gray) def setMouseCoordsToQuadStatusBar(self, x, y, z): self.quadViewStatusBar.setMouseCoords(x, y, z) def ensureMaximized(self, axis): """ Maximize the view for the given axis if it isn't already maximized. """ axisDict = { 0: self.dock2_ofSplitHorizontal1, # x 1: self.dock1_ofSplitHorizontal2, # y 2: self.dock1_ofSplitHorizontal1 } # z if not axisDict[axis]._isMaximized: self.switchMinMax(axis) def switchMinMax(self, axis): """Switch an AxisViewWidget between from minimized to maximized and vice versa. Keyword arguments: axis -- the axis which is represented by the widget (no default) either string or integer 'x' - 0 'y' - 1 'z' - 2 """ #TODO: get the mapping information from where it is set! if this is not #done properly - do it properly if type(axis) == str: axisDict = { 'x': self.dock2_ofSplitHorizontal1, # x 'y': self.dock1_ofSplitHorizontal2, # y 'z': self.dock1_ofSplitHorizontal1 } # z elif type(axis) == int: axisDict = { 0: self.dock2_ofSplitHorizontal1, # x 1: self.dock1_ofSplitHorizontal2, # y 2: self.dock1_ofSplitHorizontal1 } # z dockWidget = axisDict.pop(axis) for dWidget in axisDict.values(): if dWidget._isMaximized: dWidget.graphicsView._hud.maximizeButtonClicked.emit() dockWidget.graphicsView._hud.maximizeButtonClicked.emit() def switchXMinMax(self): self.switchMinMax('x') def switchYMinMax(self): self.switchMinMax('y') def switchZMinMax(self): self.switchMinMax('z') def on_dock(self, dockWidget): if dockWidget._isDocked: dockWidget.undockView() self.on_min(dockWidget) dockWidget.minimizeView() else: dockWidget.dockView() def on_max(self, dockWidget): dockWidget.setVisible(True) for dock in self.dockableContainer: if not dockWidget == dock: dock.setVisible(False) # Force sizes to be updated now QApplication.processEvents() # On linux, the vertical splitter doesn't seem to refresh unless we do so manually # Presumably, this is a QT bug. self.splitVertical.refresh() # Viewport doesn't update automatically... view = dockWidget.graphicsView view.viewport().setGeometry(view.rect()) def on_min(self, dockWidget): for dock in self.dockableContainer: dock.setVisible(True) # Force sizes to be updated now QApplication.processEvents() self._resizeEqual() # Viewports don't update automatically... for dock in self.dockableContainer: view = dock.graphicsView if hasattr(view, 'viewport'): view.viewport().setGeometry(view.rect())
class QuadView(QWidget): def __init__(self, parent, view1, view2, view3, view4 = None): QWidget.__init__(self, parent) self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.installEventFilter(self) self.dockableContainer = [] self.layout = QVBoxLayout() self.setLayout(self.layout) self.layout.setContentsMargins(0, 0, 0, 0) self.layout.setSpacing(0) self.splitVertical = QSplitter(Qt.Vertical, self) self.layout.addWidget(self.splitVertical) self.splitHorizontal1 = QSplitter(Qt.Horizontal, self.splitVertical) self.splitHorizontal1.setObjectName("splitter1") self.splitHorizontal2 = QSplitter(Qt.Horizontal, self.splitVertical) self.splitHorizontal2.setObjectName("splitter2") self.splitHorizontal1.splitterMoved.connect(self.horizontalSplitterMoved) self.splitHorizontal2.splitterMoved.connect(self.horizontalSplitterMoved) self.imageView2D_1 = view1 self.imageView2D_2 = view2 self.imageView2D_3 = view3 self.dock1_ofSplitHorizontal1 = ImageView2DDockWidget(self.imageView2D_1) self.dock1_ofSplitHorizontal1.connectHud() self.dockableContainer.append(self.dock1_ofSplitHorizontal1) self.dock1_ofSplitHorizontal1.onDockButtonClicked.connect(lambda arg=self.dock1_ofSplitHorizontal1 : self.on_dock(arg)) self.dock1_ofSplitHorizontal1.onMaxButtonClicked.connect(lambda arg=self.dock1_ofSplitHorizontal1 : self.on_max(arg)) self.dock1_ofSplitHorizontal1.onMinButtonClicked.connect(lambda arg=self.dock1_ofSplitHorizontal1 : self.on_min(arg)) self.splitHorizontal1.addWidget(self.dock1_ofSplitHorizontal1) self.dock2_ofSplitHorizontal1 = ImageView2DDockWidget(self.imageView2D_2) self.dock2_ofSplitHorizontal1.onDockButtonClicked.connect(lambda arg=self.dock2_ofSplitHorizontal1 : self.on_dock(arg)) self.dock2_ofSplitHorizontal1.onMaxButtonClicked.connect(lambda arg=self.dock2_ofSplitHorizontal1 : self.on_max(arg)) self.dock2_ofSplitHorizontal1.onMinButtonClicked.connect(lambda arg=self.dock2_ofSplitHorizontal1 : self.on_min(arg)) self.dock2_ofSplitHorizontal1.connectHud() self.dockableContainer.append(self.dock2_ofSplitHorizontal1) self.splitHorizontal1.addWidget(self.dock2_ofSplitHorizontal1) self.dock1_ofSplitHorizontal2 = ImageView2DDockWidget(self.imageView2D_3) self.dock1_ofSplitHorizontal2.onDockButtonClicked.connect(lambda arg=self.dock1_ofSplitHorizontal2 : self.on_dock(arg)) self.dock1_ofSplitHorizontal2.onMaxButtonClicked.connect(lambda arg=self.dock1_ofSplitHorizontal2 : self.on_max(arg)) self.dock1_ofSplitHorizontal2.onMinButtonClicked.connect(lambda arg=self.dock1_ofSplitHorizontal2 : self.on_min(arg)) self.dock1_ofSplitHorizontal2.connectHud() self.dockableContainer.append(self.dock1_ofSplitHorizontal2) self.splitHorizontal2.addWidget(self.dock1_ofSplitHorizontal2) self.dock2_ofSplitHorizontal2 = ImageView2DDockWidget(view4) self.dockableContainer.append(self.dock2_ofSplitHorizontal2) self.splitHorizontal2.addWidget(self.dock2_ofSplitHorizontal2) #this is a hack: with 0 ms it does not work... QTimer.singleShot(250, self._resizeEqual) def _resizeEqual(self): if not all( [dock.isVisible() for dock in self.dockableContainer] ): return w, h = self.size().width()-self.splitHorizontal1.handleWidth(), self.size().height()-self.splitVertical.handleWidth() self.splitVertical.setSizes([h/2, h/2]) if self.splitHorizontal1.count() == 2 and self.splitHorizontal2.count() == 2: #docks = [self.imageView2D_1, self.imageView2D_2, self.imageView2D_3, self.testView4] docks = [] for splitter in [self.splitHorizontal1, self.splitHorizontal2]: for i in range( splitter.count() ): docks.append( splitter.widget(i).graphicsView ) w1 = [docks[i].minimumSize().width() for i in [0,2] ] w2 = [docks[i].minimumSize().width() for i in [1,3] ] wLeft = max(w1) wRight = max(w2) if wLeft > wRight and wLeft > w/2: wRight = w - wLeft elif wRight >= wLeft and wRight > w/2: wLeft = w - wRight else: wLeft = w/2 wRight = w/2 self.splitHorizontal1.setSizes([wLeft, wRight]) self.splitHorizontal2.setSizes([wLeft, wRight]) def eventFilter(self, obj, event): if(event.type() in [QEvent.WindowActivate, QEvent.Show]): self._synchronizeSplitter() return False def _synchronizeSplitter(self): sizes1 = self.splitHorizontal1.sizes() sizes2 = self.splitHorizontal2.sizes() if len(sizes1) > 0 and sizes1[0] > 0: self.splitHorizontal2.setSizes(sizes1) elif len(sizes2) > 0 and sizes2[0] > 0: self.splitHorizontal1.setSizes(sizes2) def resizeEvent(self, event): QWidget.resizeEvent(self, event) self._synchronizeSplitter() def horizontalSplitterMoved(self, x, y): if self.splitHorizontal1.count() != 2 or self.splitHorizontal2.count() != 2: return sizes = self.splitHorizontal1.sizes() #What. Nr2 if self.splitHorizontal2.closestLegalPosition(x, y) < self.splitHorizontal2.closestLegalPosition(x, y): sizeLeft = self.splitHorizontal1.closestLegalPosition(x, y) else: sizeLeft = self.splitHorizontal2.closestLegalPosition(x, y) sizeRight = sizes[0] + sizes[1] - sizeLeft sizes = [sizeLeft, sizeRight] self.splitHorizontal1.setSizes(sizes) self.splitHorizontal2.setSizes(sizes) def addStatusBar(self, bar): self.statusBar = bar self.layout.addLayout(self.statusBar) def setGrayScaleToQuadStatusBar(self, gray): self.quadViewStatusBar.setGrayScale(gray) def setMouseCoordsToQuadStatusBar(self, x, y, z): self.quadViewStatusBar.setMouseCoords(x, y, z) def ensureMaximized(self, axis): """ Maximize the view for the given axis if it isn't already maximized. """ axisDict = { 0 : self.dock2_ofSplitHorizontal1, # x 1 : self.dock1_ofSplitHorizontal2, # y 2 : self.dock1_ofSplitHorizontal1 } # z if not axisDict[axis]._isMaximized: self.switchMinMax(axis) def switchMinMax(self,axis): """Switch an AxisViewWidget between from minimized to maximized and vice versa. Keyword arguments: axis -- the axis which is represented by the widget (no default) either string or integer 'x' - 0 'y' - 1 'z' - 2 """ #TODO: get the mapping information from where it is set! if this is not #done properly - do it properly if type(axis) == str: axisDict = { 'x' : self.dock2_ofSplitHorizontal1, # x 'y' : self.dock1_ofSplitHorizontal2, # y 'z' : self.dock1_ofSplitHorizontal1 } # z elif type(axis) == int: axisDict = { 0 : self.dock2_ofSplitHorizontal1, # x 1 : self.dock1_ofSplitHorizontal2, # y 2 : self.dock1_ofSplitHorizontal1 } # z dockWidget = axisDict.pop(axis) for dWidget in axisDict.values(): if dWidget._isMaximized: dWidget.graphicsView._hud.maximizeButtonClicked.emit() dockWidget.graphicsView._hud.maximizeButtonClicked.emit() def switchXMinMax(self): self.switchMinMax('x') def switchYMinMax(self): self.switchMinMax('y') def switchZMinMax(self): self.switchMinMax('z') def on_dock(self, dockWidget): if dockWidget._isDocked: dockWidget.undockView() self.on_min(dockWidget) dockWidget.minimizeView() else: dockWidget.dockView() def on_max(self, dockWidget): dockWidget.setVisible(True) for dock in self.dockableContainer: if not dockWidget == dock: dock.setVisible(False) # Force sizes to be updated now QApplication.processEvents() # On linux, the vertical splitter doesn't seem to refresh unless we do so manually # Presumably, this is a QT bug. self.splitVertical.refresh() # Viewport doesn't update automatically... view = dockWidget.graphicsView view.viewport().setGeometry( view.rect() ) def on_min(self, dockWidget): for dock in self.dockableContainer: dock.setVisible(True) # Force sizes to be updated now QApplication.processEvents() self._resizeEqual() # Viewports don't update automatically... for dock in self.dockableContainer: view = dock.graphicsView if hasattr(view, 'viewport'): view.viewport().setGeometry( view.rect() )
self.cwd().addNode(nodeOne) self.cwd().addNode(nodeTwo) self.cwd().connectAttributes( nodeOne.getAttributeByName('Output')[0], nodeTwo.getAttributeByName('Input')[0]) if __name__ == "__main__": app = QApplication(sys.argv) # Setup workspace controls kWorkspaceSplitter = QSplitter(Qt.Vertical) kWorkspaceSplitter.setObjectName('mainSplitter') kResourceTabs = QTabWidget() kResourceTabs.setObjectName('kMainTab') kResourceTabs.setTabPosition(QTabWidget.South) theView = EView() theView.Scene = ExampleScene(theView) theView.Scene.createConnected() kResourceTabs.addTab(theView, "Workspace") kWorkspaceSplitter.addWidget(kResourceTabs) window = QMainWindow() window.setWindowTitle('EDD - Standalone')
node = self.getNode(str(action.text())) if node: self.cwd().addNode(node) def setControl(self, control): self.__control = control if __name__ == "__main__": app = QApplication(sys.argv) # Setup workspace controls kWorkspaceSplitter = QSplitter(Qt.Horizontal) kWorkspaceSplitter.setObjectName('mainSplitter') kResourceTabs = QTabWidget() kResourceTabs.setObjectName('kMainTab') kResourceTabs.setTabPosition(QTabWidget.South) theView = EView() theView.Scene = ExampleScene(theView) console = QLabel() kResourceTabs.addTab(theView, "Node graph") kWorkspaceSplitter.addWidget(console) kWorkspaceSplitter.addWidget(kResourceTabs) theView.Scene.setControl(console)
class QuadView(QWidget): def __init__(self, parent, view1, view2, view3, view4 = None): QWidget.__init__(self, parent) self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.installEventFilter(self) self.dockableContainer = [] self.layout = QVBoxLayout() self.setLayout(self.layout) self.layout.setContentsMargins(4, 4, 4, 4) self.layout.setSpacing(0) self.splitVertical = QSplitter(Qt.Vertical, self) self.layout.addWidget(self.splitVertical) self.splitHorizontal1 = QSplitter(Qt.Horizontal, self.splitVertical) self.splitHorizontal1.setObjectName("splitter1") self.splitHorizontal2 = QSplitter(Qt.Horizontal, self.splitVertical) self.splitHorizontal2.setObjectName("splitter2") self.splitHorizontal1.splitterMoved.connect(self.horizontalSplitterMoved) self.splitHorizontal2.splitterMoved.connect(self.horizontalSplitterMoved) self.imageView2D_1 = view1 self.imageView2D_2 = view2 self.imageView2D_3 = view3 self.testView4 = ImageView2DDockWidget(view4) self.dock1_ofSplitHorizontal1 = ImageView2DDockWidget(self.imageView2D_1) self.dock1_ofSplitHorizontal1.connectHud() self.dockableContainer.append(self.dock1_ofSplitHorizontal1) self.dock1_ofSplitHorizontal1.onDockButtonClicked.connect(lambda arg=self.dock1_ofSplitHorizontal1 : self.on_dock(arg)) self.dock1_ofSplitHorizontal1.onMaxButtonClicked.connect(lambda arg=self.dock1_ofSplitHorizontal1 : self.on_max(arg)) self.dock1_ofSplitHorizontal1.onMinButtonClicked.connect(lambda arg=self.dock1_ofSplitHorizontal1 : self.on_min(arg)) self.splitHorizontal1.addWidget(self.dock1_ofSplitHorizontal1) self.dock2_ofSplitHorizontal1 = ImageView2DDockWidget(self.imageView2D_2) self.dock2_ofSplitHorizontal1.onDockButtonClicked.connect(lambda arg=self.dock2_ofSplitHorizontal1 : self.on_dock(arg)) self.dock2_ofSplitHorizontal1.onMaxButtonClicked.connect(lambda arg=self.dock2_ofSplitHorizontal1 : self.on_max(arg)) self.dock2_ofSplitHorizontal1.onMinButtonClicked.connect(lambda arg=self.dock2_ofSplitHorizontal1 : self.on_min(arg)) self.dock2_ofSplitHorizontal1.connectHud() self.dockableContainer.append(self.dock2_ofSplitHorizontal1) self.splitHorizontal1.addWidget(self.dock2_ofSplitHorizontal1) self.dock1_ofSplitHorizontal2 = ImageView2DDockWidget(self.imageView2D_3) self.dock1_ofSplitHorizontal2.onDockButtonClicked.connect(lambda arg=self.dock1_ofSplitHorizontal2 : self.on_dock(arg)) self.dock1_ofSplitHorizontal2.onMaxButtonClicked.connect(lambda arg=self.dock1_ofSplitHorizontal2 : self.on_max(arg)) self.dock1_ofSplitHorizontal2.onMinButtonClicked.connect(lambda arg=self.dock1_ofSplitHorizontal2 : self.on_min(arg)) self.dock1_ofSplitHorizontal2.connectHud() self.dockableContainer.append(self.dock1_ofSplitHorizontal2) self.splitHorizontal2.addWidget(self.dock1_ofSplitHorizontal2) self.dock2_ofSplitHorizontal2 = ImageView2DDockWidget(self.testView4) self.dockableContainer.append(self.dock2_ofSplitHorizontal2) self.splitHorizontal2.addWidget(self.dock2_ofSplitHorizontal2) #this is a hack: with 0 ms it does not work... QTimer.singleShot(250, self._resizeEqual) def _resizeEqual(self): w, h = self.size().width()-self.splitHorizontal1.handleWidth(), self.size().height()-self.splitVertical.handleWidth() docks = [self.imageView2D_1, self.imageView2D_2, self.imageView2D_3, self.testView4] w1 = [docks[i].minimumSize().width() for i in [0,2] ] w2 = [docks[i].minimumSize().width() for i in [1,3] ] wLeft = max(w1) wRight = max(w2) if wLeft > wRight and wLeft > w/2: wRight = w - wLeft elif wRight >= wLeft and wRight > w/2: wLeft = w - wRight else: wLeft = w/2 wRight = w/2 self.splitHorizontal1.setSizes([wLeft, wRight]) self.splitHorizontal2.setSizes([wLeft, wRight]) self.splitVertical.setSizes([h/2, h/2]) def eventFilter(self, obj, event): if(event.type()==QEvent.WindowActivate): self._synchronizeSplitter() return False def _synchronizeSplitter(self): sizes1 = self.splitHorizontal1.sizes() sizes2 = self.splitHorizontal2.sizes() if sizes1[0] > sizes2[0]: self.splitHorizontal1.setSizes(sizes2) else: self.splitHorizontal2.setSizes(sizes1) def resizeEvent(self, event): QWidget.resizeEvent(self, event) self._synchronizeSplitter() def horizontalSplitterMoved(self, x, y): sizes = self.splitHorizontal1.sizes() #What. Nr2 if self.splitHorizontal2.closestLegalPosition(x, y) < self.splitHorizontal2.closestLegalPosition(x, y): sizeLeft = self.splitHorizontal1.closestLegalPosition(x, y) else: sizeLeft = self.splitHorizontal2.closestLegalPosition(x, y) sizeRight = sizes[0] + sizes[1] - sizeLeft sizes = [sizeLeft, sizeRight] self.splitHorizontal1.setSizes(sizes) self.splitHorizontal2.setSizes(sizes) def addStatusBar(self, bar): self.statusBar = bar self.layout.addLayout(self.statusBar) def setGrayScaleToQuadStatusBar(self, gray): self.quadViewStatusBar.setGrayScale(gray) def setMouseCoordsToQuadStatusBar(self, x, y, z): self.quadViewStatusBar.setMouseCoords(x, y, z) def on_dock(self, dockWidget): if dockWidget._isDocked: dockWidget.undockView() self.on_min(dockWidget) dockWidget.minimizeView() else: dockWidget.dockView() def on_max(self, dockWidget): for dock in self.dockableContainer: if not dockWidget == dock: dock.setVisible(False) def on_min(self, dockWidget): for dock in self.dockableContainer: if not dockWidget == dock: dock.setVisible(True)
class ScoreTable(QWidget): """show scores of current or last game, even if the last game is finished. To achieve this we keep our own reference to game.""" def __init__(self, game): super(ScoreTable, self).__init__(None) self.setObjectName('ScoreTable') self.game = None self.scoreModel = None self.scoreModelTest = None self.setWindowTitle(m18nc('kajongg', 'Scores') + ' - Kajongg') self.setAttribute(Qt.WA_AlwaysShowToolTips) self.setMouseTracking(True) self.__tableFields = ['prevailing', 'won', 'wind', 'points', 'payments', 'balance', 'hand', 'manualrules'] self.setupUi() self.refresh(game) StateSaver(self, self.splitter) def setColWidth(self): """we want to accomodate 5 digits plus minus sign and all column widths should be the same, making horizontal scrolling per item more pleasant""" self.viewRight.setColWidth() def setupUi(self): """setup UI elements""" self.viewLeft = ScoreViewLeft(self) self.viewRight = ScoreViewRight(self) self.viewRight.setHorizontalScrollBar(HorizontalScrollBar(self)) self.viewRight.setHorizontalScrollMode(QAbstractItemView.ScrollPerItem) self.viewRight.setFocusPolicy(Qt.NoFocus) self.viewRight.header().setClickable(False) self.viewRight.header().setMovable(False) self.viewRight.setSelectionMode(QAbstractItemView.NoSelection) windowLayout = QVBoxLayout(self) self.splitter = QSplitter(Qt.Vertical) self.splitter.setObjectName('ScoreTableSplitter') windowLayout.addWidget(self.splitter) scoreWidget = QWidget() self.scoreLayout = QHBoxLayout(scoreWidget) leftLayout = QVBoxLayout() leftLayout.addWidget(self.viewLeft) self.leftLayout = leftLayout self.scoreLayout.addLayout(leftLayout) self.scoreLayout.addWidget(self.viewRight) self.splitter.addWidget(scoreWidget) self.ruleTree = RuleTreeView(m18nc('kajongg','Used Rules')) self.splitter.addWidget(self.ruleTree) # this shows just one line for the ruleTree - so we just see the # name of the ruleset: self.splitter.setSizes(list([1000, 1])) def sizeHint(self): """give the scoring table window a sensible default size""" result = QWidget.sizeHint(self) result.setWidth(result.height() * 3 / 2) # the default is too small. Use at least 2/5 of screen height and 1/4 of screen width: available = KApplication.kApplication().desktop().availableGeometry() height = max(result.height(), available.height() * 2 / 5) width = max(result.width(), available.width() / 4) result.setHeight(height) result.setWidth(width) return result def refresh(self, game): """load this game and this player. Keep parameter list identical with ExplainView""" if not game: # keep scores of previous game on display return if self.scoreModel: expandGroups = [ self.viewLeft.isExpanded(self.scoreModel.index(x, 0, QModelIndex())) for x in range(4)] else: expandGroups = [True, False, True, True] self.game = game gameid = str(self.game.seed or self.game.gameid) if self.game.finished(): title = m18n('Final scores for game <numid>%1</numid>', gameid) else: title = m18n('Scores for game <numid>%1</numid>', gameid) self.setWindowTitle(title + ' - Kajongg') self.ruleTree.rulesets = list([self.game.ruleset]) self.scoreModel = ScoreModel(self) if Debug.modelTest: self.scoreModelTest = ModelTest(self.scoreModel, self) for view in [self.viewLeft, self.viewRight]: view.setModel(self.scoreModel) header = view.header() header.setStretchLastSection(False) view.setAlternatingRowColors(True) self.viewRight.header().setResizeMode(QHeaderView.Fixed) for col in range(self.viewLeft.header().count()): self.viewLeft.header().setSectionHidden(col, col > 0) self.viewRight.header().setSectionHidden(col, col == 0) self.scoreLayout.setStretch(1, 100) self.scoreLayout.setSpacing(0) self.viewLeft.setFrameStyle(QFrame.NoFrame) self.viewRight.setFrameStyle(QFrame.NoFrame) self.viewLeft.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) for master, slave in ((self.viewRight, self.viewLeft), (self.viewLeft, self.viewRight)): master.expanded.connect(slave.expand) master.collapsed.connect(slave.collapse) master.verticalScrollBar().valueChanged.connect(slave.verticalScrollBar().setValue) for row, expand in enumerate(expandGroups): self.viewLeft.setExpanded(self.scoreModel.index(row, 0, QModelIndex()), expand) self.viewLeft.resizeColumnToContents(0) self.viewRight.setColWidth() # we need a timer since the scrollbar is not yet visible QTimer.singleShot(0, self.scrollRight) def scrollRight(self): """make sure the latest hand is visible""" scrollBar = self.viewRight.horizontalScrollBar() scrollBar.setValue(scrollBar.maximum()) def showEvent(self, dummyEvent): """Only now the views and scrollbars have useful sizes, so we can compute the spacer for the left view""" self.adaptLeftViewHeight() def adaptLeftViewHeight(self): """if the right view has a horizontal scrollbar, make sure both view have the same vertical scroll area. Otherwise scrolling to bottom results in unsyncronized views.""" if self.viewRight.horizontalScrollBar().isVisible(): height = self.viewRight.horizontalScrollBar().height() else: height = 0 if self.leftLayout.count() > 1: # remove previous spacer self.leftLayout.takeAt(1) if height: self.leftLayout.addSpacing(height)