telutils/dialpad/src/dialpadnumericbuttongrid.cpp
author hgs
Mon, 04 Oct 2010 15:57:13 +0300
changeset 51 12bc758d6a02
parent 48 78df25012fda
permissions -rw-r--r--
201039
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
46
hgs
parents:
diff changeset
     1
/*!
hgs
parents:
diff changeset
     2
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description: Implements grid of numeric buttons
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
#include <QPainter>
hgs
parents:
diff changeset
    19
hgs
parents:
diff changeset
    20
#include <hbmainwindow.h>
hgs
parents:
diff changeset
    21
#include <hbcolorscheme.h>
hgs
parents:
diff changeset
    22
#include <hbevent.h>
hgs
parents:
diff changeset
    23
#include <hbinputkeymapfactory.h>
hgs
parents:
diff changeset
    24
#include <hbinputkeymap.h>
hgs
parents:
diff changeset
    25
#include <hbinpututils.h>
hgs
parents:
diff changeset
    26
#include <hbinputsettingproxy.h>
hgs
parents:
diff changeset
    27
#include <hbinputlanguage.h>
hgs
parents:
diff changeset
    28
hgs
parents:
diff changeset
    29
#include "dialpadnumericbutton.h"
hgs
parents:
diff changeset
    30
#include "dialpadnumericbuttongrid.h"
hgs
parents:
diff changeset
    31
hgs
parents:
diff changeset
    32
static const int DialpadRowCount = 4;
hgs
parents:
diff changeset
    33
static const int DialpadColumnCount = 3;
hgs
parents:
diff changeset
    34
// layout values in units
hgs
parents:
diff changeset
    35
static const qreal DialpadPrimaryTextSizeV = 5.25;
hgs
parents:
diff changeset
    36
static const qreal DialpadPrimaryTextSizeH = 4.5;
hgs
parents:
diff changeset
    37
static const qreal DialpadSecondaryTextSizeV = 3.8;
hgs
parents:
diff changeset
    38
static const qreal DialpadSecondaryTextSizeH = 3.3;
51
hgs
parents: 48
diff changeset
    39
static const qreal DialpadSecondaryTextSize2RowsV = 2.8;
46
hgs
parents:
diff changeset
    40
static const qreal DialpadSecondaryTextSize2RowsH = 2.6;
hgs
parents:
diff changeset
    41
static const qreal DialpadIconSizeV = 5.0;
hgs
parents:
diff changeset
    42
static const qreal DialpadIconSizeH = 4.25;
hgs
parents:
diff changeset
    43
static const qreal DialpadPrimaryTextLeftMargin  = 1.5;
hgs
parents:
diff changeset
    44
static const qreal DialpadPrimarySecondaryMargin  = 1.0;
51
hgs
parents: 48
diff changeset
    45
static const qreal DialpadButtonBorderSize  = 0.5;
hgs
parents: 48
diff changeset
    46
static const qreal DialpadSecondaryTextOpacity = 0.4;
46
hgs
parents:
diff changeset
    47
hgs
parents:
diff changeset
    48
static const QLatin1String vmbxIcon("qtg_mono_voice_mailbox");
hgs
parents:
diff changeset
    49
hgs
parents:
diff changeset
    50
static const int DialpadKeyCodeTable[DialpadRowCount*DialpadColumnCount] =
hgs
parents:
diff changeset
    51
{
hgs
parents:
diff changeset
    52
    Qt::Key_1,        Qt::Key_2,      Qt::Key_3,
hgs
parents:
diff changeset
    53
    Qt::Key_4,        Qt::Key_5,      Qt::Key_6,
hgs
parents:
diff changeset
    54
    Qt::Key_7,        Qt::Key_8,      Qt::Key_9,
hgs
parents:
diff changeset
    55
    Qt::Key_Asterisk, Qt::Key_0,      Qt::Key_NumberSign
hgs
parents:
diff changeset
    56
};
hgs
parents:
diff changeset
    57
hgs
parents:
diff changeset
    58
DialpadNumericButtonGrid::DialpadNumericButtonGrid(
hgs
parents:
diff changeset
    59
    const HbMainWindow& mainWindow,
hgs
parents:
diff changeset
    60
    QGraphicsItem* parent) :
hgs
parents:
diff changeset
    61
    HbInputButtonGroup(parent),
hgs
parents:
diff changeset
    62
    mMainWindow(mainWindow),
hgs
parents:
diff changeset
    63
    mUnit(.0),
hgs
parents:
diff changeset
    64
    mMaxPrimaryLineWidth(.0),
hgs
parents:
diff changeset
    65
    mPrimaryTextBaseline(.0)
hgs
parents:
diff changeset
    66
{
hgs
parents:
diff changeset
    67
    setObjectName("numericButtons");
hgs
parents:
diff changeset
    68
hgs
parents:
diff changeset
    69
    // create buttons
hgs
parents:
diff changeset
    70
    setGridSize(QSize(DialpadColumnCount, DialpadRowCount));
51
hgs
parents: 48
diff changeset
    71
    setButtonBorderSize(DialpadButtonBorderSize);
46
hgs
parents:
diff changeset
    72
hgs
parents:
diff changeset
    73
    QList<HbInputButton*> buttons;
hgs
parents:
diff changeset
    74
hgs
parents:
diff changeset
    75
    for (int i = 0; i < DialpadRowCount * DialpadColumnCount; ++i) {
hgs
parents:
diff changeset
    76
        DialpadNumericButton *item = new DialpadNumericButton(
hgs
parents:
diff changeset
    77
            DialpadKeyCodeTable[i],
hgs
parents:
diff changeset
    78
            QPoint(i % DialpadColumnCount, i / DialpadColumnCount));
hgs
parents:
diff changeset
    79
        buttons.append(item);
hgs
parents:
diff changeset
    80
hgs
parents:
diff changeset
    81
        item->setType(HbInputButton::ButtonTypeNormal);
hgs
parents:
diff changeset
    82
    }
hgs
parents:
diff changeset
    83
hgs
parents:
diff changeset
    84
    setButtons(buttons);
hgs
parents:
diff changeset
    85
hgs
parents:
diff changeset
    86
    // connect signals from buttons
hgs
parents:
diff changeset
    87
    QObject::connect(this, SIGNAL(buttonPressed(const QKeyEvent&)),
hgs
parents:
diff changeset
    88
                     this, SLOT(updateButtonLabels()));
hgs
parents:
diff changeset
    89
    QObject::connect(this, SIGNAL(buttonReleased(const QKeyEvent&)),
hgs
parents:
diff changeset
    90
                     this, SLOT(updateButtonLabels()));
hgs
parents:
diff changeset
    91
    QObject::connect(this, SIGNAL(pressedButtonChanged(const QKeyEvent&,
hgs
parents:
diff changeset
    92
                                                       const QKeyEvent&)),
hgs
parents:
diff changeset
    93
                     this, SLOT(updateButtonLabels()));
hgs
parents:
diff changeset
    94
hgs
parents:
diff changeset
    95
    // update colors
hgs
parents:
diff changeset
    96
    updateColorArray();
hgs
parents:
diff changeset
    97
    // set button texts
hgs
parents:
diff changeset
    98
    setButtonTexts();
hgs
parents:
diff changeset
    99
    // set button icons
hgs
parents:
diff changeset
   100
    button(0)->setIcon(HbIcon(vmbxIcon));
hgs
parents:
diff changeset
   101
hgs
parents:
diff changeset
   102
    // update button texts when input language is changed
hgs
parents:
diff changeset
   103
    connect(HbInputSettingProxy::instance(),
hgs
parents:
diff changeset
   104
            SIGNAL(globalInputLanguageChanged(HbInputLanguage)),
hgs
parents:
diff changeset
   105
            this,
hgs
parents:
diff changeset
   106
            SLOT(setButtonTexts()));
hgs
parents:
diff changeset
   107
}
hgs
parents:
diff changeset
   108
hgs
parents:
diff changeset
   109
DialpadNumericButtonGrid::~DialpadNumericButtonGrid()
hgs
parents:
diff changeset
   110
{
hgs
parents:
diff changeset
   111
}
hgs
parents:
diff changeset
   112
hgs
parents:
diff changeset
   113
void DialpadNumericButtonGrid::resetButtons()
hgs
parents:
diff changeset
   114
{
hgs
parents:
diff changeset
   115
    cancelButtonPress();
hgs
parents:
diff changeset
   116
}
hgs
parents:
diff changeset
   117
hgs
parents:
diff changeset
   118
QChar DialpadNumericButtonGrid::inputCharacter(int keyCode) const
hgs
parents:
diff changeset
   119
{
hgs
parents:
diff changeset
   120
    return mGeneratedChar.value(keyCode);
hgs
parents:
diff changeset
   121
}
hgs
parents:
diff changeset
   122
hgs
parents:
diff changeset
   123
void DialpadNumericButtonGrid::setButtonTexts()
hgs
parents:
diff changeset
   124
{
hgs
parents:
diff changeset
   125
    HbInputLanguage inputLanguage =
hgs
parents:
diff changeset
   126
        HbInputSettingProxy::instance()->globalInputLanguage();
hgs
parents:
diff changeset
   127
    const HbKeymap *keymap =
hgs
parents:
diff changeset
   128
        HbKeymapFactory::instance()->keymap(inputLanguage.language());
hgs
parents:
diff changeset
   129
hgs
parents:
diff changeset
   130
    mGeneratedChar.clear();
hgs
parents:
diff changeset
   131
hgs
parents:
diff changeset
   132
    if (keymap) {
hgs
parents:
diff changeset
   133
        int buttonCount = (DialpadRowCount*DialpadColumnCount);
hgs
parents:
diff changeset
   134
        for (int i = 0; i < buttonCount; i++) {
hgs
parents:
diff changeset
   135
            int keyCode = DialpadKeyCodeTable[i];
hgs
parents:
diff changeset
   136
hgs
parents:
diff changeset
   137
            if (keyCode == Qt::Key_Asterisk) {
hgs
parents:
diff changeset
   138
                // asterisk is not localized
hgs
parents:
diff changeset
   139
                QChar asterisk('*');
48
hgs
parents: 46
diff changeset
   140
                button(i)->setPrimaryLabel(asterisk);
hgs
parents: 46
diff changeset
   141
                button(i)->setSecondaryLabel(QLatin1String("+"));
46
hgs
parents:
diff changeset
   142
                mGeneratedChar.insert(Qt::Key_Asterisk, asterisk);
hgs
parents:
diff changeset
   143
                continue;
hgs
parents:
diff changeset
   144
            }
hgs
parents:
diff changeset
   145
hgs
parents:
diff changeset
   146
            if (keyCode == Qt::Key_NumberSign) {
hgs
parents:
diff changeset
   147
                // number sign is not localized
hgs
parents:
diff changeset
   148
                QChar numberSign('#');
48
hgs
parents: 46
diff changeset
   149
                button(i)->setPrimaryLabel(numberSign);
46
hgs
parents:
diff changeset
   150
                mGeneratedChar.insert(Qt::Key_NumberSign, numberSign);
hgs
parents:
diff changeset
   151
                continue;
hgs
parents:
diff changeset
   152
            }
hgs
parents:
diff changeset
   153
hgs
parents:
diff changeset
   154
            int index = i;
hgs
parents:
diff changeset
   155
            if (keyCode==Qt::Key_0) {
hgs
parents:
diff changeset
   156
                index = i-1;
hgs
parents:
diff changeset
   157
            }
hgs
parents:
diff changeset
   158
hgs
parents:
diff changeset
   159
            const HbMappedKey *keyLabels =
hgs
parents:
diff changeset
   160
                keymap->keyForIndex(HbKeyboardVirtual12KeyLabels, index);
hgs
parents:
diff changeset
   161
hgs
parents:
diff changeset
   162
            //
hgs
parents:
diff changeset
   163
            // set digits
hgs
parents:
diff changeset
   164
            // todo: input digit depend on digit type setting
hgs
parents:
diff changeset
   165
            // QChar numberChar(QLocale::system().zeroDigit().unicode()+
hgs
parents:
diff changeset
   166
            //                 (keyCode-0x30));
hgs
parents:
diff changeset
   167
            //
hgs
parents:
diff changeset
   168
            QChar numberChar;
hgs
parents:
diff changeset
   169
            if (keyLabels && keyLabels->chars.count()>=1 &&
hgs
parents:
diff changeset
   170
                keyLabels->chars.at(0).length()) {
hgs
parents:
diff changeset
   171
                numberChar = keyLabels->chars.at(0).at(0);
hgs
parents:
diff changeset
   172
            } else {
hgs
parents:
diff changeset
   173
                // fallback to latin
hgs
parents:
diff changeset
   174
                numberChar = QChar(keyCode);
hgs
parents:
diff changeset
   175
            }
hgs
parents:
diff changeset
   176
48
hgs
parents: 46
diff changeset
   177
            button(i)->setPrimaryLabel(numberChar);
46
hgs
parents:
diff changeset
   178
            mGeneratedChar.insert(keyCode,numberChar);
hgs
parents:
diff changeset
   179
hgs
parents:
diff changeset
   180
            //
hgs
parents:
diff changeset
   181
            // set alphabets
hgs
parents:
diff changeset
   182
            //
hgs
parents:
diff changeset
   183
            if (keyLabels && keyLabels->chars.count()>=2) {
48
hgs
parents: 46
diff changeset
   184
                button(i)->setSecondaryLabel(keyLabels->chars.at(1));
46
hgs
parents:
diff changeset
   185
                if (keyLabels->chars.count()>=4) {
48
hgs
parents: 46
diff changeset
   186
                    button(i)->setSecondaryLabelRow2(keyLabels->chars.at(3));
46
hgs
parents:
diff changeset
   187
                } else {
48
hgs
parents: 46
diff changeset
   188
                    button(i)->setSecondaryLabelRow2(QString());
46
hgs
parents:
diff changeset
   189
                }
hgs
parents:
diff changeset
   190
            }
hgs
parents:
diff changeset
   191
        }
hgs
parents:
diff changeset
   192
hgs
parents:
diff changeset
   193
        updateButtonLabels();
hgs
parents:
diff changeset
   194
    }
hgs
parents:
diff changeset
   195
}
hgs
parents:
diff changeset
   196
hgs
parents:
diff changeset
   197
DialpadNumericButton* DialpadNumericButtonGrid::button(int i) const
hgs
parents:
diff changeset
   198
{
hgs
parents:
diff changeset
   199
    return static_cast<DialpadNumericButton*>(HbInputButtonGroup::button(i));
hgs
parents:
diff changeset
   200
}
hgs
parents:
diff changeset
   201
hgs
parents:
diff changeset
   202
void DialpadNumericButtonGrid::updateButtonLabels()
hgs
parents:
diff changeset
   203
{
hgs
parents:
diff changeset
   204
    // update numeric buttons according to button state (pressed/released)
hgs
parents:
diff changeset
   205
    updateIconColor();
hgs
parents:
diff changeset
   206
    updateTextLayouts(rect().size());
hgs
parents:
diff changeset
   207
    update();
hgs
parents:
diff changeset
   208
}
hgs
parents:
diff changeset
   209
hgs
parents:
diff changeset
   210
void DialpadNumericButtonGrid::paint(
hgs
parents:
diff changeset
   211
    QPainter* painter,
hgs
parents:
diff changeset
   212
    const QStyleOptionGraphicsItem* option,
hgs
parents:
diff changeset
   213
    QWidget* widget)
hgs
parents:
diff changeset
   214
{
hgs
parents:
diff changeset
   215
    Q_UNUSED(option);
hgs
parents:
diff changeset
   216
    Q_UNUSED(widget);
hgs
parents:
diff changeset
   217
hgs
parents:
diff changeset
   218
    // Paints empty buttons
hgs
parents:
diff changeset
   219
    HbInputButtonGroup::paint(painter,option,widget);
hgs
parents:
diff changeset
   220
hgs
parents:
diff changeset
   221
    qreal cellWidth = boundingRect().width() / gridSize().width();
hgs
parents:
diff changeset
   222
    qreal cellHeight = boundingRect().height() / gridSize().height();
hgs
parents:
diff changeset
   223
hgs
parents:
diff changeset
   224
    for (int i = 0; i < DialpadRowCount * DialpadColumnCount; i++) {
hgs
parents:
diff changeset
   225
        DialpadNumericButton *item = button(i);
hgs
parents:
diff changeset
   226
hgs
parents:
diff changeset
   227
        if (!item->icon().isNull()) {
hgs
parents:
diff changeset
   228
            // same as secondary text
hgs
parents:
diff changeset
   229
            qreal x = (item->position().x() * cellWidth) +
hgs
parents:
diff changeset
   230
                      (DialpadPrimaryTextLeftMargin * mUnit) +
hgs
parents:
diff changeset
   231
                      (DialpadPrimarySecondaryMargin * mUnit) +
hgs
parents:
diff changeset
   232
                      mMaxPrimaryLineWidth;
hgs
parents:
diff changeset
   233
            // top align with some margin
hgs
parents:
diff changeset
   234
            qreal y = item->position().y() * cellHeight + (cellHeight / 20.0);
hgs
parents:
diff changeset
   235
hgs
parents:
diff changeset
   236
            qreal width = item->icon().size().width();
hgs
parents:
diff changeset
   237
            qreal height = item->icon().size().height();
hgs
parents:
diff changeset
   238
hgs
parents:
diff changeset
   239
            Qt::Alignment alignment =
hgs
parents:
diff changeset
   240
                static_cast<Qt::Alignment>(Qt::AlignTop | Qt::AlignLeft);
hgs
parents:
diff changeset
   241
            item->icon().paint(painter,
hgs
parents:
diff changeset
   242
                               QRectF(x,y,width,height),
hgs
parents:
diff changeset
   243
                               Qt::KeepAspectRatio,
hgs
parents:
diff changeset
   244
                               alignment);
hgs
parents:
diff changeset
   245
        }                      
hgs
parents:
diff changeset
   246
    }
hgs
parents:
diff changeset
   247
hgs
parents:
diff changeset
   248
    // Draw texts
hgs
parents:
diff changeset
   249
    QPen origPen = painter->pen();
hgs
parents:
diff changeset
   250
    for (int i = 0; i < mTextLayouts.count(); ++i) {
hgs
parents:
diff changeset
   251
        if (i==SecondaryText) {
hgs
parents:
diff changeset
   252
            // dimmed in normal state
hgs
parents:
diff changeset
   253
            painter->setPen(mColors.at(Pressed+1));
hgs
parents:
diff changeset
   254
        } else {
hgs
parents:
diff changeset
   255
            // otherwise normal or pressed color
hgs
parents:
diff changeset
   256
            painter->setPen(mColors.at(i/TextTypeCount));
hgs
parents:
diff changeset
   257
        }
hgs
parents:
diff changeset
   258
        mTextLayouts.at(i)->draw(painter, QPointF(0, 0));
hgs
parents:
diff changeset
   259
    }
hgs
parents:
diff changeset
   260
    painter->setPen(origPen);
hgs
parents:
diff changeset
   261
}
hgs
parents:
diff changeset
   262
hgs
parents:
diff changeset
   263
void DialpadNumericButtonGrid::updateColorArray()
hgs
parents:
diff changeset
   264
{
hgs
parents:
diff changeset
   265
    mColors.clear();
hgs
parents:
diff changeset
   266
hgs
parents:
diff changeset
   267
    QColor normalColor = HbColorScheme::color("qtc_input_button_normal");
hgs
parents:
diff changeset
   268
    mColors.insert(Normal, normalColor);
hgs
parents:
diff changeset
   269
hgs
parents:
diff changeset
   270
    QColor pressedColor = HbColorScheme::color("qtc_input_button_pressed");
hgs
parents:
diff changeset
   271
    mColors.insert(Pressed, pressedColor);
hgs
parents:
diff changeset
   272
hgs
parents:
diff changeset
   273
    // this is used for alphabets shown dimmed, use alpha until exact color
hgs
parents:
diff changeset
   274
    // is specified
hgs
parents:
diff changeset
   275
    QColor disabledColor = HbColorScheme::color("qtc_input_button_normal");
51
hgs
parents: 48
diff changeset
   276
    disabledColor.setAlpha(DialpadSecondaryTextOpacity*256);
46
hgs
parents:
diff changeset
   277
    mColors.insert(Pressed+1, disabledColor);
hgs
parents:
diff changeset
   278
}
hgs
parents:
diff changeset
   279
hgs
parents:
diff changeset
   280
void DialpadNumericButtonGrid::updateIconColor()
hgs
parents:
diff changeset
   281
{
hgs
parents:
diff changeset
   282
    for (int i = 0; i < (DialpadRowCount * DialpadColumnCount); i++) {
hgs
parents:
diff changeset
   283
        DialpadNumericButton *item = button(i);
hgs
parents:
diff changeset
   284
hgs
parents:
diff changeset
   285
        if (item->state()==HbInputButton::ButtonStatePressed) {
hgs
parents:
diff changeset
   286
            item->icon().setColor(mColors.at(Pressed));
hgs
parents:
diff changeset
   287
        } else {
hgs
parents:
diff changeset
   288
            item->icon().setColor(mColors.at(Normal));
hgs
parents:
diff changeset
   289
        }
hgs
parents:
diff changeset
   290
    }
hgs
parents:
diff changeset
   291
}
hgs
parents:
diff changeset
   292
hgs
parents:
diff changeset
   293
void DialpadNumericButtonGrid::cancelButtonPress()
hgs
parents:
diff changeset
   294
{
hgs
parents:
diff changeset
   295
    HbInputButtonGroup::cancelButtonPress();
hgs
parents:
diff changeset
   296
    updateButtonLabels();
hgs
parents:
diff changeset
   297
}
hgs
parents:
diff changeset
   298
hgs
parents:
diff changeset
   299
hgs
parents:
diff changeset
   300
void DialpadNumericButtonGrid::setGeometry(const QRectF &rect)
hgs
parents:
diff changeset
   301
{
hgs
parents:
diff changeset
   302
    HbInputButtonGroup::setGeometry(rect);
hgs
parents:
diff changeset
   303
hgs
parents:
diff changeset
   304
    mUnit = HbDeviceProfile::profile(&mMainWindow).unitValue();
hgs
parents:
diff changeset
   305
hgs
parents:
diff changeset
   306
    updateTextLayouts(rect.size());
hgs
parents:
diff changeset
   307
hgs
parents:
diff changeset
   308
    updateIconSizes();
hgs
parents:
diff changeset
   309
}
hgs
parents:
diff changeset
   310
hgs
parents:
diff changeset
   311
void DialpadNumericButtonGrid::updateIconSizes()
hgs
parents:
diff changeset
   312
{
hgs
parents:
diff changeset
   313
    qreal width =  mMainWindow.orientation() == Qt::Vertical ?
hgs
parents:
diff changeset
   314
                   DialpadIconSizeV : DialpadIconSizeH;
hgs
parents:
diff changeset
   315
    width *= mUnit;
hgs
parents:
diff changeset
   316
hgs
parents:
diff changeset
   317
    for (int i = 0; i < DialpadRowCount * DialpadColumnCount; i++) {
hgs
parents:
diff changeset
   318
        DialpadNumericButton *item = button(i);
hgs
parents:
diff changeset
   319
hgs
parents:
diff changeset
   320
        if (!item->icon().isNull()) {
hgs
parents:
diff changeset
   321
            item->icon().setWidth(width);
hgs
parents:
diff changeset
   322
        }
hgs
parents:
diff changeset
   323
    }
hgs
parents:
diff changeset
   324
}
hgs
parents:
diff changeset
   325
hgs
parents:
diff changeset
   326
void DialpadNumericButtonGrid::changeEvent(QEvent *event)
hgs
parents:
diff changeset
   327
{
hgs
parents:
diff changeset
   328
    HbInputButtonGroup::changeEvent(event);
hgs
parents:
diff changeset
   329
hgs
parents:
diff changeset
   330
    if (event->type() == HbEvent::ThemeChanged) {
hgs
parents:
diff changeset
   331
        updateColorArray();
hgs
parents:
diff changeset
   332
        updateIconColor();
hgs
parents:
diff changeset
   333
    }
hgs
parents:
diff changeset
   334
}
hgs
parents:
diff changeset
   335
hgs
parents:
diff changeset
   336
void DialpadNumericButtonGrid::updateTextLayouts(const QSizeF &size)
hgs
parents:
diff changeset
   337
{
hgs
parents:
diff changeset
   338
    if (!size.width() && !size.height()) {
hgs
parents:
diff changeset
   339
        return;
hgs
parents:
diff changeset
   340
    }
hgs
parents:
diff changeset
   341
hgs
parents:
diff changeset
   342
    // get normal and pressed state texts
hgs
parents:
diff changeset
   343
    QList<QString> textContent;
hgs
parents:
diff changeset
   344
    bool useTwoRows;
hgs
parents:
diff changeset
   345
hgs
parents:
diff changeset
   346
    resolveTextContent(textContent, useTwoRows);
hgs
parents:
diff changeset
   347
hgs
parents:
diff changeset
   348
    // layout the texts
hgs
parents:
diff changeset
   349
    createTextLayouts(size, textContent, useTwoRows);
hgs
parents:
diff changeset
   350
}
hgs
parents:
diff changeset
   351
hgs
parents:
diff changeset
   352
void DialpadNumericButtonGrid::resolveTextContent(
hgs
parents:
diff changeset
   353
    QList<QString> &content, bool& useTwoRows)
hgs
parents:
diff changeset
   354
{
hgs
parents:
diff changeset
   355
    QString normalState;
hgs
parents:
diff changeset
   356
    QString normalStateSecondary;
hgs
parents:
diff changeset
   357
    QString pressedState;
hgs
parents:
diff changeset
   358
    QString pressedStateSecondary;
hgs
parents:
diff changeset
   359
hgs
parents:
diff changeset
   360
    useTwoRows = false;
hgs
parents:
diff changeset
   361
hgs
parents:
diff changeset
   362
    for (int i = 0; i < (DialpadRowCount*DialpadColumnCount); i++) {
hgs
parents:
diff changeset
   363
        DialpadNumericButton *item = button(i);
hgs
parents:
diff changeset
   364
        if (item->state()==HbInputButton::ButtonStatePressed) {
48
hgs
parents: 46
diff changeset
   365
            if (item->primaryLabel().length()) {
hgs
parents: 46
diff changeset
   366
                pressedState.append(item->primaryLabel());
46
hgs
parents:
diff changeset
   367
                pressedState.append(QChar(QChar::LineSeparator));
hgs
parents:
diff changeset
   368
            }
hgs
parents:
diff changeset
   369
48
hgs
parents: 46
diff changeset
   370
            if (item->secondaryLabel().length()) {
hgs
parents: 46
diff changeset
   371
                pressedStateSecondary.append(item->secondaryLabel());
46
hgs
parents:
diff changeset
   372
                pressedStateSecondary.append(QChar(QChar::LineSeparator));
48
hgs
parents: 46
diff changeset
   373
                if (item->secondaryLabelRow2().length()) {
hgs
parents: 46
diff changeset
   374
                    pressedStateSecondary.append(item->secondaryLabelRow2());
46
hgs
parents:
diff changeset
   375
                    pressedStateSecondary.append(QChar(QChar::LineSeparator));
hgs
parents:
diff changeset
   376
                    useTwoRows = true;
hgs
parents:
diff changeset
   377
                }
hgs
parents:
diff changeset
   378
            }
hgs
parents:
diff changeset
   379
        } else { // ButtonStateNormal
48
hgs
parents: 46
diff changeset
   380
            if (item->primaryLabel().length()) {
hgs
parents: 46
diff changeset
   381
                normalState.append(item->primaryLabel());
46
hgs
parents:
diff changeset
   382
                normalState.append(QChar(QChar::LineSeparator));
hgs
parents:
diff changeset
   383
            }
hgs
parents:
diff changeset
   384
48
hgs
parents: 46
diff changeset
   385
            if (item->secondaryLabel().length()) {
hgs
parents: 46
diff changeset
   386
                normalStateSecondary.append(item->secondaryLabel());
46
hgs
parents:
diff changeset
   387
                normalStateSecondary.append(QChar(QChar::LineSeparator));
48
hgs
parents: 46
diff changeset
   388
                if (item->secondaryLabelRow2().length()) {
hgs
parents: 46
diff changeset
   389
                    normalStateSecondary.append(item->secondaryLabelRow2());
46
hgs
parents:
diff changeset
   390
                    normalStateSecondary.append(QChar(QChar::LineSeparator));
hgs
parents:
diff changeset
   391
                    useTwoRows = true;
hgs
parents:
diff changeset
   392
                }
hgs
parents:
diff changeset
   393
            }
hgs
parents:
diff changeset
   394
        }
hgs
parents:
diff changeset
   395
    }
hgs
parents:
diff changeset
   396
hgs
parents:
diff changeset
   397
    content.insert(PrimaryText, normalState);
hgs
parents:
diff changeset
   398
    content.insert(SecondaryText, normalStateSecondary);
hgs
parents:
diff changeset
   399
    content.insert(TextTypeCount + Pressed, pressedState);
hgs
parents:
diff changeset
   400
    content.insert(StateCount + SecondaryText, pressedStateSecondary);
hgs
parents:
diff changeset
   401
}
hgs
parents:
diff changeset
   402
hgs
parents:
diff changeset
   403
void DialpadNumericButtonGrid::createTextLayouts(
hgs
parents:
diff changeset
   404
    const QSizeF &size, const QList<QString> &content, bool useTwoRows)
hgs
parents:
diff changeset
   405
{
hgs
parents:
diff changeset
   406
    // clear old layouts
hgs
parents:
diff changeset
   407
    qDeleteAll(mTextLayouts);
hgs
parents:
diff changeset
   408
    mTextLayouts.clear();
hgs
parents:
diff changeset
   409
hgs
parents:
diff changeset
   410
    if(!isButtonPressed()) {
hgs
parents:
diff changeset
   411
        mMaxPrimaryLineWidth = 0;
hgs
parents:
diff changeset
   412
    }
hgs
parents:
diff changeset
   413
hgs
parents:
diff changeset
   414
    QFont primaryFont = HbFontSpec(HbFontSpec::Primary).font();
hgs
parents:
diff changeset
   415
    qreal primarySize = mMainWindow.orientation() == Qt::Vertical ?
hgs
parents:
diff changeset
   416
                     DialpadPrimaryTextSizeV :
hgs
parents:
diff changeset
   417
                     DialpadPrimaryTextSizeH;
hgs
parents:
diff changeset
   418
    primaryFont.setPixelSize(primarySize * mUnit);
hgs
parents:
diff changeset
   419
hgs
parents:
diff changeset
   420
    QFont secondaryFont = HbFontSpec(HbFontSpec::Secondary).font();
hgs
parents:
diff changeset
   421
    if (useTwoRows) {
hgs
parents:
diff changeset
   422
        qreal secondarySize = mMainWindow.orientation() == Qt::Vertical ?
hgs
parents:
diff changeset
   423
                         DialpadSecondaryTextSize2RowsV :
hgs
parents:
diff changeset
   424
                         DialpadSecondaryTextSize2RowsH;
hgs
parents:
diff changeset
   425
        secondaryFont.setPixelSize(secondarySize * mUnit);
hgs
parents:
diff changeset
   426
    } else {
hgs
parents:
diff changeset
   427
        qreal secondarySize = mMainWindow.orientation() == Qt::Vertical ?
hgs
parents:
diff changeset
   428
                         DialpadSecondaryTextSizeV :
hgs
parents:
diff changeset
   429
                         DialpadSecondaryTextSizeH;
hgs
parents:
diff changeset
   430
        secondaryFont.setPixelSize(secondarySize * mUnit);
hgs
parents:
diff changeset
   431
    }
hgs
parents:
diff changeset
   432
hgs
parents:
diff changeset
   433
    for (int i=0; i < (StateCount*TextTypeCount); i++ ) {
hgs
parents:
diff changeset
   434
        QString text = content.at(i);
hgs
parents:
diff changeset
   435
hgs
parents:
diff changeset
   436
        if (!text.isNull()) {
hgs
parents:
diff changeset
   437
            QTextLayout* textLayout;
hgs
parents:
diff changeset
   438
            int type;
hgs
parents:
diff changeset
   439
hgs
parents:
diff changeset
   440
            if (i%TextTypeCount) {
hgs
parents:
diff changeset
   441
                textLayout = new QTextLayout(text,secondaryFont);
hgs
parents:
diff changeset
   442
                type = SecondaryText;
hgs
parents:
diff changeset
   443
            } else {
hgs
parents:
diff changeset
   444
                textLayout = new QTextLayout(text,primaryFont);
hgs
parents:
diff changeset
   445
                type = PrimaryText;
hgs
parents:
diff changeset
   446
            }
hgs
parents:
diff changeset
   447
hgs
parents:
diff changeset
   448
            mTextLayouts.append(textLayout);
hgs
parents:
diff changeset
   449
hgs
parents:
diff changeset
   450
            textLayout->beginLayout();
hgs
parents:
diff changeset
   451
hgs
parents:
diff changeset
   452
            int state = (i>=TextTypeCount) ? Pressed : Normal;
hgs
parents:
diff changeset
   453
hgs
parents:
diff changeset
   454
            layoutTextLines(size,*textLayout,state,type,useTwoRows);
hgs
parents:
diff changeset
   455
hgs
parents:
diff changeset
   456
            textLayout->endLayout();
hgs
parents:
diff changeset
   457
hgs
parents:
diff changeset
   458
            textLayout->setCacheEnabled(true);
hgs
parents:
diff changeset
   459
        }
hgs
parents:
diff changeset
   460
    }
hgs
parents:
diff changeset
   461
}
hgs
parents:
diff changeset
   462
hgs
parents:
diff changeset
   463
void DialpadNumericButtonGrid::layoutTextLines(
hgs
parents:
diff changeset
   464
    const QSizeF &size,
hgs
parents:
diff changeset
   465
    QTextLayout &textLayout,
hgs
parents:
diff changeset
   466
    int state,
hgs
parents:
diff changeset
   467
    int type,
hgs
parents:
diff changeset
   468
    bool useTwoRows)
hgs
parents:
diff changeset
   469
{
hgs
parents:
diff changeset
   470
    QFontMetricsF fontMetrics(textLayout.font());
hgs
parents:
diff changeset
   471
    qreal textHeight = fontMetrics.height();
hgs
parents:
diff changeset
   472
    qreal textDescent = fontMetrics.descent();
hgs
parents:
diff changeset
   473
hgs
parents:
diff changeset
   474
    qreal cellWidth = size.width() / gridSize().width();
hgs
parents:
diff changeset
   475
    qreal cellHeight = size.height() / gridSize().height();
hgs
parents:
diff changeset
   476
    qreal maxLineWidth = 0;
hgs
parents:
diff changeset
   477
hgs
parents:
diff changeset
   478
    for (int j = 0; j < (DialpadRowCount*DialpadColumnCount); j++) {
hgs
parents:
diff changeset
   479
        DialpadNumericButton *item = button(j);
hgs
parents:
diff changeset
   480
48
hgs
parents: 46
diff changeset
   481
        if ((type==PrimaryText && item->primaryLabel().isNull()) ||
hgs
parents: 46
diff changeset
   482
            (type==SecondaryText && item->secondaryLabel().isNull())) {
46
hgs
parents:
diff changeset
   483
            continue; // no text for this button -> next button
hgs
parents:
diff changeset
   484
        }
hgs
parents:
diff changeset
   485
hgs
parents:
diff changeset
   486
        if ( ( state==Normal &&
hgs
parents:
diff changeset
   487
               item->state()==HbInputButton::ButtonStateReleased ) ||
hgs
parents:
diff changeset
   488
             ( state==Pressed &&
hgs
parents:
diff changeset
   489
               item->state()==HbInputButton::ButtonStatePressed ) ) {
hgs
parents:
diff changeset
   490
            // layout text line
hgs
parents:
diff changeset
   491
            if (type==SecondaryText) {
hgs
parents:
diff changeset
   492
                layoutSecondaryText(textLayout,*item,cellWidth,
hgs
parents:
diff changeset
   493
                                    cellHeight,textHeight,textDescent,
hgs
parents:
diff changeset
   494
                                    useTwoRows);
hgs
parents:
diff changeset
   495
            } else {
hgs
parents:
diff changeset
   496
                layoutPrimaryText(textLayout,*item,cellWidth,
hgs
parents:
diff changeset
   497
                                  cellHeight,textHeight);
hgs
parents:
diff changeset
   498
hgs
parents:
diff changeset
   499
                // store line width, for drawing secondary text
48
hgs
parents: 46
diff changeset
   500
                qreal lineWidth = fontMetrics.width(item->primaryLabel());
46
hgs
parents:
diff changeset
   501
                if (mMaxPrimaryLineWidth == 0 && (j>0 && j<10) &&
hgs
parents:
diff changeset
   502
                    lineWidth > maxLineWidth) {
hgs
parents:
diff changeset
   503
                    maxLineWidth = lineWidth;
hgs
parents:
diff changeset
   504
                    mPrimaryTextBaseline = textHeight/2 - textDescent;
hgs
parents:
diff changeset
   505
                }
hgs
parents:
diff changeset
   506
            }
hgs
parents:
diff changeset
   507
        }
hgs
parents:
diff changeset
   508
    }
hgs
parents:
diff changeset
   509
hgs
parents:
diff changeset
   510
    if (maxLineWidth!=0) {
hgs
parents:
diff changeset
   511
        mMaxPrimaryLineWidth = maxLineWidth;
hgs
parents:
diff changeset
   512
    }
hgs
parents:
diff changeset
   513
}
hgs
parents:
diff changeset
   514
hgs
parents:
diff changeset
   515
void DialpadNumericButtonGrid::layoutPrimaryText(
hgs
parents:
diff changeset
   516
    QTextLayout& layout,
hgs
parents:
diff changeset
   517
    DialpadNumericButton& button,
hgs
parents:
diff changeset
   518
    qreal cellWidth,
hgs
parents:
diff changeset
   519
    qreal cellHeight,
hgs
parents:
diff changeset
   520
    qreal textHeight) const
hgs
parents:
diff changeset
   521
{
hgs
parents:
diff changeset
   522
    QTextLine line = layout.createLine();
48
hgs
parents: 46
diff changeset
   523
    line.setNumColumns(button.primaryLabel().length());
46
hgs
parents:
diff changeset
   524
    qreal textPositionX = (button.position().x() * cellWidth) +
hgs
parents:
diff changeset
   525
                    (DialpadPrimaryTextLeftMargin * mUnit)
hgs
parents:
diff changeset
   526
                    + buttonBorderSize();
hgs
parents:
diff changeset
   527
    qreal textPositionY = (button.position().y() +
hgs
parents:
diff changeset
   528
                    (0.5 * button.size().height())) *
hgs
parents:
diff changeset
   529
                    cellHeight - (0.5 * textHeight);
hgs
parents:
diff changeset
   530
    line.setPosition(QPointF(textPositionX, textPositionY));
hgs
parents:
diff changeset
   531
}
hgs
parents:
diff changeset
   532
hgs
parents:
diff changeset
   533
void DialpadNumericButtonGrid::layoutSecondaryText(
hgs
parents:
diff changeset
   534
    QTextLayout& layout,
hgs
parents:
diff changeset
   535
    DialpadNumericButton& button,
hgs
parents:
diff changeset
   536
    qreal cellWidth,
hgs
parents:
diff changeset
   537
    qreal cellHeight,
hgs
parents:
diff changeset
   538
    qreal textHeight,
hgs
parents:
diff changeset
   539
    qreal textDescent,
hgs
parents:
diff changeset
   540
    bool useTwoRows) const
hgs
parents:
diff changeset
   541
{
hgs
parents:
diff changeset
   542
    qreal textPositionX;
hgs
parents:
diff changeset
   543
    qreal textPositionY;
hgs
parents:
diff changeset
   544
hgs
parents:
diff changeset
   545
    QTextLine line = layout.createLine();
hgs
parents:
diff changeset
   546
hgs
parents:
diff changeset
   547
    if (useTwoRows) {
48
hgs
parents: 46
diff changeset
   548
        line.setNumColumns(button.secondaryLabel().length());
46
hgs
parents:
diff changeset
   549
hgs
parents:
diff changeset
   550
        textPositionX = (button.position().x() * cellWidth) +
hgs
parents:
diff changeset
   551
                        (DialpadPrimaryTextLeftMargin * mUnit) +
hgs
parents:
diff changeset
   552
                        mMaxPrimaryLineWidth +
hgs
parents:
diff changeset
   553
                        (DialpadPrimarySecondaryMargin * mUnit)
hgs
parents:
diff changeset
   554
                        + buttonBorderSize();
hgs
parents:
diff changeset
   555
48
hgs
parents: 46
diff changeset
   556
        if (button.secondaryLabelRow2().length()) {
46
hgs
parents:
diff changeset
   557
            textPositionY = (button.position().y() +
hgs
parents:
diff changeset
   558
                            (0.5 * button.size().height())) *
hgs
parents:
diff changeset
   559
                            cellHeight;
hgs
parents:
diff changeset
   560
hgs
parents:
diff changeset
   561
            QTextLine line2 = layout.createLine();
48
hgs
parents: 46
diff changeset
   562
            line2.setNumColumns(button.secondaryLabelRow2().length());
46
hgs
parents:
diff changeset
   563
            line2.setPosition(QPointF(textPositionX,textPositionY-textHeight));
hgs
parents:
diff changeset
   564
        } else {
hgs
parents:
diff changeset
   565
            textPositionY = (button.position().y() +
hgs
parents:
diff changeset
   566
                            (0.5 * button.size().height())) *
hgs
parents:
diff changeset
   567
                            cellHeight - (0.5 * textHeight);
hgs
parents:
diff changeset
   568
        }
hgs
parents:
diff changeset
   569
    } else {
48
hgs
parents: 46
diff changeset
   570
        line.setNumColumns(button.secondaryLabel().length());
46
hgs
parents:
diff changeset
   571
        textPositionX = (button.position().x() * cellWidth) +
hgs
parents:
diff changeset
   572
                        (DialpadPrimaryTextLeftMargin * mUnit) +
hgs
parents:
diff changeset
   573
                        mMaxPrimaryLineWidth +
hgs
parents:
diff changeset
   574
                        (DialpadPrimarySecondaryMargin * mUnit)
hgs
parents:
diff changeset
   575
                        + buttonBorderSize();
hgs
parents:
diff changeset
   576
        textPositionY = (button.position().y() +
hgs
parents:
diff changeset
   577
                        (0.5 * button.size().height())) *
hgs
parents:
diff changeset
   578
                        cellHeight + mPrimaryTextBaseline -
hgs
parents:
diff changeset
   579
                        (textHeight - textDescent);
hgs
parents:
diff changeset
   580
    }
hgs
parents:
diff changeset
   581
    line.setPosition(QPointF(textPositionX, textPositionY));
hgs
parents:
diff changeset
   582
}
hgs
parents:
diff changeset
   583
hgs
parents:
diff changeset
   584
bool DialpadNumericButtonGrid::isButtonPressed() const
hgs
parents:
diff changeset
   585
{
hgs
parents:
diff changeset
   586
    bool pressed = false;
hgs
parents:
diff changeset
   587
hgs
parents:
diff changeset
   588
    for (int i = 0; i < (DialpadRowCount*DialpadColumnCount); i++) {
hgs
parents:
diff changeset
   589
        if (button(i)->state()==HbInputButton::ButtonStatePressed) {
hgs
parents:
diff changeset
   590
            pressed = true;
hgs
parents:
diff changeset
   591
            break;
hgs
parents:
diff changeset
   592
        }
hgs
parents:
diff changeset
   593
    }
hgs
parents:
diff changeset
   594
hgs
parents:
diff changeset
   595
    return pressed;
hgs
parents:
diff changeset
   596
}