UBKeyboardPalette.cpp 17 KB
Newer Older
1 2 3 4 5 6
/*
 * UBKeyboardPalette.cpp
 *
 *  Created on: Feb 10, 2011
 *      Author: tolik
 */
Claudio Valerio's avatar
Claudio Valerio committed
7 8 9 10 11 12 13 14

#include <QtGui>
#include <QList>
#include <QSize>

#include "UBKeyboardPalette.h"
#include "core/UBSettings.h"

15 16
#include "core/UBApplication.h"
#include "gui/UBMainWindow.h"
17 18 19

#include "core/memcheck.h"

Claudio Valerio's avatar
Claudio Valerio committed
20 21
/*

22
            UBKeyboardPalette
Claudio Valerio's avatar
Claudio Valerio committed
23 24

*/
25 26


Claudio Valerio's avatar
Claudio Valerio committed
27
UBKeyboardPalette::UBKeyboardPalette(QWidget *parent)
28
        : UBActionPalette(Qt::TopRightCorner, parent)
Claudio Valerio's avatar
Claudio Valerio committed
29
{
30 31 32

  //  setWindowFlags(/*Qt::CustomizeWindowHint|*/Qt::WindowStaysOnTopHint|Qt::FramelessWindowHint);

33
    setCustomCloseProcessing(true);
34 35 36
    setCustomPosition(true);
    setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
    setFocusPolicy(Qt::NoFocus);
37 38 39
    setClosable(true);
    setGrip(false);

40 41 42 43
    capsLock = false;
    languagePopupActive = false;
    keyboardActive = false;
    btnWidth = btnHeight = 16;
44 45
    strSize = "16x16";
    currBtnImages = new BTNImages("16", btnWidth, btnHeight);
Claudio Valerio's avatar
Claudio Valerio committed
46

47 48 49 50 51
    buttons = new UBKeyButton*[47];
    for (int i=0; i<47; i++)
    {
        buttons[i] = new UBKeyButton(this);
    }
Claudio Valerio's avatar
Claudio Valerio committed
52

53
    locales = UBPlatformUtils::getKeyboardLayouts(this->nLocalesCount);
Claudio Valerio's avatar
Claudio Valerio committed
54

55
    createCtrlButtons();
Claudio Valerio's avatar
Claudio Valerio committed
56

57
    nCurrentLocale = UBSettings::settings()->KeyboardLocale->get().toInt();
58
    setInput(locales[nCurrentLocale]);
Claudio Valerio's avatar
Claudio Valerio committed
59

60
    setContentsMargins( 22, 22, 22, 22 );
Claudio Valerio's avatar
Claudio Valerio committed
61

62
    init();
Claudio Valerio's avatar
Claudio Valerio committed
63 64
}

65 66
//QList<UBKeyboardPalette*> UBKeyboardPalette::instances;
void UBKeyboardPalette::init()
Claudio Valerio's avatar
Claudio Valerio committed
67
{
68 69
    m_isVisible = false;
    setVisible(false);
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
70

71
    setKeyButtonSize(UBSettings::settings()->boardKeyboardPaletteKeyBtnSize->get().toString());
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
72

73 74 75 76
    connect(this, SIGNAL(keyboardActivated(bool)), this, SLOT(onActivated(bool)));
    connect(UBSettings::settings()->boardKeyboardPaletteKeyBtnSize, SIGNAL(changed(QVariant)), this, SLOT(keyboardPaletteButtonSizeChanged(QVariant)));
    connect(UBApplication::mainWindow->actionVirtualKeyboard, SIGNAL(triggered(bool)), this, SLOT(showKeyboard(bool)));
    connect(this, SIGNAL(closed()), this, SLOT(hideKeyboard()));
Claudio Valerio's avatar
Claudio Valerio committed
77

Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
78 79
    //------------------------------//

80
    UBPlatformUtils::setWindowNonActivableFlag(this, true);
Claudio Valerio's avatar
Claudio Valerio committed
81 82
}

Ivan Ilin's avatar
Ivan Ilin committed
83 84 85 86
void UBKeyboardPalette::showKeyboard(bool show)
{
    m_isVisible = show;
}
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
87 88


89 90
void UBKeyboardPalette::hideKeyboard()
{
91
    UBApplication::mainWindow->actionVirtualKeyboard->activate(QAction::Trigger);
92 93
}

