2
* Copyright (C) 2010 Andriy Rysin (rysin@kde.org)
4
* This program is free software; you can redistribute it and/or modify
5
* it under the terms of the GNU General Public License as published by
6
* the Free Software Foundation; either version 2 of the License, or
7
* (at your option) any later version.
9
* This program is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
* GNU General Public License for more details.
14
* You should have received a copy of the GNU General Public License
15
* along with this program; if not, write to the Free Software
16
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19
#include "kcm_add_layout_dialog.h"
21
#include <klocalizedstring.h>
23
#include "xkb_rules.h"
25
#include "iso_codes.h"
27
#include "ui_kcm_add_layout_dialog.h"
30
AddLayoutDialog::AddLayoutDialog(const Rules* rules_, Flags* flags_, QWidget* parent):
34
selectedLanguage("no_language")
36
layoutDialogUi = new Ui_AddLayoutDialog();
37
layoutDialogUi->setupUi(this);
39
QSet<QString> languages;
40
foreach(const LayoutInfo* layoutInfo, rules->layoutInfos) {
41
QSet<QString> langs = QSet<QString>::fromList(layoutInfo->languages);
42
languages.unite( langs );
44
IsoCodes isoCodes(IsoCodes::iso_639);
45
foreach(const QString& lang, languages) {
46
const IsoCodeEntry* isoCodeEntry = isoCodes.getEntry(IsoCodes::attr_iso_639_2B_code, lang);
47
if( isoCodeEntry == NULL ) {
48
isoCodeEntry = isoCodes.getEntry(IsoCodes::attr_iso_639_2T_code, lang);
50
QString name = isoCodeEntry != NULL ? i18n(isoCodeEntry->value(IsoCodes::attr_name).toUtf8()) : lang;
51
layoutDialogUi->languageComboBox->addItem(name, lang);
53
layoutDialogUi->languageComboBox->model()->sort(0);
54
layoutDialogUi->languageComboBox->insertItem(0, i18n("Any language"), "");
55
layoutDialogUi->languageComboBox->setCurrentIndex(0);
57
bool noLabel = flags != NULL;
59
layoutDialogUi->labelLabel->setVisible(false);
60
layoutDialogUi->labelEdit->setVisible(false);
63
layoutDialogUi->labelEdit->setMaxLength(LayoutUnit::MAX_LABEL_LENGTH);
68
connect(layoutDialogUi->languageComboBox, SIGNAL(activated(int)), this, SLOT(languageChanged(int)));
69
connect(layoutDialogUi->layoutComboBox, SIGNAL(activated(int)), this, SLOT(layoutChanged(int)));
73
bool containsLanguage(const LayoutInfo* layoutInfo, const QString& lang)
75
if( layoutInfo->languages.contains(lang) )
78
foreach(const VariantInfo* variantInfo, layoutInfo->variantInfos) {
79
if( variantInfo->languages.contains(lang) )
85
void AddLayoutDialog::languageChanged(int langIdx)
87
QString lang = layoutDialogUi->languageComboBox->itemData(langIdx).toString();
88
if( lang == selectedLanguage )
91
QPixmap emptyPixmap(layoutDialogUi->layoutComboBox->iconSize());
92
emptyPixmap.fill(Qt::transparent);
94
layoutDialogUi->layoutComboBox->clear();
95
foreach(const LayoutInfo* layoutInfo, rules->layoutInfos) {
96
if( lang.isEmpty() || containsLanguage(layoutInfo, lang) ) {
98
QIcon icon(flags->getIcon(layoutInfo->name));
100
icon = QIcon(emptyPixmap); // align text with no icons
102
layoutDialogUi->layoutComboBox->addItem(icon, layoutInfo->description, layoutInfo->name);
105
layoutDialogUi->layoutComboBox->addItem(layoutInfo->description, layoutInfo->name);
109
layoutDialogUi->layoutComboBox->model()->sort(0);
110
layoutDialogUi->layoutComboBox->setCurrentIndex(0);
113
selectedLanguage = lang;
116
void AddLayoutDialog::layoutChanged(int layoutIdx)
118
QString layoutName = layoutDialogUi->layoutComboBox->itemData(layoutIdx).toString();
119
if( layoutName == selectedLayout )
122
QString lang = layoutDialogUi->languageComboBox->itemData(layoutDialogUi->languageComboBox->currentIndex()).toString();
124
layoutDialogUi->variantComboBox->clear();
125
const LayoutInfo* layoutInfo = rules->getLayoutInfo(layoutName);
126
foreach(const VariantInfo* variantInfo, layoutInfo->variantInfos) {
127
if( lang.isEmpty() || variantInfo->languages.contains(lang) ) {
128
layoutDialogUi->variantComboBox->addItem(variantInfo->description, variantInfo->name);
132
if( lang.isEmpty() || layoutInfo->languages.contains(lang) ) {
133
layoutDialogUi->variantComboBox->model()->sort(0);
134
layoutDialogUi->variantComboBox->insertItem(0, i18nc("variant", "Default"), "");
136
layoutDialogUi->variantComboBox->setCurrentIndex(0);
138
layoutDialogUi->labelEdit->setText(layoutName);
140
selectedLayout = layoutName;
143
void AddLayoutDialog::accept()
145
selectedLayoutUnit.layout = layoutDialogUi->layoutComboBox->itemData(layoutDialogUi->layoutComboBox->currentIndex()).toString();
146
selectedLayoutUnit.variant = layoutDialogUi->variantComboBox->itemData(layoutDialogUi->variantComboBox->currentIndex()).toString();
147
QString label = layoutDialogUi->labelEdit->text();
148
if( label == selectedLayoutUnit.layout ) {
151
selectedLayoutUnit.setDisplayName( label );
152
selectedLayoutUnit.setShortcut(layoutDialogUi->kkeysequencewidget->keySequence());