22 #include <QtGui/QCursor>
23 #include <QtGui/QPainter>
24 #include <QtCore/QTimer>
25 #include <QtGui/QFontMetrics>
34 class K3PopupMenu::K3PopupMenuPrivate
50 ~K3PopupMenuPrivate ()
69 Qt::ButtonState
state;
76 static bool s_continueCtxMenuShow;
77 static QPointer<QAction> s_highlightedAction;
79 static int s_highlightedItem;
83 QPointer<QAction> K3PopupMenu::K3PopupMenuPrivate::s_highlightedAction(0L);
84 int K3PopupMenu::K3PopupMenuPrivate::s_highlightedItem(-1);
85 K3PopupMenu* K3PopupMenu::K3PopupMenuPrivate::s_contextedMenu(0);
86 bool K3PopupMenu::K3PopupMenuPrivate::s_continueCtxMenuShow(
true);
90 , d(new K3PopupMenuPrivate())
98 if (K3PopupMenuPrivate::s_contextedMenu ==
this)
100 K3PopupMenuPrivate::s_contextedMenu = 0;
101 K3PopupMenuPrivate::s_highlightedAction = 0L;
102 K3PopupMenuPrivate::s_highlightedItem = -1;
111 action->setEnabled(
false);
112 QFont f = action->font();
115 insertAction(before, action);
122 action->setEnabled(
false);
123 QFont f = action->font();
126 insertAction(before, action);
143 d->state = Qt::NoButton;
145 d->mouseButtons = Qt::NoButton;
146 d->keyboardModifiers = Qt::NoModifier;
159 return d->mouseButtons;
164 return d->keyboardModifiers;
170 d->state = Qt::NoButton;
172 d->mouseButtons = Qt::NoButton;
173 d->keyboardModifiers = Qt::NoModifier;
178 d->state = e->state();
180 d->keyboardModifiers = e->modifiers();
186 bool firstpass =
true;
191 if (key == Qt::Key_Escape || key == Qt::Key_Return || key == Qt::Key_Enter
192 || key == Qt::Key_Up || key == Qt::Key_Down || key == Qt::Key_Left
193 || key == Qt::Key_Right || key == Qt::Key_F1) {
199 d->state = e->state();
201 d->keyboardModifiers = e->modifiers();
204 }
else if ( key == Qt::Key_Shift || key == Qt::Key_Control || key == Qt::Key_Alt || key == Qt::Key_Meta )
209 if (!d->keySeq.isNull()) {
210 if (key == Qt::Key_Backspace) {
212 if (d->keySeq.length() == 1) {
218 keyString = d->keySeq.left(d->keySeq.length() - 1);
223 }
else if (key == Qt::Key_Delete) {
230 }
else if (d->noMatches) {
240 a = d->lastHitAction;
243 }
else if (key == Qt::Key_Backspace && menuAction()) {
250 d->keySeq += keyString;
251 int seqLen = d->keySeq.length();
253 foreach (a, actions()) {
262 if (a == d->lastHitAction)
263 thisText = d->originalText;
265 thisText = a->text();
271 thisText = thisText.left(seqLen);
274 if (!thisText.contains(d->keySeq, Qt::CaseInsensitive)) {
281 if (d->lastHitAction != a)
283 d->lastHitAction->setText(d->originalText);
286 if (d->lastHitAction != a || d->lastHitAction == 0L)
287 d->originalText = a->text();
290 a->setText(
underlineText(d->originalText, d->keySeq.length()));
293 d->lastHitAction = a;
296 d->clearTimer.start(5000,
true);
312 d->lastHitAction->activate(QAction::Trigger);
315 }
else if (d->lastHitAction && d->lastHitAction->menu()) {
317 d->lastHitAction->activate(QAction::Trigger);
339 for (uint i = 0; i < length; i++) {
341 ret.insert(2*i,
"&");
349 if (d->lastHitAction) {
350 d->lastHitAction->setText(d->originalText);
351 d->lastHitAction = 0L;
358 d->noMatches = noMatches;
363 d->shortcuts = enable;
368 d->autoExec = enable;
380 if (d->m_ctxMenu && d->m_ctxMenu->isVisible())
383 d->m_ctxMenu->hide();
393 d->state = Qt::ButtonState(uint(e->button()) | (e->state() & Qt::KeyboardModifierMask));
396 d->keyboardModifiers = e->modifiers();
397 d->mouseButtons = e->buttons();
399 if ( !d->m_ctxMenu || !d->m_ctxMenu->isVisible() )
400 Q3PopupMenu::mouseReleaseEvent(e);
408 connect(d->m_ctxMenu, SIGNAL(aboutToHide()),
this, SLOT(
ctxMenuHiding()));
421 K3PopupMenuPrivate::s_continueCtxMenuShow =
false;
426 return K3PopupMenuPrivate::s_highlightedAction;
431 return K3PopupMenuPrivate::s_contextedMenu;
436 if (!d->m_ctxMenu || !d->m_ctxMenu->isVisible())
441 d->m_ctxMenu->hide();
447 if (K3PopupMenuPrivate::s_highlightedAction)
448 if (
QMenu* subMenu = K3PopupMenuPrivate::s_highlightedAction->menu())
451 K3PopupMenuPrivate::s_highlightedAction = activeAction();
452 K3PopupMenuPrivate::s_highlightedItem = itemAtPos(pos);
454 if (!K3PopupMenuPrivate::s_highlightedAction)
456 K3PopupMenuPrivate::s_contextedMenu = 0;
463 if (
QMenu* subMenu = K3PopupMenuPrivate::s_highlightedAction->menu())
466 QTimer::singleShot(100, subMenu, SLOT(hide()));
469 if (!K3PopupMenuPrivate::s_continueCtxMenuShow)
471 K3PopupMenuPrivate::s_continueCtxMenuShow =
true;
475 K3PopupMenuPrivate::s_contextedMenu =
this;
476 d->m_ctxMenu->exec(this->mapToGlobal(pos));
486 if (K3PopupMenuPrivate::s_highlightedAction)
487 if (
QMenu* subMenu = K3PopupMenuPrivate::s_highlightedAction->menu())
488 QTimer::singleShot(0, subMenu, SLOT(hide()));
493 if (K3PopupMenuPrivate::s_highlightedAction)
494 if (
QMenu* subMenu = K3PopupMenuPrivate::s_highlightedAction->menu())
498 K3PopupMenuPrivate::s_continueCtxMenuShow =
true;
505 if (e->reason() == QContextMenuEvent::Mouse)
509 else if (activeAction())
511 showCtxMenu(actionGeometry(activeAction()).center());
523 if (d->m_ctxMenu && d->m_ctxMenu->isVisible())
533 bool blocked = blockSignals(
true);
534 d->m_ctxMenu->hide();
535 blockSignals(blocked);
549 , d(new K3PopupMenuPrivate())
559 int newid = insertItem(text,
id, index);
560 QMenuItem* menuItem = findItem(newid);
562 menuItem->setEnabled(
false);
563 QFont f = menuItem->font();
565 menuItem->setFont(f);
571 int newid = insertItem(text,
id, index);
572 QMenuItem* menuItem = findItem(newid);
574 menuItem->setEnabled(
false);
575 menuItem->setIcon(icon);
576 QFont f = menuItem->font();
578 menuItem->setFont(f);
584 QMenuItem* menuItem = findItem(
id);
588 menuItem->setText(text);
589 menuItem->setIcon(QIcon());
595 QMenuItem* menuItem = findItem(
id);
599 menuItem->setText(text);
600 menuItem->setIcon(icon);
606 QMenuItem* menuItem = findItem(
id);
610 return menuItem->text();
615 QMenuItem* menuItem = findItem(
id);
619 return menuItem->icon().pixmap();
629 return K3PopupMenuPrivate::s_highlightedItem;
632 #endif // END compat methods
634 #include "k3popupmenu.moc"