QskInputPanel fixed

This commit is contained in:
Uwe Rathmann 2017-10-17 19:02:02 +02:00
parent e6f0088ae4
commit e5a053462c
2 changed files with 80 additions and 3 deletions

View File

@ -151,20 +151,25 @@ static qreal qskKeyStretch( Qt::Key key )
case Qt::Key_Shift: case Qt::Key_Shift:
case Qt::Key_CapsLock: case Qt::Key_CapsLock:
return 1.5; return 1.5;
case Qt::Key_Space: case Qt::Key_Space:
return 3.5; return 3.5;
case Qt::Key_Return: case Qt::Key_Return:
case Qt::Key_Mode_switch: case Qt::Key_Mode_switch:
// Possibly smaller // Possibly smaller
default: default:
break; break;
} }
return 1.0; return 1.0;
} }
static qreal qskRowStretch( const QskInputPanel::KeyRow& keyRow ) static qreal qskRowStretch( const QskInputPanel::KeyRow& keyRow )
{ {
qreal stretch = 0; qreal stretch = 0;
for ( const auto& key : keyRow ) for ( const auto& key : keyRow )
{ {
if ( !key ) if ( !key )
@ -172,6 +177,7 @@ static qreal qskRowStretch( const QskInputPanel::KeyRow& keyRow )
stretch += qskKeyStretch( key ); stretch += qskKeyStretch( key );
} }
return stretch; return stretch;
} }
@ -261,29 +267,39 @@ QString QskInputPanel::textForKey( Qt::Key key ) const
key &= ~KeyStates; key &= ~KeyStates;
// Special cases // Special cases
switch ( key ) { switch ( key )
{
case Qt::Key_Backspace: case Qt::Key_Backspace:
case Qt::Key_Muhenkan: case Qt::Key_Muhenkan:
return QChar( 0x232B ); return QChar( 0x232B );
case Qt::Key_CapsLock: case Qt::Key_CapsLock:
case Qt::Key_Kana_Lock: case Qt::Key_Kana_Lock:
return QChar( 0x21E7 ); return QChar( 0x21E7 );
case Qt::Key_Shift: case Qt::Key_Shift:
case Qt::Key_Kana_Shift: case Qt::Key_Kana_Shift:
return QChar( 0x2B06 ); return QChar( 0x2B06 );
case Qt::Key_Mode_switch: case Qt::Key_Mode_switch:
return QChar( 0x2026 ); return QChar( 0x2026 );
case Qt::Key_Return: case Qt::Key_Return:
case Qt::Key_Kanji: case Qt::Key_Kanji:
return QChar( 0x23CE ); return QChar( 0x23CE );
case Qt::Key_Left: case Qt::Key_Left:
return QChar( 0x2190 ); return QChar( 0x2190 );
case Qt::Key_Right: case Qt::Key_Right:
return QChar( 0x2192 ); return QChar( 0x2192 );
case Qt::Key_ApplicationLeft: case Qt::Key_ApplicationLeft:
return QChar( 0x2B05 ); return QChar( 0x2B05 );
case Qt::Key_ApplicationRight: case Qt::Key_ApplicationRight:
return QChar( 0x27A1 ); return QChar( 0x27A1 );
default: default:
break; break;
} }
@ -297,18 +313,24 @@ QString QskInputPanel::textForKey( Qt::Key key ) const
QString QskInputPanel::displayLanguageName() const QString QskInputPanel::displayLanguageName() const
{ {
const auto locale = this->locale(); const auto locale = this->locale();
switch ( locale.language() ) switch ( locale.language() )
{ {
case QLocale::Bulgarian: case QLocale::Bulgarian:
return QStringLiteral( "български език" ); return QStringLiteral( "български език" );
case QLocale::Czech: case QLocale::Czech:
return QStringLiteral( "Čeština" ); return QStringLiteral( "Čeština" );
case QLocale::German: case QLocale::German:
return QStringLiteral( "Deutsch" ); return QStringLiteral( "Deutsch" );
case QLocale::Danish: case QLocale::Danish:
return QStringLiteral( "Dansk" ); return QStringLiteral( "Dansk" );
case QLocale::Greek: case QLocale::Greek:
return QStringLiteral( "Eλληνικά" ); return QStringLiteral( "Eλληνικά" );
case QLocale::English: case QLocale::English:
{ {
switch ( locale.country() ) switch ( locale.country() )
@ -318,52 +340,73 @@ QString QskInputPanel::displayLanguageName() const
case QLocale::UnitedStatesMinorOutlyingIslands: case QLocale::UnitedStatesMinorOutlyingIslands:
case QLocale::UnitedStatesVirginIslands: case QLocale::UnitedStatesVirginIslands:
return QStringLiteral( "English (US)" ); return QStringLiteral( "English (US)" );
default: default:
return QStringLiteral( "English (UK)" ); return QStringLiteral( "English (UK)" );
} }
break; break;
} }
case QLocale::Spanish: case QLocale::Spanish:
return QStringLiteral( "Español" ); return QStringLiteral( "Español" );
case QLocale::Finnish: case QLocale::Finnish:
return QStringLiteral( "Suomi" ); return QStringLiteral( "Suomi" );
case QLocale::French: case QLocale::French:
return QStringLiteral( "Français" ); return QStringLiteral( "Français" );
case QLocale::Hungarian: case QLocale::Hungarian:
return QStringLiteral( "Magyar" ); return QStringLiteral( "Magyar" );
case QLocale::Italian: case QLocale::Italian:
return QStringLiteral( "Italiano" ); return QStringLiteral( "Italiano" );
case QLocale::Japanese: case QLocale::Japanese:
return QStringLiteral( "日本語" ); return QStringLiteral( "日本語" );
case QLocale::Latvian: case QLocale::Latvian:
return QStringLiteral( "Latviešu" ); return QStringLiteral( "Latviešu" );
case QLocale::Lithuanian: case QLocale::Lithuanian:
return QStringLiteral( "Lietuvių" ); return QStringLiteral( "Lietuvių" );
case QLocale::Dutch: case QLocale::Dutch:
return QStringLiteral( "Nederlands" ); return QStringLiteral( "Nederlands" );
case QLocale::Portuguese: case QLocale::Portuguese:
return QStringLiteral( "Português" ); return QStringLiteral( "Português" );
case QLocale::Romanian: case QLocale::Romanian:
return QStringLiteral( "Română" ); return QStringLiteral( "Română" );
case QLocale::Russia: case QLocale::Russia:
return QStringLiteral( "Русский" ); return QStringLiteral( "Русский" );
case QLocale::Slovenian: case QLocale::Slovenian:
return QStringLiteral( "Slovenščina" ); return QStringLiteral( "Slovenščina" );
case QLocale::Slovak: case QLocale::Slovak:
return QStringLiteral( "Slovenčina" ); return QStringLiteral( "Slovenčina" );
case QLocale::Turkish: case QLocale::Turkish:
return QStringLiteral( "Türkçe" ); return QStringLiteral( "Türkçe" );
case QLocale::Chinese: case QLocale::Chinese:
return QStringLiteral( "中文" ); return QStringLiteral( "中文" );
default: default:
break; break;
} }
return QLocale::languageToString( locale.language() ); return QLocale::languageToString( locale.language() );
} }
void QskInputPanel::setPreeditGroups( const QVector< Qt::Key >& groups ) void QskInputPanel::setPreeditGroups( const QVector< Qt::Key >& groups )
{ {
auto& topRow = m_data->keyTable[ LowercaseMode ].data[ 0 ]; auto& topRow = m_data->keyTable[ LowercaseMode ].data[ 0 ];
for ( const auto& group : groups ) for ( const auto& group : groups )
{ {
auto& keyData = topRow[ &group - groups.data() ]; auto& keyData = topRow[ &group - groups.data() ];
@ -392,6 +435,7 @@ bool QskInputPanel::advanceFocus( bool forward )
auto offset = forward ? 1 : -1; auto offset = forward ? 1 : -1;
auto focusKeyIndex = m_data->focusKeyIndex; auto focusKeyIndex = m_data->focusKeyIndex;
Q_FOREVER Q_FOREVER
{ {
focusKeyIndex += offset; focusKeyIndex += offset;
@ -420,6 +464,7 @@ bool QskInputPanel::activateFocusKey()
if ( m_data->focusKeyIndex > 0 && m_data->focusKeyIndex < RowCount * KeyCount ) if ( m_data->focusKeyIndex > 0 && m_data->focusKeyIndex < RowCount * KeyCount )
{ {
auto& keyData = keyDataAt( m_data->focusKeyIndex ); auto& keyData = keyDataAt( m_data->focusKeyIndex );
if ( keyData.key & KeyPressed ) if ( keyData.key & KeyPressed )
handleKey( m_data->focusKeyIndex ); handleKey( m_data->focusKeyIndex );
else else
@ -457,6 +502,7 @@ void QskInputPanel::clearFocusKey()
keyDataAt( m_data->focusKeyIndex ).key &= ~KeyFocused; keyDataAt( m_data->focusKeyIndex ).key &= ~KeyFocused;
update(); update();
} }
m_data->focusKeyIndex = -1; m_data->focusKeyIndex = -1;
} }
@ -475,6 +521,7 @@ void QskInputPanel::setCandidateOffset( int candidateOffset )
for ( int i = 0; i < count; ++i ) for ( int i = 0; i < count; ++i )
{ {
auto& keyData = topRow[ i + groupCount ]; auto& keyData = topRow[ i + groupCount ];
if ( continueLeft && i == 0 ) if ( continueLeft && i == 0 )
keyData.key = Qt::Key_ApplicationLeft; keyData.key = Qt::Key_ApplicationLeft;
else if ( continueRight && ( i == KeyCount - groupCount - 1 ) ) else if ( continueRight && ( i == KeyCount - groupCount - 1 ) )
@ -566,6 +613,7 @@ void QskInputPanel::touchEvent( QTouchEvent* e )
} }
const auto rect = keyboardRect(); const auto rect = keyboardRect();
for ( const auto& tp : e->touchPoints() ) for ( const auto& tp : e->touchPoints() )
{ {
const auto pos = tp.pos(); const auto pos = tp.pos();
@ -587,6 +635,7 @@ void QskInputPanel::touchEvent( QTouchEvent* e )
const auto keyIndex = m_data->keyTable[ m_data->mode ].indexOf( keyData ); const auto keyIndex = m_data->keyTable[ m_data->mode ].indexOf( keyData );
auto it = m_data->activeKeys.find( tp.id() ); auto it = m_data->activeKeys.find( tp.id() );
if ( tp.state() == Qt::TouchPointReleased ) if ( tp.state() == Qt::TouchPointReleased )
{ {
const int repeatCount = it->second.count; const int repeatCount = it->second.count;
@ -613,6 +662,7 @@ void QskInputPanel::touchEvent( QTouchEvent* e )
keyDataAt( it->second.keyIndex ).key &= ~KeyPressed; keyDataAt( it->second.keyIndex ).key &= ~KeyPressed;
it->second.count = 0; it->second.count = 0;
} }
it->second.keyIndex = keyIndex; it->second.keyIndex = keyIndex;
} }
@ -680,6 +730,7 @@ void QskInputPanel::handleKey( int keyIndex )
// Preedit keys // Preedit keys
const auto row = keyIndex / KeyCount; const auto row = keyIndex / KeyCount;
const auto column = keyIndex % KeyCount; const auto column = keyIndex % KeyCount;
if ( m_data->mode == LowercaseMode && !m_data->groups.isEmpty() && row == 0 ) if ( m_data->mode == LowercaseMode && !m_data->groups.isEmpty() && row == 0 )
{ {
if ( key == Qt::Key_ApplicationLeft if ( key == Qt::Key_ApplicationLeft
@ -708,15 +759,18 @@ void QskInputPanel::handleKey( int keyIndex )
case Qt::Key_Kana_Lock: case Qt::Key_Kana_Lock:
setMode( UppercaseMode ); // Lock caps setMode( UppercaseMode ); // Lock caps
return; return;
case Qt::Key_Shift: case Qt::Key_Shift:
case Qt::Key_Kana_Shift: case Qt::Key_Kana_Shift:
setMode( LowercaseMode ); // Unlock caps setMode( LowercaseMode ); // Unlock caps
return; return;
case Qt::Key_Mode_switch: // Cycle through modes, but skip caps case Qt::Key_Mode_switch: // Cycle through modes, but skip caps
setMode( static_cast< QskInputPanel::Mode >( setMode( static_cast< QskInputPanel::Mode >(
m_data->mode ? ( ( m_data->mode + 1 ) % QskInputPanel::ModeCount ) m_data->mode ? ( ( m_data->mode + 1 ) % QskInputPanel::ModeCount )
: SpecialCharacterMode ) ); : SpecialCharacterMode ) );
return; return;
default: default:
break; break;
} }
@ -763,18 +817,23 @@ void QskInputPanel::updateLocale( const QLocale& locale )
case QLocale::Bulgarian: case QLocale::Bulgarian:
m_data->currentLayout = &qskInputPanelLayouts.bg; m_data->currentLayout = &qskInputPanelLayouts.bg;
break; break;
case QLocale::Czech: case QLocale::Czech:
m_data->currentLayout = &qskInputPanelLayouts.cs; m_data->currentLayout = &qskInputPanelLayouts.cs;
break; break;
case QLocale::German: case QLocale::German:
m_data->currentLayout = &qskInputPanelLayouts.de; m_data->currentLayout = &qskInputPanelLayouts.de;
break; break;
case QLocale::Danish: case QLocale::Danish:
m_data->currentLayout = &qskInputPanelLayouts.da; m_data->currentLayout = &qskInputPanelLayouts.da;
break; break;
case QLocale::Greek: case QLocale::Greek:
m_data->currentLayout = &qskInputPanelLayouts.el; m_data->currentLayout = &qskInputPanelLayouts.el;
break; break;
case QLocale::English: case QLocale::English:
{ {
switch ( locale.country() ) switch ( locale.country() )
@ -794,59 +853,76 @@ void QskInputPanel::updateLocale( const QLocale& locale )
case QLocale::Spanish: case QLocale::Spanish:
m_data->currentLayout = &qskInputPanelLayouts.es; m_data->currentLayout = &qskInputPanelLayouts.es;
break; break;
case QLocale::Finnish: case QLocale::Finnish:
m_data->currentLayout = &qskInputPanelLayouts.fi; m_data->currentLayout = &qskInputPanelLayouts.fi;
break; break;
case QLocale::French: case QLocale::French:
m_data->currentLayout = &qskInputPanelLayouts.fr; m_data->currentLayout = &qskInputPanelLayouts.fr;
break; break;
case QLocale::Hungarian: case QLocale::Hungarian:
m_data->currentLayout = &qskInputPanelLayouts.hu; m_data->currentLayout = &qskInputPanelLayouts.hu;
break; break;
case QLocale::Italian: case QLocale::Italian:
m_data->currentLayout = &qskInputPanelLayouts.it; m_data->currentLayout = &qskInputPanelLayouts.it;
break; break;
case QLocale::Japanese: case QLocale::Japanese:
m_data->currentLayout = &qskInputPanelLayouts.ja; m_data->currentLayout = &qskInputPanelLayouts.ja;
break; break;
case QLocale::Latvian: case QLocale::Latvian:
m_data->currentLayout = &qskInputPanelLayouts.lv; m_data->currentLayout = &qskInputPanelLayouts.lv;
break; break;
case QLocale::Lithuanian: case QLocale::Lithuanian:
m_data->currentLayout = &qskInputPanelLayouts.lt; m_data->currentLayout = &qskInputPanelLayouts.lt;
break; break;
case QLocale::Dutch: case QLocale::Dutch:
m_data->currentLayout = &qskInputPanelLayouts.nl; m_data->currentLayout = &qskInputPanelLayouts.nl;
break; break;
case QLocale::Portuguese: case QLocale::Portuguese:
m_data->currentLayout = &qskInputPanelLayouts.pt; m_data->currentLayout = &qskInputPanelLayouts.pt;
break; break;
case QLocale::Romanian: case QLocale::Romanian:
m_data->currentLayout = &qskInputPanelLayouts.ro; m_data->currentLayout = &qskInputPanelLayouts.ro;
break; break;
case QLocale::Russia: case QLocale::Russia:
m_data->currentLayout = &qskInputPanelLayouts.ru; m_data->currentLayout = &qskInputPanelLayouts.ru;
break; break;
case QLocale::Slovenian: case QLocale::Slovenian:
m_data->currentLayout = &qskInputPanelLayouts.sl; m_data->currentLayout = &qskInputPanelLayouts.sl;
break; break;
case QLocale::Slovak: case QLocale::Slovak:
m_data->currentLayout = &qskInputPanelLayouts.sk; m_data->currentLayout = &qskInputPanelLayouts.sk;
break; break;
case QLocale::Turkish: case QLocale::Turkish:
m_data->currentLayout = &qskInputPanelLayouts.tr; m_data->currentLayout = &qskInputPanelLayouts.tr;
break; break;
case QLocale::Chinese: case QLocale::Chinese:
m_data->currentLayout = &qskInputPanelLayouts.zh; m_data->currentLayout = &qskInputPanelLayouts.zh;
break; break;
default: default:
qWarning() << "QskInputPanel: unsupported locale:" << locale; qWarning() << "QskInputPanel: unsupported locale:" << locale;
case QLocale::C: case QLocale::C:
m_data->currentLayout = &qskInputPanelLayouts.en_US; m_data->currentLayout = &qskInputPanelLayouts.en_US;
break; break;
} }
Q_EMIT displayLanguageName(); Q_EMIT displayLanguageNameChanged();
updateKeyData(); updateKeyData();
setMode( LowercaseMode ); setMode( LowercaseMode );

View File

@ -54,7 +54,7 @@ namespace
private: private:
virtual QskControl* owningControl() const override final virtual QskControl* owningControl() const override final
{ {
return const_cast< QskInputPanel * >( m_panel ); return const_cast< QskInputPanel* >( m_panel );
} }
private: private:
@ -146,6 +146,7 @@ QSGNode* QskInputPanelSkinlet::updatePanelNode(
const auto rowIndex = &keyRow - panelKeyData; const auto rowIndex = &keyRow - panelKeyData;
auto& frames = panelNode->frames[ rowIndex ]; auto& frames = panelNode->frames[ rowIndex ];
auto& glyphs = panelNode->glyphs[ rowIndex ]; auto& glyphs = panelNode->glyphs[ rowIndex ];
for ( const auto& keyData : keyRow ) for ( const auto& keyData : keyRow )
{ {
const auto colIndex = &keyData - keyRow; const auto colIndex = &keyData - keyRow;