7#if QT_CONFIG(columnview)
9#include "qcolumnview_p.h"
10#include "qcolumnviewgrip_p.h"
13#include <qabstractitemdelegate.h>
14#include <qscrollbar.h>
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
43
44
45
46
47
48QColumnView::QColumnView(QWidget * parent)
49: QAbstractItemView(*
new QColumnViewPrivate, parent)
56
57
58QColumnView::QColumnView(QColumnViewPrivate & dd, QWidget * parent)
59: QAbstractItemView(dd, parent)
65void QColumnViewPrivate::initialize()
68 q->setTextElideMode(Qt::ElideMiddle);
69#if QT_CONFIG(animation)
71 QObjectPrivate::connect(¤tAnimation, &QPropertyAnimation::finished,
72 this, &QColumnViewPrivate::changeCurrentColumn);
73 currentAnimation.setTargetObject(hbar);
74 currentAnimation.setPropertyName(
"value");
75 currentAnimation.setEasingCurve(QEasingCurve::InOutQuad);
78 q->setItemDelegate(
new QColumnViewDelegate(q));
81void QColumnViewPrivate::clearConnections()
83#if QT_CONFIG(animation)
84 QObject::disconnect(animationConnection);
86 for (
const QMetaObject::Connection &connection : gripConnections)
87 QObject::disconnect(connection);
88 const auto copy = viewConnections;
89 for (
auto it = copy.keyBegin(); it != copy.keyEnd(); ++it)
95
96
97QColumnView::~QColumnView()
100 d->clearConnections();
104
105
106
107
108
109
110
111void QColumnView::setResizeGripsVisible(
bool visible)
114 if (d->showResizeGrips == visible)
116 d->showResizeGrips = visible;
117 d->gripConnections.clear();
118 for (QAbstractItemView *view : std::as_const(d->columns)) {
120 QColumnViewGrip *grip =
new QColumnViewGrip(view);
121 view->setCornerWidget(grip);
122 d->gripConnections.push_back(
123 QObjectPrivate::connect(grip, &QColumnViewGrip::gripMoved,
124 d, &QColumnViewPrivate::gripMoved)
127 QWidget *widget = view->cornerWidget();
128 view->setCornerWidget(
nullptr);
129 widget->deleteLater();
134bool QColumnView::resizeGripsVisible()
const
136 Q_D(
const QColumnView);
137 return d->showResizeGrips;
141
142
143void QColumnView::setModel(QAbstractItemModel *model)
146 if (model == d->model)
149 QAbstractItemView::setModel(model);
153
154
155void QColumnView::setRootIndex(
const QModelIndex &index)
162 Q_ASSERT(d->columns.size() == 0);
164 QAbstractItemView *view = d->createColumn(index,
true);
165 if (view->selectionModel())
166 view->selectionModel()->deleteLater();
168 view->setSelectionModel(selectionModel());
170 QAbstractItemView::setRootIndex(index);
171 d->updateScrollbars();
175
176
177bool QColumnView::isIndexHidden(
const QModelIndex &index)
const
184
185
186QModelIndex QColumnView::indexAt(
const QPoint &point)
const
188 Q_D(
const QColumnView);
189 for (
int i = 0; i < d->columns.size(); ++i) {
190 QPoint topLeft = d->columns.at(i)->frameGeometry().topLeft();
191 QPoint adjustedPoint(point.x() - topLeft.x(), point.y() - topLeft.y());
192 QModelIndex index = d->columns.at(i)->indexAt(adjustedPoint);
196 return QModelIndex();
200
201
202QRect QColumnView::visualRect(
const QModelIndex &index)
const
204 if (!index.isValid())
207 Q_D(
const QColumnView);
208 for (
int i = 0; i < d->columns.size(); ++i) {
209 QRect rect = d->columns.at(i)->visualRect(index);
210 if (!rect.isNull()) {
211 rect.translate(d->columns.at(i)->frameGeometry().topLeft());
219
220
221void QColumnView::scrollContentsBy(
int dx,
int dy)
224 if (d->columns.isEmpty() || dx == 0)
227 dx = isRightToLeft() ? -dx : dx;
228 for (
int i = 0; i < d->columns.size(); ++i)
229 d->columns.at(i)->move(d->columns.at(i)->x() + dx, 0);
231 QAbstractItemView::scrollContentsBy(dx, dy);
235
236
237void QColumnView::scrollTo(
const QModelIndex &index, ScrollHint hint)
241 if (!index.isValid() || d->columns.isEmpty())
244#if QT_CONFIG(animation)
245 if (d->currentAnimation.state() == QPropertyAnimation::Running)
248 d->currentAnimation.stop();
252 d->closeColumns(index,
true);
254 QModelIndex indexParent = index.parent();
256 int currentColumn = 0;
258 while (currentColumn < d->columns.size()) {
259 if (indexParent == d->columns.at(currentColumn)->rootIndex())
261 leftEdge += d->columns.at(currentColumn)->width();
266 if (currentColumn == d->columns.size())
269 int indexColumn = currentColumn;
271 int visibleWidth = d->columns.at(currentColumn)->width();
273 if (currentColumn + 1 < d->columns.size()) {
275 visibleWidth += d->columns.at(currentColumn)->width();
278 int rightEdge = leftEdge + visibleWidth;
279 if (isRightToLeft()) {
280 leftEdge = viewport()->width() - leftEdge;
281 rightEdge = leftEdge - visibleWidth;
282 qSwap(rightEdge, leftEdge);
286 if (leftEdge > -horizontalOffset()
287 && rightEdge <= ( -horizontalOffset() + viewport()->size().width())) {
288 d->columns.at(indexColumn)->scrollTo(index);
289 d->changeCurrentColumn();
293 int newScrollbarValue = 0;
294 if (isRightToLeft()) {
297 newScrollbarValue = viewport()->size().width() - leftEdge;
300 newScrollbarValue = rightEdge + horizontalOffset();
303 if (leftEdge > -horizontalOffset()) {
305 newScrollbarValue = rightEdge - viewport()->size().width();
308 newScrollbarValue = leftEdge;
312#if QT_CONFIG(animation)
313 if (
const int animationDuration = style()->styleHint(QStyle::SH_Widget_Animation_Duration,
nullptr,
this)) {
314 d->currentAnimation.setDuration(animationDuration);
315 d->currentAnimation.setEndValue(newScrollbarValue);
316 d->currentAnimation.start();
320 horizontalScrollBar()->setValue(newScrollbarValue);
325
326
327
328
329QModelIndex QColumnView::moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers)
335 return QModelIndex();
337 QModelIndex current = currentIndex();
338 if (isRightToLeft()) {
339 if (cursorAction == MoveLeft)
340 cursorAction = MoveRight;
341 else if (cursorAction == MoveRight)
342 cursorAction = MoveLeft;
344 switch (cursorAction) {
346 if (current.parent().isValid() && current.parent() != rootIndex())
347 return (current.parent());
352 if (model()->hasChildren(current))
353 return model()->index(0, 0, current);
355 return current.sibling(current.row() + 1, current.column());
361 return QModelIndex();
365
366
367void QColumnView::resizeEvent(QResizeEvent *event)
371 d->updateScrollbars();
372 if (!isRightToLeft()) {
373 int diff = event->oldSize().width() - event->size().width();
374 if (diff < 0 && horizontalScrollBar()->isVisible()
375 && horizontalScrollBar()->value() == horizontalScrollBar()->maximum()) {
376 horizontalScrollBar()->setMaximum(horizontalScrollBar()->maximum() + diff);
379 QAbstractItemView::resizeEvent(event);
383
384
385void QColumnViewPrivate::updateScrollbars()
388#if QT_CONFIG(animation)
389 if (currentAnimation.state() == QPropertyAnimation::Running)
394 int horizontalLength = 0;
395 if (!columns.isEmpty()) {
396 horizontalLength = (columns.constLast()->x() + columns.constLast()->width()) - columns.constFirst()->x();
397 if (horizontalLength <= 0)
398 horizontalLength = (columns.constFirst()->x() + columns.constFirst()->width()) - columns.constLast()->x();
401 QSize viewportSize = viewport->size();
402 if (horizontalLength < viewportSize.width() && hbar->value() == 0) {
403 hbar->setRange(0, 0);
405 int visibleLength = qMin(horizontalLength + q->horizontalOffset(), viewportSize.width());
406 int hiddenLength = horizontalLength - visibleLength;
407 if (hiddenLength != hbar->maximum())
408 hbar->setRange(0, hiddenLength);
410 if (!columns.isEmpty()) {
411 int pageStepSize = columns.at(0)->width();
412 if (pageStepSize != hbar->pageStep())
413 hbar->setPageStep(pageStepSize);
415 bool visible = (hbar->maximum() > 0);
416 if (visible != hbar->isVisible())
417 hbar->setVisible(visible);
421
422
423int QColumnView::horizontalOffset()
const
425 Q_D(
const QColumnView);
430
431
432int QColumnView::verticalOffset()
const
438
439
440QRegion QColumnView::visualRegionForSelection(
const QItemSelection &selection)
const
442 int ranges = selection.size();
449 int firstRow = selection.at(0).top();
450 int lastRow = selection.at(0).top();
451 for (
int i = 0; i < ranges; ++i) {
452 firstRow = qMin(firstRow, selection.at(i).top());
453 lastRow = qMax(lastRow, selection.at(i).bottom());
456 QModelIndex firstIdx = model()->index(qMin(firstRow, lastRow), 0, rootIndex());
457 QModelIndex lastIdx = model()->index(qMax(firstRow, lastRow), 0, rootIndex());
459 if (firstIdx == lastIdx)
460 return visualRect(firstIdx);
462 QRegion firstRegion = visualRect(firstIdx);
463 QRegion lastRegion = visualRect(lastIdx);
464 return firstRegion.united(lastRegion);
468
469
470void QColumnView::setSelection(
const QRect &rect, QItemSelectionModel::SelectionFlags command)
477
478
479void QColumnView::setSelectionModel(QItemSelectionModel *newSelectionModel)
481 Q_D(
const QColumnView);
482 for (
int i = 0; i < d->columns.size(); ++i) {
483 if (d->columns.at(i)->selectionModel() == selectionModel()) {
484 d->columns.at(i)->setSelectionModel(newSelectionModel);
488 QAbstractItemView::setSelectionModel(newSelectionModel);
492
493
494QSize QColumnView::sizeHint()
const
496 Q_D(
const QColumnView);
498 for (
int i = 0; i < d->columns.size(); ++i) {
499 sizeHint += d->columns.at(i)->sizeHint();
501 return sizeHint.expandedTo(QAbstractItemView::sizeHint());
505
506
507
508void QColumnViewPrivate::gripMoved(
int offset)
512 QObject *grip = q->sender();
515 if (q->isRightToLeft())
516 offset = -1 * offset;
519 for (
int i = 0; i < columns.size(); ++i) {
520 if (!found && columns.at(i)->cornerWidget() == grip) {
522 columnSizes[i] = columns.at(i)->width();
523 if (q->isRightToLeft())
524 columns.at(i)->move(columns.at(i)->x() + offset, 0);
530 int currentX = columns.at(i)->x();
531 columns.at(i)->move(currentX + offset, 0);
538
539
540
541
542
543
544void QColumnViewPrivate::closeColumns(
const QModelIndex &parent,
bool build)
546 if (columns.isEmpty())
549 bool clearAll = !parent.isValid();
550 bool passThroughRoot =
false;
552 QList<QModelIndex> dirsToAppend;
555 int currentColumn = -1;
556 QModelIndex parentIndex = parent;
557 while (currentColumn == -1 && parentIndex.isValid()) {
558 if (columns.isEmpty())
560 parentIndex = parentIndex.parent();
561 if (root == parentIndex)
562 passThroughRoot =
true;
563 if (!parentIndex.isValid())
565 for (
int i = columns.size() - 1; i >= 0; --i) {
566 if (columns.at(i)->rootIndex() == parentIndex) {
571 if (currentColumn == -1)
572 dirsToAppend.append(parentIndex);
577 if (!clearAll && !passThroughRoot && currentColumn == -1)
580 if (currentColumn == -1 && parent.isValid())
584 bool alreadyExists =
false;
585 if (build && columns.size() > currentColumn + 1) {
586 bool viewingParent = (columns.at(currentColumn + 1)->rootIndex() == parent);
587 bool viewingChild = (!model->hasChildren(parent)
588 && !columns.at(currentColumn + 1)->rootIndex().isValid());
589 if (viewingParent || viewingChild) {
591 alreadyExists =
true;
596 for (
int i = columns.size() - 1; i > currentColumn; --i) {
597 QAbstractItemView* notShownAnymore = columns.at(i);
599 notShownAnymore->setVisible(
false);
600 if (notShownAnymore != previewColumn) {
601 notShownAnymore->deleteLater();
602 disconnectView(notShownAnymore);
606 if (columns.isEmpty()) {
612 while (!dirsToAppend.isEmpty()) {
613 QAbstractItemView *newView = createColumn(dirsToAppend.takeLast(),
true);
614 if (!dirsToAppend.isEmpty())
615 newView->setCurrentIndex(dirsToAppend.constLast());
618 if (build && !alreadyExists)
619 createColumn(parent,
false);
622void QColumnViewPrivate::disconnectView(QAbstractItemView *view)
624 const auto it = viewConnections.find(view);
625 if (it == viewConnections.end())
627 for (
const QMetaObject::Connection &connection : it.value())
628 QObject::disconnect(connection);
629 viewConnections.erase(it);
632void QColumnViewPrivate::clicked(
const QModelIndex &index)
635 QModelIndex parent = index.parent();
636 QAbstractItemView *columnClicked =
nullptr;
637 for (
int column = 0; column < columns.size(); ++column) {
638 if (columns.at(column)->rootIndex() == parent) {
639 columnClicked = columns[column];
643 if (q->selectionModel() && columnClicked) {
644 QItemSelectionModel::SelectionFlags flags = QItemSelectionModel::Current;
645 if (columnClicked->selectionModel()->isSelected(index))
646 flags |= QItemSelectionModel::Select;
647 q->selectionModel()->setCurrentIndex(index, flags);
652
653
654
655
656
657
658
659
660
661QAbstractItemView *QColumnViewPrivate::createColumn(
const QModelIndex &index,
bool show)
664 QAbstractItemView *view =
nullptr;
665 QMetaObject::Connection clickedConnection;
666 if (model->hasChildren(index)) {
667 view = q->createColumn(index);
668 clickedConnection = QObjectPrivate::connect(view, &QAbstractItemView::clicked,
669 this, &QColumnViewPrivate::clicked);
672 setPreviewWidget(
new QWidget(q));
673 view = previewColumn;
674 view->setMinimumWidth(qMax(view->minimumWidth(), previewWidget->minimumWidth()));
677 viewConnections[view] = {
678 QObject::connect(view, &QAbstractItemView::activated, q, &QColumnView::activated),
679 QObject::connect(view, &QAbstractItemView::clicked, q, &QColumnView::clicked),
680 QObject::connect(view, &QAbstractItemView::doubleClicked, q, &QColumnView::doubleClicked),
681 QObject::connect(view, &QAbstractItemView::entered, q, &QColumnView::entered),
682 QObject::connect(view, &QAbstractItemView::pressed, q, &QColumnView::pressed),
686 view->setFocusPolicy(Qt::NoFocus);
687 view->setParent(viewport);
691 if (showResizeGrips) {
692 QColumnViewGrip *grip =
new QColumnViewGrip(view);
693 view->setCornerWidget(grip);
694 gripConnections.push_back(
695 QObjectPrivate::connect(grip, &QColumnViewGrip::gripMoved,
696 this, &QColumnViewPrivate::gripMoved)
700 if (columnSizes.size() > columns.size()) {
701 view->setGeometry(0, 0, columnSizes.at(columns.size()), viewport->height());
703 int initialWidth = view->sizeHint().width();
704 if (q->isRightToLeft())
705 view->setGeometry(viewport->width() - initialWidth, 0, initialWidth, viewport->height());
707 view->setGeometry(0, 0, initialWidth, viewport->height());
708 columnSizes.resize(qMax(columnSizes.size(), columns.size() + 1));
709 columnSizes[columns.size()] = initialWidth;
711 if (!columns.isEmpty() && columns.constLast()->isHidden())
712 columns.constLast()->setVisible(
true);
714 columns.append(view);
717 if (show && view->isHidden())
718 view->setVisible(
true);
723
724
725
726
727
728
729
732
733
734
735
736
737
738
739
740QAbstractItemView *QColumnView::createColumn(
const QModelIndex &index)
742 QListView *view =
new QListView(viewport());
744 initializeColumn(view);
746 view->setRootIndex(index);
747 if (model()->canFetchMore(index))
748 model()->fetchMore(index);
754
755
756
757
758
759
760
761void QColumnView::initializeColumn(QAbstractItemView *column)
const
763 Q_D(
const QColumnView);
765 column->setFrameShape(QFrame::NoFrame);
766 column->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
767 column->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
768 column->setMinimumWidth(100);
769 column->setAttribute(Qt::WA_MacShowFocusRect,
false);
771#if QT_CONFIG(draganddrop)
772 column->setDragDropMode(dragDropMode());
773 column->setDragDropOverwriteMode(dragDropOverwriteMode());
774 column->setDropIndicatorShown(showDropIndicator());
776 column->setAlternatingRowColors(alternatingRowColors());
777 column->setAutoScroll(hasAutoScroll());
778 column->setEditTriggers(editTriggers());
779 column->setHorizontalScrollMode(horizontalScrollMode());
780 column->setIconSize(iconSize());
781 column->setSelectionBehavior(selectionBehavior());
782 column->setSelectionMode(selectionMode());
783 column->setTabKeyNavigation(tabKeyNavigation());
784 column->setTextElideMode(textElideMode());
785 column->setVerticalScrollMode(verticalScrollMode());
787 column->setModel(model());
790 for (
auto i = d->rowDelegates.cbegin(), end = d->rowDelegates.cend(); i != end; ++i)
791 column->setItemDelegateForRow(i.key(), i.value());
794 QAbstractItemDelegate *delegate = column->itemDelegate();
795 column->setItemDelegate(d->itemDelegate);
800
801
802
803
804QWidget *QColumnView::previewWidget()
const
806 Q_D(
const QColumnView);
807 return d->previewWidget;
811
812
813
814
815
816
817
818
819void QColumnView::setPreviewWidget(QWidget *widget)
822 d->setPreviewWidget(widget);
826
827
828void QColumnViewPrivate::setPreviewWidget(QWidget *widget)
832 if (!columns.isEmpty() && columns.constLast() == previewColumn)
833 columns.removeLast();
834 previewColumn->deleteLater();
836 QColumnViewPreviewColumn *column =
new QColumnViewPreviewColumn(q);
837 column->setPreviewWidget(widget);
838 previewColumn = column;
839 previewColumn->hide();
840 previewColumn->setFrameShape(QFrame::NoFrame);
841 previewColumn->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
842 previewColumn->setSelectionMode(QAbstractItemView::NoSelection);
843 previewColumn->setMinimumWidth(qMax(previewColumn->verticalScrollBar()->width(),
844 previewColumn->minimumWidth()));
845 previewWidget = widget;
846 previewWidget->setParent(previewColumn->viewport());
850
851
852
853
854
855
856
857void QColumnView::setColumnWidths(
const QList<
int> &list)
861 const int listCount = list.size();
862 const int count = qMin(listCount, d->columns.size());
863 for (; i < count; ++i) {
864 d->columns.at(i)->resize(list.at(i), d->columns.at(i)->height());
865 d->columnSizes[i] = list.at(i);
868 d->columnSizes.reserve(listCount);
869 for (; i < listCount; ++i)
870 d->columnSizes.append(list.at(i));
874
875
876
877
878QList<
int> QColumnView::columnWidths()
const
880 Q_D(
const QColumnView);
882 const int columnCount = d->columns.size();
883 list.reserve(columnCount);
884 for (
int i = 0; i < columnCount; ++i)
885 list.append(d->columnSizes.at(i));
890
891
892void QColumnView::rowsInserted(
const QModelIndex &parent,
int start,
int end)
894 QAbstractItemView::rowsInserted(parent, start, end);
895 d_func()->checkColumnCreation(parent);
899
900
901void QColumnView::currentChanged(
const QModelIndex ¤t,
const QModelIndex &previous)
904 if (!current.isValid()) {
905 QAbstractItemView::currentChanged(current, previous);
909 QModelIndex currentParent = current.parent();
911 if (currentParent == previous.parent()
912 && model()->hasChildren(current) && model()->hasChildren(previous)) {
913 for (
int i = 0; i < d->columns.size(); ++i) {
914 if (currentParent == d->columns.at(i)->rootIndex()) {
915 if (d->columns.size() > i + 1) {
916 QAbstractItemView::currentChanged(current, previous);
926 if (currentParent == previous) {
927 for (
int i = 0; i < d->columns.size(); ++i) {
928 if (currentParent == d->columns.at(i)->rootIndex()) {
930 if (d->columns.size() < i + 2) {
931 d->createColumn(current,
false);
938 d->closeColumns(current,
true);
940 if (!model()->hasChildren(current))
941 emit updatePreviewWidget(current);
943 QAbstractItemView::currentChanged(current, previous);
947
948
949
950void QColumnViewPrivate::changeCurrentColumn()
953 if (columns.isEmpty())
956 QModelIndex current = q->currentIndex();
957 if (!current.isValid())
961 closeColumns(current,
true);
964 int currentColumn = qMax(0, columns.size() - 2);
965 QAbstractItemView *parentColumn = columns.at(currentColumn);
967 parentColumn->setFocus(Qt::OtherFocusReason);
968 q->setFocusProxy(parentColumn);
971 for (
int i = 0; i < columns.size(); ++i) {
972 if (columns.at(i)->selectionModel() == q->selectionModel()) {
973 QItemSelectionModel *replacementSelectionModel =
974 new QItemSelectionModel(parentColumn->model());
975 replacementSelectionModel->setCurrentIndex(
976 q->selectionModel()->currentIndex(), QItemSelectionModel::Current);
977 replacementSelectionModel->select(
978 q->selectionModel()->selection(), QItemSelectionModel::Select);
979 QAbstractItemView *view = columns.at(i);
980 view->setSelectionModel(replacementSelectionModel);
981 view->setFocusPolicy(Qt::NoFocus);
982 if (columns.size() > i + 1) {
983 const QModelIndex newRootIndex = columns.at(i + 1)->rootIndex();
984 if (newRootIndex.isValid())
985 view->setCurrentIndex(newRootIndex);
990 parentColumn->selectionModel()->deleteLater();
991 parentColumn->setFocusPolicy(Qt::StrongFocus);
992 parentColumn->setSelectionModel(q->selectionModel());
994 if (currentColumn > 0) {
995 parentColumn = columns.at(currentColumn - 1);
996 if (parentColumn->currentIndex() != current.parent())
997 parentColumn->setCurrentIndex(current.parent());
1000 if (columns.constLast()->isHidden()) {
1001 columns.constLast()->setVisible(
true);
1003 if (columns.constLast()->selectionModel())
1004 columns.constLast()->selectionModel()->clear();
1009
1010
1011void QColumnView::selectAll()
1013 if (!model() || !selectionModel())
1016 QModelIndexList indexList = selectionModel()->selectedIndexes();
1017 QModelIndex parent = rootIndex();
1018 QItemSelection selection;
1019 if (indexList.size() >= 1)
1020 parent = indexList.at(0).parent();
1021 if (indexList.size() == 1) {
1022 parent = indexList.at(0);
1023 if (!model()->hasChildren(parent))
1024 parent = parent.parent();
1026 selection.append(QItemSelectionRange(parent, parent));
1029 QModelIndex tl = model()->index(0, 0, parent);
1030 QModelIndex br = model()->index(model()->rowCount(parent) - 1,
1031 model()->columnCount(parent) - 1,
1033 selection.append(QItemSelectionRange(tl, br));
1034 selectionModel()->select(selection, QItemSelectionModel::ClearAndSelect);
1038
1039
1040QColumnViewPrivate::QColumnViewPrivate()
1041: QAbstractItemViewPrivate()
1042,showResizeGrips(
true)
1044,previewWidget(
nullptr)
1045,previewColumn(
nullptr)
1049QColumnViewPrivate::~QColumnViewPrivate()
1054
1055
1056
1057void QColumnViewPrivate::columnsInserted(
const QModelIndex &parent,
int start,
int end)
1059 QAbstractItemViewPrivate::columnsInserted(parent, start, end);
1060 checkColumnCreation(parent);
1064
1065
1066
1067
1068
1069void QColumnViewPrivate::checkColumnCreation(
const QModelIndex &parent)
1071 if (parent == q_func()->currentIndex() && model->hasChildren(parent)) {
1074 for (
int i = 0; i < columns.size(); ++i) {
1075 QAbstractItemView *view = columns.at(i);
1076 if (view->rootIndex() == parent) {
1077 if (view == previewColumn) {
1079 closeColumns(parent,
false);
1080 createColumn(parent,
true );
1089
1090
1091
1092void QColumnViewPrivate::doLayout()
1095 if (!model || columns.isEmpty())
1098 int viewportHeight = viewport->height();
1099 int x = columns.at(0)->x();
1101 if (q->isRightToLeft()) {
1102 x = viewport->width() + q->horizontalOffset();
1103 for (
int i = 0; i < columns.size(); ++i) {
1104 QAbstractItemView *view = columns.at(i);
1106 if (x != view->x() || viewportHeight != view->height())
1107 view->setGeometry(x, 0, view->width(), viewportHeight);
1110 for (
int i = 0; i < columns.size(); ++i) {
1111 QAbstractItemView *view = columns.at(i);
1112 int currentColumnWidth = view->width();
1113 if (x != view->x() || viewportHeight != view->height())
1114 view->setGeometry(x, 0, currentColumnWidth, viewportHeight);
1115 x += currentColumnWidth;
1121
1122
1123
1124
1125
1126
1127void QColumnViewDelegate::paint(QPainter *painter,
1128 const QStyleOptionViewItem &option,
1129 const QModelIndex &index)
const
1131 bool reverse = (option.direction == Qt::RightToLeft);
1132 int width = ((option.rect.height() * 2) / 3);
1134 QStyleOptionViewItem opt = option;
1136 opt.rect.adjust(width,0,0,0);
1138 opt.rect.adjust(0,0,-width,0);
1140 if (!(index.model()->flags(index) & Qt::ItemIsEnabled)) {
1141 opt.showDecorationSelected =
true;
1142 opt.state |= QStyle::State_Selected;
1145 QStyledItemDelegate::paint(painter, opt, index);
1148 opt.rect = QRect(option.rect.x(), option.rect.y(), width, option.rect.height());
1150 opt.rect = QRect(option.rect.x() + option.rect.width() - width, option.rect.y(),
1151 width, option.rect.height());
1154 if (index.model()->hasChildren(index)) {
1155 const QWidget *view = opt.widget;
1156 QStyle *style = view ? view->style() : QApplication::style();
1157 style->drawPrimitive(QStyle::PE_IndicatorColumnViewArrow, &opt, painter, view);
1163#include "moc_qcolumnview.cpp"