Hopefully this stops any crashes around QuickActions.qml and EmojiDialog.qml

Hopefully this stops any crashes around QuickActions.qml and EmojiDialog.qml. Best I can guess this is some race condition where QuickActions are deleted in the time it takes to instnatiate the EmojiDialog popup. I've also rearranged the updateQuickActions function to stop a possible race condition there.

BUG: 509484
This commit is contained in:
James Graham
2025-10-08 14:07:02 +01:00
committed by Tobias Fella
parent 1070427a0d
commit 7356a68f4c
2 changed files with 38 additions and 29 deletions

View File

@@ -33,6 +33,7 @@ RowLayout {
icon.name: "preferences-desktop-emoticons"
display: QQC2.ToolButton.IconOnly
onClicked: {
root.reacting = true;
var dialog = emojiDialog.createObject(reactButton);
dialog.chosen.connect(emoji => {
root.reacting = false;
@@ -44,7 +45,6 @@ RowLayout {
dialog.closed.connect(() => {
root.reacting = false;
})
root.reacting = true;
dialog.open();
}

View File

@@ -146,6 +146,10 @@ qreal MessageDelegateBase::maxContentWidth() const
void MessageDelegateBase::cleanupIncubator(MessageObjectIncubator *incubator)
{
if (!incubator) {
return;
}
incubator->clear();
const auto it = std::find(m_activeIncubators.begin(), m_activeIncubators.end(), incubator);
if (it != m_activeIncubators.end()) {
@@ -471,35 +475,40 @@ void MessageDelegateBase::setQuickActionComponent(QQmlComponent *quickActionComp
void MessageDelegateBase::updateQuickAction()
{
if (m_quickActionComponent && !m_compactMode && m_hovered && !m_quickActionItem && !m_quickActionIncubating) {
const auto quickActionIncubator = new MessageObjectIncubator(
m_objectInitialCallback,
[this](MessageObjectIncubator *incubator) {
if (!incubator) {
return;
}
const auto quickActionObject = qobject_cast<QQuickItem *>(incubator->object());
if (quickActionObject) {
if (!m_compactMode) {
m_quickActionItem = quickActionObject;
connect(m_quickActionItem, SIGNAL(reactingChanged()), this, SLOT(updateQuickAction()));
} else {
cleanupItem(quickActionObject);
}
markAsDirty();
}
m_quickActionIncubating = false;
cleanupIncubator(incubator);
},
m_errorCallback);
m_activeIncubators.push_back(quickActionIncubator);
m_quickActionComponent->create(*quickActionIncubator, qmlContext(m_quickActionComponent));
m_quickActionIncubating = true;
} else if (m_quickActionItem && !m_hovered && !m_quickActionItem->property("reacting").toBool()) {
cleanupItem(m_quickActionItem);
markAsDirty();
if (!m_hovered || m_compactMode) {
if (m_quickActionItem && (!m_quickActionItem->property("reacting").toBool() || m_compactMode)) {
cleanupItem(m_quickActionItem);
markAsDirty();
}
return;
}
if (!m_quickActionComponent || m_quickActionItem || m_quickActionIncubating) {
return;
}
m_quickActionIncubating = true;
const auto quickActionIncubator = new MessageObjectIncubator(
m_objectInitialCallback,
[this](MessageObjectIncubator *incubator) {
if (!incubator) {
return;
}
if (const auto quickActionObject = qobject_cast<QQuickItem *>(incubator->object())) {
if (!m_compactMode) {
m_quickActionItem = quickActionObject;
connect(m_quickActionItem, SIGNAL(reactingChanged()), this, SLOT(updateQuickAction()));
} else {
cleanupItem(quickActionObject);
}
markAsDirty();
}
cleanupIncubator(incubator);
m_quickActionIncubating = false;
},
m_errorCallback);
m_activeIncubators.push_back(quickActionIncubator);
m_quickActionComponent->create(*quickActionIncubator, qmlContext(m_quickActionComponent));
}
bool MessageDelegateBase::showLocalMessagesOnRight() const