[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdelibs/kdeui/widgets
From:       Rafael Fernández López <ereslibre () kde ! org>
Date:       2008-04-30 22:50:10
Message-ID: 1209595810.498359.19213.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 802873 by ereslibre:

Prevent the title of the KMenu from being clicked, since it is a QToolButton really. \
We install an event filter for this purpose that will discard every event except \
Paint, and keyboard events (what  does accept keyboard navigation on the menu itself)


 M  +52 -18    kmenu.cpp  


--- trunk/KDE/kdelibs/kdeui/widgets/kmenu.cpp #802872:802873
@@ -21,6 +21,7 @@
 #include "kmenu.h"
 #include "khbox.h"
 
+#include <QtCore/QObject>
 #include <QtCore/QPointer>
 #include <QtCore/QTimer>
 #include <QtGui/QApplication>
@@ -40,25 +41,9 @@
 class KMenu::KMenuPrivate
 {
 public:
-    KMenuPrivate (KMenu *_parent)
-        : parent(_parent)
-        , noMatches(false)
-        , shortcuts(false)
-        , autoExec(false)
-        , lastHitAction(0L)
-        , mouseButtons(Qt::NoButton)
-        , keyboardModifiers(Qt::NoModifier)
-        , ctxMenu(0)
-        , highlightedAction(0)
-    {
-        resetKeyboardVars();
-    }
+    KMenuPrivate (KMenu *_parent);
+    ~KMenuPrivate ();
 
-    ~KMenuPrivate ()
-    {
-        delete ctxMenu;
-    }
-
     void resetKeyboardVars(bool noMatches = false);
     void actionHovered(QAction* action);
     void showCtxMenu(const QPoint &pos);
@@ -82,9 +67,57 @@
     // support for RMB menus on menus
     QMenu* ctxMenu;
     QPointer<QAction> highlightedAction;
+
+    class EventSniffer;
+    EventSniffer *eventSniffer;
 };
 
+class KMenu::KMenuPrivate::EventSniffer
+    : public QObject
+{
+public:
+    EventSniffer(QObject *parent = 0)
+        : QObject(parent) { }
 
+    ~EventSniffer() { }
+
+    bool eventFilter(QObject *object, QEvent *event)
+    {
+        Q_UNUSED(object);
+
+        if (event->type() == QEvent::Paint ||
+            event->type() == QEvent::KeyPress ||
+            event->type() == QEvent::KeyRelease) {
+            return false;
+        }
+
+        event->accept();
+        return true;
+    }
+};
+
+KMenu::KMenuPrivate::KMenuPrivate (KMenu *_parent)
+    : parent(_parent)
+    , noMatches(false)
+    , shortcuts(false)
+    , autoExec(false)
+    , lastHitAction(0L)
+    , mouseButtons(Qt::NoButton)
+    , keyboardModifiers(Qt::NoModifier)
+    , ctxMenu(0)
+    , highlightedAction(0)
+    , eventSniffer(new EventSniffer)
+{
+    resetKeyboardVars();
+}
+
+KMenu::KMenuPrivate::~KMenuPrivate ()
+{
+    delete ctxMenu;
+    delete eventSniffer;
+}
+
+
 /**
  * custom variant type for QAction::data of kmenu context menus
  * @author Joseph Wenninger <jowenn@kde.org>
@@ -143,6 +176,7 @@
 
     QWidgetAction *action = new QWidgetAction(this);
     QToolButton *titleButton = new QToolButton(this);
+    titleButton->installEventFilter(d->eventSniffer);
     titleButton->setDefaultAction(buttonAction);
     titleButton->setDown(true); // prevent hover style changes in some styles
     titleButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic