104void QQmlDelegateChoice::setDelegate(QQmlComponent *delegate)
106 if (m_delegate == delegate)
108 QQmlAbstractDelegateComponent *adc =
static_cast<QQmlAbstractDelegateComponent *>(m_delegate);
110 disconnect(adc, &QQmlAbstractDelegateComponent::delegateChanged,
this, &QQmlDelegateChoice::delegateChanged);
111 m_delegate = delegate;
112 adc =
static_cast<QQmlAbstractDelegateComponent *>(delegate);
114 connect(adc, &QQmlAbstractDelegateComponent::delegateChanged,
this, &QQmlDelegateChoice::delegateChanged);
115 emit delegateChanged();
119bool QQmlDelegateChoice::match(
int row,
int column,
const QVariant &value)
const
121 if (!m_value.isValid() && m_row < 0 && m_column < 0)
124 bool roleMatched =
true;
125 if (m_value.isValid()) {
126 roleMatched = (value == m_value);
128 bool valueOk =
false;
129 bool mValueOk =
false;
130 roleMatched = (value.toInt(&valueOk) == m_value.toInt(&mValueOk) && valueOk && mValueOk);
133 roleMatched = (value.toString() == m_value.toString());
135 const bool rowMatched = (m_row < 0 ) ?
true : m_row == row;
136 const bool columnMatched = (m_column < 0 ) ?
true : m_column == column;
137 return roleMatched && rowMatched && columnMatched;
238void QQmlDelegateChooser::choices_append(QQmlListProperty<QQmlDelegateChoice> *prop, QQmlDelegateChoice *choice)
240 QQmlDelegateChooser *q =
static_cast<QQmlDelegateChooser *>(prop->object);
241 q->m_choices.append(choice);
242 connect(choice, &QQmlDelegateChoice::changed, q, &QQmlAbstractDelegateComponent::delegateChanged);
243 emit q->delegateChanged();
258void QQmlDelegateChooser::choices_clear(QQmlListProperty<QQmlDelegateChoice> *prop)
260 QQmlDelegateChooser *q =
static_cast<QQmlDelegateChooser *>(prop->object);
261 for (QQmlDelegateChoice *choice : q->m_choices)
262 disconnect(choice, &QQmlDelegateChoice::changed, q, &QQmlAbstractDelegateComponent::delegateChanged);
263 q->m_choices.clear();
264 emit q->delegateChanged();
267void QQmlDelegateChooser::choices_replace(QQmlListProperty<QQmlDelegateChoice> *prop,
268 qsizetype index, QQmlDelegateChoice *choice)
270 QQmlDelegateChooser *q =
static_cast<QQmlDelegateChooser *>(prop->object);
271 disconnect(q->m_choices[index], &QQmlDelegateChoice::changed,
272 q, &QQmlAbstractDelegateComponent::delegateChanged);
273 q->m_choices[index] = choice;
274 connect(choice, &QQmlDelegateChoice::changed, q,
275 &QQmlAbstractDelegateComponent::delegateChanged);
276 emit q->delegateChanged();
279void QQmlDelegateChooser::choices_removeLast(QQmlListProperty<QQmlDelegateChoice> *prop)
281 QQmlDelegateChooser *q =
static_cast<QQmlDelegateChooser *>(prop->object);
282 disconnect(q->m_choices.takeLast(), &QQmlDelegateChoice::changed,
283 q, &QQmlAbstractDelegateComponent::delegateChanged);
284 emit q->delegateChanged();
287QQmlComponent *QQmlDelegateChooser::delegate(QQmlAdaptorModel *adaptorModel,
int row,
int column)
const
290 if (!m_role.isNull())
291 v = value(adaptorModel, row, column, m_role);
293 v = value(adaptorModel, row, column, QStringLiteral(
"modelData"));
296 if (v.canConvert(QMetaType(QMetaType::QVariantMap)))
297 v = v.toMap().value(m_role);
298 else if (v.canConvert(QMetaType(QMetaType::QObjectStar)))
299 v = v.value<QObject*>()->property(m_role.toUtf8());
304 for (
int i = 0; i < m_choices.size(); ++i) {
305 const QQmlDelegateChoice *choice = m_choices.at(i);
306 if (choice->match(row, column, v))
307 return choice->delegate();