Switch to manual polishing of event delegates

This commit is contained in:
Nicolas Werner 2023-10-08 20:14:13 +02:00
parent 205a42dade
commit 6c6370c83f
No known key found for this signature in database
GPG key ID: C8D75E610773F2D9
7 changed files with 169 additions and 60 deletions

View file

@ -131,7 +131,7 @@ EventDelegateChooser::DelegateIncubator::setInitialState(QObject *obj)
roleToPropIdx.insert(*role, i);
roles.emplace_back(*role);
nhlog::ui()->critical("Found prop {}, idx {}, role {}", prop.name(), i, *role);
// nhlog::ui()->critical("Found prop {}, idx {}, role {}", prop.name(), i, *role);
} else {
nhlog::ui()->critical("Required property {} not found in model!", prop.name());
}
@ -140,14 +140,15 @@ EventDelegateChooser::DelegateIncubator::setInitialState(QObject *obj)
nhlog::ui()->debug("Querying data for id {}", currentId.toStdString());
chooser.room_->multiData(currentId, forReply ? chooser.eventId_ : QString(), roles);
Qt::beginPropertyUpdateGroup();
for (const auto &role : roles) {
const auto &roleName = roleNames[role.role()];
nhlog::ui()->critical("Setting role {}, {} to {}",
role.role(),
roleName.toStdString(),
role.data().toString().toStdString());
// nhlog::ui()->critical("Setting role {}, {} to {}",
// role.role(),
// roleName.toStdString(),
// role.data().toString().toStdString());
nhlog::ui()->critical("Setting {}", mo->property(roleToPropIdx[role.role()]).name());
// nhlog::ui()->critical("Setting {}", mo->property(roleToPropIdx[role.role()]).name());
mo->property(roleToPropIdx[role.role()]).write(obj, role.data());
if (const auto &req = requiredProperties.find(roleName); req != requiredProperties.end())
@ -156,14 +157,15 @@ EventDelegateChooser::DelegateIncubator::setInitialState(QObject *obj)
if (isReplyNeeded) {
const auto roleName = QByteArray("isReply");
nhlog::ui()->critical("Setting role {} to {}", roleName.toStdString(), forReply);
// nhlog::ui()->critical("Setting role {} to {}", roleName.toStdString(), forReply);
nhlog::ui()->critical("Setting {}", mo->property(roleToPropIdx[-1]).name());
// nhlog::ui()->critical("Setting {}", mo->property(roleToPropIdx[-1]).name());
mo->property(roleToPropIdx[-1]).write(obj, forReply);
if (const auto &req = requiredProperties.find(roleName); req != requiredProperties.end())
QQmlIncubatorPrivate::get(this)->requiredProperties()->remove(*req);
}
Qt::endPropertyUpdateGroup();
// setInitialProperties(rolesToSet);
@ -188,9 +190,12 @@ EventDelegateChooser::DelegateIncubator::setInitialState(QObject *obj)
auto mo = obj->metaObject();
chooser.room_->multiData(
currentId, forReply ? chooser.eventId_ : QString(), rolesToRequest);
Qt::beginPropertyUpdateGroup();
for (const auto &role : rolesToRequest) {
mo->property(roleToPropIdx[role.role()]).write(obj, role.data());
}
Qt::endPropertyUpdateGroup();
};
if (!forReply) {
@ -257,11 +262,22 @@ EventDelegateChooser::DelegateIncubator::statusChanged(QQmlIncubator::Status sta
child->setParentItem(&chooser);
QQmlEngine::setObjectOwnership(child, QQmlEngine::ObjectOwnership::JavaScriptOwnership);
// connect(child, &QQuickItem::parentChanged, child, [child](QQuickItem *) {
// // QTBUG-115687
// if (child->flags().testFlag(QQuickItem::ItemObservesViewport)) {
// nhlog::ui()->critical("SETTING OBSERVES VIEWPORT");
// // Re-trigger the parent traversal to get subtreeTransformChangedEnabled turned
// on child->setFlag(QQuickItem::ItemObservesViewport);
// }
// });
if (forReply)
emit chooser.replyChanged();
else
emit chooser.mainChanged();
chooser.polish();
} else if (status == QQmlIncubator::Error) {
auto errors_ = errors();
for (const auto &e : qAsConst(errors_))
@ -269,3 +285,49 @@ EventDelegateChooser::DelegateIncubator::statusChanged(QQmlIncubator::Status sta
}
}
void
EventDelegateChooser::updatePolish()
{
auto mainChild = qobject_cast<QQuickItem *>(eventIncubator.object());
auto replyChild = qobject_cast<QQuickItem *>(replyIncubator.object());
nhlog::ui()->critical("POLISHING {}", (void *)this);
if (mainChild) {
auto attached = qobject_cast<EventDelegateChooserAttachedType *>(
qmlAttachedPropertiesObject<EventDelegateChooser>(mainChild));
Q_ASSERT(attached != nullptr);
// in theory we could also reset the width, but that doesn't seem to work nicely for text
// areas because of how they cache it.
mainChild->setWidth(maxWidth_);
mainChild->ensurePolished();
auto width = mainChild->implicitWidth();
if (width > maxWidth_ || attached->fillWidth())
width = maxWidth_;
nhlog::ui()->debug(
"Made event delegate width: {}, {}", width, mainChild->metaObject()->className());
mainChild->setWidth(width);
mainChild->ensurePolished();
}
if (replyChild) {
auto attached = qobject_cast<EventDelegateChooserAttachedType *>(
qmlAttachedPropertiesObject<EventDelegateChooser>(replyChild));
Q_ASSERT(attached != nullptr);
// in theory we could also reset the width, but that doesn't seem to work nicely for text
// areas because of how they cache it.
replyChild->setWidth(maxWidth_);
replyChild->ensurePolished();
auto width = replyChild->implicitWidth();
if (width > maxWidth_ || attached->fillWidth())
width = maxWidth_;
replyChild->setWidth(width);
replyChild->ensurePolished();
}
}