QTextStream &operator<<( QTextStream &ts, const QDockArea &dockArea ) { QString str; QPtrList<QDockWindow> l = dockArea.dockWindowList(); for ( QDockWindow *dw = l.first(); dw; dw = l.next() ) str += "[" + QString( dw->caption() ) + "," + QString::number( (int)dw->offset() ) + "," + QString::number( (int)dw->newLine() ) + "," + QString::number( dw->fixedExtent().width() ) + "," + QString::number( dw->fixedExtent().height() ) + "," + QString::number( (int)!dw->isHidden() ) + "]"; ts << str << endl; return ts; }
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; }