keyboard handling improved
This commit is contained in:
parent
23eec85708
commit
ce50d49312
@ -198,26 +198,14 @@ void QskInputPanel::setPrediction( const QStringList& prediction )
|
||||
|
||||
void QskInputPanel::keyPressEvent( QKeyEvent* event )
|
||||
{
|
||||
// animate the corresponding key button TODO
|
||||
int keyCode = -1;
|
||||
|
||||
switch( event->key() )
|
||||
{
|
||||
case Qt::Key_Return:
|
||||
case Qt::Key_Escape:
|
||||
{
|
||||
Q_EMIT keySelected( event->key() );
|
||||
break;
|
||||
}
|
||||
|
||||
case Qt::Key_Shift:
|
||||
case Qt::Key_Control:
|
||||
case Qt::Key_Meta:
|
||||
case Qt::Key_Alt:
|
||||
case Qt::Key_AltGr:
|
||||
case Qt::Key_CapsLock:
|
||||
case Qt::Key_NumLock:
|
||||
case Qt::Key_ScrollLock:
|
||||
{
|
||||
keyCode = event->key();
|
||||
break;
|
||||
}
|
||||
|
||||
@ -226,11 +214,17 @@ void QskInputPanel::keyPressEvent( QKeyEvent* event )
|
||||
const auto text = event->text();
|
||||
|
||||
if ( !text.isEmpty() )
|
||||
Q_EMIT keySelected( text[0].unicode() );
|
||||
keyCode = text[0].unicode();
|
||||
else
|
||||
Q_EMIT keySelected( event->key() );
|
||||
keyCode = event->key();
|
||||
}
|
||||
}
|
||||
|
||||
if ( m_data->keyboard->hasKey( keyCode ) )
|
||||
{
|
||||
// animating the corresponding key button ???
|
||||
Q_EMIT keySelected( keyCode );
|
||||
}
|
||||
}
|
||||
|
||||
#include "moc_QskInputPanel.cpp"
|
||||
|
@ -9,6 +9,7 @@
|
||||
|
||||
#include <QGuiApplication>
|
||||
#include <QStyleHints>
|
||||
#include <QSet>
|
||||
|
||||
namespace
|
||||
{
|
||||
@ -191,6 +192,27 @@ static bool qskIsAutorepeat( int key )
|
||||
&& key != Qt::Key_Mode_switch );
|
||||
}
|
||||
|
||||
static QSet< int > qskKeyCodes( const QskVirtualKeyboardLayouts::Layout& layout )
|
||||
{
|
||||
QSet< int > codes;
|
||||
codes.reserve( RowCount * ColumnCount );
|
||||
|
||||
for ( int mode = 0; mode <= QskVirtualKeyboard::ModeCount; mode++ )
|
||||
{
|
||||
const auto& keyCodes = layout[ mode ];
|
||||
|
||||
for( int row = 0; row < RowCount; row++ )
|
||||
{
|
||||
const auto& keys = keyCodes.data[ row ];
|
||||
|
||||
for ( int col = 0; col < ColumnCount; col++ )
|
||||
codes += keys[ col ];
|
||||
}
|
||||
}
|
||||
|
||||
return codes;
|
||||
}
|
||||
|
||||
QSK_SUBCONTROL( QskVirtualKeyboard, Panel )
|
||||
QSK_SUBCONTROL( QskVirtualKeyboard, ButtonPanel )
|
||||
QSK_SUBCONTROL( QskVirtualKeyboard, ButtonText )
|
||||
@ -198,17 +220,11 @@ QSK_SUBCONTROL( QskVirtualKeyboard, ButtonText )
|
||||
class QskVirtualKeyboard::PrivateData
|
||||
{
|
||||
public:
|
||||
PrivateData():
|
||||
currentLayout( nullptr ),
|
||||
mode( QskVirtualKeyboard::LowercaseMode )
|
||||
{
|
||||
}
|
||||
|
||||
public:
|
||||
const QskVirtualKeyboardLayouts::Layout* currentLayout;
|
||||
QskVirtualKeyboard::Mode mode;
|
||||
const QskVirtualKeyboardLayouts::Layout* currentLayout = nullptr;
|
||||
QskVirtualKeyboard::Mode mode = QskVirtualKeyboard::LowercaseMode;
|
||||
|
||||
QVector< Button* > keyButtons;
|
||||
QSet< int > keyCodes;
|
||||
};
|
||||
|
||||
QskVirtualKeyboard::QskVirtualKeyboard( QQuickItem* parent ):
|
||||
@ -356,7 +372,7 @@ void QskVirtualKeyboard::updateLayout()
|
||||
const int key = keys[ col ];
|
||||
auto button = m_data->keyButtons[ row * ColumnCount + col ];
|
||||
|
||||
button->setVisible( key != Qt::Key( 0 ) );
|
||||
button->setVisible( key != 0 );
|
||||
|
||||
if ( button->isVisible() )
|
||||
{
|
||||
@ -376,6 +392,11 @@ void QskVirtualKeyboard::updateLayout()
|
||||
}
|
||||
}
|
||||
|
||||
bool QskVirtualKeyboard::hasKey( int keyCode ) const
|
||||
{
|
||||
return m_data->keyCodes.contains( keyCode );
|
||||
}
|
||||
|
||||
void QskVirtualKeyboard::buttonPressed()
|
||||
{
|
||||
const auto button = static_cast< const Button* >( sender() );
|
||||
@ -419,26 +440,28 @@ void QskVirtualKeyboard::buttonPressed()
|
||||
|
||||
void QskVirtualKeyboard::updateLocale( const QLocale& locale )
|
||||
{
|
||||
const QskVirtualKeyboardLayouts::Layout* newLayout = nullptr;
|
||||
|
||||
switch( locale.language() )
|
||||
{
|
||||
case QLocale::Bulgarian:
|
||||
m_data->currentLayout = &qskKeyboardLayouts.bg;
|
||||
newLayout = &qskKeyboardLayouts.bg;
|
||||
break;
|
||||
|
||||
case QLocale::Czech:
|
||||
m_data->currentLayout = &qskKeyboardLayouts.cs;
|
||||
newLayout = &qskKeyboardLayouts.cs;
|
||||
break;
|
||||
|
||||
case QLocale::German:
|
||||
m_data->currentLayout = &qskKeyboardLayouts.de;
|
||||
newLayout = &qskKeyboardLayouts.de;
|
||||
break;
|
||||
|
||||
case QLocale::Danish:
|
||||
m_data->currentLayout = &qskKeyboardLayouts.da;
|
||||
newLayout = &qskKeyboardLayouts.da;
|
||||
break;
|
||||
|
||||
case QLocale::Greek:
|
||||
m_data->currentLayout = &qskKeyboardLayouts.el;
|
||||
newLayout = &qskKeyboardLayouts.el;
|
||||
break;
|
||||
|
||||
case QLocale::English:
|
||||
@ -449,11 +472,11 @@ void QskVirtualKeyboard::updateLocale( const QLocale& locale )
|
||||
case QLocale::UnitedStates:
|
||||
case QLocale::UnitedStatesMinorOutlyingIslands:
|
||||
case QLocale::UnitedStatesVirginIslands:
|
||||
m_data->currentLayout = &qskKeyboardLayouts.en_US;
|
||||
newLayout = &qskKeyboardLayouts.en_US;
|
||||
break;
|
||||
|
||||
default:
|
||||
m_data->currentLayout = &qskKeyboardLayouts.en_GB;
|
||||
newLayout = &qskKeyboardLayouts.en_GB;
|
||||
break;
|
||||
}
|
||||
|
||||
@ -461,81 +484,86 @@ void QskVirtualKeyboard::updateLocale( const QLocale& locale )
|
||||
}
|
||||
|
||||
case QLocale::Spanish:
|
||||
m_data->currentLayout = &qskKeyboardLayouts.es;
|
||||
newLayout = &qskKeyboardLayouts.es;
|
||||
break;
|
||||
|
||||
case QLocale::Finnish:
|
||||
m_data->currentLayout = &qskKeyboardLayouts.fi;
|
||||
newLayout = &qskKeyboardLayouts.fi;
|
||||
break;
|
||||
|
||||
case QLocale::French:
|
||||
m_data->currentLayout = &qskKeyboardLayouts.fr;
|
||||
newLayout = &qskKeyboardLayouts.fr;
|
||||
break;
|
||||
|
||||
case QLocale::Hungarian:
|
||||
m_data->currentLayout = &qskKeyboardLayouts.hu;
|
||||
newLayout = &qskKeyboardLayouts.hu;
|
||||
break;
|
||||
|
||||
case QLocale::Italian:
|
||||
m_data->currentLayout = &qskKeyboardLayouts.it;
|
||||
newLayout = &qskKeyboardLayouts.it;
|
||||
break;
|
||||
|
||||
case QLocale::Japanese:
|
||||
m_data->currentLayout = &qskKeyboardLayouts.ja;
|
||||
newLayout = &qskKeyboardLayouts.ja;
|
||||
break;
|
||||
|
||||
case QLocale::Latvian:
|
||||
m_data->currentLayout = &qskKeyboardLayouts.lv;
|
||||
newLayout = &qskKeyboardLayouts.lv;
|
||||
break;
|
||||
|
||||
case QLocale::Lithuanian:
|
||||
m_data->currentLayout = &qskKeyboardLayouts.lt;
|
||||
newLayout = &qskKeyboardLayouts.lt;
|
||||
break;
|
||||
|
||||
case QLocale::Dutch:
|
||||
m_data->currentLayout = &qskKeyboardLayouts.nl;
|
||||
newLayout = &qskKeyboardLayouts.nl;
|
||||
break;
|
||||
|
||||
case QLocale::Portuguese:
|
||||
m_data->currentLayout = &qskKeyboardLayouts.pt;
|
||||
newLayout = &qskKeyboardLayouts.pt;
|
||||
break;
|
||||
|
||||
case QLocale::Romanian:
|
||||
m_data->currentLayout = &qskKeyboardLayouts.ro;
|
||||
newLayout = &qskKeyboardLayouts.ro;
|
||||
break;
|
||||
|
||||
case QLocale::Russia:
|
||||
m_data->currentLayout = &qskKeyboardLayouts.ru;
|
||||
newLayout = &qskKeyboardLayouts.ru;
|
||||
break;
|
||||
|
||||
case QLocale::Slovenian:
|
||||
m_data->currentLayout = &qskKeyboardLayouts.sl;
|
||||
newLayout = &qskKeyboardLayouts.sl;
|
||||
break;
|
||||
|
||||
case QLocale::Slovak:
|
||||
m_data->currentLayout = &qskKeyboardLayouts.sk;
|
||||
newLayout = &qskKeyboardLayouts.sk;
|
||||
break;
|
||||
|
||||
case QLocale::Turkish:
|
||||
m_data->currentLayout = &qskKeyboardLayouts.tr;
|
||||
newLayout = &qskKeyboardLayouts.tr;
|
||||
break;
|
||||
|
||||
case QLocale::Chinese:
|
||||
m_data->currentLayout = &qskKeyboardLayouts.zh;
|
||||
newLayout = &qskKeyboardLayouts.zh;
|
||||
break;
|
||||
#if 1
|
||||
case QLocale::C:
|
||||
m_data->currentLayout = &qskKeyboardLayouts.en_US;
|
||||
newLayout = &qskKeyboardLayouts.en_US;
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
qWarning() << "QskInputPanel: unsupported locale:" << locale;
|
||||
m_data->currentLayout = &qskKeyboardLayouts.en_US;
|
||||
|
||||
qWarning() << "QskVirtualKeyboard: unsupported locale:" << locale;
|
||||
newLayout = &qskKeyboardLayouts.en_US;
|
||||
}
|
||||
|
||||
setMode( LowercaseMode );
|
||||
polish();
|
||||
if ( newLayout != m_data->currentLayout )
|
||||
{
|
||||
m_data->currentLayout = newLayout;
|
||||
m_data->keyCodes = qskKeyCodes( *newLayout );
|
||||
|
||||
setMode( LowercaseMode );
|
||||
polish();
|
||||
}
|
||||
}
|
||||
|
||||
void QskVirtualKeyboard::setMode( QskVirtualKeyboard::Mode mode )
|
||||
|
@ -43,6 +43,8 @@ public:
|
||||
virtual QskAspect::Subcontrol effectiveSubcontrol(
|
||||
QskAspect::Subcontrol ) const override;
|
||||
|
||||
bool hasKey( int keyCode ) const;
|
||||
|
||||
Q_SIGNALS:
|
||||
void modeChanged( Mode );
|
||||
void keySelected( int keyCode );
|
||||
|
Loading…
x
Reference in New Issue
Block a user