Claudio Valerio's avatar
Claudio Valerio committed
94 95
void UBKeyboardPalette::syncPosition(const QPoint & pos)
{
Anatoly Mihalchenko's avatar
Anatoly Mihalchenko committed
96
    m_pos = pos;
97
    move(pos);
Claudio Valerio's avatar
Claudio Valerio committed
98 99 100 101
}

void UBKeyboardPalette::syncLocale(int nLocale)
{
102 103
    nCurrentLocale = nLocale;
    setInput(locales[nCurrentLocale]);
Claudio Valerio's avatar
Claudio Valerio committed
104 105 106 107
}

void UBKeyboardPalette::keyboardPaletteButtonSizeChanged(QVariant size)
{
108
    setKeyButtonSize(size.toString());
Claudio Valerio's avatar
Claudio Valerio committed
109 110 111 112
}

void UBKeyboardPalette::setInput(const UBKeyboardLocale* locale)
{
113 114 115 116 117 118 119 120 121
    if (locale!=NULL)
    {
        for (int i=0; i<47; i++)
            buttons[i]->setKeyBt((*locale)[i]);
    }
    else
    {
        this->hide();
    }
Claudio Valerio's avatar
Claudio Valerio committed
122 123 124 125
}

UBKeyboardPalette::~UBKeyboardPalette()
{
126 127
    //for (int i=0; i<47; i++)
    //    delete buttons[i];
128
    delete [] buttons;
Claudio Valerio's avatar
Claudio Valerio committed
129

130 131
    //for (int i=0; i<8; i++)
    //    delete ctrlButtons[i];
132
    delete [] ctrlButtons;
Claudio Valerio's avatar
Claudio Valerio committed
133

134 135 136 137 138 139
    //if (locales!=NULL)
    //{
    //    for (int i=0; i<nLocalesCount; i++)
    //        delete locales[i];
    //    delete [] locales;
    //}
140 141 142 143 144 145

    if(currBtnImages != NULL)
    {
        delete currBtnImages;
        currBtnImages = NULL;
    }
Claudio Valerio's avatar
Claudio Valerio committed
146 147 148 149
}

QSize  UBKeyboardPalette::sizeHint () const
{
150 151 152
    int w = contentsMargins().left() + 15 * btnWidth + contentsMargins().right();
    int h = contentsMargins().top() + 5 * btnHeight + contentsMargins().bottom();
    return QSize(w, h);
Claudio Valerio's avatar
Claudio Valerio committed
153 154 155 156
}

const QString* UBKeyboardPalette::getLocaleName()
{
157
    return locales == NULL ? NULL : &(locales[nCurrentLocale]->name);
Claudio Valerio's avatar
Claudio Valerio committed
158 159 160 161
}

void UBKeyboardPalette::setLocale(int nLocale)
{
162
    if (locales != NULL)
163 164
    {
        nCurrentLocale = nLocale;
Claudio Valerio's avatar
Claudio Valerio committed
165

166 167 168
        setInput(locales[nCurrentLocale]);
        onLocaleChanged(locales[nCurrentLocale]);
        update();
169 170

		UBSettings::settings()->KeyboardLocale->set(nCurrentLocale);
171 172
    }
    emit localeChanged(nLocale);
Claudio Valerio's avatar
Claudio Valerio committed
173 174
}

175
void UBKeyboardPalette::setKeyButtonSize(const QString& _strSize)
Claudio Valerio's avatar
Claudio Valerio committed
176
{
177
    QStringList strs = _strSize.split('x');
178 179 180

    if (strs.size()==2)
    {
181
        strSize = _strSize;
182 183
        btnWidth = strs[0].toInt();
        btnHeight = strs[1].toInt();
Claudio Valerio's avatar
Claudio Valerio committed
184

185 186 187
        if(currBtnImages != NULL)
            delete currBtnImages;
        currBtnImages = new BTNImages(strs[1], btnWidth, btnHeight);
Claudio Valerio's avatar
Claudio Valerio committed
188

189 190
        adjustSizeAndPosition();
    }
Claudio Valerio's avatar
Claudio Valerio committed
191 192 193 194
}

void UBKeyboardPalette::enterEvent ( QEvent * )
{
195 196
    if (keyboardActive)
        return;
Claudio Valerio's avatar
Claudio Valerio committed
197

198
    keyboardActive = true;
Claudio Valerio's avatar
Claudio Valerio committed
199

200
    adjustSizeAndPosition();
Claudio Valerio's avatar
Claudio Valerio committed
201

202
    emit keyboardActivated(true);
Claudio Valerio's avatar
Claudio Valerio committed
203 204 205 206
}

void UBKeyboardPalette::leaveEvent ( QEvent * )
{
207
    if (languagePopupActive || !keyboardActive || mIsMoving)
208
        return;
Claudio Valerio's avatar
Claudio Valerio committed
209

210
    keyboardActive = false;
Claudio Valerio's avatar
Claudio Valerio committed
211

212
    adjustSizeAndPosition();
Claudio Valerio's avatar
Claudio Valerio committed
213

214
    emit keyboardActivated(false);
Claudio Valerio's avatar
Claudio Valerio committed
215 216 217 218
}

void  UBKeyboardPalette::moveEvent ( QMoveEvent * event )
{
219
    UBActionPalette::moveEvent(event);
220
    emit moved(event->pos());
Claudio Valerio's avatar
Claudio Valerio committed
221 222 223 224
}

void UBKeyboardPalette::adjustSizeAndPosition(bool pUp)
{
225 226 227 228 229
    QSize rSize = sizeHint();
    if (rSize != size())
    {
        int dx = (rSize.width() - size().width()) /2;
        int dy = rSize.height() - size().height();
Claudio Valerio's avatar
Claudio Valerio committed
230

231 232 233
        this->move(x()-dx, y() - dy);
        this->resize(rSize.width(), rSize.height());
    }
234
    UBActionPalette::adjustSizeAndPosition(pUp);
Claudio Valerio's avatar
Claudio Valerio committed
235 236 237 238
}

void  UBKeyboardPalette::paintEvent( QPaintEvent* event)
{
239
    UBActionPalette::paintEvent(event);
240 241 242 243 244 245

    QRect r = this->geometry();

    int lleft, ltop, lright, lbottom;
    getContentsMargins ( &lleft, &ltop, &lright, &lbottom ) ;

246 247 248 249 250 251
    //------------------------------------------------
    // calculate start offset from left, and from top

    int ctrlButtonsId = 0;
    lleft = ( r.width() - btnWidth * 15 ) / 2;
    ltop = ( r.height() - btnHeight * 5 ) / 2;
252

253 254
    //------------------------------------------------
    // set geometry (position) for row 1
255

256 257 258 259 260 261
    int offX = lleft;
    int offY = ltop;

    //-------------------

    // buttons [`]..[+]
262 263
    for (int i = 0; i<13; i++)
    {
264 265
        buttons[i]->setGeometry(offX, offY, btnWidth, btnHeight);
        offX += btnWidth;
266
    }
267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286

    // button Backspace
    ctrlButtons[ctrlButtonsId++]->setGeometry(offX, offY, btnWidth * 2, btnHeight);
    offX += btnWidth * 2;

    //------------------------------------------------
    // set geometry (position) for row 2

    offX = lleft;
    offY += btnHeight;
    offX += btnWidth / 2;

    //-------------------

    // button Tab
    ctrlButtons[ctrlButtonsId++]->setGeometry(offX, offY, btnWidth * 2, btnHeight);
    offX += btnWidth * 2;

    // buttons [q]..[]]
    for (int i = 0; i<12; i++)
287
    {
288 289
        buttons[i + 13]->setGeometry(offX, offY, btnWidth, btnHeight);
        offX += btnWidth;
290 291
    }

292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309
//     // Row 2 Stub
//     ctrlButtons[ctrlButtonsId++]->setGeometry(offX, offY, btnWidth * 1.5, btnHeight);
//     offX += btnWidth * 1.5;

    //------------------------------------------------
    // set geometry (position) for row 3

    offX = lleft;
    offY += btnHeight;

    //-------------------

//     // Row 3 Stub
//     ctrlButtons[ctrlButtonsId++]->setGeometry(offX, offY, btnWidth, btnHeight);
//    offX += btnWidth;

    // buttons [a]..[\]
    for (int i = 0; i < 12; i++)
310
    {
311 312
        buttons[i + 12 + 13]->setGeometry(offX, offY, btnWidth, btnHeight);
        offX += btnWidth;
313
    }
314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331

    // button Enter
    ctrlButtons[ctrlButtonsId++]->setGeometry(offX, offY, btnWidth * 3, btnHeight);
    offX += btnWidth*3;

    //------------------------------------------------
    // set geometry (position) for row 4

    offX = lleft;
    offY += btnHeight;

    //-------------------

    // button LCapsLock
    ctrlButtons[ctrlButtonsId++]->setGeometry(offX, offY, btnWidth*2.5, btnHeight);
    offX += btnWidth*2.5;

    for (int i = 0; i < 10; i++)
332
    {
333 334
        buttons[i + 12 + 12 + 13]->setGeometry(offX, offY, btnWidth, btnHeight);
        offX += btnWidth;
335 336
    }

337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353
    // button RCapsLock
    ctrlButtons[ctrlButtonsId++]->setGeometry(offX, offY, btnWidth*2.5, btnHeight);
    offX += btnWidth*2.5;

    //------------------------------------------------
    // set geometry (position) for row 5

    offX = lleft;
    offY += btnHeight;

    //-------------------

    ctrlButtons[ctrlButtonsId++]->setGeometry(offX + btnWidth * 1 , offY, btnWidth * 2, btnHeight);
    ctrlButtons[ctrlButtonsId++]->setGeometry(offX + btnWidth * 3 , offY, btnWidth * 9, btnHeight);
    ctrlButtons[ctrlButtonsId++]->setGeometry(offX + btnWidth * 12, offY, btnWidth * 2, btnHeight);

    //------------------------------------------------
Claudio Valerio's avatar
Claudio Valerio committed
354 355 356
}


357 358 359
//-----------------------------------------------------------------------//
// BTNImages Class
//-----------------------------------------------------------------------//
Claudio Valerio's avatar
Claudio Valerio committed
360

361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385
BTNImages::BTNImages(QString strHeight, int width, int height)
{
    m_strHeight = strHeight;
    m_width = width;
    m_height = height;

    m_strLeftPassive    = ":/images/virtual.keyboard/" + strHeight + "/left-passive.png";
    m_strCenterPassive  = ":/images/virtual.keyboard/" + strHeight + "/centre-passive.png";
    m_strRightPassive   = ":/images/virtual.keyboard/" + strHeight + "/right-passive.png";
    m_strLeftActive     = ":/images/virtual.keyboard/" + strHeight + "/left-active.png";
    m_strCenterActive   = ":/images/virtual.keyboard/" + strHeight + "/centre-active.png";
    m_strRightActive    = ":/images/virtual.keyboard/" + strHeight + "/right-active.png";

    m_btnLeftPassive    = QImage(m_strLeftPassive);
    m_btnCenterPassive  = QImage(m_strCenterPassive);
    m_btnRightPassive   = QImage(m_strRightPassive);
    m_btnLeftActive     = QImage(m_strLeftActive);
    m_btnCenterActive   = QImage(m_strCenterActive);
    m_btnRightActive    = QImage(m_strRightActive);
}

ContentImage::ContentImage(QString strHeight, int height, QString strContentName)
{
    m_strHeight = strHeight;
    m_height = height;
Claudio Valerio's avatar
Claudio Valerio committed
386

387 388 389 390 391 392 393 394 395
    m_strContent = ":/images/virtual.keyboard/" + strHeight + "/" + strContentName + ".png";
    m_btnContent = QImage(m_strContent);
}

//-----------------------------------------------------------------------//
// UBKeyboardButton Class
//-----------------------------------------------------------------------//

UBKeyboardButton::UBKeyboardButton(UBKeyboardPalette* parent, QString contentImagePath = "")
396 397 398 399
        :QWidget(parent),
        keyboard(parent),
        bFocused(false),
        bPressed(false)
Claudio Valerio's avatar
Claudio Valerio committed
400
{
401 402 403 404 405
    m_parent = parent;

    m_contentImagePath = contentImagePath;
    imgContent = NULL;

406
    setCursor(Qt::PointingHandCursor);
Claudio Valerio's avatar
Claudio Valerio committed
407 408 409
}

UBKeyboardButton::~UBKeyboardButton()
410 411 412 413 414 415 416
{
    if(imgContent != NULL)
    {
        delete imgContent;
        imgContent = NULL;
    }
}
Claudio Valerio's avatar
Claudio Valerio committed
417 418 419

void UBKeyboardButton::paintEvent(QPaintEvent*)
{
420

421 422
    QPainter painter(this);

423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439
    //--------------------------

    if(imgContent != NULL)
    {
        if(imgContent->m_height != m_parent->currBtnImages->m_height)
        {
            delete imgContent;
            if(!m_contentImagePath.isEmpty())
                imgContent = new ContentImage(m_parent->currBtnImages->m_strHeight, m_parent->currBtnImages->m_height, m_contentImagePath);
        }
    }
    else
    if(!m_contentImagePath.isEmpty())
        imgContent = new ContentImage(m_parent->currBtnImages->m_strHeight, m_parent->currBtnImages->m_height, m_contentImagePath);

    //--------------------------

440
    if (bPressed)
441 442 443 444 445 446 447 448 449 450 451
    {
        painter.drawImage( 0,0, m_parent->currBtnImages->m_btnLeftActive, 0,0, m_parent->currBtnImages->m_btnLeftActive.width(), m_parent->currBtnImages->m_btnLeftActive.height() );
        painter.drawImage( QRect(m_parent->currBtnImages->m_btnLeftActive.width(), 0, width() - m_parent->currBtnImages->m_btnLeftActive.width() - m_parent->currBtnImages->m_btnRightActive.width(), height()), m_parent->currBtnImages->m_btnCenterActive );
        painter.drawImage( width() - m_parent->currBtnImages->m_btnRightActive.width(), 0, m_parent->currBtnImages->m_btnRightActive, 0,0, m_parent->currBtnImages->m_btnRightActive.width(), m_parent->currBtnImages->m_btnRightActive.height() );
    }
    else
    {
        painter.drawImage( 0,0, m_parent->currBtnImages->m_btnLeftPassive, 0,0, m_parent->currBtnImages->m_btnLeftPassive.width(), m_parent->currBtnImages->m_btnLeftPassive.height() );
        painter.drawImage( QRect(m_parent->currBtnImages->m_btnLeftPassive.width(), 0, width() - m_parent->currBtnImages->m_btnLeftPassive.width() - m_parent->currBtnImages->m_btnRightPassive.width(), height()), m_parent->currBtnImages->m_btnCenterPassive );
        painter.drawImage( width() - m_parent->currBtnImages->m_btnRightPassive.width(), 0, m_parent->currBtnImages->m_btnRightPassive, 0,0, m_parent->currBtnImages->m_btnRightPassive.width(), m_parent->currBtnImages->m_btnRightPassive.height() );
    }
Claudio Valerio's avatar
Claudio Valerio committed
452

453
    //--------------------------
Claudio Valerio's avatar
Claudio Valerio committed
454

455
    this->paintContent(painter);
456 457

    //--------------------------
Claudio Valerio's avatar
Claudio Valerio committed
458 459 460 461
}

void  UBKeyboardButton::enterEvent ( QEvent*)
{
462 463
    bFocused = true;
    update();
Claudio Valerio's avatar
Claudio Valerio committed
464 465 466 467
}

void  UBKeyboardButton::leaveEvent ( QEvent*)
{
468 469
    bFocused = false;
    update();
Claudio Valerio's avatar
Claudio Valerio committed
470 471 472 473
}

void  UBKeyboardButton::mousePressEvent ( QMouseEvent * event)
{
474 475 476 477
    event->accept();
    bPressed = true;
    update();
    this->onPress();
Claudio Valerio's avatar
Claudio Valerio committed
478 479 480 481
}

void  UBKeyboardButton::mouseReleaseEvent ( QMouseEvent * )
{
482 483 484
    bPressed = false;
    update();
    this->onRelease();
Claudio Valerio's avatar
Claudio Valerio committed
485 486 487
}

UBKeyButton::UBKeyButton(UBKeyboardPalette* parent)
488 489
        :UBKeyboardButton(parent),
        keybt(0)
Claudio Valerio's avatar
Claudio Valerio committed
490 491 492 493 494 495 496
{}

UBKeyButton::~UBKeyButton()
{}

void UBKeyButton::onPress()
{
497 498
    if (keybt!=NULL)
        sendUnicodeSymbol(keybt->code1, keybt->code2, capsLock());
Claudio Valerio's avatar
Claudio Valerio committed
499 500 501 502 503 504 505
}

void UBKeyButton::onRelease()
{}

void UBKeyButton::paintContent(QPainter& painter)
{
506 507 508 509 510 511
    if (keybt)
    {
        QString text(QChar(capsLock() ? keybt->symbol2 : keybt->symbol1));
        QRect textRect(rect().x()+2, rect().y()+2, rect().width()-4, rect().height()-4);
        painter.drawText(textRect, Qt::AlignCenter, text);
    }
Claudio Valerio's avatar
Claudio Valerio committed
512 513
}

514 515 516 517 518 519
UBCntrlButton::UBCntrlButton(UBKeyboardPalette* parent, int _code, const QString& _contentImagePath )
        :UBKeyboardButton(parent, _contentImagePath),
        label(""),
        code(_code)
{}

