diff options
Diffstat (limited to 'src/gui')
-rw-r--r-- | src/gui/itemviews/qabstractitemview.cpp | 13 | ||||
-rw-r--r-- | src/gui/itemviews/qabstractitemview_p.h | 4 | ||||
-rw-r--r-- | src/gui/kernel/kernel.pri | 6 | ||||
-rw-r--r-- | src/gui/kernel/qaction.cpp | 2 | ||||
-rw-r--r-- | src/gui/kernel/qaction.h | 9 | ||||
-rw-r--r-- | src/gui/kernel/qapplication_s60.cpp | 14 | ||||
-rw-r--r-- | src/gui/kernel/qsoftkeymanager.cpp | 260 | ||||
-rw-r--r-- | src/gui/kernel/qsoftkeymanager_p.h (renamed from src/gui/widgets/qactiontokeyeventmapper_p.h) | 34 | ||||
-rw-r--r-- | src/gui/kernel/qwidget.cpp | 80 | ||||
-rw-r--r-- | src/gui/kernel/qwidget.h | 3 | ||||
-rw-r--r-- | src/gui/kernel/qwidget_p.h | 5 | ||||
-rw-r--r-- | src/gui/kernel/qwidget_s60.cpp | 72 | ||||
-rw-r--r-- | src/gui/widgets/qactiontokeyeventmapper.cpp | 103 | ||||
-rw-r--r-- | src/gui/widgets/qcombobox.cpp | 22 | ||||
-rw-r--r-- | src/gui/widgets/qcombobox_p.h | 6 | ||||
-rw-r--r-- | src/gui/widgets/qmainwindow.cpp | 34 | ||||
-rw-r--r-- | src/gui/widgets/qmenu.cpp | 15 | ||||
-rw-r--r-- | src/gui/widgets/qmenu_p.h | 11 | ||||
-rw-r--r-- | src/gui/widgets/qmenubar.cpp | 22 | ||||
-rw-r--r-- | src/gui/widgets/widgets.pri | 6 |
20 files changed, 387 insertions, 334 deletions
diff --git a/src/gui/itemviews/qabstractitemview.cpp b/src/gui/itemviews/qabstractitemview.cpp index 5c68928..8eb5425 100644 --- a/src/gui/itemviews/qabstractitemview.cpp +++ b/src/gui/itemviews/qabstractitemview.cpp @@ -61,7 +61,7 @@ #ifndef QT_NO_ACCESSIBILITY #include <qaccessible.h> #endif -#include <private/qactiontokeyeventmapper_p.h> +#include <private/qsoftkeymanager_p.h> QT_BEGIN_NAMESPACE @@ -88,6 +88,9 @@ QAbstractItemViewPrivate::QAbstractItemViewPrivate() overwrite(false), dropIndicatorPosition(QAbstractItemView::OnItem), #endif +#ifdef QT_KEYPAD_NAVIGATION + doneSoftKey(0), +#endif autoScroll(true), autoScrollMargin(16), autoScrollCount(0), @@ -128,6 +131,10 @@ void QAbstractItemViewPrivate::init() doDelayedItemsLayout(); q->setAttribute(Qt::WA_InputMethodEnabled); + +#ifdef QT_KEYPAD_NAVIGATION + doneSoftKey = QSoftKeyManager::createKeyedAction(QAction::EndEditSoftKey, Qt::Key_Back, q); +#endif } void QAbstractItemViewPrivate::checkMouseMove(const QPersistentModelIndex &index) @@ -2064,14 +2071,14 @@ void QAbstractItemView::keyPressEvent(QKeyEvent *event) if (QApplication::keypadNavigationEnabled()) { if (!hasEditFocus()) { setEditFocus(true); - QActionToKeyEventMapper::addSoftKey(QAction::BackSoftKey, Qt::Key_Back, this); + addAction(d->doneSoftKey); return; } } break; case Qt::Key_Back: if (QApplication::keypadNavigationEnabled() && hasEditFocus()) { - QActionToKeyEventMapper::removeSoftkey(this); + removeAction(d->doneSoftKey); setEditFocus(false); } else { event->ignore(); diff --git a/src/gui/itemviews/qabstractitemview_p.h b/src/gui/itemviews/qabstractitemview_p.h index 6b1ec8e..0bd272d 100644 --- a/src/gui/itemviews/qabstractitemview_p.h +++ b/src/gui/itemviews/qabstractitemview_p.h @@ -379,6 +379,10 @@ public: QAbstractItemView::DropIndicatorPosition dropIndicatorPosition; #endif +#ifdef QT_KEYPAD_NAVIGATION + QAction *doneSoftKey; +#endif + QString keyboardInput; QTime keyboardInputTime; diff --git a/src/gui/kernel/kernel.pri b/src/gui/kernel/kernel.pri index 8489817..7cde384 100644 --- a/src/gui/kernel/kernel.pri +++ b/src/gui/kernel/kernel.pri @@ -46,7 +46,8 @@ HEADERS += \ kernel/qgesture.h \ kernel/qgesture_p.h \ kernel/qstandardgestures.h \ - kernel/qstandardgestures_p.h + kernel/qstandardgestures_p.h \ + kernel/qsoftkeymanager_p.h SOURCES += \ kernel/qaction.cpp \ @@ -77,7 +78,8 @@ SOURCES += \ kernel/qwidgetaction.cpp \ kernel/qkeymapper.cpp \ kernel/qgesture.cpp \ - kernel/qstandardgestures.cpp + kernel/qstandardgestures.cpp \ + kernel/qsoftkeymanager.cpp win32 { DEFINES += QT_NO_DIRECTDRAW diff --git a/src/gui/kernel/qaction.cpp b/src/gui/kernel/qaction.cpp index c641281..549d07c 100644 --- a/src/gui/kernel/qaction.cpp +++ b/src/gui/kernel/qaction.cpp @@ -81,7 +81,7 @@ static QString qt_strippedText(QString s) QActionPrivate::QActionPrivate() : group(0), enabled(1), forceDisabled(0), visible(1), forceInvisible(0), checkable(0), checked(0), separator(0), fontSet(false), - menuRole(QAction::TextHeuristicRole), softKeyRole(QAction::OptionsSoftKey), + menuRole(QAction::TextHeuristicRole), softKeyRole(QAction::NoSoftKey), priority(QAction::NormalPriority), iconVisibleInMenu(-1) { #ifdef QT3_SUPPORT diff --git a/src/gui/kernel/qaction.h b/src/gui/kernel/qaction.h index 59c1765..df56d2c 100644 --- a/src/gui/kernel/qaction.h +++ b/src/gui/kernel/qaction.h @@ -93,10 +93,11 @@ class Q_GUI_EXPORT QAction : public QObject public: enum MenuRole { NoRole, TextHeuristicRole, ApplicationSpecificRole, AboutQtRole, AboutRole, PreferencesRole, QuitRole }; - enum SoftKeyRole { OptionsSoftKey, SelectSoftKey, BackSoftKey, NextSoftKey, PreviousSoftKey, - OkSoftKey, CancelSoftKey, EditSoftKey, ViewSoftKey, BackSpaceSoftKey, - EndEditSoftKey, RevertEditSoftKey, DeselectSoftKey, FinishSoftKey, - MenuSoftKey, ContextMenuSoftKey, ExitSoftKey }; + enum SoftKeyRole { + NoSoftKey, OptionsSoftKey, SelectSoftKey, BackSoftKey, NextSoftKey, + PreviousSoftKey, OkSoftKey, CancelSoftKey, EditSoftKey, ViewSoftKey, + BackSpaceSoftKey, EndEditSoftKey, RevertEditSoftKey, DeselectSoftKey, + FinishSoftKey, MenuSoftKey, ContextMenuSoftKey, ExitSoftKey }; enum Priority { LowPriority = 0, NormalPriority = 128, HighPriority = 256}; diff --git a/src/gui/kernel/qapplication_s60.cpp b/src/gui/kernel/qapplication_s60.cpp index 6a381f5..a5d07fd 100644 --- a/src/gui/kernel/qapplication_s60.cpp +++ b/src/gui/kernel/qapplication_s60.cpp @@ -59,6 +59,7 @@ #include "private/qwindowsurface_s60_p.h" #include "qpaintengine.h" #include "private/qmenubar_p.h" +#include "private/qsoftkeymanager_p.h" #include "apgwgnam.h" // For CApaWindowGroupName #include <MdaAudioTonePlayer.h> // For CMdaAudioToneUtility @@ -1348,17 +1349,12 @@ void QApplication::symbianHandleCommand(int command) exit(); break; default: - if (command >= SOFTKEYSTART && command <= SOFTKEYEND) { - int index= command-SOFTKEYSTART; - QWidget *focused = QApplication::focusWidget(); - QWidget *softKeySource = focused ? focused : QApplication::activeWindow(); - const QList<QAction*>& softKeys = softKeySource->softKeys(); - Q_ASSERT(index < softKeys.count()); - softKeys.at(index)->activate(QAction::Trigger); - } + bool handled = QSoftKeyManager::handleCommand(command); #ifdef Q_WS_S60 - else + if (!handled) QMenuBarPrivate::symbianCommands(command); +#else + Q_UNUSED(handled); #endif break; } diff --git a/src/gui/kernel/qsoftkeymanager.cpp b/src/gui/kernel/qsoftkeymanager.cpp new file mode 100644 index 0000000..b1ebd38 --- /dev/null +++ b/src/gui/kernel/qsoftkeymanager.cpp @@ -0,0 +1,260 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qapplication.h" +#include "qevent.h" +#ifdef Q_WS_S60 +#include "private/qt_s60_p.h" +#endif +#include "private/qsoftkeymanager_p.h" + +QT_BEGIN_NAMESPACE + +#ifdef Q_WS_S60 +static const int s60CommandStart = 6000; +#endif + +QWidget *QSoftKeyManager::softKeySource = 0; +QSoftKeyManager *QSoftKeyManager::self = 0; + +const char *QSoftKeyManager::standardSoftKeyText(QAction::SoftKeyRole role) +{ + const char *softKeyText = 0; + switch (role) { + case QAction::OptionsSoftKey: + softKeyText = QT_TRANSLATE_NOOP("QSoftKeyManager", "Options"); + break; + case QAction::SelectSoftKey: + softKeyText = QT_TRANSLATE_NOOP("QSoftKeyManager", "Select"); + break; + case QAction::BackSoftKey: + softKeyText = QT_TRANSLATE_NOOP("QSoftKeyManager", "Back"); + break; + case QAction::NextSoftKey: + softKeyText = QT_TRANSLATE_NOOP("QSoftKeyManager", "Next"); + break; + case QAction::PreviousSoftKey: + softKeyText = QT_TRANSLATE_NOOP("QSoftKeyManager", "Previous"); + break; + case QAction::OkSoftKey: + softKeyText = QT_TRANSLATE_NOOP("QSoftKeyManager", "Ok"); + break; + case QAction::CancelSoftKey: + softKeyText = QT_TRANSLATE_NOOP("QSoftKeyManager", "Cancel"); + break; + case QAction::EditSoftKey: + softKeyText = QT_TRANSLATE_NOOP("QSoftKeyManager", "Edit"); + break; + case QAction::ViewSoftKey: + softKeyText = QT_TRANSLATE_NOOP("QSoftKeyManager", "View"); + break; + default: + ; + }; + + return softKeyText; +} + +QSoftKeyManager *QSoftKeyManager::instance() +{ + if (!QSoftKeyManager::self) + QSoftKeyManager::self = new QSoftKeyManager; + + return self; +} + +QSoftKeyManager::QSoftKeyManager() : QObject() +{ +} + +QAction *QSoftKeyManager::createAction(QAction::SoftKeyRole softKeyRole, QWidget *actionWidget) +{ + const char* text = standardSoftKeyText(softKeyRole); + QAction *action = new QAction(QSoftKeyManager::tr(text), actionWidget); + action->setSoftKeyRole(softKeyRole); + return action; +} + +/*! \internal + + Creates a QAction and registers the 'triggered' signal to send the given key event to + \a actionWidget as a convenience. + +*/ +QAction *QSoftKeyManager::createKeyedAction(QAction::SoftKeyRole softKeyRole, Qt::Key key, QWidget *actionWidget) +{ + QScopedPointer<QAction> action(createAction(softKeyRole, actionWidget)); + + connect(action.data(), SIGNAL(triggered()), QSoftKeyManager::instance(), SLOT(sendKeyEvent())); + + QSoftKeyManager::instance()->keyedActions.insert(action.data(), key); + return action.take(); +} + +void QSoftKeyManager::sendKeyEvent() +{ + QAction *action = qobject_cast<QAction*>(sender()); + + if (!action) + return; + + Qt::Key keyToSend = keyedActions.value(action, Qt::Key_unknown); + + if (keyToSend != Qt::Key_unknown) + QApplication::postEvent(action->parentWidget(), + new QKeyEvent(QEvent::KeyPress, keyToSend, Qt::NoModifier)); +} + +void QSoftKeyManager::updateSoftKeys(bool force) +{ + QList<QAction*> softKeys; + QWidget *source = QApplication::focusWidget(); + do { + if (source) { + QList<QAction*> actions = source->actions(); + for (int i = 0; i < actions.count(); ++i) { + if (actions.at(i)->softKeyRole() != QAction::NoSoftKey) + softKeys.append(actions.at(i)); + } + + QWidget *parent = source->parentWidget(); + if (parent && softKeys.isEmpty()) + source = parent; + else + break; + } else { + source = QApplication::activeWindow(); + } + } while (source); + + if (force || (source != QSoftKeyManager::softKeySource)) { + QSoftKeyManager::softKeySource = source; + QSoftKeyManager::updateSoftKeys_sys(softKeys); + } +} + +#ifdef Q_WS_S60 +void QSoftKeyManager::updateSoftKeys_sys(const QList<QAction*> &softkeys) +{ + + CEikButtonGroupContainer* nativeContainer = S60->buttonGroupContainer(); + QT_TRAP_THROWING(nativeContainer->SetCommandSetL(R_AVKON_SOFTKEYS_EMPTY_WITH_IDS)); + + int position = -1; + int command; + bool needsExitButton = true; + + for (int index = 0; index < softkeys.count(); index++) { + const QAction* softKeyAction = softkeys.at(index); + switch (softKeyAction->softKeyRole()) { + // Positive Actions go on LSK + case QAction::OptionsSoftKey: + case QAction::MenuSoftKey: + case QAction::ContextMenuSoftKey: + command = EAknSoftkeyOptions; //Calls DynInitMenuPane in AppUI + position = 0; + break; + case QAction::SelectSoftKey: + case QAction::PreviousSoftKey: + case QAction::OkSoftKey: + case QAction::EditSoftKey: + case QAction::ViewSoftKey: + case QAction::EndEditSoftKey: + case QAction::FinishSoftKey: + command = s60CommandStart + index; + position = 0; + break; + // Negative Actions on the RSK + case QAction::BackSoftKey: + case QAction::NextSoftKey: + case QAction::CancelSoftKey: + case QAction::BackSpaceSoftKey: + case QAction::RevertEditSoftKey: + case QAction::DeselectSoftKey: + needsExitButton = false; + command = s60CommandStart + index; + position = 2; + break; + case QAction::ExitSoftKey: + needsExitButton = false; + command = EAknSoftkeyExit; //Calls HandleCommand in AppUI + position = 2; + break; + default: + break; + } + + if (position != -1) { + TPtrC text = qt_QString2TPtrC(softKeyAction->text()); + QT_TRAP_THROWING(nativeContainer->SetCommandL(position, command, text)); + } + } + + if (needsExitButton) + QT_TRAP_THROWING(nativeContainer->SetCommandL(2, EAknSoftkeyExit, qt_QString2TPtrC(QObject::tr("Exit")))); + + nativeContainer->DrawDeferred(); // 3.1 needs an extra invitation +} + +bool QSoftKeyManager::handleCommand(int command) +{ + if (command >= s60CommandStart && QSoftKeyManager::softKeySource) { + int index = command - s60CommandStart; + const QList<QAction*>& softKeys = QSoftKeyManager::softKeySource->actions(); + if (index < softKeys.count()) { + softKeys.at(index)->activate(QAction::Trigger); + return true; + } + } + + return false; +} + +#else + +void QSoftKeyManager::updateSoftKeys_sys(const QList<QAction*> &) +{ +} + +#endif + +QT_END_NAMESPACE + diff --git a/src/gui/widgets/qactiontokeyeventmapper_p.h b/src/gui/kernel/qsoftkeymanager_p.h index 984eed9..630dd9f 100644 --- a/src/gui/widgets/qactiontokeyeventmapper_p.h +++ b/src/gui/kernel/qsoftkeymanager_p.h @@ -39,8 +39,8 @@ ** ****************************************************************************/ -#ifndef QACTIONTOKEYEVENTMAPPER_P_H -#define QACTIONTOKEYEVENTMAPPER_P_H +#ifndef QSOFTKEYMANAGER_P_H +#define QSOFTKEYMANAGER_P_H // // W A R N I N G @@ -59,17 +59,31 @@ QT_BEGIN_HEADER QT_BEGIN_NAMESPACE -class QActionToKeyEventMapper : public QObject +class QSoftKeyManager : public QObject { Q_OBJECT + public: - QActionToKeyEventMapper(QAction *softKeyAction, Qt::Key key, QObject *parent); - static QString roleText(QAction::SoftKeyRole role); - static void addSoftKey(QAction::SoftKeyRole standardRole, Qt::Key key, QWidget *actionWidget); - static void removeSoftkey(QWidget *focussedWidget); + static void updateSoftKeys(bool force = false); + static QAction *createAction(QAction::SoftKeyRole standardRole, QWidget *actionWidget); + static QAction *createKeyedAction(QAction::SoftKeyRole standardRole, Qt::Key key, QWidget *actionWidget); + +#ifdef Q_WS_S60 + static bool handleCommand(int); +#endif + private: - QAction *m_softKeyAction; - Qt::Key m_key; + QSoftKeyManager(); + static QSoftKeyManager *instance(); + static const char *standardSoftKeyText(QAction::SoftKeyRole role); + static void updateSoftKeys_sys(const QList<QAction*> &softKeys); + + static QSoftKeyManager *self; + static QWidget *softKeySource; + QHash<QAction*, Qt::Key> keyedActions; + + Q_DISABLE_COPY(QSoftKeyManager) + private Q_SLOTS: void sendKeyEvent(); }; @@ -78,4 +92,4 @@ QT_END_NAMESPACE QT_END_HEADER -#endif //QACTIONTOKEYEVENTMAPPER_P_H +#endif //QSOFTKEYMANAGER_P_H diff --git a/src/gui/kernel/qwidget.cpp b/src/gui/kernel/qwidget.cpp index 4f1ab94..461834c 100644 --- a/src/gui/kernel/qwidget.cpp +++ b/src/gui/kernel/qwidget.cpp @@ -82,6 +82,7 @@ #include "private/qstyle_p.h" #include "private/qinputcontext_p.h" #include "qfileinfo.h" +#include "private/qsoftkeymanager_p.h" #if defined (Q_WS_WIN) # include <private/qwininputcontext_p.h> @@ -4971,13 +4972,6 @@ void QWidget::render(QPainter *painter, const QPoint &targetOffset, d->extra->inRenderWithPainter = false; } -#if !defined(Q_OS_SYMBIAN) -void QWidgetPrivate::setSoftKeys_sys(const QList<QAction*> &softkeys) -{ - Q_UNUSED(softkeys) -} -#endif // !defined(Q_OS_SYMBIAN) - /*! Returns a pointer to this widget's effect if it has one; otherwise 0. @@ -7997,7 +7991,9 @@ bool QWidget::event(QEvent *event) } break; case QEvent::FocusIn: - d->setSoftKeys_sys(softKeys()); +#ifdef QT_KEYPAD_NAVIGATION + QSoftKeyManager::updateSoftKeys(); +#endif focusInEvent((QFocusEvent*)event); break; @@ -8148,8 +8144,10 @@ bool QWidget::event(QEvent *event) QApplication::sendEvent(w, event); } +#ifdef QT_KEYPAD_NAVIGATION if (isWindow() && isActiveWindow()) - d->setSoftKeys_sys(softKeys()); + QSoftKeyManager::updateSoftKeys(); +#endif break; } @@ -8258,6 +8256,9 @@ bool QWidget::event(QEvent *event) case QEvent::ActionAdded: case QEvent::ActionRemoved: case QEvent::ActionChanged: +#ifdef QT_KEYPAD_NAVIGATION + QSoftKeyManager::updateSoftKeys(true); +#endif actionEvent((QActionEvent*)event); break; #endif @@ -11938,67 +11939,6 @@ void QWidget::clearMask() setMask(QRegion()); } -/*! - \preliminary - \since 4.6 - - Returns the (possibly empty) list of this widget's softkeys. - Returned list cannot be changed. Softkeys should be added - and removed via method called setSoftKeys - - \sa setSoftKey(), setSoftKeys() -*/ -const QList<QAction*>& QWidget::softKeys() const -{ - Q_D(const QWidget); - if( d->softKeys.count() > 0) - return d->softKeys; - if (isWindow() || !parentWidget()) - return d->softKeys; - - return parentWidget()->softKeys(); -} - -/*! - \preliminary - \since 4.6 - - Sets the softkey \a softKey to this widget's list of softkeys. - Setting 0 as softkey will clear all the existing softkeys set - to the widget. A QWidget can have 0 or more softkeys. - - \sa softKeys(), setSoftKeys() -*/ -void QWidget::setSoftKey(QAction *softKey) -{ - Q_D(QWidget); - qDeleteAll(d->softKeys); - d->softKeys.clear(); - if (softKey) - d->softKeys.append(softKey); - if ((!QApplication::focusWidget() && this == QApplication::activeWindow()) - || QApplication::focusWidget() == this) - d->setSoftKeys_sys(this->softKeys()); -} - -/*! - Sets the list of softkeys \a softKeys to this widget's list of softkeys. - A QWidget can have 0 or more softkeys. - - \sa softKeys(), setSoftKey() -*/ -void QWidget::setSoftKeys(const QList<QAction*> &softKeys) -{ - Q_D(QWidget); - qDeleteAll(d->softKeys); - d->softKeys.clear(); - d->softKeys = softKeys; - - if ((!QApplication::focusWidget() && this == QApplication::activeWindow()) - || QApplication::focusWidget() == this) - d->setSoftKeys_sys(this->softKeys()); -} - /*! \fn const QX11Info &QWidget::x11Info() const Returns information about the configuration of the X display used to display the widget. diff --git a/src/gui/kernel/qwidget.h b/src/gui/kernel/qwidget.h index 8410775..7e250e2 100644 --- a/src/gui/kernel/qwidget.h +++ b/src/gui/kernel/qwidget.h @@ -564,9 +564,6 @@ public: void removeAction(QAction *action); QList<QAction*> actions() const; #endif - const QList<QAction*>& softKeys() const; - void setSoftKey(QAction *softKey); - void setSoftKeys(const QList<QAction*> &softKeys); QWidget *parentWidget() const; diff --git a/src/gui/kernel/qwidget_p.h b/src/gui/kernel/qwidget_p.h index 5e06c29..5a9c48c 100644 --- a/src/gui/kernel/qwidget_p.h +++ b/src/gui/kernel/qwidget_p.h @@ -85,9 +85,6 @@ #if defined(Q_OS_SYMBIAN) class RDrawableWindow; class CCoeControl; -// The following 2 defines may only be needed for s60. To be seen. -const int SOFTKEYSTART=5000; -const int SOFTKEYEND=5004; #endif QT_BEGIN_NAMESPACE @@ -263,7 +260,6 @@ public: explicit QWidgetPrivate(int version = QObjectPrivateVersion); ~QWidgetPrivate(); - void setSoftKeys_sys(const QList<QAction*> &softkeys); QWExtra *extraData() const; QTLWExtra *topData() const; QTLWExtra *maybeTopData() const; @@ -517,7 +513,6 @@ public: QWidget *focus_next; QWidget *focus_prev; QWidget *focus_child; - QList<QAction*> softKeys; QLayout *layout; QRegion *needsFlush; QPaintDevice *redirectDev; diff --git a/src/gui/kernel/qwidget_s60.cpp b/src/gui/kernel/qwidget_s60.cpp index 3744377..4fef020 100644 --- a/src/gui/kernel/qwidget_s60.cpp +++ b/src/gui/kernel/qwidget_s60.cpp @@ -78,78 +78,6 @@ static bool isEqual(const QList<QAction*>& a, const QList<QAction*>& b) return true; } - -void QWidgetPrivate::setSoftKeys_sys(const QList<QAction*> &softkeys) -{ -#ifdef Q_WS_S60 - Q_Q(QWidget); - if (QApplication::focusWidget() && q!=QApplication::focusWidget()) { - QList<QAction *> old = QApplication::focusWidget()->softKeys(); - if (isEqual(old, softkeys )) - return; - } - CEikButtonGroupContainer* nativeContainer = S60->buttonGroupContainer(); - QT_TRAP_THROWING(nativeContainer->SetCommandSetL(R_AVKON_SOFTKEYS_EMPTY_WITH_IDS)); - - int position = -1; - int command; - bool needsExitButton = true; - - for (int index = 0; index < softkeys.count(); index++) { - const QAction* softKeyAction = softkeys.at(index); - switch (softKeyAction->softKeyRole()) { - // Positive Actions go on LSK - case QAction::OptionsSoftKey: - case QAction::MenuSoftKey: - case QAction::ContextMenuSoftKey: - command = EAknSoftkeyOptions; //Calls DynInitMenuPane in AppUI - position = 0; - break; - case QAction::SelectSoftKey: - case QAction::PreviousSoftKey: - case QAction::OkSoftKey: - case QAction::EditSoftKey: - case QAction::ViewSoftKey: - case QAction::EndEditSoftKey: - case QAction::FinishSoftKey: - command = SOFTKEYSTART + index; - position = 0; - break; - // Negative Actions on the RSK - case QAction::BackSoftKey: - case QAction::NextSoftKey: - case QAction::CancelSoftKey: - case QAction::BackSpaceSoftKey: - case QAction::RevertEditSoftKey: - case QAction::DeselectSoftKey: - needsExitButton = false; - command = SOFTKEYSTART + index; - position = 2; - break; - case QAction::ExitSoftKey: - needsExitButton = false; - command = EAknSoftkeyExit; //Calls HandleCommand in AppUI - position = 2; - break; - default: - break; - } - - if (position != -1) { - TPtrC text = qt_QString2TPtrC(softKeyAction->text()); - QT_TRAP_THROWING(nativeContainer->SetCommandL(position, command, text)); - } - } - - if (needsExitButton) - QT_TRAP_THROWING(nativeContainer->SetCommandL(2, EAknSoftkeyExit, qt_QString2TPtrC(QObject::tr("Exit")))); - - nativeContainer->DrawDeferred(); // 3.1 needs an extra invitation -#else - Q_UNUSED(softkeys) -#endif -} - void QWidgetPrivate::setWSGeometry(bool /* dontShow */, const QRect & /* rect */) { diff --git a/src/gui/widgets/qactiontokeyeventmapper.cpp b/src/gui/widgets/qactiontokeyeventmapper.cpp deleted file mode 100644 index 171b82d..0000000 --- a/src/gui/widgets/qactiontokeyeventmapper.cpp +++ /dev/null @@ -1,103 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qapplication.h" -#include "qevent.h" -#include "qactiontokeyeventmapper_p.h" - -QT_BEGIN_NAMESPACE - -QActionToKeyEventMapper::QActionToKeyEventMapper(QAction *softKeyAction, Qt::Key key, QObject *parent) - : QObject(parent) - , m_softKeyAction(softKeyAction) - , m_key(key) -{ - -} - -QString QActionToKeyEventMapper::roleText(QAction::SoftKeyRole role) -{ - switch (role) { - case QAction::OptionsSoftKey: - return QAction::tr("Options"); - case QAction::SelectSoftKey: - return QAction::tr("Select"); - case QAction::BackSoftKey: - return QAction::tr("Back"); - case QAction::NextSoftKey: - return QAction::tr("Next"); - case QAction::PreviousSoftKey: - return QAction::tr("Previous"); - case QAction::OkSoftKey: - return QAction::tr("Ok"); - case QAction::CancelSoftKey: - return QAction::tr("Cancel"); - case QAction::EditSoftKey: - return QAction::tr("Edit"); - case QAction::ViewSoftKey: - return QAction::tr("View"); - default: - return QString(); - }; -} -void QActionToKeyEventMapper::addSoftKey(QAction::SoftKeyRole standardRole, Qt::Key key, QWidget *actionWidget) -{ - QAction *action = new QAction(actionWidget); - action->setSoftKeyRole(standardRole); - action->setText(roleText(standardRole)); - QActionToKeyEventMapper *softKey = new QActionToKeyEventMapper(action, key, actionWidget); - connect(action, SIGNAL(triggered()), softKey, SLOT(sendKeyEvent())); - connect(action, SIGNAL(destroyed()), softKey, SLOT(deleteLater())); - actionWidget->setSoftKey(action); -} - -void QActionToKeyEventMapper::removeSoftkey(QWidget *focussedWidget) -{ - focussedWidget->setSoftKey(0); -} - -void QActionToKeyEventMapper::sendKeyEvent() -{ - QApplication::postEvent(parent(), new QKeyEvent(QEvent::KeyPress, m_key, Qt::NoModifier)); -} - -QT_END_NAMESPACE - diff --git a/src/gui/widgets/qcombobox.cpp b/src/gui/widgets/qcombobox.cpp index 220f04e..0d710c4 100644 --- a/src/gui/widgets/qcombobox.cpp +++ b/src/gui/widgets/qcombobox.cpp @@ -63,8 +63,8 @@ #include <private/qcombobox_p.h> #include <private/qabstractitemmodel_p.h> #include <private/qabstractscrollarea_p.h> +#include <private/qsoftkeymanager_p.h> #include <qdebug.h> -#include <private/qactiontokeyeventmapper_p.h> #ifdef Q_WS_X11 #include <private/qt_x11_p.h> #endif @@ -402,6 +402,13 @@ QComboBoxPrivateContainer::QComboBoxPrivateContainer(QAbstractItemView *itemView layout->setSpacing(0); layout->setMargin(0); +#ifdef QT_KEYPAD_NAVIGATION + selectAction = QSoftKeyManager::createKeyedAction(QAction::SelectSoftKey, Qt::Key_Select, itemView); + cancelAction = QSoftKeyManager::createKeyedAction(QAction::CancelSoftKey, Qt::Key_Escape, itemView); + addAction(selectAction); + addAction(cancelAction); +#endif + // set item view setItemView(itemView); @@ -564,6 +571,11 @@ void QComboBoxPrivateContainer::setItemView(QAbstractItemView *itemView) this, SLOT(setCurrentIndex(QModelIndex))); connect(view, SIGNAL(destroyed()), this, SLOT(viewDestroyed())); + +#ifdef QT_KEYPAD_NAVIGATION + selectAction->setParent(itemView); + cancelAction->setParent(itemView); +#endif } /*! @@ -629,9 +641,6 @@ bool QComboBoxPrivateContainer::eventFilter(QObject *o, QEvent *e) case Qt::Key_Select: #endif if (view->currentIndex().isValid() && (view->currentIndex().flags() & Qt::ItemIsEnabled) ) { -#ifdef QT_KEYPAD_NAVIGATION - QActionToKeyEventMapper::removeSoftkey(this); -#endif combo->hidePopup(); emit itemSelected(view->currentIndex()); } @@ -642,10 +651,6 @@ bool QComboBoxPrivateContainer::eventFilter(QObject *o, QEvent *e) // fall through case Qt::Key_F4: case Qt::Key_Escape: -#ifdef QT_KEYPAD_NAVIGATION - case Qt::Key_Back: - QActionToKeyEventMapper::removeSoftkey(this); -#endif combo->hidePopup(); return true; default: @@ -2477,7 +2482,6 @@ void QComboBox::showPopup() #ifdef QT_KEYPAD_NAVIGATION if (QApplication::keypadNavigationEnabled()) view()->setEditFocus(true); - QActionToKeyEventMapper::addSoftKey(QAction::CancelSoftKey, Qt::Key_Back, view()); #endif } diff --git a/src/gui/widgets/qcombobox_p.h b/src/gui/widgets/qcombobox_p.h index 507820c..cd0861d 100644 --- a/src/gui/widgets/qcombobox_p.h +++ b/src/gui/widgets/qcombobox_p.h @@ -78,6 +78,8 @@ QT_BEGIN_NAMESPACE +class QAction; + class QComboBoxListView : public QListView { Q_OBJECT @@ -253,6 +255,10 @@ private: QAbstractItemView *view; QComboBoxPrivateScroller *top; QComboBoxPrivateScroller *bottom; +#ifdef QT_KEYPAD_NAVIGATION + QAction *selectAction; + QAction *cancelAction; +#endif }; class QComboMenuDelegate : public QAbstractItemDelegate diff --git a/src/gui/widgets/qmainwindow.cpp b/src/gui/widgets/qmainwindow.cpp index 990d821..17645cd 100644 --- a/src/gui/widgets/qmainwindow.cpp +++ b/src/gui/widgets/qmainwindow.cpp @@ -65,6 +65,9 @@ QT_BEGIN_NAMESPACE extern OSWindowRef qt_mac_window_for(const QWidget *); // qwidget_mac.cpp QT_END_NAMESPACE #endif +#ifdef QT_KEYPAD_NAVIGATION +#include <private/qsoftkeymanager_p.h> +#endif QT_BEGIN_NAMESPACE @@ -77,6 +80,9 @@ public: #ifdef Q_WS_MAC , useHIToolBar(false) #endif +#ifdef QT_KEYPAD_NAVIGATION + , menuBarAction(0) +#endif #if !defined(QT_NO_DOCKWIDGET) && !defined(QT_NO_CURSOR) , hasOldCursor(false) , cursorAdjusted(false) #endif @@ -88,6 +94,9 @@ public: #ifdef Q_WS_MAC bool useHIToolBar; #endif +#ifdef QT_KEYPAD_NAVIGATION + QAction *menuBarAction; +#endif void init(); QList<int> hoverSeparator; QPoint hoverPos; @@ -108,6 +117,9 @@ void QMainWindowPrivate::init() const int metric = q->style()->pixelMetric(QStyle::PM_ToolBarIconSize, 0, q); iconSize = QSize(metric, metric); q->setAttribute(Qt::WA_Hover); +#ifdef QT_KEYPAD_NAVIGATION + menuBarAction = QSoftKeyManager::createAction(QAction::MenuSoftKey, q); +#endif } /* @@ -479,11 +491,13 @@ void QMainWindow::setMenuBar(QMenuBar *menuBar) oldMenuBar->deleteLater(); } d->layout->setMenuBar(menuBar); - if (menuBar) { - QAction* menu = new QAction(QString::fromLatin1("Options"), this); - menu->setSoftKeyRole(QAction::MenuSoftKey); - setSoftKey(menu); - } + +#ifdef QT_KEYPAD_NAVIGATION + if (menuBar) + addAction(d->menuBarAction); + else + removeAction(d->menuBarAction); +#endif } /*! @@ -1412,16 +1426,6 @@ bool QMainWindow::event(QEvent *event) } break; #endif -#ifndef QT_NO_MENUBAR - case QEvent::WindowActivate: - if (d->layout->menuBar()) { - // ### TODO: This is evil, there is no need to create a new action every time - QAction* menu = new QAction(QString::fromLatin1("Options"), this); - menu->setSoftKeyRole(QAction::MenuSoftKey); - setSoftKey(menu); - } - break; -#endif default: break; } diff --git a/src/gui/widgets/qmenu.cpp b/src/gui/widgets/qmenu.cpp index 925be02..5e51155 100644 --- a/src/gui/widgets/qmenu.cpp +++ b/src/gui/widgets/qmenu.cpp @@ -60,13 +60,13 @@ #ifndef QT_NO_WHATSTHIS # include <qwhatsthis.h> #endif -#include <private/qactiontokeyeventmapper_p.h> #include "qmenu_p.h" #include "qmenubar_p.h" #include "qwidgetaction.h" #include "qtoolbutton.h" #include <private/qaction_p.h> +#include <private/qsoftkeymanager_p.h> #ifdef QT3_SUPPORT #include <qmenudata.h> #endif // QT3_SUPPORT @@ -162,6 +162,15 @@ void QMenuPrivate::init() scroll = new QMenuPrivate::QMenuScroller; scroll->scrollFlags = QMenuPrivate::QMenuScroller::ScrollNone; } + +#ifdef QT_KEYPAD_NAVIGATION + selectAction = QSoftKeyManager::createKeyedAction(QAction::SelectSoftKey, Qt::Key_Select, q); + cancelAction = QSoftKeyManager::createKeyedAction(QAction::CancelSoftKey, Qt::Key_Back, q); + selectAction->setVisible(false); // Don't show these in the menu + cancelAction->setVisible(false); + q->addAction(selectAction); + q->addAction(cancelAction); +#endif } int QMenuPrivate::scrollerHeight() const @@ -1926,9 +1935,6 @@ void QMenu::popup(const QPoint &p, QAction *atAction) #ifndef QT_NO_ACCESSIBILITY QAccessible::updateAccessibility(this, 0, QAccessible::PopupMenuStart); #endif -#ifdef QT_KEYPAD_NAVIGATION - QActionToKeyEventMapper::addSoftKey(QAction::CancelSoftKey, Qt::Key_Back, this); -#endif } /*! @@ -2587,7 +2593,6 @@ void QMenu::keyPressEvent(QKeyEvent *e) case Qt::Key_Escape: #ifdef QT_KEYPAD_NAVIGATION case Qt::Key_Back: - QActionToKeyEventMapper::removeSoftkey(this); #endif key_consumed = true; if (d->tornoff) { diff --git a/src/gui/widgets/qmenu_p.h b/src/gui/widgets/qmenu_p.h index 33b892a..2d5632e 100644 --- a/src/gui/widgets/qmenu_p.h +++ b/src/gui/widgets/qmenu_p.h @@ -139,7 +139,12 @@ class QMenuPrivate : public QWidgetPrivate public: QMenuPrivate() : itemsDirty(0), maxIconWidth(0), tabWidth(0), ncols(0), collapsibleSeparators(true), activationRecursionGuard(false), hasHadMouse(0), aboutToHide(0), motions(0), - currentAction(0), scroll(0), eventLoop(0), tearoff(0), tornoff(0), tearoffHighlighted(0), + currentAction(0), +#ifdef QT_KEYPAD_NAVIGATION + selectAction(0), + cancelAction(0), +#endif + scroll(0), eventLoop(0), tearoff(0), tornoff(0), tearoffHighlighted(0), hasCheckableItems(0), sloppyAction(0), doChildEffects(false) #ifdef Q_WS_MAC ,mac_menu(0) @@ -193,6 +198,10 @@ public: uint aboutToHide : 1; int motions; QAction *currentAction; +#ifdef QT_KEYPAD_NAVIGATION + QAction *selectAction; + QAction *cancelAction; +#endif static QBasicTimer menuDelayTimer; enum SelectionReason { SelectedFromKeyboard, diff --git a/src/gui/widgets/qmenubar.cpp b/src/gui/widgets/qmenubar.cpp index 7b0f37e..13e7de4 100644 --- a/src/gui/widgets/qmenubar.cpp +++ b/src/gui/widgets/qmenubar.cpp @@ -1072,16 +1072,10 @@ void QMenuBar::paintEvent(QPaintEvent *e) */ void QMenuBar::setVisible(bool visible) { -#if defined(Q_WS_MAC) || defined(Q_OS_WINCE) +#if defined(Q_WS_MAC) || defined(Q_OS_WINCE) || defined(Q_WS_S60) if (isNativeMenuBar()) return; #endif -#ifdef Q_WS_S60 - Q_D(QMenuBar); - if(d->symbian_menubar) - return; -#endif - QWidget::setVisible(visible); } @@ -1278,10 +1272,12 @@ void QMenuBar::actionEvent(QActionEvent *e) { Q_D(QMenuBar); d->itemsDirty = true; -#if defined (Q_WS_MAC) || defined(Q_OS_WINCE) +#if defined (Q_WS_MAC) || defined(Q_OS_WINCE) || defined(Q_WS_S60) if (isNativeMenuBar()) { #ifdef Q_WS_MAC QMenuBarPrivate::QMacMenuBarPrivate *nativeMenuBar = d->mac_menubar; +#elif defined(Q_WS_S60) + QMenuBarPrivate::QSymbianMenuBarPrivate *nativeMenuBar = d->symbian_menubar; #else QMenuBarPrivate::QWceMenuBarPrivate *nativeMenuBar = d->wce_menubar; #endif @@ -1295,16 +1291,6 @@ void QMenuBar::actionEvent(QActionEvent *e) nativeMenuBar->syncAction(e->action()); } #endif -#ifdef Q_WS_S60 - if(d->symbian_menubar) { - if(e->type() == QEvent::ActionAdded) - d->symbian_menubar->addAction(e->action(), d->symbian_menubar->findAction(e->before())); - else if(e->type() == QEvent::ActionRemoved) - d->symbian_menubar->removeAction(e->action()); - else if(e->type() == QEvent::ActionChanged) - d->symbian_menubar->syncAction(e->action()); - } -#endif if(e->type() == QEvent::ActionAdded) { connect(e->action(), SIGNAL(triggered()), this, SLOT(_q_actionTriggered())); diff --git a/src/gui/widgets/widgets.pri b/src/gui/widgets/widgets.pri index 4567902..6883dd8 100644 --- a/src/gui/widgets/widgets.pri +++ b/src/gui/widgets/widgets.pri @@ -81,8 +81,7 @@ HEADERS += \ widgets/qtoolbararealayout_p.h \ widgets/qplaintextedit.h \ widgets/qplaintextedit_p.h \ - widgets/qprintpreviewwidget.h \ - widgets/qactiontokeyeventmapper_p.h + widgets/qprintpreviewwidget.h SOURCES += \ widgets/qabstractbutton.cpp \ widgets/qabstractslider.cpp \ @@ -143,8 +142,7 @@ SOURCES += \ widgets/qwidgetanimator.cpp \ widgets/qtoolbararealayout.cpp \ widgets/qplaintextedit.cpp \ - widgets/qprintpreviewwidget.cpp \ - widgets/qactiontokeyeventmapper.cpp + widgets/qprintpreviewwidget.cpp !embedded:mac { HEADERS += widgets/qmacnativewidget_mac.h \ |