21class QDataWidgetMapperPrivate:
public QObjectPrivate
24 Q_DECLARE_PUBLIC(QDataWidgetMapper)
26 QDataWidgetMapperPrivate()
27 : model(QAbstractItemModelPrivate::staticEmptyModel()), delegate(
nullptr),
28 orientation(Qt::Horizontal), submitPolicy(QDataWidgetMapper::AutoSubmit)
32 QAbstractItemModel *model;
33 QAbstractItemDelegate *delegate;
34 Qt::Orientation orientation;
35 QDataWidgetMapper::SubmitPolicy submitPolicy;
36 QPersistentModelIndex rootIndex;
37 QPersistentModelIndex currentTopLeft;
39 inline int itemCount()
41 return orientation == Qt::Horizontal
42 ? model->rowCount(rootIndex)
43 : model->columnCount(rootIndex);
46 inline int currentIdx()
const
48 return orientation == Qt::Horizontal ? currentTopLeft.row() : currentTopLeft.column();
51 inline QModelIndex indexAt(
int itemPos)
53 return orientation == Qt::Horizontal
54 ? model->index(currentIdx(), itemPos, rootIndex)
55 : model->index(itemPos, currentIdx(), rootIndex);
58 void flipEventFilters(QAbstractItemDelegate *oldDelegate,
59 QAbstractItemDelegate *newDelegate)
const
61 for (
const WidgetMapper &e : widgetMap) {
62 QWidget *w = e.widget;
65 w->removeEventFilter(oldDelegate);
66 w->installEventFilter(newDelegate);
73 void dataChanged(
const QModelIndex &topLeft,
const QModelIndex &bottomRight,
75 void commitData(QWidget *);
76 void closeEditor(QWidget *, QAbstractItemDelegate::EndEditHint);
77 void modelDestroyed();
79 void disconnectModel()
81 for (
const QMetaObject::Connection &connection : modelConnections)
82 QObject::disconnect(connection);
84 void disconnectDelegate()
86 for (
const QMetaObject::Connection &connection : delegateConnections)
87 QObject::disconnect(connection);
92 QPointer<QWidget> widget;
94 QPersistentModelIndex currentIndex;
98 void populate(WidgetMapper &m);
99 int findWidget(QWidget *w)
const;
101 bool commit(
const WidgetMapper &m);
103 std::vector<WidgetMapper> widgetMap;
104 std::array<QMetaObject::Connection, 2> modelConnections;
105 std::array<QMetaObject::Connection, 2> delegateConnections;
118bool QDataWidgetMapperPrivate::commit(
const WidgetMapper &m)
120 if (m.widget.isNull())
123 if (!m.currentIndex.isValid())
128 if (m.property.isEmpty())
129 delegate->setModelData(m.widget, model, idx);
131 model->setData(idx, m.widget->property(m.property), Qt::EditRole);
136void QDataWidgetMapperPrivate::populate(WidgetMapper &m)
138 if (m.widget.isNull())
141 m.currentIndex = indexAt(m.section);
142 if (m.property.isEmpty())
143 delegate->setEditorData(m.widget, m.currentIndex);
145 m.widget->setProperty(m.property, m.currentIndex.data(Qt::EditRole));
185void QDataWidgetMapperPrivate::closeEditor(QWidget *w, QAbstractItemDelegate::EndEditHint hint)
187 int idx = findWidget(w);
192 case QAbstractItemDelegate::RevertModelCache: {
193 populate(widgetMap[idx]);
195 case QAbstractItemDelegate::EditNextItem:
198 case QAbstractItemDelegate::EditPreviousItem:
199 w->focusPreviousChild();
201 case QAbstractItemDelegate::SubmitModelCache:
202 case QAbstractItemDelegate::NoHint:
328void QDataWidgetMapper::setModel(QAbstractItemModel *model)
330 Q_D(QDataWidgetMapper);
332 if (d->model == model)
335 d->disconnectModel();
337 d->rootIndex = QModelIndex();
338 d->currentTopLeft = QModelIndex();
342 d->modelConnections = {
343 QObjectPrivate::connect(model, &QAbstractItemModel::dataChanged,
344 d, &QDataWidgetMapperPrivate::dataChanged),
345 QObjectPrivate::connect(model, &QAbstractItemModel::destroyed,
346 d, &QDataWidgetMapperPrivate::modelDestroyed)
379void QDataWidgetMapper::setItemDelegate(QAbstractItemDelegate *delegate)
381 Q_D(QDataWidgetMapper);
382 QAbstractItemDelegate *oldDelegate = d->delegate;
383 d->disconnectDelegate();
385 d->delegate = delegate;
388 d->delegateConnections = {
389 QObjectPrivate::connect(delegate, &QAbstractItemDelegate::commitData,
390 d, &QDataWidgetMapperPrivate::commitData),
391 QObjectPrivate::connect(delegate, &QAbstractItemDelegate::closeEditor,
392 d, &QDataWidgetMapperPrivate::closeEditor)
396 d->flipEventFilters(oldDelegate, delegate);
456void QDataWidgetMapper::addMapping(QWidget *widget,
int section)
458 Q_D(QDataWidgetMapper);
460 removeMapping(widget);
461 d->widgetMap.push_back({widget, section, d->indexAt(section), QByteArray()});
462 widget->installEventFilter(d->delegate);
472void QDataWidgetMapper::addMapping(QWidget *widget,
int section,
const QByteArray &propertyName)
474 Q_D(QDataWidgetMapper);
476 removeMapping(widget);
477 d->widgetMap.push_back({widget, section, d->indexAt(section), propertyName});
478 widget->installEventFilter(d->delegate);
665void QDataWidgetMapper::setCurrentIndex(
int index)
667 Q_D(QDataWidgetMapper);
669 if (index < 0 || index >= d->itemCount())
671 d->currentTopLeft = d->orientation == Qt::Horizontal
672 ? d->model->index(index, 0, d->rootIndex)
673 : d->model->index(0, index, d->rootIndex);
676 emit currentIndexChanged(index);