Use a weak pointer to store picked event handler

Fixes crash while item is picked and changing layers
This commit is contained in:
Dan Paulat 2024-08-03 23:09:27 -05:00
parent f2b2fce5c5
commit 2e1b537c87

View file

@ -244,7 +244,7 @@ public:
Qt::KeyboardModifiers lastKeyboardModifiers_ { Qt::KeyboardModifiers lastKeyboardModifiers_ {
Qt::KeyboardModifier::NoModifier}; Qt::KeyboardModifier::NoModifier};
std::shared_ptr<types::EventHandler> pickedEventHandler_ {nullptr}; std::weak_ptr<types::EventHandler> weakPickedEventHandler_ {};
uint64_t frameDraws_; uint64_t frameDraws_;
@ -1320,11 +1320,12 @@ bool MapWidget::event(QEvent* e)
return true; return true;
} }
if (p->pickedEventHandler_ != nullptr && auto pickedEventHandler = p->weakPickedEventHandler_.lock();
p->pickedEventHandler_->event_ != nullptr) if (pickedEventHandler != nullptr && pickedEventHandler->event_ != nullptr)
{ {
p->pickedEventHandler_->event_(e); pickedEventHandler->event_(e);
} }
pickedEventHandler.reset();
return QOpenGLWidget::event(e); return QOpenGLWidget::event(e);
} }
@ -1593,34 +1594,35 @@ void MapWidgetImpl::RunMousePicking()
} }
// If no draw item was picked, hide the tooltip // If no draw item was picked, hide the tooltip
auto prevPickedEventHandler = weakPickedEventHandler_.lock();
if (!itemPicked) if (!itemPicked)
{ {
util::tooltip::Hide(); util::tooltip::Hide();
if (pickedEventHandler_ != nullptr) if (prevPickedEventHandler != nullptr)
{ {
// Send leave event to picked event handler // Send leave event to picked event handler
if (pickedEventHandler_->event_ != nullptr) if (prevPickedEventHandler->event_ != nullptr)
{ {
QEvent event(QEvent::Type::Leave); QEvent event(QEvent::Type::Leave);
pickedEventHandler_->event_(&event); prevPickedEventHandler->event_(&event);
} }
// Reset picked event handler // Reset picked event handler
pickedEventHandler_ = nullptr; weakPickedEventHandler_.reset();
} }
} }
else if (eventHandler != nullptr) else if (eventHandler != nullptr)
{ {
// If the event handler changed // If the event handler changed
if (pickedEventHandler_ != eventHandler) if (prevPickedEventHandler != eventHandler)
{ {
// Send leave event to old event handler // Send leave event to old event handler
if (pickedEventHandler_ != nullptr && if (prevPickedEventHandler != nullptr &&
pickedEventHandler_->event_ != nullptr) prevPickedEventHandler->event_ != nullptr)
{ {
QEvent event(QEvent::Type::Leave); QEvent event(QEvent::Type::Leave);
pickedEventHandler_->event_(&event); prevPickedEventHandler->event_(&event);
} }
// Send enter event to new event handler // Send enter event to new event handler
@ -1631,8 +1633,15 @@ void MapWidgetImpl::RunMousePicking()
} }
// Store picked event handler // Store picked event handler
pickedEventHandler_ = eventHandler; weakPickedEventHandler_ = eventHandler;
} }
eventHandler.reset();
}
if (prevPickedEventHandler != nullptr)
{
prevPickedEventHandler.reset();
} }
Q_EMIT widget_->MouseCoordinateChanged( Q_EMIT widget_->MouseCoordinateChanged(