diff options
Diffstat (limited to 'src/widgets/itemviews')
20 files changed, 66 insertions, 75 deletions
diff --git a/src/widgets/itemviews/qabstractitemdelegate.h b/src/widgets/itemviews/qabstractitemdelegate.h index 28635b0595..f72076b515 100644 --- a/src/widgets/itemviews/qabstractitemdelegate.h +++ b/src/widgets/itemviews/qabstractitemdelegate.h @@ -45,8 +45,6 @@ #include <QtCore/qobject.h> #include <QtWidgets/qstyleoption.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE @@ -131,6 +129,4 @@ private: QT_END_NAMESPACE -QT_END_HEADER - #endif // QABSTRACTITEMDELEGATE_H diff --git a/src/widgets/itemviews/qabstractitemview.cpp b/src/widgets/itemviews/qabstractitemview.cpp index fa873b63a5..fdefeb7bb3 100644 --- a/src/widgets/itemviews/qabstractitemview.cpp +++ b/src/widgets/itemviews/qabstractitemview.cpp @@ -1853,7 +1853,8 @@ void QAbstractItemView::mouseReleaseEvent(QMouseEvent *event) QStyleOptionViewItem option = d->viewOptions(); if (d->pressedAlreadySelected) option.state |= QStyle::State_Selected; - if (style()->styleHint(QStyle::SH_ItemView_ActivateItemOnSingleClick, &option, this)) + if ((model()->flags(index) & Qt::ItemIsEnabled) + && style()->styleHint(QStyle::SH_ItemView_ActivateItemOnSingleClick, &option, this)) emit activated(index); } } @@ -3816,13 +3817,31 @@ QItemSelectionModel::SelectionFlags QAbstractItemView::selectionCommand(const QM const QEvent *event) const { Q_D(const QAbstractItemView); + Qt::KeyboardModifiers keyModifiers = Qt::NoModifier; + if (event) { + switch (event->type()) { + case QEvent::MouseButtonDblClick: + case QEvent::MouseButtonPress: + case QEvent::MouseButtonRelease: + case QEvent::MouseMove: + case QEvent::KeyPress: + case QEvent::KeyRelease: + keyModifiers = (static_cast<const QInputEvent*>(event))->modifiers(); + break; + default: + keyModifiers = QApplication::keyboardModifiers(); + } + } switch (d->selectionMode) { case NoSelection: // Never update selection model return QItemSelectionModel::NoUpdate; case SingleSelection: // ClearAndSelect on valid index otherwise NoUpdate if (event && event->type() == QEvent::MouseButtonRelease) return QItemSelectionModel::NoUpdate; - return QItemSelectionModel::ClearAndSelect|d->selectionBehaviorFlags(); + if ((keyModifiers & Qt::ControlModifier) && d->selectionModel->isSelected(index)) + return QItemSelectionModel::Deselect | d->selectionBehaviorFlags(); + else + return QItemSelectionModel::ClearAndSelect | d->selectionBehaviorFlags(); case MultiSelection: return d->multiSelectionCommand(index, event); case ExtendedSelection: diff --git a/src/widgets/itemviews/qabstractitemview.h b/src/widgets/itemviews/qabstractitemview.h index ad5e1de562..b48047bdc3 100644 --- a/src/widgets/itemviews/qabstractitemview.h +++ b/src/widgets/itemviews/qabstractitemview.h @@ -47,8 +47,6 @@ #include <QtCore/qitemselectionmodel.h> #include <QtWidgets/qabstractitemdelegate.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE @@ -376,6 +374,4 @@ Q_DECLARE_OPERATORS_FOR_FLAGS(QAbstractItemView::EditTriggers) QT_END_NAMESPACE -QT_END_HEADER - #endif // QABSTRACTITEMVIEW_H diff --git a/src/widgets/itemviews/qcolumnview.h b/src/widgets/itemviews/qcolumnview.h index a340be0823..660b5f387e 100644 --- a/src/widgets/itemviews/qcolumnview.h +++ b/src/widgets/itemviews/qcolumnview.h @@ -44,8 +44,6 @@ #include <QtWidgets/qabstractitemview.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE @@ -116,7 +114,5 @@ private: QT_END_NAMESPACE -QT_END_HEADER - #endif // QCOLUMNVIEW_H diff --git a/src/widgets/itemviews/qdatawidgetmapper.h b/src/widgets/itemviews/qdatawidgetmapper.h index d65d06a4ab..9fb9c2db05 100644 --- a/src/widgets/itemviews/qdatawidgetmapper.h +++ b/src/widgets/itemviews/qdatawidgetmapper.h @@ -46,8 +46,6 @@ #ifndef QT_NO_DATAWIDGETMAPPER -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE @@ -120,8 +118,6 @@ private: QT_END_NAMESPACE -QT_END_HEADER - #endif // QT_NO_DATAWIDGETMAPPER #endif diff --git a/src/widgets/itemviews/qdirmodel.h b/src/widgets/itemviews/qdirmodel.h index 6ecd9a3990..45bc3511d8 100644 --- a/src/widgets/itemviews/qdirmodel.h +++ b/src/widgets/itemviews/qdirmodel.h @@ -46,8 +46,6 @@ #include <QtCore/qdir.h> #include <QtWidgets/qfileiconprovider.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE @@ -154,6 +152,4 @@ private: QT_END_NAMESPACE -QT_END_HEADER - #endif // QDIRMODEL_H diff --git a/src/widgets/itemviews/qfileiconprovider.h b/src/widgets/itemviews/qfileiconprovider.h index a7a7d508ce..3a8a42f07b 100644 --- a/src/widgets/itemviews/qfileiconprovider.h +++ b/src/widgets/itemviews/qfileiconprovider.h @@ -46,8 +46,6 @@ #include <QtCore/qscopedpointer.h> #include <QtGui/qicon.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE @@ -75,7 +73,5 @@ private: QT_END_NAMESPACE -QT_END_HEADER - #endif // QFILEICONPROVIDER_H diff --git a/src/widgets/itemviews/qheaderview.h b/src/widgets/itemviews/qheaderview.h index 4e2b7d24c6..1cbfc957a8 100644 --- a/src/widgets/itemviews/qheaderview.h +++ b/src/widgets/itemviews/qheaderview.h @@ -44,8 +44,6 @@ #include <QtWidgets/qabstractitemview.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE @@ -263,6 +261,4 @@ inline void QHeaderView::showSection(int alogicalIndex) QT_END_NAMESPACE -QT_END_HEADER - #endif // QHEADERVIEW_H diff --git a/src/widgets/itemviews/qitemdelegate.h b/src/widgets/itemviews/qitemdelegate.h index 17b0e94625..884a09e8c6 100644 --- a/src/widgets/itemviews/qitemdelegate.h +++ b/src/widgets/itemviews/qitemdelegate.h @@ -47,8 +47,6 @@ #include <QtGui/qpixmap.h> #include <QtCore/qvariant.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE @@ -135,6 +133,4 @@ private: QT_END_NAMESPACE -QT_END_HEADER - #endif // QITEMDELEGATE_H diff --git a/src/widgets/itemviews/qitemeditorfactory.h b/src/widgets/itemviews/qitemeditorfactory.h index f52f4c5b64..5aed89fb70 100644 --- a/src/widgets/itemviews/qitemeditorfactory.h +++ b/src/widgets/itemviews/qitemeditorfactory.h @@ -47,8 +47,6 @@ #include <QtCore/qhash.h> #include <QtCore/qvariant.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE @@ -118,6 +116,4 @@ private: QT_END_NAMESPACE -QT_END_HEADER - #endif // QITEMEDITORFACTORY_H diff --git a/src/widgets/itemviews/qlistview.h b/src/widgets/itemviews/qlistview.h index a7164142dd..ff880a889c 100644 --- a/src/widgets/itemviews/qlistview.h +++ b/src/widgets/itemviews/qlistview.h @@ -44,8 +44,6 @@ #include <QtWidgets/qabstractitemview.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE @@ -193,6 +191,4 @@ private: QT_END_NAMESPACE -QT_END_HEADER - #endif // QLISTVIEW_H diff --git a/src/widgets/itemviews/qlistwidget.h b/src/widgets/itemviews/qlistwidget.h index 1a8c56c907..2cddd4eb6f 100644 --- a/src/widgets/itemviews/qlistwidget.h +++ b/src/widgets/itemviews/qlistwidget.h @@ -47,8 +47,6 @@ #include <QtCore/qvector.h> #include <QtCore/qitemselectionmodel.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE @@ -329,6 +327,4 @@ inline bool QListWidgetItem::isHidden() const QT_END_NAMESPACE -QT_END_HEADER - #endif // QLISTWIDGET_H diff --git a/src/widgets/itemviews/qstyleditemdelegate.h b/src/widgets/itemviews/qstyleditemdelegate.h index 8aa056d769..d88da60c89 100644 --- a/src/widgets/itemviews/qstyleditemdelegate.h +++ b/src/widgets/itemviews/qstyleditemdelegate.h @@ -47,8 +47,6 @@ #include <QtGui/qpixmap.h> #include <QtCore/qvariant.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE @@ -110,6 +108,4 @@ private: QT_END_NAMESPACE -QT_END_HEADER - #endif // QSTYLEDITEMDELEGATE_H diff --git a/src/widgets/itemviews/qtableview.h b/src/widgets/itemviews/qtableview.h index 8f4c73d9f1..4d1129c60b 100644 --- a/src/widgets/itemviews/qtableview.h +++ b/src/widgets/itemviews/qtableview.h @@ -44,8 +44,6 @@ #include <QtWidgets/qabstractitemview.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE @@ -192,6 +190,4 @@ private: QT_END_NAMESPACE -QT_END_HEADER - #endif // QTABLEVIEW_H diff --git a/src/widgets/itemviews/qtablewidget.h b/src/widgets/itemviews/qtablewidget.h index 6d9da27fdf..a6c355c6a6 100644 --- a/src/widgets/itemviews/qtablewidget.h +++ b/src/widgets/itemviews/qtablewidget.h @@ -47,8 +47,6 @@ #include <QtCore/qvector.h> //#include <QtWidgets/qitemselectionmodel.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE @@ -371,6 +369,4 @@ inline bool QTableWidgetItem::isSelected() const QT_END_NAMESPACE -QT_END_HEADER - #endif // QTABLEWIDGET_H diff --git a/src/widgets/itemviews/qtreeview.cpp b/src/widgets/itemviews/qtreeview.cpp index 6046ef50a5..8d0a578f61 100644 --- a/src/widgets/itemviews/qtreeview.cpp +++ b/src/widgets/itemviews/qtreeview.cpp @@ -52,6 +52,7 @@ #include <qevent.h> #include <qpen.h> #include <qdebug.h> +#include <QMetaMethod> #ifndef QT_NO_ACCESSIBILITY #include <qaccessible.h> #include <qaccessible2.h> @@ -749,6 +750,8 @@ void QTreeView::expand(const QModelIndex &index) Q_D(QTreeView); if (!d->isIndexValid(index)) return; + if (index.flags() & Qt::ItemNeverHasChildren) + return; if (d->delayedPendingLayout) { //A complete relayout is going to be performed, just store the expanded index, no need to layout. if (d->storeExpanded(index)) @@ -2644,7 +2647,17 @@ void QTreeView::expandAll() void QTreeView::collapseAll() { Q_D(QTreeView); + QSet<QPersistentModelIndex> old_expandedIndexes; + old_expandedIndexes = d->expandedIndexes; d->expandedIndexes.clear(); + if (!signalsBlocked() && isSignalConnected(QMetaMethod::fromSignal(&QTreeView::collapsed))) { + QSet<QPersistentModelIndex>::const_iterator i = old_expandedIndexes.constBegin(); + for (; i != old_expandedIndexes.constEnd(); ++i) { + const QPersistentModelIndex &mi = (*i); + if (mi.isValid() && !(mi.flags() & Qt::ItemNeverHasChildren)) + emit collapsed(mi); + } + } doItemsLayout(); } @@ -2658,6 +2671,8 @@ void QTreeView::expandToDepth(int depth) { Q_D(QTreeView); d->viewItems.clear(); + QSet<QPersistentModelIndex> old_expandedIndexes; + old_expandedIndexes = d->expandedIndexes; d->expandedIndexes.clear(); d->interruptDelayedItemsLayout(); d->layout(-1); @@ -2668,6 +2683,29 @@ void QTreeView::expandToDepth(int depth) d->storeExpanded(d->viewItems.at(i).index); } } + + bool someSignalEnabled = isSignalConnected(QMetaMethod::fromSignal(&QTreeView::collapsed)); + someSignalEnabled |= isSignalConnected(QMetaMethod::fromSignal(&QTreeView::expanded)); + + if (!signalsBlocked() && someSignalEnabled) { + // emit signals + QSet<QPersistentModelIndex> collapsedIndexes = old_expandedIndexes - d->expandedIndexes; + QSet<QPersistentModelIndex>::const_iterator i = collapsedIndexes.constBegin(); + for (; i != collapsedIndexes.constEnd(); ++i) { + const QPersistentModelIndex &mi = (*i); + if (mi.isValid() && !(mi.flags() & Qt::ItemNeverHasChildren)) + emit collapsed(mi); + } + + QSet<QPersistentModelIndex> expandedIndexs = d->expandedIndexes - old_expandedIndexes; + i = expandedIndexs.constBegin(); + for (; i != expandedIndexs.constEnd(); ++i) { + const QPersistentModelIndex &mi = (*i); + if (mi.isValid() && !(mi.flags() & Qt::ItemNeverHasChildren)) + emit expanded(mi); + } + } + updateGeometries(); d->viewport->update(); } @@ -2887,6 +2925,9 @@ void QTreeViewPrivate::expand(int item, bool emitSignal) if (item == -1 || viewItems.at(item).expanded) return; + const QModelIndex index = viewItems.at(item).index; + if (index.flags() & Qt::ItemNeverHasChildren) + return; #ifndef QT_NO_ANIMATION if (emitSignal && animationsEnabled) @@ -2896,7 +2937,6 @@ void QTreeViewPrivate::expand(int item, bool emitSignal) if (state != QAbstractItemView::AnimatingState) stateBeforeAnimation = state; q->setState(QAbstractItemView::ExpandingState); - const QModelIndex index = viewItems.at(item).index; storeExpanded(index); viewItems[item].expanded = true; layout(item); @@ -3189,9 +3229,9 @@ void QTreeViewPrivate::layout(int i, bool recursiveExpanding, bool afterIsUninit item->expanded = false; item->total = 0; item->hasMoreSiblings = false; - if (recursiveExpanding || isIndexExpanded(current)) { - if (recursiveExpanding) - expandedIndexes.insert(current); + if ((recursiveExpanding && !(current.flags() & Qt::ItemNeverHasChildren)) || isIndexExpanded(current)) { + if (recursiveExpanding && storeExpanded(current) && !q->signalsBlocked()) + emit q->expanded(current); item->expanded = true; layout(last, recursiveExpanding, afterIsUninitialized); item = &viewItems[last]; diff --git a/src/widgets/itemviews/qtreeview.h b/src/widgets/itemviews/qtreeview.h index 54e580985c..7127994969 100644 --- a/src/widgets/itemviews/qtreeview.h +++ b/src/widgets/itemviews/qtreeview.h @@ -44,8 +44,6 @@ #include <QtWidgets/qabstractitemview.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE @@ -235,6 +233,4 @@ private: QT_END_NAMESPACE -QT_END_HEADER - #endif // QTREEVIEW_H diff --git a/src/widgets/itemviews/qtreeview_p.h b/src/widgets/itemviews/qtreeview_p.h index 5a0821c9cf..6778446ed3 100644 --- a/src/widgets/itemviews/qtreeview_p.h +++ b/src/widgets/itemviews/qtreeview_p.h @@ -203,7 +203,7 @@ public: inline bool isIndexExpanded(const QModelIndex &idx) const { //We first check if the idx is a QPersistentModelIndex, because creating QPersistentModelIndex is slow - return isPersistent(idx) && expandedIndexes.contains(idx); + return !(idx.flags() & Qt::ItemNeverHasChildren) && isPersistent(idx) && expandedIndexes.contains(idx); } // used when hiding and showing items diff --git a/src/widgets/itemviews/qtreewidget.h b/src/widgets/itemviews/qtreewidget.h index a16a1cd9c2..0796797273 100644 --- a/src/widgets/itemviews/qtreewidget.h +++ b/src/widgets/itemviews/qtreewidget.h @@ -47,8 +47,6 @@ #include <QtCore/qvariant.h> #include <QtCore/qvector.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE @@ -423,6 +421,4 @@ inline bool QTreeWidgetItem::isDisabled() const QT_END_NAMESPACE -QT_END_HEADER - #endif // QTREEWIDGET_H diff --git a/src/widgets/itemviews/qtreewidgetitemiterator.h b/src/widgets/itemviews/qtreewidgetitemiterator.h index ec604e8b1a..e124a72afd 100644 --- a/src/widgets/itemviews/qtreewidgetitemiterator.h +++ b/src/widgets/itemviews/qtreewidgetitemiterator.h @@ -45,8 +45,6 @@ #include <QtCore/qglobal.h> #include <QtCore/qscopedpointer.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE @@ -153,6 +151,4 @@ Q_DECLARE_OPERATORS_FOR_FLAGS(QTreeWidgetItemIterator::IteratorFlags) QT_END_NAMESPACE #endif // QT_NO_TREEWIDGET -QT_END_HEADER - #endif // QTREEWIDGETITEMITERATOR_H |