static void place_line( QValueList<DockData> &lastLine, Qt::Orientation o, int linestrut, int fullextent, int tbstrut, int maxsize, QDockAreaLayout * ) { QDockWindow *last = 0; QRect lastRect; for ( QValueList<DockData>::Iterator it = lastLine.begin(); it != lastLine.end(); ++it ) { if ( tbstrut != -1 && ::qt_cast<QToolBar*>((*it).w) ) (*it).rect.setHeight( tbstrut ); if ( !last ) { last = (*it).w; lastRect = (*it).rect; continue; } if ( !last->isStretchable() ) { int w = QMIN( lastRect.width(), maxsize ); set_geometry( last, lastRect.x(), lastRect.y(), w, lastRect.height(), o ); } else { int w = QMIN( (*it).rect.x() - lastRect.x(), maxsize ); set_geometry( last, lastRect.x(), lastRect.y(), w, last->isResizeEnabled() ? linestrut : lastRect.height(), o ); } last = (*it).w; lastRect = (*it).rect; } if ( !last ) return; if ( !last->isStretchable() ) { int w = QMIN( lastRect.width(), maxsize ); set_geometry( last, lastRect.x(), lastRect.y(), w, lastRect.height(), o ); } else { int w = QMIN( fullextent - lastRect.x() - ( o == Qt::Vertical ? 1 : 0 ), maxsize ); set_geometry( last, lastRect.x(), lastRect.y(), w, last->isResizeEnabled() ? linestrut : lastRect.height(), o ); } }
int QDockAreaLayout::layoutItems( const QRect &rect, bool testonly ) { if ( !dockWindows || !dockWindows->first() ) return 0; dirty = FALSE; // some corrections QRect r = rect; if ( orientation() == Vertical ) r.setHeight( r.height() - 3 ); // init lines.clear(); ls.clear(); QPtrListIterator<QDockWindow> it( *dockWindows ); QDockWindow *dw = 0; int start = start_pos( r, orientation() ); int pos = start; int sectionpos = 0; int linestrut = 0; QValueList<DockData> lastLine; int tbstrut = -1; int maxsize = size_extent( rect.size(), orientation() ); int visibleWindows = 0; // go through all widgets in the dock while ( ( dw = it.current() ) != 0 ) { ++it; if ( dw->isHidden() ) continue; ++visibleWindows; // find position for the widget: This is the maximum of the // end of the previous widget and the offset of the widget. If // the position + the width of the widget dosn't fit into the // dock, try moving it a bit back, if possible. int op = pos; int dockExtend = dock_extent( dw, orientation(), maxsize ); if ( !dw->isStretchable() ) { pos = QMAX( pos, dw->offset() ); if ( pos + dockExtend > size_extent( r.size(), orientation() ) - 1 ) pos = QMAX( op, size_extent( r.size(), orientation() ) - 1 - dockExtend ); } if ( !lastLine.isEmpty() && !dw->newLine() && space_left( rect, pos, orientation() ) < dockExtend ) shrink_extend( dw, dockExtend, space_left( rect, pos, orientation() ), orientation() ); // if the current widget doesn't fit into the line anymore and it is not the first widget of the line if ( !lastLine.isEmpty() && ( space_left( rect, pos, orientation() ) < dockExtend || dw->newLine() ) ) { if ( !testonly ) // place the last line, if not in test mode place_line( lastLine, orientation(), linestrut, size_extent( r.size(), orientation() ), tbstrut, maxsize, this ); // remember the line coordinats of the last line if ( orientation() == Horizontal ) lines.append( QRect( 0, sectionpos, r.width(), linestrut ) ); else lines.append( QRect( sectionpos, 0, linestrut, r.height() ) ); // do some clearing for the next line lastLine.clear(); sectionpos += linestrut; linestrut = 0; pos = start; tbstrut = -1; } // remeber first widget of a line if ( lastLine.isEmpty() ) { ls.append( dw ); // try to make the best position int op = pos; if ( !dw->isStretchable() ) pos = QMAX( pos, dw->offset() ); if ( pos + dockExtend > size_extent( r.size(), orientation() ) - 1 ) pos = QMAX( op, size_extent( r.size(), orientation() ) - 1 - dockExtend ); } // do some calculations and add the remember the rect which the docking widget requires for the placing QRect dwRect(pos, sectionpos, dockExtend, dock_strut( dw, orientation() ) ); lastLine.append( DockData( dw, dwRect ) ); if ( ::qt_cast<QToolBar*>(dw) ) tbstrut = QMAX( tbstrut, dock_strut( dw, orientation() ) ); linestrut = QMAX( dock_strut( dw, orientation() ), linestrut ); add_size( dockExtend, pos, orientation() ); } // if some stuff was not placed/stored yet, do it now if ( !testonly ) place_line( lastLine, orientation(), linestrut, size_extent( r.size(), orientation() ), tbstrut, maxsize, this ); if ( orientation() == Horizontal ) lines.append( QRect( 0, sectionpos, r.width(), linestrut ) ); else lines.append( QRect( sectionpos, 0, linestrut, r.height() ) ); if ( *(--lines.end()) == *(--(--lines.end())) ) lines.remove( lines.at( lines.count() - 1 ) ); it.toFirst(); bool hadResizable = FALSE; while ( ( dw = it.current() ) != 0 ) { ++it; if ( !dw->isVisibleTo( parentWidget ) ) continue; hadResizable = hadResizable || dw->isResizeEnabled(); dw->updateSplitterVisibility( visibleWindows > 1 ); //!dw->area()->isLastDockWindow( dw ) ); } return sectionpos + linestrut; }