keyboard handling improved

This commit is contained in:
Uwe Rathmann 2018-06-03 11:01:22 +02:00
parent 23eec85708
commit ce50d49312
3 changed files with 79 additions and 55 deletions

View File

@ -198,26 +198,14 @@ void QskInputPanel::setPrediction( const QStringList& prediction )
void QskInputPanel::keyPressEvent( QKeyEvent* event ) void QskInputPanel::keyPressEvent( QKeyEvent* event )
{ {
// animate the corresponding key button TODO int keyCode = -1;
switch( event->key() ) switch( event->key() )
{ {
case Qt::Key_Return: case Qt::Key_Return:
case Qt::Key_Escape: case Qt::Key_Escape:
{ {
Q_EMIT keySelected( event->key() ); keyCode = 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:
{
break; break;
} }
@ -226,11 +214,17 @@ void QskInputPanel::keyPressEvent( QKeyEvent* event )
const auto text = event->text(); const auto text = event->text();
if ( !text.isEmpty() ) if ( !text.isEmpty() )
Q_EMIT keySelected( text[0].unicode() ); keyCode = text[0].unicode();
else 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" #include "moc_QskInputPanel.cpp"

View File

@ -9,6 +9,7 @@
#include <QGuiApplication> #include <QGuiApplication>
#include <QStyleHints> #include <QStyleHints>
#include <QSet>
namespace namespace
{ {
@ -191,6 +192,27 @@ static bool qskIsAutorepeat( int key )
&& key != Qt::Key_Mode_switch ); && 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, Panel )
QSK_SUBCONTROL( QskVirtualKeyboard, ButtonPanel ) QSK_SUBCONTROL( QskVirtualKeyboard, ButtonPanel )
QSK_SUBCONTROL( QskVirtualKeyboard, ButtonText ) QSK_SUBCONTROL( QskVirtualKeyboard, ButtonText )
@ -198,17 +220,11 @@ QSK_SUBCONTROL( QskVirtualKeyboard, ButtonText )
class QskVirtualKeyboard::PrivateData class QskVirtualKeyboard::PrivateData
{ {
public: public:
PrivateData(): const QskVirtualKeyboardLayouts::Layout* currentLayout = nullptr;
currentLayout( nullptr ), QskVirtualKeyboard::Mode mode = QskVirtualKeyboard::LowercaseMode;
mode( QskVirtualKeyboard::LowercaseMode )
{
}
public:
const QskVirtualKeyboardLayouts::Layout* currentLayout;
QskVirtualKeyboard::Mode mode;
QVector< Button* > keyButtons; QVector< Button* > keyButtons;
QSet< int > keyCodes;
}; };
QskVirtualKeyboard::QskVirtualKeyboard( QQuickItem* parent ): QskVirtualKeyboard::QskVirtualKeyboard( QQuickItem* parent ):
@ -356,7 +372,7 @@ void QskVirtualKeyboard::updateLayout()
const int key = keys[ col ]; const int key = keys[ col ];
auto button = m_data->keyButtons[ row * ColumnCount + col ]; auto button = m_data->keyButtons[ row * ColumnCount + col ];
button->setVisible( key != Qt::Key( 0 ) ); button->setVisible( key != 0 );
if ( button->isVisible() ) 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() void QskVirtualKeyboard::buttonPressed()
{ {
const auto button = static_cast< const Button* >( sender() ); const auto button = static_cast< const Button* >( sender() );
@ -419,26 +440,28 @@ void QskVirtualKeyboard::buttonPressed()
void QskVirtualKeyboard::updateLocale( const QLocale& locale ) void QskVirtualKeyboard::updateLocale( const QLocale& locale )
{ {
const QskVirtualKeyboardLayouts::Layout* newLayout = nullptr;
switch( locale.language() ) switch( locale.language() )
{ {
case QLocale::Bulgarian: case QLocale::Bulgarian:
m_data->currentLayout = &qskKeyboardLayouts.bg; newLayout = &qskKeyboardLayouts.bg;
break; break;
case QLocale::Czech: case QLocale::Czech:
m_data->currentLayout = &qskKeyboardLayouts.cs; newLayout = &qskKeyboardLayouts.cs;
break; break;
case QLocale::German: case QLocale::German:
m_data->currentLayout = &qskKeyboardLayouts.de; newLayout = &qskKeyboardLayouts.de;
break; break;
case QLocale::Danish: case QLocale::Danish:
m_data->currentLayout = &qskKeyboardLayouts.da; newLayout = &qskKeyboardLayouts.da;
break; break;
case QLocale::Greek: case QLocale::Greek:
m_data->currentLayout = &qskKeyboardLayouts.el; newLayout = &qskKeyboardLayouts.el;
break; break;
case QLocale::English: case QLocale::English:
@ -449,11 +472,11 @@ void QskVirtualKeyboard::updateLocale( const QLocale& locale )
case QLocale::UnitedStates: case QLocale::UnitedStates:
case QLocale::UnitedStatesMinorOutlyingIslands: case QLocale::UnitedStatesMinorOutlyingIslands:
case QLocale::UnitedStatesVirginIslands: case QLocale::UnitedStatesVirginIslands:
m_data->currentLayout = &qskKeyboardLayouts.en_US; newLayout = &qskKeyboardLayouts.en_US;
break; break;
default: default:
m_data->currentLayout = &qskKeyboardLayouts.en_GB; newLayout = &qskKeyboardLayouts.en_GB;
break; break;
} }
@ -461,82 +484,87 @@ void QskVirtualKeyboard::updateLocale( const QLocale& locale )
} }
case QLocale::Spanish: case QLocale::Spanish:
m_data->currentLayout = &qskKeyboardLayouts.es; newLayout = &qskKeyboardLayouts.es;
break; break;
case QLocale::Finnish: case QLocale::Finnish:
m_data->currentLayout = &qskKeyboardLayouts.fi; newLayout = &qskKeyboardLayouts.fi;
break; break;
case QLocale::French: case QLocale::French:
m_data->currentLayout = &qskKeyboardLayouts.fr; newLayout = &qskKeyboardLayouts.fr;
break; break;
case QLocale::Hungarian: case QLocale::Hungarian:
m_data->currentLayout = &qskKeyboardLayouts.hu; newLayout = &qskKeyboardLayouts.hu;
break; break;
case QLocale::Italian: case QLocale::Italian:
m_data->currentLayout = &qskKeyboardLayouts.it; newLayout = &qskKeyboardLayouts.it;
break; break;
case QLocale::Japanese: case QLocale::Japanese:
m_data->currentLayout = &qskKeyboardLayouts.ja; newLayout = &qskKeyboardLayouts.ja;
break; break;
case QLocale::Latvian: case QLocale::Latvian:
m_data->currentLayout = &qskKeyboardLayouts.lv; newLayout = &qskKeyboardLayouts.lv;
break; break;
case QLocale::Lithuanian: case QLocale::Lithuanian:
m_data->currentLayout = &qskKeyboardLayouts.lt; newLayout = &qskKeyboardLayouts.lt;
break; break;
case QLocale::Dutch: case QLocale::Dutch:
m_data->currentLayout = &qskKeyboardLayouts.nl; newLayout = &qskKeyboardLayouts.nl;
break; break;
case QLocale::Portuguese: case QLocale::Portuguese:
m_data->currentLayout = &qskKeyboardLayouts.pt; newLayout = &qskKeyboardLayouts.pt;
break; break;
case QLocale::Romanian: case QLocale::Romanian:
m_data->currentLayout = &qskKeyboardLayouts.ro; newLayout = &qskKeyboardLayouts.ro;
break; break;
case QLocale::Russia: case QLocale::Russia:
m_data->currentLayout = &qskKeyboardLayouts.ru; newLayout = &qskKeyboardLayouts.ru;
break; break;
case QLocale::Slovenian: case QLocale::Slovenian:
m_data->currentLayout = &qskKeyboardLayouts.sl; newLayout = &qskKeyboardLayouts.sl;
break; break;
case QLocale::Slovak: case QLocale::Slovak:
m_data->currentLayout = &qskKeyboardLayouts.sk; newLayout = &qskKeyboardLayouts.sk;
break; break;
case QLocale::Turkish: case QLocale::Turkish:
m_data->currentLayout = &qskKeyboardLayouts.tr; newLayout = &qskKeyboardLayouts.tr;
break; break;
case QLocale::Chinese: case QLocale::Chinese:
m_data->currentLayout = &qskKeyboardLayouts.zh; newLayout = &qskKeyboardLayouts.zh;
break; break;
#if 1 #if 1
case QLocale::C: case QLocale::C:
m_data->currentLayout = &qskKeyboardLayouts.en_US; newLayout = &qskKeyboardLayouts.en_US;
break; break;
#endif #endif
default: default:
qWarning() << "QskInputPanel: unsupported locale:" << locale; qWarning() << "QskVirtualKeyboard: unsupported locale:" << locale;
m_data->currentLayout = &qskKeyboardLayouts.en_US; newLayout = &qskKeyboardLayouts.en_US;
} }
if ( newLayout != m_data->currentLayout )
{
m_data->currentLayout = newLayout;
m_data->keyCodes = qskKeyCodes( *newLayout );
setMode( LowercaseMode ); setMode( LowercaseMode );
polish(); polish();
} }
}
void QskVirtualKeyboard::setMode( QskVirtualKeyboard::Mode mode ) void QskVirtualKeyboard::setMode( QskVirtualKeyboard::Mode mode )
{ {

View File

@ -43,6 +43,8 @@ public:
virtual QskAspect::Subcontrol effectiveSubcontrol( virtual QskAspect::Subcontrol effectiveSubcontrol(
QskAspect::Subcontrol ) const override; QskAspect::Subcontrol ) const override;
bool hasKey( int keyCode ) const;
Q_SIGNALS: Q_SIGNALS:
void modeChanged( Mode ); void modeChanged( Mode );
void keySelected( int keyCode ); void keySelected( int keyCode );