src/gui/kernel/qsoftkeymanager.cpp
changeset 3 41300fa6a67c
parent 0 1918ee327afb
child 4 3b1da2848fc7
child 7 f7bc934e204c
child 18 2f34d5167611
--- a/src/gui/kernel/qsoftkeymanager.cpp	Tue Jan 26 12:42:25 2010 +0200
+++ b/src/gui/kernel/qsoftkeymanager.cpp	Tue Feb 02 00:43:10 2010 +0200
@@ -48,6 +48,7 @@
 #include "private/qsoftkeymanager_p.h"
 #include "private/qobject_p.h"
 
+#ifndef QT_NO_SOFTKEYMANAGER
 QT_BEGIN_NAMESPACE
 
 #ifdef Q_WS_S60
@@ -136,12 +137,21 @@
 */
 QAction *QSoftKeyManager::createKeyedAction(StandardSoftKey standardKey, Qt::Key key, QWidget *actionWidget)
 {
+#ifndef QT_NO_ACTION
     QScopedPointer<QAction> action(createAction(standardKey, actionWidget));
 
     connect(action.data(), SIGNAL(triggered()), QSoftKeyManager::instance(), SLOT(sendKeyEvent()));
-
+    connect(action.data(), SIGNAL(destroyed(QObject*)), QSoftKeyManager::instance(), SLOT(cleanupHash(QObject*)));
     QSoftKeyManager::instance()->d_func()->keyedActions.insert(action.data(), key);
     return action.take();
+#endif //QT_NO_ACTION
+}
+
+void QSoftKeyManager::cleanupHash(QObject* obj)
+{
+    Q_D(QSoftKeyManager);
+    QAction *action = qobject_cast<QAction*>(obj);
+    d->keyedActions.remove(action);
 }
 
 void QSoftKeyManager::sendKeyEvent()
@@ -167,6 +177,7 @@
 
 bool QSoftKeyManager::event(QEvent *e)
 {
+#ifndef QT_NO_ACTION
     if (e->type() == QEvent::UpdateSoftKeys) {
         QList<QAction*> softKeys;
         QWidget *source = QApplication::focusWidget();
@@ -179,7 +190,7 @@
                 }
 
                 QWidget *parent = source->parentWidget();
-                if (parent && softKeys.isEmpty())
+                if (parent && softKeys.isEmpty() && !source->isWindow())
                     source = parent;
                 else
                     break;
@@ -192,19 +203,29 @@
         QSoftKeyManagerPrivate::updateSoftKeys_sys(softKeys);
         return true;
     }
+#endif //QT_NO_ACTION
     return false;
 }
 
 #ifdef Q_WS_S60
 void QSoftKeyManagerPrivate::updateSoftKeys_sys(const QList<QAction*> &softkeys)
 {
+    // lets not update softkeys if s60 native dialog or menu is shown
+    if (CCoeEnv::Static()->AppUi()->IsDisplayingMenuOrDialog())
+        return;
+
     CEikButtonGroupContainer* nativeContainer = S60->buttonGroupContainer();
+    nativeContainer->DrawableWindow()->SetOrdinalPosition(0);
     nativeContainer->DrawableWindow()->SetPointerCapturePriority(1); //keep softkeys available in modal dialog
-    QT_TRAP_THROWING(nativeContainer->SetCommandSetL(R_AVKON_SOFTKEYS_EMPTY_WITH_IDS));
+    nativeContainer->DrawableWindow()->SetFaded(EFalse, RWindowTreeNode::EFadeIncludeChildren);
 
     int position = -1;
-    int command;
     bool needsExitButton = true;
+    QT_TRAP_THROWING(
+        //Using -1 instead of EAknSoftkeyEmpty to avoid flickering.
+        nativeContainer->SetCommandL(0, -1, KNullDesC);
+        nativeContainer->SetCommandL(2, -1, KNullDesC);
+    );
 
     for (int index = 0; index < softkeys.count(); index++) {
         const QAction* softKeyAction = softkeys.at(index);
@@ -225,20 +246,32 @@
             break;
         }
 
-        command = (softKeyAction->objectName().contains("_q_menuSoftKeyAction"))
+        int command = (softKeyAction->objectName().contains(QLatin1String("_q_menuSoftKeyAction")))
                     ? EAknSoftkeyOptions
                     : s60CommandStart + index;
 
+        // _q_menuSoftKeyAction action is set to "invisible" and all invisible actions are by default
+        // disabled. However we never want to dim options softkey, even it is set to "invisible"
+        bool dimmed = (command == EAknSoftkeyOptions) ? false : !softKeyAction->isEnabled();
+
         if (position != -1) {
             const int underlineShortCut = QApplication::style()->styleHint(QStyle::SH_UnderlineShortcut);
             QString iconText = softKeyAction->iconText();
             TPtrC text = qt_QString2TPtrC( underlineShortCut ? softKeyAction->text() : iconText);
-            QT_TRAP_THROWING(nativeContainer->SetCommandL(position, command, text));
+            QT_TRAP_THROWING(
+                nativeContainer->SetCommandL(position, command, text);
+                nativeContainer->DimCommand(command, dimmed);
+            );
         }
     }
 
-    if (needsExitButton)
-        QT_TRAP_THROWING(nativeContainer->SetCommandL(2, EAknSoftkeyExit, qt_QString2TPtrC(QSoftKeyManager::tr("Exit"))));
+    const Qt::WindowType sourceWindowType = QSoftKeyManagerPrivate::softKeySource
+        ?   QSoftKeyManagerPrivate::softKeySource->window()->windowType()
+        :   Qt::Widget;
+
+    if (needsExitButton && sourceWindowType != Qt::Dialog && sourceWindowType != Qt::Popup)
+        QT_TRAP_THROWING(
+            nativeContainer->SetCommandL(2, EAknSoftkeyExit, qt_QString2TPtrC(QSoftKeyManager::tr("Exit"))));
 
     nativeContainer->DrawDeferred(); // 3.1 needs an extra invitation
 }
@@ -275,4 +308,4 @@
 #endif
 
 QT_END_NAMESPACE
-
+#endif //QT_NO_SOFTKEYMANAGER