File indexing completed on 2024-04-21 03:55:25

0001 /*
0002     SPDX-FileCopyrightText: 2009 Rahman Duran <rahman.duran@gmail.com>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005 */
0006 
0007 #include "kurlnavigatormenu_p.h"
0008 
0009 #include <QApplication>
0010 #include <QKeyEvent>
0011 #include <QMimeData>
0012 
0013 namespace KDEPrivate
0014 {
0015 KUrlNavigatorMenu::KUrlNavigatorMenu(QWidget *parent)
0016     : QMenu(parent)
0017     , m_initialMousePosition(QCursor::pos())
0018     , m_mouseMoved(false)
0019 {
0020     setAcceptDrops(true);
0021     setMouseTracking(true);
0022 }
0023 
0024 KUrlNavigatorMenu::~KUrlNavigatorMenu()
0025 {
0026 }
0027 
0028 void KUrlNavigatorMenu::dragEnterEvent(QDragEnterEvent *event)
0029 {
0030     if (event->mimeData()->hasUrls()) {
0031         event->acceptProposedAction();
0032     }
0033 }
0034 
0035 void KUrlNavigatorMenu::dragMoveEvent(QDragMoveEvent *event)
0036 {
0037     const QPointF eventPosition = event->position();
0038     const QPointF globalEventPosition = mapToGlobal(eventPosition);
0039     QMouseEvent mouseEvent(QMouseEvent(QEvent::MouseMove, eventPosition, globalEventPosition, Qt::LeftButton, event->buttons(), event->modifiers()));
0040     mouseMoveEvent(&mouseEvent);
0041 }
0042 
0043 void KUrlNavigatorMenu::dropEvent(QDropEvent *event)
0044 {
0045     QAction *action = actionAt(event->position().toPoint());
0046     if (action != nullptr) {
0047         Q_EMIT urlsDropped(action, event);
0048     }
0049 }
0050 
0051 void KUrlNavigatorMenu::mouseMoveEvent(QMouseEvent *event)
0052 {
0053     if (!m_mouseMoved) {
0054         QPoint moveDistance = mapToGlobal(event->pos()) - m_initialMousePosition;
0055         m_mouseMoved = (moveDistance.manhattanLength() >= QApplication::startDragDistance());
0056     }
0057     // Don't pass the event to the base class until we consider
0058     // that the mouse has moved. This prevents menu items from
0059     // being highlighted too early.
0060     if (m_mouseMoved) {
0061         QMenu::mouseMoveEvent(event);
0062     }
0063 }
0064 
0065 void KUrlNavigatorMenu::mouseReleaseEvent(QMouseEvent *event)
0066 {
0067     Qt::MouseButton btn = event->button();
0068     // Since menu is opened on mouse press, we may receive
0069     // the corresponding mouse release event. Let's ignore
0070     // it unless mouse was moved.
0071     if (m_mouseMoved || (btn != Qt::LeftButton)) {
0072         QAction *action = actionAt(event->pos());
0073         if (action != nullptr) {
0074             Q_EMIT mouseButtonClicked(action, btn);
0075 
0076             // Prevent QMenu default activation, in case
0077             // triggered signal is used
0078             setActiveAction(nullptr);
0079         }
0080         QMenu::mouseReleaseEvent(event);
0081     }
0082     m_mouseMoved = true;
0083 }
0084 
0085 } // namespace KDEPrivate
0086 
0087 #include "moc_kurlnavigatormenu_p.cpp"