Don't start animations from QEvent::Enter.

The enter/leave events may be sent from ~QWidget() and if we start
animating something with grabbing of widgets it crashes sometimes.
This commit is contained in:
John Preston 2021-11-29 15:56:50 +04:00
parent 03775e0cc5
commit 2eb64e051b
1 changed files with 15 additions and 4 deletions

View File

@ -68,6 +68,7 @@ private:
const Fn<void(bool)> _menuOverCallback;
base::unique_qptr<Ui::DropdownMenu> _menu;
bool _temporarilyHidden = false;
bool _overButton = false;
};
@ -120,9 +121,17 @@ WithDropdownController::WithDropdownController(
, _menuOverCallback(std::move(menuOverCallback)) {
button->events(
) | rpl::filter([=](not_null<QEvent*> e) {
return (e->type() == QEvent::Enter);
}) | rpl::start_with_next([=] {
showMenu();
return (e->type() == QEvent::Enter)
|| (e->type() == QEvent::Leave);
}) | rpl::start_with_next([=](not_null<QEvent*> e) {
_overButton = (e->type() == QEvent::Enter);
if (_overButton) {
InvokeQueued(button, [=] {
if (_overButton) {
showMenu();
}
});
}
}, button->lifetime());
}
@ -740,7 +749,9 @@ void Widget::markOver(bool over) {
if (over) {
_over = true;
_wontBeOver = false;
updateControlsWrapVisibility();
InvokeQueued(this, [=] {
updateControlsWrapVisibility();
});
} else {
_wontBeOver = true;
InvokeQueued(this, [=] {