mirror of
https://github.com/ciphervance/supercell-wx.git
synced 2025-10-30 18:30:06 +00:00
Use a weak pointer to store picked event handler
Fixes crash while item is picked and changing layers
This commit is contained in:
parent
f2b2fce5c5
commit
2e1b537c87
1 changed files with 22 additions and 13 deletions
|
|
@ -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(
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue