src/hbinput/inputwidgets/hbinputsettinglist.cpp
changeset 0 16d8024aca5e
child 1 f7ac710697a9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/hbinput/inputwidgets/hbinputsettinglist.cpp	Mon Apr 19 14:02:13 2010 +0300
@@ -0,0 +1,321 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (developer.feedback@nokia.com)
+**
+** This file is part of the HbInput module of the UI Extensions for Mobile.
+**
+** GNU Lesser General Public License Usage
+** 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 developer.feedback@nokia.com.
+**
+****************************************************************************/
+
+#include <QGraphicsLinearLayout>
+#include <QGraphicsGridLayout>
+#if QT_VERSION >= 0x040600
+#include <QGraphicsDropShadowEffect>
+#endif
+
+#include <hblabel.h>
+#include <hbpushbutton.h>
+#include <hblistwidget.h>
+#include <hblistwidgetitem.h>
+#include <hbinputmethod.h>
+#include <hbinputsettingproxy.h>
+#include <hbinpututils.h>
+#include <hbinputpredictionfactory.h>
+#include "hbinputsettinglist.h"
+#include "hbdialog_p.h"
+
+const QString settingsIcon("qtg_mono_settings");
+const QString inputMethodIcon("qtg_mono_virtual_input");
+
+/// @cond
+
+class HbInputSettingListPrivate : public HbDialogPrivate
+{
+public:
+    HbInputSettingListPrivate();
+
+    qreal languageNameWidth();
+
+public:
+    HbPushButton *mLanguageButton;
+    HbPushButton *mPredictionButton;
+    HbListWidget *mOptionList;
+    HbInputLanguage mPrimaryLanguage;
+    HbInputLanguage mSecondaryLanguage;
+    QList<QString> mPredictionValues;
+};
+
+HbInputSettingListPrivate::HbInputSettingListPrivate()
+ : mLanguageButton(0), mPredictionButton(0), mOptionList(0)
+{
+}
+
+qreal HbInputSettingListPrivate::languageNameWidth()
+{
+    qreal nameWidth(0);
+    QList<HbInputLanguage> languages;
+    HbInputUtils::listSupportedInputLanguages(languages);
+    QFontMetrics fontMetrics(HbFontSpec(HbFontSpec::Primary).font());
+
+    foreach (HbInputLanguage language, languages) {
+        qreal width = fontMetrics.width(language.localisedName());
+        if (width > nameWidth) {
+            nameWidth = width;
+        }
+    }
+
+    return nameWidth;
+}
+
+/// @endcond
+
+/*!
+Constructs input setting list
+*/
+HbInputSettingList::HbInputSettingList(QGraphicsWidget* parent)
+ : HbDialog(*new HbInputSettingListPrivate(), parent)
+{
+    Q_D(HbInputSettingList);
+
+    QGraphicsLinearLayout *mainLayout = new QGraphicsLinearLayout(Qt::Vertical);
+    QGraphicsGridLayout *gridLayout = new QGraphicsGridLayout();
+    
+    HbLabel *languageLabel = new HbLabel(tr("Language"), this);
+    languageLabel->setFontSpec(HbFontSpec(HbFontSpec::Primary));
+    d->mLanguageButton = new HbPushButton(QString(), this);
+    d->mLanguageButton->setFontSpec(HbFontSpec(HbFontSpec::Primary));
+    d->mLanguageButton->setObjectName("Language setting button");
+
+    HbLabel *predictionLabel = new HbLabel(tr("Prediction"), this);
+    predictionLabel->setFontSpec(HbFontSpec(HbFontSpec::Primary));
+    d->mPredictionButton = new HbPushButton(QString(), this);
+    d->mPredictionButton->setFontSpec(HbFontSpec(HbFontSpec::Primary));
+    d->mPredictionButton->setObjectName("Prediction setting button");
+
+    d->mOptionList = new HbListWidget(this);
+    d->mOptionList->setFontSpec(HbFontSpec(HbFontSpec::Primary));
+    d->mOptionList->setVerticalScrollBarPolicy(HbScrollArea::ScrollBarAlwaysOff);
+    d->mOptionList->setObjectName("Input options list");
+    d->mOptionList->addItem(HbIcon(settingsIcon), tr("Input settings"));
+
+    gridLayout->addItem(languageLabel, 0, 0);
+    gridLayout->addItem(d->mLanguageButton, 0, 1);
+    gridLayout->addItem(predictionLabel, 1, 0);
+    gridLayout->addItem(d->mPredictionButton, 1, 1);
+
+    qreal buttonWidth = 30 + d->languageNameWidth();
+    gridLayout->setColumnFixedWidth(0, 300 - buttonWidth);
+    gridLayout->setColumnFixedWidth(1, buttonWidth);
+
+    qreal buttonHeight = buttonWidth * 0.4;
+    gridLayout->setRowFixedHeight(0, buttonHeight);
+    gridLayout->setRowFixedHeight(1, buttonHeight);
+
+    mainLayout->addItem(gridLayout);
+    mainLayout->addItem(d->mOptionList);
+    setLayout(mainLayout);
+
+    d->mPredictionValues.append(tr("Off"));
+    d->mPredictionValues.append(tr("On"));
+
+    // set default values for popup
+    setTimeout(HbDialog::NoTimeout);
+    setBackgroundFaded(false);
+    setDismissPolicy(TapOutside);
+
+#if QT_VERSION >= 0x040600
+    // Make sure the custom button list never steals focus.
+    setFlag(QGraphicsItem::ItemIsPanel, true);
+    setActive(false);
+
+    // enable drop shadow for the setting list
+// Effect deletion is crashing -> Effect temporarily removed
+//    QGraphicsDropShadowEffect *effect = new QGraphicsDropShadowEffect;
+//    effect->setBlurRadius(8);
+//    setGraphicsEffect(effect);
+#endif
+
+    connect(d->mLanguageButton, SIGNAL(clicked(bool)), this, SLOT(languageButtonClicked()));
+    connect(d->mPredictionButton, SIGNAL(clicked(bool)), this, SLOT(predictionButtonClicked()));
+    connect(d->mOptionList, SIGNAL(activated(HbListWidgetItem *)), this, SLOT(listItemActivated(HbListWidgetItem *)));
+
+    HbInputSettingProxy *settings = HbInputSettingProxy::instance();
+    connect(settings, SIGNAL(globalInputLanguageChanged(const HbInputLanguage &)), this, SLOT(primaryLanguageChanged(const HbInputLanguage &)));
+    connect(settings, SIGNAL(globalSecondaryInputLanguageChanged(const HbInputLanguage &)), this, SLOT(secondaryLanguageChanged(const HbInputLanguage &)));
+    connect(settings, SIGNAL(predictiveInputStateChanged(int)), this, SLOT(predictionStatusChanged(int)));
+
+    connect(this, SIGNAL(aboutToClose()), this, SLOT(saveSettings()));
+}
+
+/*!
+Destructs the object.
+*/
+HbInputSettingList::~HbInputSettingList()
+{
+}
+
+/*!
+Opens the setting list
+*/
+void HbInputSettingList::showSettingList()
+{
+    Q_D(HbInputSettingList);
+
+    HbInputSettingProxy *settings = HbInputSettingProxy::instance();
+    d->mPrimaryLanguage = settings->globalInputLanguage();
+    d->mSecondaryLanguage = settings->globalSecondaryInputLanguage();
+
+    d->mLanguageButton->setText(d->mPrimaryLanguage.localisedName());
+    d->mPredictionButton->setText(d->mPredictionValues.at(settings->predictiveInputStatus()));
+
+    QList<HbInputMethodDescriptor> customList = HbInputMethod::listCustomInputMethods();
+    bool showInputMethod = true;
+    if (customList.count() < 1) {
+        showInputMethod = false;
+    }
+
+    if (d->mOptionList->count() == 1 && showInputMethod) {
+        d->mOptionList->insertItem(0, HbIcon(inputMethodIcon), tr("Input methods"));
+    } else if (d->mOptionList->count() == 2 && !showInputMethod) {
+        delete d->mOptionList->takeItem(0);
+    }
+
+    exec();
+}
+
+/*!
+Enables/disables language selection button
+*/
+void HbInputSettingList::setLanguageSelectionEnabled(bool enabled)
+{
+    Q_D(HbInputSettingList);
+
+    d->mLanguageButton->setEnabled(enabled);
+}
+
+/*!
+Enables/disables prediction selection button
+*/
+void HbInputSettingList::setPredictionSelectionEnabled(bool enabled)
+{
+    Q_D(HbInputSettingList);
+
+    d->mPredictionButton->setEnabled(enabled);
+}
+
+/*!
+Swaps current primary and secondary languages
+*/
+void HbInputSettingList::languageButtonClicked()
+{
+    Q_D(HbInputSettingList);
+
+    if (d->mSecondaryLanguage == HbInputLanguage()) {
+        emit inputSettingsButtonClicked();
+    } else {
+        HbInputLanguage language = d->mPrimaryLanguage;
+        d->mPrimaryLanguage = d->mSecondaryLanguage;
+        d->mSecondaryLanguage = language;
+
+        primaryLanguageChanged(d->mPrimaryLanguage);
+    }
+
+    close();
+}
+
+/*!
+Toggles prediction state
+*/
+void HbInputSettingList::predictionButtonClicked()
+{
+    HbInputSettingProxy *settings = HbInputSettingProxy::instance();
+    settings->setPredictiveInputStatus(!settings->predictiveInputStatus());
+
+    close();
+}
+
+/*!
+Opens input settings or input method selection
+*/
+void HbInputSettingList::listItemActivated(HbListWidgetItem *item)
+{
+    Q_D(HbInputSettingList);
+
+    if (d->mOptionList->row(item) == d->mOptionList->count() - 1) {
+        emit inputSettingsButtonClicked();
+    } else {
+        emit inputMethodsButtonClicked();
+    }
+
+    close();
+}
+
+/*!
+Sets current primary language and updates the language button text
+*/
+void HbInputSettingList::primaryLanguageChanged(const HbInputLanguage &newLanguage)
+{
+    Q_D(HbInputSettingList);
+
+    d->mPrimaryLanguage = HbInputLanguage(newLanguage);
+    d->mLanguageButton->setText(d->mPrimaryLanguage.localisedName());
+}
+
+/*!
+Sets current secondary language
+*/
+void HbInputSettingList::secondaryLanguageChanged(const HbInputLanguage &newLanguage)
+{
+    Q_D(HbInputSettingList);
+
+    d->mSecondaryLanguage = HbInputLanguage(newLanguage);
+}
+
+/*!
+Updates prediction button text
+*/
+void HbInputSettingList::predictionStatusChanged(int newStatus)
+{
+    Q_D(HbInputSettingList);
+
+    d->mPredictionButton->setText(d->mPredictionValues.at(newStatus));
+}
+
+/*!
+Stores the current language selection
+*/
+void HbInputSettingList::saveSettings()
+{
+    Q_D(HbInputSettingList);
+
+    HbInputSettingProxy *settings = HbInputSettingProxy::instance();
+    HbPredictionFactory *predFactory = HbPredictionFactory::instance();		
+
+    if (d->mPrimaryLanguage != settings->globalInputLanguage()) {
+        settings->setGlobalInputLanguage(d->mPrimaryLanguage);
+        settings->setGlobalSecondaryInputLanguage(d->mSecondaryLanguage);
+        if(!predFactory->predictionEngineForLanguage(d->mPrimaryLanguage)) {
+            predictionStatusChanged(false);
+            settings->setPredictiveInputStatus(false);
+        }
+    }
+}
+
+// End of file
+