From 9b759997061eed35d22ebf65ccddc9fd0d460b49 Mon Sep 17 00:00:00 2001 From: Kevin Kofler Date: Fri, 5 Dec 2014 02:25:08 +0100 Subject: [PATCH] keyboard: Preselect the current keyboard layout variant. --- src/modules/keyboard/KeyboardPage.cpp | 50 ++++++++++++++++++++------- src/modules/keyboard/KeyboardPage.h | 2 ++ 2 files changed, 39 insertions(+), 13 deletions(-) diff --git a/src/modules/keyboard/KeyboardPage.cpp b/src/modules/keyboard/KeyboardPage.cpp index 5cbcad53b..5c414f73d 100644 --- a/src/modules/keyboard/KeyboardPage.cpp +++ b/src/modules/keyboard/KeyboardPage.cpp @@ -84,6 +84,7 @@ KeyboardPage::init() { //### Detect current keyboard layout and variant QString currentLayout; + QString currentVariant; QProcess process; process.start( "setxkbmap", QStringList() << "-print" ); @@ -109,9 +110,17 @@ KeyboardPage::init() currentLayout = split.at( 1 ); if ( currentLayout.contains( "(" ) ) + { + int parenthesisIndex = currentLayout.indexOf( "(" ); + currentVariant = currentLayout.mid( parenthesisIndex + 1 ) + .trimmed(); + currentVariant.chop( 1 ); currentLayout = currentLayout - .mid( 0, currentLayout.indexOf( "(" ) ) + .mid( 0, parenthesisIndex ) .trimmed(); + } + + break; } } } @@ -167,13 +176,19 @@ KeyboardPage::init() ui->listLayout->sortItems(); + // Set current layout and variant + if ( currentLayoutItem ) + { + ui->listLayout->setCurrentItem( currentLayoutItem ); + updateVariants( currentLayoutItem, currentVariant ); + } + // Unblock signals ui->listLayout->blockSignals( false ); - // Set current layout - if ( currentLayoutItem ) - ui->listLayout->setCurrentItem( currentLayoutItem ); - else if ( ui->listLayout->count() > 0 ) + // Default to the first available layout if none was set + // Do this after unblocking signals so we get the default variant handling. + if ( !currentLayoutItem && ui->listLayout->count() > 0 ) ui->listLayout->setCurrentRow( 0 ); } @@ -233,16 +248,12 @@ KeyboardPage::finalize() void -KeyboardPage::onListLayoutCurrentItemChanged( QListWidgetItem* current, QListWidgetItem* previous ) +KeyboardPage::updateVariants( LayoutItem* currentItem, QString currentVariant ) { - LayoutItem *item = dynamic_cast< LayoutItem* >( current ); - if ( !item ) - return; - // Block signals ui->listVariant->blockSignals( true ); - QMap< QString, QString > variants = item->info.variants; + QMap< QString, QString > variants = currentItem->info.variants; QMapIterator< QString, QString > li( variants ); LayoutItem* defaultItem = nullptr; @@ -252,12 +263,14 @@ KeyboardPage::onListLayoutCurrentItemChanged( QListWidgetItem* current, QListWid { li.next(); - item = new LayoutItem(); + LayoutItem* item = new LayoutItem(); item->setText( li.key() ); item->data = li.value(); ui->listVariant->addItem( item ); - if ( li.value() == "" ) + // currentVariant defaults to QString(). It is only non-empty during the + // initial setup. + if ( li.value() == currentVariant ) defaultItem = item; } @@ -270,6 +283,17 @@ KeyboardPage::onListLayoutCurrentItemChanged( QListWidgetItem* current, QListWid } +void +KeyboardPage::onListLayoutCurrentItemChanged( QListWidgetItem* current, QListWidgetItem* previous ) +{ + LayoutItem* item = dynamic_cast< LayoutItem* >( current ); + if ( !item ) + return; + + updateVariants( item ); +} + + void KeyboardPage::onListVariantCurrentItemChanged( QListWidgetItem* current, QListWidgetItem* previous ) { diff --git a/src/modules/keyboard/KeyboardPage.h b/src/modules/keyboard/KeyboardPage.h index fe5087502..0f12c3e63 100644 --- a/src/modules/keyboard/KeyboardPage.h +++ b/src/modules/keyboard/KeyboardPage.h @@ -68,6 +68,8 @@ private: KeyboardGlobal::KeyboardInfo info; }; + void updateVariants( LayoutItem* currentItem, QString currentVariant = QString() ); + Ui::Page_Keyboard *ui; KeyBoardPreview* m_keyboardPreview; int m_defaultIndex;