Claudio Valerio's avatar
Claudio Valerio committed
520 521

UBCntrlButton::UBCntrlButton(UBKeyboardPalette* parent, const QString& _label, int _code )
522 523 524
        :UBKeyboardButton(parent),
        label(_label),
        code(_code)
Claudio Valerio's avatar
Claudio Valerio committed
525 526 527 528 529 530 531
{}

UBCntrlButton::~UBCntrlButton()
{}

void UBCntrlButton::onPress()
{
532
     sendControlSymbol(code);
Claudio Valerio's avatar
Claudio Valerio committed
533 534 535 536 537 538 539
}

void UBCntrlButton::onRelease()
{}

void UBCntrlButton::paintContent(QPainter& painter)
{
540 541 542 543 544 545 546 547 548 549
    if(!label.isEmpty())
    {
        painter.drawText(rect(), Qt::AlignCenter, label);
    }
    else
    if(imgContent != NULL)
    {
        painter.drawImage(( rect().width() - imgContent->m_btnContent.width() ) / 2, ( rect().height() - imgContent->m_btnContent.height() ) / 2,
            imgContent->m_btnContent, 0,0, imgContent->m_btnContent.width(), imgContent->m_btnContent.height());
    }
Claudio Valerio's avatar
Claudio Valerio committed
550 551
}

552 553
UBCapsLockButton::UBCapsLockButton(UBKeyboardPalette* parent, const QString _contentImagePath)
        :UBKeyboardButton(parent, _contentImagePath)
Claudio Valerio's avatar
Claudio Valerio committed
554 555 556 557 558 559 560
{}

UBCapsLockButton::~UBCapsLockButton()
{}

void UBCapsLockButton::onPress()
{
561 562
    keyboard->capsLock = !keyboard->capsLock;
    keyboard->update();
Claudio Valerio's avatar
Claudio Valerio committed
563 564 565 566 567 568 569
}

void UBCapsLockButton::onRelease()
{}

void UBCapsLockButton::paintContent(QPainter& painter)
{
570 571 572 573 574 575 576
    if(imgContent != NULL)
    {
        painter.drawImage(( rect().width() - imgContent->m_btnContent.width() ) / 2, ( rect().height() - imgContent->m_btnContent.height() ) / 2,
            imgContent->m_btnContent, 0,0, imgContent->m_btnContent.width(), imgContent->m_btnContent.height());
    }
    else
        painter.drawText(rect(), Qt::AlignCenter, "^");
Claudio Valerio's avatar
Claudio Valerio committed
577 578 579 580
}


UBLocaleButton::UBLocaleButton(UBKeyboardPalette* parent)
581
        :UBKeyboardButton(parent)
Claudio Valerio's avatar
Claudio Valerio committed
582
{
583
    localeMenu = new QMenu(this);
Claudio Valerio's avatar
Claudio Valerio committed
584

585 586 587 588 589 590 591
    for (int i=0; i<parent->nLocalesCount; i++)
    {
        QAction* action = (parent->locales[i]->icon!=NULL) ?
                          localeMenu->addAction(*parent->locales[i]->icon, parent->locales[i]->fullName)
                          : localeMenu->addAction(parent->locales[i]->fullName);
        action->setData(QVariant(i));
    }
Claudio Valerio's avatar
Claudio Valerio committed
592 593 594 595
}

UBLocaleButton::~UBLocaleButton()
{
596
    delete localeMenu;
Claudio Valerio's avatar
Claudio Valerio committed
597 598 599 600 601 602 603 604
}

void UBLocaleButton::onPress()
{
}

void UBLocaleButton::onRelease()
{
605 606 607 608 609 610 611 612
    keyboard->languagePopupActive = true;
    QAction* action = localeMenu->exec(mapToGlobal(QPoint(0,0)));
    keyboard->languagePopupActive = false;
    if (action!=NULL)
    {
        int nLocale = action->data().toInt();
        keyboard->setLocale(nLocale);
    }
Claudio Valerio's avatar
Claudio Valerio committed
613 614 615 616
}

void UBLocaleButton::paintContent(QPainter& painter)
{
617 618 619
    const QString* localeName = keyboard->getLocaleName();
    if (localeName!=NULL)
        painter.drawText(rect(), Qt::AlignCenter, *localeName);
Claudio Valerio's avatar
Claudio Valerio committed
620
}