void DocumentViewContainer::updateLayout() { // Stop update timer: this is useful if updateLayout() is called directly // and not through scheduleLayoutUpdate() d->mLayoutUpdateTimer->stop(); QList<DocumentView*> views = (d->mViews | d->mAddedViews).toList(); qSort(views.begin(), views.end(), viewLessThan); bool animated = GwenviewConfig::animationMethod() != DocumentView::NoAnimation; bool crossFade = d->mAddedViews.count() == 1 && d->mRemovedViews.count() == 1; if (animated && crossFade) { DocumentView* oldView = *d->mRemovedViews.begin(); DocumentView* newView = *d->mAddedViews.begin(); newView->setGeometry(rect()); newView->setEraseBorders(true); QPropertyAnimation* anim = newView->fadeIn(); oldView->setZValue(-1); connect(anim, SIGNAL(finished()), oldView, SLOT(hideAndDeleteLater())); d->mRemovedViews.clear(); return; } if (!views.isEmpty()) { // Compute column count int colCount; switch (views.count()) { case 1: colCount = 1; break; case 2: colCount = 2; break; case 3: colCount = 3; break; case 4: colCount = 2; break; case 5: colCount = 3; break; case 6: colCount = 3; break; default: colCount = 3; break; } int rowCount = qCeil(views.count() / qreal(colCount)); Q_ASSERT(rowCount > 0); int viewWidth = width() / colCount; int viewHeight = height() / rowCount; int col = 0; int row = 0; Q_FOREACH(DocumentView * view, views) { QRect rect; rect.setLeft(col * viewWidth); rect.setTop(row * viewHeight); rect.setWidth(viewWidth); rect.setHeight(viewHeight); if (animated) { if (d->mViews.contains(view)) { if (rect != view->geometry()) { if (d->mAddedViews.isEmpty() && d->mRemovedViews.isEmpty()) { // View moves because of a resize view->moveTo(rect); } else { // View moves because the number of views changed, // animate the change view->moveToAnimated(rect); } } } else { view->setGeometry(rect); view->fadeIn(); } } else { // Not animated, set final geometry and opacity now view->setGeometry(rect); view->setOpacity(1); } ++col; if (col == colCount) { col = 0; ++row; } }