Switch to manual polishing of event delegates
This commit is contained in:
parent
205a42dade
commit
6c6370c83f
7 changed files with 169 additions and 60 deletions
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue