Ignore:
Timestamp:
May 5, 2011, 5:36:53 AM (14 years ago)
Author:
Dmitry A. Kuminov
Message:

trunk: Merged in qt 4.7.2 sources from branches/vendor/nokia/qt.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/src/gui/itemviews/qtreeview.cpp

    r769 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    675675    // since QAbstractItemView::dataChanged() will get the visualRect for the items anyway
    676676
     677    bool sizeChanged = false;
    677678    int topViewIndex = d->viewIndex(topLeft);
    678     if (topViewIndex == 0)
    679         d->defaultItemHeight = indexRowSizeHint(topLeft);
    680     bool sizeChanged = false;
     679    if (topViewIndex == 0) {
     680        int newDefaultItemHeight = indexRowSizeHint(topLeft);
     681        sizeChanged = d->defaultItemHeight != newDefaultItemHeight;
     682        d->defaultItemHeight = newDefaultItemHeight;
     683    }
     684
    681685    if (topViewIndex != -1) {
    682         if (topLeft == bottomRight) {
     686        if (topLeft.row() == bottomRight.row()) {
    683687            int oldHeight = d->itemHeight(topViewIndex);
    684688            d->invalidateHeightCache(topViewIndex);
    685             sizeChanged = (oldHeight != d->itemHeight(topViewIndex));
     689            sizeChanged |= (oldHeight != d->itemHeight(topViewIndex));
     690            if (topLeft.column() == 0)
     691                d->viewItems[topViewIndex].hasChildren = d->hasVisibleChildren(topLeft);
    686692        } else {
    687693            int bottomViewIndex = d->viewIndex(bottomRight);
     
    690696                d->invalidateHeightCache(i);
    691697                sizeChanged |= (oldHeight != d->itemHeight(i));
     698                if (topLeft.column() == 0)
     699                    d->viewItems[i].hasChildren = d->hasVisibleChildren(d->viewItems.at(i).index);
    692700            }
    693701        }
     
    955963        start = d->model->index(0, 0, d->root);
    956964
    957     QTime now(QTime::currentTime());
    958965    bool skipRow = false;
    959     if (search.isEmpty()
    960         || (d->keyboardInputTime.msecsTo(now) > QApplication::keyboardInputInterval())) {
     966    bool keyboardTimeWasValid = d->keyboardInputTime.isValid();
     967    qint64 keyboardInputTimeElapsed = d->keyboardInputTime.restart();
     968    if (search.isEmpty() || !keyboardTimeWasValid
     969        || keyboardInputTimeElapsed > QApplication::keyboardInputInterval()) {
    961970        d->keyboardInput = search;
    962         skipRow = true;
     971        skipRow = currentIndex().isValid(); //if it is not valid we should really start at QModelIndex(0,0)
    963972    } else {
    964973        d->keyboardInput += search;
    965974    }
    966     d->keyboardInputTime = now;
    967975
    968976    // special case for searches with same key like 'aaaaa'
     
    12291237        d->hoverBranch = d->itemDecorationAt(he->pos());
    12301238        if (oldBranch != d->hoverBranch) {
    1231             QModelIndex oldIndex = d->modelIndex(oldBranch),
    1232                 newIndex = d->modelIndex(d->hoverBranch);
    1233             if (oldIndex != newIndex) {
    1234                 QRect oldRect = visualRect(oldIndex);
    1235                 QRect newRect = visualRect(newIndex);
    1236                 oldRect.setLeft(oldRect.left() - d->indent);
    1237                 newRect.setLeft(newRect.left() - d->indent);
    1238                 //we need to paint the whole items (including the decoration) so that when the user
    1239                 //moves the mouse over those elements they are updated
    1240                 viewport()->update(oldRect);
    1241                 viewport()->update(newRect);
     1239            //we need to paint the whole items (including the decoration) so that when the user
     1240            //moves the mouse over those elements they are updated
     1241            if (oldBranch >= 0) {
     1242                int y = d->coordinateForItem(oldBranch);
     1243                int h = d->itemHeight(oldBranch);
     1244                viewport()->update(QRect(0, y, viewport()->width(), h));
     1245            }
     1246            if (d->hoverBranch >= 0) {
     1247                int y = d->coordinateForItem(d->hoverBranch);
     1248                int h = d->itemHeight(d->hoverBranch);
     1249                viewport()->update(QRect(0, y, viewport()->width(), h));
    12421250            }
    12431251        }
     
    19942002{
    19952003    Q_D(QTreeView);
     2004    if (d->hasRemovedItems) {
     2005        //clean the QSet that may contains old (and this invalid) indexes
     2006        d->hasRemovedItems = false;
     2007        QSet<QPersistentModelIndex>::iterator it = d->expandedIndexes.begin();
     2008        while (it != d->expandedIndexes.constEnd()) {
     2009            if (!it->isValid())
     2010                it = d->expandedIndexes.erase(it);
     2011            else
     2012                ++it;
     2013        }
     2014        it = d->hiddenIndexes.begin();
     2015        while (it != d->hiddenIndexes.constEnd()) {
     2016            if (!it->isValid())
     2017                it = d->hiddenIndexes.erase(it);
     2018            else
     2019                ++it;
     2020        }
     2021    }
    19962022    d->viewItems.clear(); // prepare for new layout
    19972023    QModelIndex parent = d->root;
     
    21352161    case MoveLeft: {
    21362162        QScrollBar *sb = horizontalScrollBar();
    2137         if (vi < d->viewItems.count() && d->viewItems.at(vi).expanded && d->itemsExpandable && sb->value() == sb->minimum())
     2163        if (vi < d->viewItems.count() && d->viewItems.at(vi).expanded && d->itemsExpandable && sb->value() == sb->minimum()) {
    21382164            d->collapse(vi, true);
    2139         else {
     2165            d->moveCursorUpdatedView = true;
     2166        } else {
    21402167            bool descend = style()->styleHint(QStyle::SH_ItemView_ArrowKeysNavigateIntoChildren, 0, this);
    21412168            if (descend) {
     
    21572184                }
    21582185
     2186                int oldValue = sb->value();
    21592187                sb->setValue(sb->value() - sb->singleStep());
     2188                if (oldValue != sb->value())
     2189                    d->moveCursorUpdatedView = true;
    21602190            }
    21612191
     
    21692199            && d->hasVisibleChildren(d->viewItems.at(vi).index)) {
    21702200            d->expand(vi, true);
     2201            d->moveCursorUpdatedView = true;
    21712202        } else {
    21722203            bool descend = style()->styleHint(QStyle::SH_ItemView_ArrowKeysNavigateIntoChildren, 0, this);
     
    21912222                //last restort: we change the scrollbar value
    21922223                QScrollBar *sb = horizontalScrollBar();
     2224                int oldValue = sb->value();
    21932225                sb->setValue(sb->value() + sb->singleStep());
     2226                if (oldValue != sb->value())
     2227                    d->moveCursorUpdatedView = true;
    21942228            }
    21952229        }
     
    22502284  Returns the rectangle from the viewport of the items in the given
    22512285  \a selection.
     2286
     2287  Since 4.7, the returned region only contains rectangles intersecting
     2288  (or included in) the viewport.
    22522289*/
    22532290QRegion QTreeView::visualRegionForSelection(const QItemSelection &selection) const
     
    22582295
    22592296    QRegion selectionRegion;
     2297    const QRect &viewportRect = d->viewport->rect();
    22602298    for (int i = 0; i < selection.count(); ++i) {
    22612299        QItemSelectionRange range = selection.at(i);
     
    22902328        int height = bottom - top + 1;
    22912329        if (d->header->sectionsMoved()) {
    2292             for (int c = range.left(); c <= range.right(); ++c)
    2293                 selectionRegion += QRegion(QRect(columnViewportPosition(c), top,
    2294                                                  columnWidth(c), height));
     2330            for (int c = range.left(); c <= range.right(); ++c) {
     2331                const QRect rangeRect(columnViewportPosition(c), top, columnWidth(c), height);
     2332                if (viewportRect.intersects(rangeRect))
     2333                    selectionRegion += rangeRect;
     2334            }
    22952335        } else {
    22962336            QRect combined = leftRect|rightRect;
    22972337            combined.setX(columnViewportPosition(isRightToLeft() ? range.right() : range.left()));
    2298             selectionRegion += combined;
     2338            if (viewportRect.intersects(combined))
     2339                selectionRegion += combined;
    22992340        }
    23002341    }
     
    24032444
    24042445/*!
    2405   \internal
    2406 */
    2407 static bool treeViewItemLessThan(const QTreeViewItem &left,
    2408                                  const QTreeViewItem &right)
    2409 {
    2410     if (left.level != right.level) {
    2411         Q_ASSERT(left.level > right.level);
    2412         QModelIndex leftParent = left.index.parent();
    2413         QModelIndex rightParent = right.index.parent();
    2414         // computer parent, don't get
    2415         while (leftParent.isValid() && leftParent.parent() != rightParent)
    2416             leftParent = leftParent.parent();
    2417         return (leftParent.row() < right.index.row());
    2418     }
    2419     return (left.index.row() < right.index.row());
    2420 }
    2421 
    2422 /*!
    24232446  Informs the view that the rows from the \a start row to the \a end row
    24242447  inclusive have been inserted into the \a parent model item.
     
    24492472    if (((parentItem != -1) && d->viewItems.at(parentItem).expanded && updatesEnabled())
    24502473        || (parent == d->root)) {
    2451         const uint childLevel = (parentItem == -1)
    2452                                 ? uint(0) : d->viewItems.at(parentItem).level + 1;
    2453         const int firstChildItem = parentItem + 1;
    2454         const int lastChildItem = firstChildItem + ((parentItem == -1)
    2455                                                     ? d->viewItems.count()
    2456                                                     : d->viewItems.at(parentItem).total) - 1;
    2457 
    2458         if (parentRowCount == end + 1 && start > 0) {
    2459             //need to Update hasMoreSiblings
    2460             int previousRow = start - 1;
    2461             QModelIndex previousSibilingModelIndex = d->model->index(previousRow, 0, parent);
    2462             bool isHidden = d->isRowHidden(previousSibilingModelIndex);
    2463             while (isHidden && previousRow > 0) {
    2464                 previousRow--;
    2465                 previousSibilingModelIndex = d->model->index(previousRow, 0, parent);
    2466                 isHidden = d->isRowHidden(previousSibilingModelIndex);
    2467             }
    2468             if (!isHidden) {
    2469                 const int previousSibilling = d->viewIndex(previousSibilingModelIndex);
    2470                 if(previousSibilling != -1)
    2471                     d->viewItems[previousSibilling].hasMoreSiblings = true;
    2472             }
    2473         }
    2474 
    2475         QVector<QTreeViewItem> insertedItems(delta);
    2476         for (int i = 0; i < delta; ++i) {
    2477             QTreeViewItem &item = insertedItems[i];
    2478             item.index = d->model->index(i + start, 0, parent);
    2479             item.level = childLevel;
    2480             item.hasChildren = d->hasVisibleChildren(item.index);
    2481             item.hasMoreSiblings = !((i == delta - 1) && (parentRowCount == end +1));
    2482         }
    2483         if (d->viewItems.isEmpty())
    2484             d->defaultItemHeight = indexRowSizeHint(insertedItems[0].index);
    2485 
    2486         int insertPos;
    2487         if (lastChildItem < firstChildItem) { // no children
    2488             insertPos = firstChildItem;
    2489         } else {
    2490             // do a binary search to figure out where to insert
    2491             QVector<QTreeViewItem>::iterator it;
    2492             it = qLowerBound(d->viewItems.begin() + firstChildItem,
    2493                              d->viewItems.begin() + lastChildItem + 1,
    2494                              insertedItems.at(0), treeViewItemLessThan);
    2495             insertPos = it - d->viewItems.begin();
    2496 
    2497             // update stale model indexes of siblings
    2498             for (int item = insertPos; item <= lastChildItem; ) {
    2499                 Q_ASSERT(d->viewItems.at(item).level == childLevel);
    2500                 const QModelIndex modelIndex = d->viewItems.at(item).index;
    2501                 //Q_ASSERT(modelIndex.parent() == parent);
    2502                 d->viewItems[item].index = d->model->index(
    2503                     modelIndex.row() + delta, modelIndex.column(), parent);
    2504 
    2505                 if (!d->viewItems[item].index.isValid()) {
    2506                     // Something really bad is happening, a bad model is
    2507                     // often the cause.  We can't optimize in this case :(
    2508                     qWarning() << "QTreeView::rowsInserted internal representation of the model has been corrupted, resetting.";
    2509                     doItemsLayout();
    2510                     return;
    2511                 }
    2512 
    2513                 item += d->viewItems.at(item).total + 1;
    2514             }
    2515         }
    2516 
    2517         d->viewItems.insert(insertPos, delta, insertedItems.at(0));
    2518         if (delta > 1) {
    2519             qCopy(insertedItems.begin() + 1, insertedItems.end(),
    2520                   d->viewItems.begin() + insertPos + 1);
    2521         }
    2522 
    2523         if (parentItem != -1)
    2524             d->viewItems[parentItem].hasChildren = true;
    2525         d->updateChildCount(parentItem, delta);
    2526 
    2527         updateGeometries();
    2528         viewport()->update();
     2474        d->doDelayedItemsLayout();
    25292475    } else if ((parentItem != -1) && d->viewItems.at(parentItem).expanded) {
    25302476        d->doDelayedItemsLayout();
     
    25442490{
    25452491    Q_D(QTreeView);
    2546     d->rowsRemoved(parent, start, end, false);
    25472492    QAbstractItemView::rowsAboutToBeRemoved(parent, start, end);
     2493    d->viewItems.clear();
    25482494}
    25492495
     
    25572503{
    25582504    Q_D(QTreeView);
    2559     d->rowsRemoved(parent, start, end, true);
     2505    d->viewItems.clear();
     2506    d->doDelayedItemsLayout();
     2507    d->hasRemovedItems = true;
     2508    d->_q_rowsRemoved(parent, start, end);
    25602509}
    25612510
     
    26592608    Q_D(QTreeView);
    26602609    d->viewItems.clear();
    2661     d->expandedIndexes.clear();
    26622610    d->interruptDelayedItemsLayout();
    2663     d->layout(-1);
    2664     for (int i = 0; i < d->viewItems.count(); ++i) {
    2665         if (d->viewItems[i].expanded)
    2666             continue;
    2667         d->viewItems[i].expanded = true;
    2668         d->layout(i);
    2669         QModelIndex idx = d->viewItems.at(i).index;
    2670         d->expandedIndexes.insert(idx);
    2671     }
     2611    d->layout(-1, true);
    26722612    updateGeometries();
    26732613    d->viewport->update();
     
    29502890}
    29512891
     2892void QTreeViewPrivate::insertViewItems(int pos, int count, const QTreeViewItem &viewItem)
     2893{
     2894    viewItems.insert(pos, count, viewItem);
     2895    QTreeViewItem *items = viewItems.data();
     2896    for (int i = pos + count; i < viewItems.count(); i++)
     2897        if (items[i].parentItem >= pos)
     2898            items[i].parentItem += count;
     2899}
     2900
     2901void QTreeViewPrivate::removeViewItems(int pos, int count)
     2902{
     2903    viewItems.remove(pos, count);
     2904    QTreeViewItem *items = viewItems.data();
     2905    for (int i = pos; i < viewItems.count(); i++)
     2906        if (items[i].parentItem >= pos)
     2907            items[i].parentItem -= count;
     2908}
     2909
     2910#if 0
     2911bool QTreeViewPrivate::checkViewItems() const
     2912{
     2913    for (int i = 0; i < viewItems.count(); ++i) {
     2914        const QTreeViewItem &vi = viewItems.at(i);
     2915        if (vi.parentItem == -1) {
     2916            Q_ASSERT(!vi.index.parent().isValid() || vi.index.parent() == root);
     2917        } else {
     2918            Q_ASSERT(vi.index.parent() == viewItems.at(vi.parentItem).index);
     2919        }
     2920    }
     2921    return true;
     2922}
     2923#endif
     2924
    29522925void QTreeViewPrivate::collapse(int item, bool emitSignal)
    29532926{
     
    29782951    viewItems[item].expanded = false;
    29792952    int index = item;
    2980     QModelIndex parent = modelIndex;
    2981     while (parent.isValid() && parent != root) {
    2982         Q_ASSERT(index > -1);
     2953    while (index > -1) {
    29832954        viewItems[index].total -= total;
    2984         parent = parent.parent();
    2985         index = viewIndex(parent);
    2986     }
    2987     viewItems.remove(item + 1, total); // collapse
     2955        index = viewItems[index].parentItem;
     2956    }
     2957    removeViewItems(item + 1, total); // collapse
    29882958    q->setState(oldState);
    29892959
     
    31223092}
    31233093
    3124 void QTreeViewPrivate::layout(int i)
     3094/** \internal
     3095    creates and initialize the viewItem structure of the children of the element \i
     3096
     3097    set \a recursiveExpanding if the function has to expand all the children (called from expandAll)
     3098    \a afterIsUninitialized is when we recurse from layout(-1), it means all the items after 'i' are
     3099    not yet initialized and need not to be moved
     3100 */
     3101void QTreeViewPrivate::layout(int i, bool recursiveExpanding, bool afterIsUninitialized)
    31253102{
    31263103    Q_Q(QTreeView);
     
    31493126        }
    31503127        viewItems.resize(count);
     3128        afterIsUninitialized = true;
    31513129    } else if (viewItems[i].total != (uint)count) {
    3152             viewItems.insert(i + 1, count, QTreeViewItem()); // expand
     3130        if (!afterIsUninitialized)
     3131            insertViewItems(i + 1, count, QTreeViewItem()); // expand
     3132        else if (count > 0)
     3133            viewItems.resize(viewItems.count() + count);
    31533134    } else {
    31543135        expanding = false;
     
    31723153            item = &viewItems[last];
    31733154            item->index = current;
     3155            item->parentItem = i;
    31743156            item->level = level;
    31753157            item->height = 0;
     
    31783160            item->total = 0;
    31793161            item->hasMoreSiblings = false;
    3180             if (isIndexExpanded(current)) {
     3162            if (recursiveExpanding || isIndexExpanded(current)) {
     3163                if (recursiveExpanding)
     3164                    expandedIndexes.insert(current);
    31813165                item->expanded = true;
    3182                 layout(last);
     3166                layout(last, recursiveExpanding, afterIsUninitialized);
    31833167                item = &viewItems[last];
    31843168                children += item->total;
     
    31923176
    31933177    // remove hidden items
    3194     if (hidden > 0)
    3195         viewItems.remove(last + 1, hidden); // collapse
     3178    if (hidden > 0) {
     3179        if (!afterIsUninitialized)
     3180            removeViewItems(last + 1, hidden);
     3181        else
     3182            viewItems.resize(viewItems.size() - hidden);
     3183    }
    31963184
    31973185    if (!expanding)
    31983186        return; // nothing changed
    31993187
    3200     while (parent != root) {
    3201         Q_ASSERT(i > -1);
     3188    while (i > -1) {
    32023189        viewItems[i].total += count - hidden;
    3203         parent = parent.parent();
    3204         i = viewIndex(parent);
     3190        i = viewItems[i].parentItem;
    32053191    }
    32063192}
     
    32093195{
    32103196    int index = itemAtCoordinate(coordinateForItem(i) - viewport->height());
     3197    while (isItemHiddenOrDisabled(index))
     3198        index--;
    32113199    return index == -1 ? 0 : index;
    32123200}
     
    32153203{
    32163204    int index = itemAtCoordinate(coordinateForItem(i) + viewport->height());
     3205    while (isItemHiddenOrDisabled(index))
     3206        index++;
    32173207    return index == -1 ? viewItems.count() - 1 : index;
    32183208}
     
    33573347    const int totalCount = viewItems.count();
    33583348    const QModelIndex index = _index.sibling(_index.row(), 0);
    3359 
    3360 
    3361     // A quick check near the last item to see if we are just incrementing
    3362     const int start = lastViewedItem > 2 ? lastViewedItem - 2 : 0;
    3363     const int end = lastViewedItem < totalCount - 2 ? lastViewedItem + 2 : totalCount;
    3364     int row = index.row();
    3365     for (int i = start; i < end; ++i) {
    3366         const QModelIndex &idx = viewItems.at(i).index;
    3367         if (idx.row() == row) {
    3368             if (idx.internalId() == index.internalId()) {
    3369                 lastViewedItem = i;
    3370                 return i;
    3371             }
    3372         }
    3373     }
    3374 
    3375     // NOTE: this function is slow if the item is outside the visible area
    3376     // search in visible items first and below
    3377     int t = firstVisibleItem();
    3378     t = t > 100 ? t - 100 : 0; // start 100 items above the visible area
    3379 
    3380     for (int i = t; i < totalCount; ++i) {
    3381         const QModelIndex &idx = viewItems.at(i).index;
    3382         if (idx.row() == row) {
    3383             if (idx.internalId() == index.internalId()) {
    3384                 lastViewedItem = i;
    3385                 return i;
    3386             }
    3387         }
    3388     }
    3389     // search from top to first visible
    3390     for (int j = 0; j < t; ++j) {
     3349    const int row = index.row();
     3350    const qint64 internalId = index.internalId();
     3351
     3352    // We start nearest to the lastViewedItem
     3353    int localCount = qMin(lastViewedItem - 1, totalCount - lastViewedItem);
     3354    for (int i = 0; i < localCount; ++i) {
     3355        const QModelIndex &idx1 = viewItems.at(lastViewedItem + i).index;
     3356        if (idx1.row() == row && idx1.internalId() == internalId) {
     3357            lastViewedItem = lastViewedItem + i;
     3358            return lastViewedItem;
     3359        }
     3360        const QModelIndex &idx2 = viewItems.at(lastViewedItem - i - 1).index;
     3361        if (idx2.row() == row && idx2.internalId() == internalId) {
     3362            lastViewedItem = lastViewedItem - i - 1;
     3363            return lastViewedItem;
     3364        }
     3365    }
     3366
     3367    for (int j = qMax(0, lastViewedItem + localCount); j < totalCount; ++j) {
    33913368        const QModelIndex &idx = viewItems.at(j).index;
    3392         if (idx.row() == row) {
    3393             if (idx.internalId() == index.internalId()) {
    3394                 lastViewedItem = j;
    3395                 return j;
    3396             }
    3397         }
    3398     }
     3369        if (idx.row() == row && idx.internalId() == internalId) {
     3370            lastViewedItem = j;
     3371            return j;
     3372        }
     3373    }
     3374    for (int j = qMin(totalCount, lastViewedItem - localCount) - 1; j >= 0; --j) {
     3375        const QModelIndex &idx = viewItems.at(j).index;
     3376        if (idx.row() == row && idx.internalId() == internalId) {
     3377            lastViewedItem = j;
     3378            return j;
     3379        }
     3380    }
     3381
    33993382    // nothing found
    34003383    return -1;
     
    34463429}
    34473430
    3448 void QTreeViewPrivate::relayout(const QModelIndex &parent)
    3449 {
    3450     Q_Q(QTreeView);
    3451     // do a local relayout of the items
    3452     if (parent.isValid()) {
    3453         int parentViewIndex = viewIndex(parent);
    3454         if (parentViewIndex > -1 && viewItems.at(parentViewIndex).expanded) {
    3455             collapse(parentViewIndex, false); // remove the current layout
    3456             expand(parentViewIndex, false); // do the relayout
    3457             q->updateGeometries();
    3458             viewport->update();
    3459         }
    3460     } else {
    3461         viewItems.clear();
    3462         q->doItemsLayout();
    3463     }
    3464 }
    3465 
    3466 
    34673431void QTreeViewPrivate::updateScrollBars()
    34683432{
     
    34713435    if (!viewportSize.isValid())
    34723436        viewportSize = QSize(0, 0);
     3437
     3438    if (viewItems.isEmpty()) {
     3439        q->doItemsLayout();
     3440    }
    34733441
    34743442    int itemsInViewport = 0;
     
    37183686}
    37193687
    3720 void QTreeViewPrivate::rowsRemoved(const QModelIndex &parent,
    3721                                    int start, int end, bool after)
    3722 {
    3723     Q_Q(QTreeView);
    3724     // if we are going to do a complete relayout anyway, there is no need to update
    3725     if (delayedPendingLayout) {
    3726         _q_rowsRemoved(parent, start, end);
    3727         return;
    3728     }
    3729 
    3730     const int parentItem = viewIndex(parent);
    3731     if ((parentItem != -1) || (parent == root)) {
    3732 
    3733         const uint childLevel = (parentItem == -1)
    3734                                 ? uint(0) : viewItems.at(parentItem).level + 1;
    3735         Q_UNUSED(childLevel); // unused in release mode, used in assert below
    3736 
    3737         const int firstChildItem = parentItem + 1;
    3738         int lastChildItem = firstChildItem + ((parentItem == -1)
    3739                                               ? viewItems.count()
    3740                                               : viewItems.at(parentItem).total) - 1;
    3741 
    3742         const int delta = end - start + 1;
    3743 
    3744         int previousSibiling = -1;
    3745         int removedCount = 0;
    3746         for (int item = firstChildItem; item <= lastChildItem; ) {
    3747             Q_ASSERT(viewItems.at(item).level == childLevel);
    3748             const QModelIndex modelIndex = viewItems.at(item).index;
    3749             //Q_ASSERT(modelIndex.parent() == parent);
    3750             const int count = viewItems.at(item).total + 1;
    3751             if (modelIndex.row() < start) {
    3752                 previousSibiling = item;
    3753                 // not affected by the removal
    3754                 item += count;
    3755             } else if (modelIndex.row() <= end) {
    3756                 // removed
    3757                 viewItems.remove(item, count);
    3758                 removedCount += count;
    3759                 lastChildItem -= count;
    3760             } else {
    3761                 if (after) {
    3762                     // moved; update the model index
    3763                     viewItems[item].index = model->index(
    3764                         modelIndex.row() - delta, modelIndex.column(), parent);
    3765                 }
    3766                 item += count;
    3767             }
    3768         }
    3769 
    3770         if (previousSibiling != -1 && after && model->rowCount(parent) == start)
    3771             viewItems[previousSibiling].hasMoreSiblings = false;
    3772 
    3773         if (parentItem != -1) {
    3774             if (viewItems.at(parentItem).expanded) {
    3775                 updateChildCount(parentItem, -removedCount);
    3776                 if (viewItems.at(parentItem).total == 0)
    3777                     viewItems[parentItem].hasChildren = false; //every children have been removed;
    3778             } else if (viewItems[parentItem].hasChildren && !hasVisibleChildren(parent)) {
    3779                 viewItems[parentItem].hasChildren = false;
    3780             }
    3781         }
    3782         if (after) {
    3783             q->updateGeometries();
    3784             viewport->update();
    3785         } else {
    3786             //we have removed items: we should at least update the scroll bar values.
    3787             // They are used to determine the item geometry.
    3788             updateScrollBars();
    3789         }
    3790     } else {
    3791         // If an ancestor of root is removed then relayout
    3792         QModelIndex idx = root;
    3793         while (idx.isValid()) {
    3794             idx = idx.parent();
    3795             if (idx == parent) {
    3796                 doDelayedItemsLayout();
    3797                 break;
    3798             }
    3799         }
    3800     }
    3801     _q_rowsRemoved(parent, start, end);
    3802 
    3803     QSet<QPersistentModelIndex>::iterator it = expandedIndexes.begin();
    3804     while (it != expandedIndexes.constEnd()) {
    3805         if (!it->isValid())
    3806             it = expandedIndexes.erase(it);
    3807         else
    3808             ++it;
    3809     }
    3810     it = hiddenIndexes.begin();
    3811     while (it != hiddenIndexes.constEnd()) {
    3812         if (!it->isValid())
    3813             it = hiddenIndexes.erase(it);
    3814         else
    3815             ++it;
    3816     }
    3817 }
    3818 
    3819 void QTreeViewPrivate::updateChildCount(const int parentItem, const int delta)
    3820 {
    3821     if ((parentItem != -1) && delta) {
    3822         int level = viewItems.at(parentItem).level;
    3823         int item = parentItem;
    3824         do {
    3825             Q_ASSERT(item >= 0);
    3826             for ( ; int(viewItems.at(item).level) != level; --item) ;
    3827             viewItems[item].total += delta;
    3828             --level;
    3829         } while (level >= 0);
    3830     }
    3831 }
    3832 
    3833 
    38343688void QTreeViewPrivate::_q_sortIndicatorChanged(int column, Qt::SortOrder order)
    38353689{
Note: See TracChangeset for help on using the changeset viewer.