From 5110ebb18e359736685915c8e22881c5a26a89c3 Mon Sep 17 00:00:00 2001 From: John Preston Date: Tue, 3 Nov 2015 11:49:14 -0500 Subject: [PATCH] crash in PopupMenu fixed --- Telegram/SourceFiles/gui/popupmenu.cpp | 37 +++++++++++++++++++------- Telegram/SourceFiles/gui/popupmenu.h | 2 +- 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/Telegram/SourceFiles/gui/popupmenu.cpp b/Telegram/SourceFiles/gui/popupmenu.cpp index ea68cff3d0..bfc890cb34 100644 --- a/Telegram/SourceFiles/gui/popupmenu.cpp +++ b/Telegram/SourceFiles/gui/popupmenu.cpp @@ -37,7 +37,9 @@ PopupMenu::PopupMenu(const style::PopupMenu &st) : TWidget(0) , _childMenuIndex(-1) , a_opacity(1) , _a_hide(animFunc(this, &PopupMenu::animStep_hide)) -, _deleteOnHide(true) { +, _deleteOnHide(true) +, _triggering(false) +, _deleteLater(false) { init(); } @@ -53,7 +55,9 @@ PopupMenu::PopupMenu(QMenu *menu, const style::PopupMenu &st) : TWidget(0) , _childMenuIndex(-1) , a_opacity(1) , _a_hide(animFunc(this, &PopupMenu::animStep_hide)) -, _deleteOnHide(true) { +, _deleteOnHide(true) +, _triggering(false) +, _deleteLater(false) { init(); QList actions(menu->actions()); for (int32 i = 0, l = actions.size(); i < l; ++i) { @@ -238,7 +242,13 @@ void PopupMenu::itemPressed(PressSource source) { } } else { hideMenu(); + _triggering = true; emit _actions[_selected]->trigger(); + _triggering = false; + if (_deleteLater) { + _deleteLater = false; + deleteLater(); + } } } } @@ -262,6 +272,7 @@ void PopupMenu::keyPressEvent(QKeyEvent *e) { if (e->key() == Qt::Key_Enter || e->key() == Qt::Key_Return) { itemPressed(PressSourceKeyboard); + return; } else if (e->key() == Qt::Key_Escape) { hideMenu(_parent ? true : false); return; @@ -269,6 +280,7 @@ void PopupMenu::keyPressEvent(QKeyEvent *e) { if (e->key() == (rtl() ? Qt::Key_Left : Qt::Key_Right)) { if (_selected >= 0 && _menus.at(_selected)) { itemPressed(PressSourceKeyboard); + return; } else if (_selected < 0 && _parent && !_actions.isEmpty()) { _mouseSelection = false; setSelected(0); @@ -368,13 +380,14 @@ void PopupMenu::mouseMoveEvent(QMouseEvent *e) { void PopupMenu::mousePressEvent(QMouseEvent *e) { mouseMoveEvent(e); - itemPressed(PressSourceMouse); - if (!_inner.contains(mapFromGlobal(e->globalPos()))) { - if (_parent) { - _parent->mousePressEvent(e); - } else { - hideMenu(); - } + if (_inner.contains(mapFromGlobal(e->globalPos()))) { + itemPressed(PressSourceMouse); + return; + } + if (_parent) { + _parent->mousePressEvent(e); + } else { + hideMenu(); } } @@ -384,7 +397,11 @@ void PopupMenu::focusOutEvent(QFocusEvent *e) { void PopupMenu::hideEvent(QHideEvent *e) { if (_deleteOnHide) { - deleteLater(); + if (_triggering) { + _deleteLater = true; + } else { + deleteLater(); + } } } diff --git a/Telegram/SourceFiles/gui/popupmenu.h b/Telegram/SourceFiles/gui/popupmenu.h index bccb3483c9..887f15bd6c 100644 --- a/Telegram/SourceFiles/gui/popupmenu.h +++ b/Telegram/SourceFiles/gui/popupmenu.h @@ -102,6 +102,6 @@ private: anim::fvalue a_opacity; Animation _a_hide; - bool _deleteOnHide; + bool _deleteOnHide, _triggering, _deleteLater; };