/* * UBKeyboardPalette.cpp * * Created on: Feb 10, 2011 * Author: tolik */ #include #include #include #include "UBKeyboardPalette.h" #include "core/UBSettings.h" #include "core/UBApplication.h" #include "gui/UBMainWindow.h" #include "core/memcheck.h" /* UBKeyboardPalette */ UBKeyboardPalette::UBKeyboardPalette(QWidget *parent) : UBActionPalette(Qt::TopRightCorner, parent) { // setWindowFlags(/*Qt::CustomizeWindowHint|*/Qt::WindowStaysOnTopHint|Qt::FramelessWindowHint); setCustomCloseProcessing(true); setCustomPosition(true); setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); setFocusPolicy(Qt::NoFocus); setClosable(true); setGrip(false); capsLock = false; shift = false; languagePopupActive = false; keyboardActive = false; nSpecialModifierIndex = 0; specialModifier = 0; btnWidth = btnHeight = 16; strSize = "16x16"; currBtnImages = new BTNImages("16", btnWidth, btnHeight); storage = NULL; buttons = new UBKeyButton*[47]; for (int i=0; i<47; i++) { buttons[i] = new UBKeyButton(this); } locales = UBPlatformUtils::getKeyboardLayouts(this->nLocalesCount); createCtrlButtons(); nCurrentLocale = UBSettings::settings()->KeyboardLocale->get().toInt(); setInput(locales[nCurrentLocale]); setContentsMargins( 22, 22, 22, 22 ); init(); } //QList UBKeyboardPalette::instances; void UBKeyboardPalette::init() { m_isVisible = false; setVisible(false); setKeyButtonSize(UBSettings::settings()->boardKeyboardPaletteKeyBtnSize->get().toString()); 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())); //------------------------------// UBPlatformUtils::setWindowNonActivableFlag(this, true); } void UBKeyboardPalette::showKeyboard(bool show) { m_isVisible = show; } void UBKeyboardPalette::hideKeyboard() { UBApplication::mainWindow->actionVirtualKeyboard->activate(QAction::Trigger); } void UBKeyboardPalette::syncPosition(const QPoint & pos) { m_pos = pos; move(pos); } void UBKeyboardPalette::syncLocale(int nLocale) { nCurrentLocale = nLocale; setInput(locales[nCurrentLocale]); } void UBKeyboardPalette::keyboardPaletteButtonSizeChanged(QVariant size) { setKeyButtonSize(size.toString()); } void UBKeyboardPalette::setInput(const UBKeyboardLocale* locale) { if (locale!=NULL) { for (int i=0; i<47; i++) buttons[i]->setKeyBt((*locale)[i]); } else { this->hide(); } } UBKeyboardPalette::~UBKeyboardPalette() { //for (int i=0; i<47; i++) // delete buttons[i]; delete [] buttons; //for (int i=0; i<8; i++) // delete ctrlButtons[i]; delete [] ctrlButtons; //if (locales!=NULL) //{ // for (int i=0; iname); } void UBKeyboardPalette::setLocale(int nLocale) { if (locales != NULL) { nCurrentLocale = nLocale; setInput(locales[nCurrentLocale]); onLocaleChanged(locales[nCurrentLocale]); update(); UBSettings::settings()->KeyboardLocale->set(nCurrentLocale); } emit localeChanged(nLocale); } void UBKeyboardPalette::setKeyButtonSize(const QString& _strSize) { QStringList strs = _strSize.split('x'); if (strs.size()==2) { strSize = _strSize; btnWidth = strs[0].toInt(); btnHeight = strs[1].toInt(); if(currBtnImages != NULL) delete currBtnImages; currBtnImages = new BTNImages(strs[1], btnWidth, btnHeight); adjustSizeAndPosition(); } } void UBKeyboardPalette::enterEvent ( QEvent * ) { if (keyboardActive) return; keyboardActive = true; adjustSizeAndPosition(); emit keyboardActivated(true); } void UBKeyboardPalette::leaveEvent ( QEvent * ) { if (languagePopupActive || !keyboardActive || mIsMoving) return; keyboardActive = false; adjustSizeAndPosition(); emit keyboardActivated(false); } void UBKeyboardPalette::moveEvent ( QMoveEvent * event ) { UBActionPalette::moveEvent(event); emit moved(event->pos()); } void UBKeyboardPalette::adjustSizeAndPosition(bool pUp) { QSize rSize = sizeHint(); if (rSize != size()) { int dx = (rSize.width() - size().width()) /2; int dy = rSize.height() - size().height(); this->move(x()-dx, y() - dy); this->resize(rSize.width(), rSize.height()); } UBActionPalette::adjustSizeAndPosition(pUp); } void UBKeyboardPalette::paintEvent( QPaintEvent* event) { UBActionPalette::paintEvent(event); QRect r = this->geometry(); int lleft, ltop, lright, lbottom; getContentsMargins ( &lleft, <op, &lright, &lbottom ) ; //------------------------------------------------ // calculate start offset from left, and from top int ctrlButtonsId = 0; lleft = ( r.width() - btnWidth * 15 ) / 2; ltop = ( r.height() - btnHeight * 5 ) / 2; //------------------------------------------------ // set geometry (position) for row 1 int offX = lleft; int offY = ltop; //------------------- // buttons [`]..[+] for (int i = 0; i<13; i++) { buttons[i]->setGeometry(offX, offY, btnWidth, btnHeight); offX += btnWidth; } // 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++) { buttons[i + 13]->setGeometry(offX, offY, btnWidth, btnHeight); offX += btnWidth; } // // 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 // button Enter ctrlButtons[ctrlButtonsId++]->setGeometry(offX, offY, btnWidth * 1, btnHeight); offX += btnWidth*1; // buttons [a]..[\] for (int i = 0; i < 12; i++) { buttons[i + 12 + 13]->setGeometry(offX, offY, btnWidth, btnHeight); offX += btnWidth; } // button Enter ctrlButtons[ctrlButtonsId++]->setGeometry(offX, offY, btnWidth * 2, btnHeight); offX += btnWidth*2; //------------------------------------------------ // 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++) { buttons[i + 12 + 12 + 13]->setGeometry(offX, offY, btnWidth, btnHeight); offX += btnWidth; } // 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); //------------------------------------------------ } void UBKeyboardPalette::onDeactivated() { onActivated(false); } //-----------------------------------------------------------------------// // BTNImages Class //-----------------------------------------------------------------------// 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; m_strContent = ":/images/virtual.keyboard/" + strHeight + "/" + strContentName + ".png"; m_btnContent = QImage(m_strContent); } //-----------------------------------------------------------------------// // UBKeyboardButton Class //-----------------------------------------------------------------------// UBKeyboardButton::UBKeyboardButton(UBKeyboardPalette* parent, QString contentImagePath = "") :QWidget(parent), keyboard(parent), bFocused(false), bPressed(false) { m_parent = parent; m_contentImagePath = contentImagePath; imgContent = NULL; setCursor(Qt::PointingHandCursor); } UBKeyboardButton::~UBKeyboardButton() { if(imgContent != NULL) { delete imgContent; imgContent = NULL; } } bool UBKeyboardButton::isPressed() { return bPressed; } void UBKeyboardButton::paintEvent(QPaintEvent*) { QPainter painter(this); //-------------------------- 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); //-------------------------- if (isPressed()) { 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() ); } //-------------------------- this->paintContent(painter); //-------------------------- } void UBKeyboardButton::enterEvent ( QEvent*) { bFocused = true; update(); } void UBKeyboardButton::leaveEvent ( QEvent*) { bFocused = false; update(); } void UBKeyboardButton::mousePressEvent ( QMouseEvent * event) { event->accept(); bPressed = true; update(); this->onPress(); } void UBKeyboardButton::mouseReleaseEvent ( QMouseEvent * ) { bPressed = false; update(); this->onRelease(); } UBKeyButton::UBKeyButton(UBKeyboardPalette* parent) :UBKeyboardButton(parent), keybt(0) {} UBKeyButton::~UBKeyButton() {} bool UBKeyButton::shifted() { bool b = keyboard->shift; if (keybt->capsLockSwitch && keyboard->capsLock) b = !b; return b; } void UBKeyButton::onPress() { if (keybt!=NULL) { int codeIndex = keyboard->nSpecialModifierIndex * 2 + shifted(); if (keyboard->nSpecialModifierIndex) { if (keybt->codes[codeIndex].empty()) { sendUnicodeSymbol(keyboard->specialModifier); sendUnicodeSymbol(keybt->codes[shifted()]); } else { sendUnicodeSymbol(keybt->codes[codeIndex]); } keyboard->nSpecialModifierIndex = 0; } else { int nSpecialModifierIndex = shifted()? keybt->modifier2 : keybt->modifier1; if (nSpecialModifierIndex) { keyboard->nSpecialModifierIndex = nSpecialModifierIndex; keyboard->specialModifier = keybt->codes[codeIndex]; } else { sendUnicodeSymbol(keybt->codes[codeIndex]); } } } if (keyboard->shift) { keyboard->shift = false; keyboard->update(); } } void UBKeyButton::onRelease() {} void UBKeyButton::paintContent(QPainter& painter) { if (keybt) { QString text(QChar(shifted() ? keybt->symbol2 : keybt->symbol1)); QRect textRect(rect().x()+2, rect().y()+2, rect().width()-4, rect().height()-4); painter.drawText(textRect, Qt::AlignCenter, text); } } UBCntrlButton::UBCntrlButton(UBKeyboardPalette* parent, int _code, const QString& _contentImagePath ) :UBKeyboardButton(parent, _contentImagePath), label(""), code(_code) {} UBCntrlButton::UBCntrlButton(UBKeyboardPalette* parent, const QString& _label, int _code ) :UBKeyboardButton(parent), label(_label), code(_code) {} UBCntrlButton::~UBCntrlButton() {} void UBCntrlButton::onPress() { sendControlSymbol(code); } void UBCntrlButton::onRelease() {} void UBCntrlButton::paintContent(QPainter& painter) { 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()); } } UBCapsLockButton::UBCapsLockButton(UBKeyboardPalette* parent, const QString _contentImagePath) :UBKeyboardButton(parent, _contentImagePath) {} UBCapsLockButton::~UBCapsLockButton() {} void UBCapsLockButton::onPress() { keyboard->capsLock = !keyboard->capsLock; keyboard->update(); } void UBCapsLockButton::onRelease() {} bool UBCapsLockButton::isPressed() { return keyboard->capsLock; } void UBCapsLockButton::paintContent(QPainter& painter) { 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, "^"); } UBShiftButton::UBShiftButton(UBKeyboardPalette* parent, const QString _contentImagePath) :UBKeyboardButton(parent, _contentImagePath) {} UBShiftButton::~UBShiftButton() {} void UBShiftButton::onPress() { keyboard->shift = !keyboard->shift; keyboard->update(); } void UBShiftButton::onRelease() {} bool UBShiftButton::isPressed() { return keyboard->shift; } void UBShiftButton::paintContent(QPainter& painter) { 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, "^"); } UBLocaleButton::UBLocaleButton(UBKeyboardPalette* parent) :UBKeyboardButton(parent) { localeMenu = new QMenu(this); for (int i=0; inLocalesCount; 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)); } } UBLocaleButton::~UBLocaleButton() { delete localeMenu; } void UBLocaleButton::onPress() { } void UBLocaleButton::onRelease() { 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); } } void UBLocaleButton::paintContent(QPainter& painter) { const QString* localeName = keyboard->getLocaleName(); if (localeName!=NULL) painter.drawText(rect(), Qt::AlignCenter, *localeName); }