void MenuBar::dropEvent(QDropEvent *event) { const MimeDataObject *mimeData = qobject_cast<const MimeDataObject *>(event->mimeData()); QAction *aAction = qobject_cast<QAction *>(mimeData->object()); if (aAction && isEdited()) { if (activeAction()) if (activeAction()->menu()) activeAction()->menu()->close(); if (aAction->menu()) if (aAction->objectName() == "actionNewMenu") { Menu *menu = new Menu(aAction->text()); menu->setEdited(true); aAction = menu->menuAction(); } QAction *eAction = this->actionAt(event->pos()); QRect rect = actionGeometry(eAction); eAction = this->actionAt(QPoint(event->pos().x()+rect.width()/2, event->pos().y())); if (eAction) { if (aAction->isSeparator()) insertSeparator(eAction); else insertAction(eAction,aAction); } else { if (aAction->isSeparator()) addSeparator(); else addAction(aAction); } event->acceptProposedAction(); } }
// Determine the geometry of the indicator by retrieving // the action under mouse and positioning the bar within its geometry. QRect ActionProviderBase::indicatorGeometry(const QPoint &pos, Qt::LayoutDirection layoutDirection) const { QAction *action = actionAt(pos); if (!action) return QRect(); QRect rc = actionGeometry(action); return orientation() == Qt::Horizontal ? horizontalIndicatorRect(rc, layoutDirection) : verticalIndicatorRect(rc); }
void PopupMenu::contextMenuEvent(QContextMenuEvent* e) { if(_contextMenu) { if(e->reason() == QContextMenuEvent::Mouse) showContextMenu(e->pos()); else if(activeAction()) showContextMenu(actionGeometry(activeAction()).center()); e->accept(); return; } QMenu::contextMenuEvent(e); }
void PopupMenu::popHovered(QAction* action) { DEBUG_PRST_ROUTES(stderr, "PopupMenu::popHovered action text:%s\n", action->text().toLatin1().constData()); _lastHoveredAction = action; hideContextMenu(); #ifndef POPUP_MENU_DISABLE_AUTO_SCROLL if(action && !MusEGlobal::config.scrollableSubMenus) { int dw = QApplication::desktop()->width(); // We want the whole thing if multiple monitors. QRect r = actionGeometry(action); if(x() + r.x() < 0) move(-r.x(), y()); else if(r.x() + r.width() + x() > dw) move(dw - r.x() - r.width(), y()); } #endif // POPUP_MENU_DISABLE_AUTO_SCROLL }