work around mouse plugins that return a single menu.

svn path=/trunk/KDE/kdelibs/; revision=1203343
This commit is contained in:
Aaron J. Seigo 2010-12-03 17:03:18 +00:00
parent 197a679f63
commit 3366e28e72

View File

@ -630,28 +630,35 @@ void Containment::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
d->addContainmentActions(desktopMenu, event); d->addContainmentActions(desktopMenu, event);
} }
if (!desktopMenu.isEmpty()) {
//kDebug() << "executing at" << screenPos; //kDebug() << "executing at" << screenPos;
QMenu *menu = &desktopMenu;
//kDebug() << "showing menu, actions" << desktopMenu.actions().size() << desktopMenu.actions().first()->menu();
if (desktopMenu.actions().size() == 1 && desktopMenu.actions().first()->menu()) {
// we have a menu with a single top level menu; just show that top level menu instad.
menu = desktopMenu.actions().first()->menu();
}
if (!menu->isEmpty()) {
QPoint pos = event->screenPos(); QPoint pos = event->screenPos();
if (applet && d->isPanelContainment()) { if (applet && d->isPanelContainment()) {
desktopMenu.adjustSize(); menu->adjustSize();
pos = applet->popupPosition(desktopMenu.size()); pos = applet->popupPosition(menu->size());
if (event->reason() == QGraphicsSceneContextMenuEvent::Mouse) { if (event->reason() == QGraphicsSceneContextMenuEvent::Mouse) {
// if the menu pops up way away from the mouse press, then move it // if the menu pops up way away from the mouse press, then move it
// to the mouse press // to the mouse press
if (d->formFactor == Vertical) { if (d->formFactor == Vertical) {
if (pos.y() + desktopMenu.height() < event->screenPos().y()) { if (pos.y() + menu->height() < event->screenPos().y()) {
pos.setY(event->screenPos().y()); pos.setY(event->screenPos().y());
} }
} else if (d->formFactor == Horizontal) { } else if (d->formFactor == Horizontal) {
if (pos.x() + desktopMenu.width() < event->screenPos().x()) { if (pos.x() + menu->width() < event->screenPos().x()) {
pos.setX(event->screenPos().x()); pos.setX(event->screenPos().x());
} }
} }
} }
} }
desktopMenu.exec(pos); menu->exec(pos);
event->accept(); event->accept();
} else { } else {
Applet::contextMenuEvent(event); Applet::contextMenuEvent(event);