crash in PopupMenu fixed

This commit is contained in:
John Preston 2015-11-03 11:49:14 -05:00
parent 9a83c26731
commit 5110ebb18e
2 changed files with 28 additions and 11 deletions

View File

@ -37,7 +37,9 @@ PopupMenu::PopupMenu(const style::PopupMenu &st) : TWidget(0)
, _childMenuIndex(-1) , _childMenuIndex(-1)
, a_opacity(1) , a_opacity(1)
, _a_hide(animFunc(this, &PopupMenu::animStep_hide)) , _a_hide(animFunc(this, &PopupMenu::animStep_hide))
, _deleteOnHide(true) { , _deleteOnHide(true)
, _triggering(false)
, _deleteLater(false) {
init(); init();
} }
@ -53,7 +55,9 @@ PopupMenu::PopupMenu(QMenu *menu, const style::PopupMenu &st) : TWidget(0)
, _childMenuIndex(-1) , _childMenuIndex(-1)
, a_opacity(1) , a_opacity(1)
, _a_hide(animFunc(this, &PopupMenu::animStep_hide)) , _a_hide(animFunc(this, &PopupMenu::animStep_hide))
, _deleteOnHide(true) { , _deleteOnHide(true)
, _triggering(false)
, _deleteLater(false) {
init(); init();
QList<QAction*> actions(menu->actions()); QList<QAction*> actions(menu->actions());
for (int32 i = 0, l = actions.size(); i < l; ++i) { for (int32 i = 0, l = actions.size(); i < l; ++i) {
@ -238,7 +242,13 @@ void PopupMenu::itemPressed(PressSource source) {
} }
} else { } else {
hideMenu(); hideMenu();
_triggering = true;
emit _actions[_selected]->trigger(); 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) { if (e->key() == Qt::Key_Enter || e->key() == Qt::Key_Return) {
itemPressed(PressSourceKeyboard); itemPressed(PressSourceKeyboard);
return;
} else if (e->key() == Qt::Key_Escape) { } else if (e->key() == Qt::Key_Escape) {
hideMenu(_parent ? true : false); hideMenu(_parent ? true : false);
return; return;
@ -269,6 +280,7 @@ void PopupMenu::keyPressEvent(QKeyEvent *e) {
if (e->key() == (rtl() ? Qt::Key_Left : Qt::Key_Right)) { if (e->key() == (rtl() ? Qt::Key_Left : Qt::Key_Right)) {
if (_selected >= 0 && _menus.at(_selected)) { if (_selected >= 0 && _menus.at(_selected)) {
itemPressed(PressSourceKeyboard); itemPressed(PressSourceKeyboard);
return;
} else if (_selected < 0 && _parent && !_actions.isEmpty()) { } else if (_selected < 0 && _parent && !_actions.isEmpty()) {
_mouseSelection = false; _mouseSelection = false;
setSelected(0); setSelected(0);
@ -368,13 +380,14 @@ void PopupMenu::mouseMoveEvent(QMouseEvent *e) {
void PopupMenu::mousePressEvent(QMouseEvent *e) { void PopupMenu::mousePressEvent(QMouseEvent *e) {
mouseMoveEvent(e); mouseMoveEvent(e);
itemPressed(PressSourceMouse); if (_inner.contains(mapFromGlobal(e->globalPos()))) {
if (!_inner.contains(mapFromGlobal(e->globalPos()))) { itemPressed(PressSourceMouse);
if (_parent) { return;
_parent->mousePressEvent(e); }
} else { if (_parent) {
hideMenu(); _parent->mousePressEvent(e);
} } else {
hideMenu();
} }
} }
@ -384,7 +397,11 @@ void PopupMenu::focusOutEvent(QFocusEvent *e) {
void PopupMenu::hideEvent(QHideEvent *e) { void PopupMenu::hideEvent(QHideEvent *e) {
if (_deleteOnHide) { if (_deleteOnHide) {
deleteLater(); if (_triggering) {
_deleteLater = true;
} else {
deleteLater();
}
} }
} }

View File

@ -102,6 +102,6 @@ private:
anim::fvalue a_opacity; anim::fvalue a_opacity;
Animation _a_hide; Animation _a_hide;
bool _deleteOnHide; bool _deleteOnHide, _triggering, _deleteLater;
}; };