void SplitView::split(BufferView* view, Qt::Orientation orientation) { if (view) { QSplitter* container = qobject_cast<QSplitter*>(view->parentWidget()); if (container) { int index = container->indexOf(view); BufferView* bv = 0; const int size = (orientation == Qt::Horizontal ? container->width() : container->height()) - container->handleWidth(); if (container->count() == 1 || container->orientation() == orientation) { container->setOrientation(orientation); bv = createBufferView(container, index + 1); QList<int> sizes; for (int i = 0; i < container->count(); ++i) sizes += size / container->count(); container->setSizes(sizes); } else if (index != -1) { QList<int> sizes = container->sizes(); QSplitter* splitter = wrap(view, orientation); if (splitter) { container->setSizes(sizes); bv = createBufferView(splitter); splitter->setSizes(QList<int>() << size/2 << size/2); } } if (bv) { bv->setBuffer(view->buffer()); emit viewAdded(bv); } } } }
void KateViewManager::splitViewSpace( KateViewSpace* vs, // = 0 Qt::Orientation o )// = Qt::Horizontal { // emergency: fallback to activeViewSpace, and if still invalid, abort if (!vs) vs = activeViewSpace(); if (!vs) return; // get current splitter, and abort if null QSplitter *currentSplitter = qobject_cast<QSplitter*>(vs->parentWidget()); if (!currentSplitter) return; // index where to insert new splitter/viewspace const int index = currentSplitter->indexOf( vs ); // create new viewspace KateViewSpace* vsNew = new KateViewSpace( this ); // only 1 children -> we are the root container. So simply set the orientation // and add the new view space, then correct the sizes to 50%:50% if (currentSplitter->count() == 1) { if( currentSplitter->orientation() != o ) currentSplitter->setOrientation( o ); QList<int> sizes = currentSplitter->sizes(); sizes << (sizes.first() - currentSplitter->handleWidth() ) / 2; sizes[0] = sizes[1]; currentSplitter->insertWidget( index, vsNew ); currentSplitter->setSizes( sizes ); } else { // create a new QSplitter and replace vs with the splitter. vs and newVS are // the new children of the new QSplitter QSplitter* newContainer = new QSplitter( o ); newContainer->setOpaqueResize( KGlobalSettings::opaqueResize() ); QList<int> currentSizes = currentSplitter->sizes(); newContainer->addWidget( vs ); newContainer->addWidget( vsNew ); currentSplitter->insertWidget( index, newContainer ); newContainer->show(); // fix sizes of children of old and new splitter currentSplitter->setSizes( currentSizes ); QList<int> newSizes = newContainer->sizes(); newSizes[0] = (newSizes[0] + newSizes[1] - newContainer->handleWidth()) / 2; newSizes[1] = newSizes[0]; newContainer->setSizes( newSizes ); } m_viewSpaceList.append( vsNew ); activeViewSpace()->setActive( false ); vsNew->setActive( true, true ); vsNew->show(); createView ((KTextEditor::Document*)activeView()->document()); updateViewSpaceActions (); }
void ViewAreaImpl::dropViewInsidePane(ViewPane* pane, View* view, int dropEdge) { if(dropEdge == OVER){ addView(pane, view, true); } else { QSize destSize = pane->size(); QSplitter* parentSplitter = static_cast<QSplitter*>(pane->parentWidget()); if(parentSplitter->count() >= 2){ QList<int> sizes = parentSplitter->sizes(); QSplitter* newSplitter = new QSplitter(parentSplitter); parentSplitter->insertWidget(parentSplitter->indexOf(pane), newSplitter); newSplitter->addWidget(pane); parentSplitter->setSizes(sizes); parentSplitter = newSplitter; } ViewPane* newViewPane = new ViewPane(this, parentSplitter); if(dropEdge == LEFT){ parentSplitter->setOrientation(Qt::Horizontal); parentSplitter->insertWidget(0, newViewPane); } else if(dropEdge == RIGHT){ parentSplitter->setOrientation(Qt::Horizontal); parentSplitter->insertWidget(1, newViewPane); } else if(dropEdge == TOP){ parentSplitter->setOrientation(Qt::Vertical); parentSplitter->insertWidget(0, newViewPane); } else { parentSplitter->setOrientation(Qt::Vertical); parentSplitter->insertWidget(1, newViewPane); } addView(newViewPane, view, true); int half; if(parentSplitter->orientation() == Qt::Horizontal){ half = destSize.height() / 2; } else { half = destSize.width() / 2; } QList<int> sizes; sizes << half << half; parentSplitter->setSizes(sizes); } }
void KKbdAccessExtensions::showIcon() { if (!d->panel) return; QPoint p; // kdDebug() << "KKbdAccessExtensions::showIcon: topLevelWidget = " << d->panel->topLevelWidget()->name() << endl; if (::qt_cast<QSplitter*>( d->panel )) { QSplitter* splitter = dynamic_cast<QSplitter *>(d->panel); int handleNdx = d->handleNdx - 1; QValueList<int> sizes = splitter->sizes(); // kdDebug() << "KKbdAccessExtensions::showIcon: sizes = " << sizes << endl; if (splitter->orientation() == Qt::Horizontal) { d->icon->setShape(Qt::SizeHorCursor); p.setX(sizes[handleNdx] + (splitter->handleWidth() / 2)); p.setY(splitter->height() / 2); } else { d->icon->setShape(Qt::SizeVerCursor); p.setX(splitter->width() / 2); p.setY(sizes[handleNdx] + (splitter->handleWidth() / 2)); } // kdDebug() << "KKbdAccessExtensions::showIcon: p = " << p << endl; p = splitter->mapToGlobal(p); // kdDebug() << "KKbdAccessExtensions::showIcon: mapToGlobal = " << p << endl; } else { QDockWindow* dockWindow = dynamic_cast<QDockWindow *>(d->panel); p = dockWindow->pos(); if (dockWindow->area()) { // kdDebug() << "KKbdAccessExtensions::showIcon: pos = " << p << " of window = " << dockWindow->parentWidget()->name() << endl; p = dockWindow->parentWidget()->mapTo(dockWindow->topLevelWidget(), p); // kdDebug() << "KKbdAccessExtensions::showIcon: mapTo = " << p << " of window = " << dockWindow->topLevelWidget()->name() << endl; // TODO: How to get the handle width? if (d->handleNdx == 1) { d->icon->setShape(Qt::SizeHorCursor); if (dockWindow->area()->orientation() == Qt::Vertical) { if (dockWindow->area()->handlePosition() == QDockArea::Normal) // Handle is to the right of the dock window. p.setX(p.x() + dockWindow->width()); // else Handle is to the left of the dock window. } else // Handle is to the right of the dock window. p.setX(p.x() + dockWindow->width()); p.setY(p.y() + (dockWindow->height() / 2)); } else { d->icon->setShape(Qt::SizeVerCursor); p.setX(p.x() + (dockWindow->width() / 2)); if (dockWindow->area()->orientation() == Qt::Vertical) // Handle is below the dock window. p.setY(p.y() + dockWindow->height()); else { if (dockWindow->area()->handlePosition() == QDockArea::Normal) // Handle is below the dock window. p.setY(p.y() + dockWindow->height()); // else Handle is above the dock window. } } p = dockWindow->topLevelWidget()->mapToGlobal(p); } else { d->icon->setShape(Qt::SizeAllCursor); p = QPoint(dockWindow->width() / 2, dockWindow->height() / 2); p = dockWindow->mapToGlobal(p); // Undocked. Position in center of window. } } // kdDebug() << "KKbdAccessExtensions::showIcon: show(p) = " << p << endl; d->icon->show(p); }