mirror of https://github.com/procxx/kepka.git
crash in PopupMenu fixed
This commit is contained in:
parent
9a83c26731
commit
5110ebb18e
|
@ -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,15 +380,16 @@ void PopupMenu::mouseMoveEvent(QMouseEvent *e) {
|
||||||
|
|
||||||
void PopupMenu::mousePressEvent(QMouseEvent *e) {
|
void PopupMenu::mousePressEvent(QMouseEvent *e) {
|
||||||
mouseMoveEvent(e);
|
mouseMoveEvent(e);
|
||||||
|
if (_inner.contains(mapFromGlobal(e->globalPos()))) {
|
||||||
itemPressed(PressSourceMouse);
|
itemPressed(PressSourceMouse);
|
||||||
if (!_inner.contains(mapFromGlobal(e->globalPos()))) {
|
return;
|
||||||
|
}
|
||||||
if (_parent) {
|
if (_parent) {
|
||||||
_parent->mousePressEvent(e);
|
_parent->mousePressEvent(e);
|
||||||
} else {
|
} else {
|
||||||
hideMenu();
|
hideMenu();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void PopupMenu::focusOutEvent(QFocusEvent *e) {
|
void PopupMenu::focusOutEvent(QFocusEvent *e) {
|
||||||
hideMenu();
|
hideMenu();
|
||||||
|
@ -384,9 +397,13 @@ void PopupMenu::focusOutEvent(QFocusEvent *e) {
|
||||||
|
|
||||||
void PopupMenu::hideEvent(QHideEvent *e) {
|
void PopupMenu::hideEvent(QHideEvent *e) {
|
||||||
if (_deleteOnHide) {
|
if (_deleteOnHide) {
|
||||||
|
if (_triggering) {
|
||||||
|
_deleteLater = true;
|
||||||
|
} else {
|
||||||
deleteLater();
|
deleteLater();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void PopupMenu::hideMenu(bool fast) {
|
void PopupMenu::hideMenu(bool fast) {
|
||||||
if (isHidden()) return;
|
if (isHidden()) return;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue