From ce4a32fe52ef09d8f5ff1dd22c001110902b60a2 Mon Sep 17 00:00:00 2001 From: toma Date: Wed, 25 Nov 2009 17:56:58 +0000 Subject: Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features. BUG:215923 git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdelibs@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da --- kdeui/kcmenumngr.cpp | 129 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 kdeui/kcmenumngr.cpp (limited to 'kdeui/kcmenumngr.cpp') diff --git a/kdeui/kcmenumngr.cpp b/kdeui/kcmenumngr.cpp new file mode 100644 index 000000000..6255a764d --- /dev/null +++ b/kdeui/kcmenumngr.cpp @@ -0,0 +1,129 @@ +/* + * This file is part of the KDE Libraries + * Copyright (C) 1999 Matthias Ettrich + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + */ +#include +#include +#include "kcmenumngr.h" +#include "kglobal.h" +#include "kconfig.h" +#include "kshortcut.h" + +#undef KeyPress +#undef None + +template class QPtrDict; + +KContextMenuManager* KContextMenuManager::manager = 0; + +KContextMenuManager::KContextMenuManager( QObject* parent, const char* name ) + : QObject( parent, name) +{ + KConfigGroupSaver saver ( KGlobal::config(), QString::fromLatin1("Shortcuts") ) ; + menuKey = KShortcut( saver.config()->readEntry(QString::fromLatin1("PopupContextMenu"), QString::fromLatin1("Menu") ) ).keyCodeQt(); + saver.config()->setGroup( QString::fromLatin1("ContextMenus") ) ; + showOnPress = saver.config()->readBoolEntry(QString::fromLatin1("ShowOnPress"), true ); +} + +KContextMenuManager::~KContextMenuManager() +{ +} + + +bool KContextMenuManager::showOnButtonPress( void ) +{ + if ( !manager ) + manager = new KContextMenuManager; + return manager->showOnPress; +} + + +void KContextMenuManager::insert( QWidget* widget, QPopupMenu* popup ) +{ + if ( !manager ) + manager = new KContextMenuManager; + + manager->connect( widget, SIGNAL( destroyed() ), manager, SLOT( widgetDestroyed() ) ); + manager->menus.insert( widget, popup ); + widget->installEventFilter( manager ); +} + +bool KContextMenuManager::eventFilter( QObject *o, QEvent * e) +{ + QPopupMenu* popup = 0; + QPoint pos; + switch ( e->type() ) { + case QEvent::MouseButtonPress: + if (((QMouseEvent*) e )->button() != RightButton ) + break; + if ( !showOnPress ) + return true; // eat event for safety + popup = menus[o]; + pos = ((QMouseEvent*) e )->globalPos(); + break; + case QEvent::MouseButtonRelease: + if ( showOnPress || ((QMouseEvent*) e )->button() != RightButton ) + break; + popup = menus[o]; + pos = ((QMouseEvent*) e )->globalPos(); + break; + case QEvent::KeyPress: + { + if ( !o->isWidgetType() ) + break; + QKeyEvent *k = (QKeyEvent *)e; + int key = k->key(); + if ( k->state() & ShiftButton ) + key |= SHIFT; + if ( k->state() & ControlButton ) + key |= CTRL; + if ( k->state() & AltButton ) + key |= ALT; + if ( key != menuKey ) + break; + popup = menus[o]; + if ( popup ) { + QWidget* w = (QWidget*) o ; + + // ### workaround + pos = w->mapToGlobal( w->rect().center() ); + // with later Qt snapshot + // pos = w->mapToGlobal( w->microFocusHint().center() ); + } + } + break; + default: + break; + } + + if ( popup ) { + popup->popup( pos ); + return true; + } + + return false; +} + +void KContextMenuManager::widgetDestroyed() +{ + if ( menus.find( (QObject*)sender() ) ) + menus.remove( (QObject*)sender() ); +} + +#include "kcmenumngr.moc" -- cgit v1.2.1