~ubuntu-branches/ubuntu/utopic/kde-workspace/utopic-proposed

« back to all changes in this revision

Viewing changes to kcontrol/keyboard/kcm_add_layout_dialog.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Michał Zając
  • Date: 2011-07-09 08:31:15 UTC
  • Revision ID: james.westby@ubuntu.com-20110709083115-ohyxn6z93mily9fc
Tags: upstream-4.6.90
Import upstream version 4.6.90

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 *  Copyright (C) 2010 Andriy Rysin (rysin@kde.org)
 
3
 *
 
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.
 
8
 *
 
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.
 
13
 *
 
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.
 
17
 */
 
18
 
 
19
#include "kcm_add_layout_dialog.h"
 
20
 
 
21
#include <klocalizedstring.h>
 
22
 
 
23
#include "xkb_rules.h"
 
24
#include "flags.h"
 
25
#include "iso_codes.h"
 
26
 
 
27
#include "ui_kcm_add_layout_dialog.h"
 
28
 
 
29
 
 
30
AddLayoutDialog::AddLayoutDialog(const Rules* rules_, Flags* flags_, QWidget* parent):
 
31
                QDialog(parent),
 
32
                rules(rules_),
 
33
                flags(flags_),
 
34
                selectedLanguage("no_language")
 
35
{
 
36
    layoutDialogUi = new Ui_AddLayoutDialog();
 
37
    layoutDialogUi->setupUi(this);
 
38
 
 
39
    QSet<QString> languages;
 
40
    foreach(const LayoutInfo* layoutInfo, rules->layoutInfos) {
 
41
        QSet<QString> langs = QSet<QString>::fromList(layoutInfo->languages);
 
42
        languages.unite( langs );
 
43
    }
 
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);
 
49
        }
 
50
        QString name = isoCodeEntry != NULL ? i18n(isoCodeEntry->value(IsoCodes::attr_name).toUtf8()) : lang;
 
51
        layoutDialogUi->languageComboBox->addItem(name, lang);
 
52
    }
 
53
    layoutDialogUi->languageComboBox->model()->sort(0);
 
54
        layoutDialogUi->languageComboBox->insertItem(0, i18n("Any language"), "");
 
55
        layoutDialogUi->languageComboBox->setCurrentIndex(0);
 
56
 
 
57
        bool noLabel = flags != NULL;
 
58
        if( noLabel ) {
 
59
                layoutDialogUi->labelLabel->setVisible(false);
 
60
                layoutDialogUi->labelEdit->setVisible(false);
 
61
        }
 
62
        else {
 
63
                layoutDialogUi->labelEdit->setMaxLength(LayoutUnit::MAX_LABEL_LENGTH);
 
64
        }
 
65
 
 
66
    languageChanged(0);
 
67
 
 
68
        connect(layoutDialogUi->languageComboBox, SIGNAL(activated(int)), this, SLOT(languageChanged(int)));
 
69
    connect(layoutDialogUi->layoutComboBox, SIGNAL(activated(int)), this, SLOT(layoutChanged(int)));
 
70
}
 
71
 
 
72
static
 
73
bool containsLanguage(const LayoutInfo* layoutInfo, const QString& lang)
 
74
{
 
75
        if( layoutInfo->languages.contains(lang) )
 
76
                return true;
 
77
 
 
78
        foreach(const VariantInfo* variantInfo, layoutInfo->variantInfos) {
 
79
                if( variantInfo->languages.contains(lang) )
 
80
                        return true;
 
81
        }
 
82
        return false;
 
83
}
 
84
 
 
85
void AddLayoutDialog::languageChanged(int langIdx)
 
86
{
 
87
        QString lang = layoutDialogUi->languageComboBox->itemData(langIdx).toString();
 
88
        if( lang == selectedLanguage )
 
89
                return;
 
90
 
 
91
        QPixmap emptyPixmap(layoutDialogUi->layoutComboBox->iconSize());
 
92
        emptyPixmap.fill(Qt::transparent);
 
93
 
 
94
        layoutDialogUi->layoutComboBox->clear();
 
95
    foreach(const LayoutInfo* layoutInfo, rules->layoutInfos) {
 
96
        if( lang.isEmpty() || containsLanguage(layoutInfo, lang) ) {
 
97
                if( flags ) {
 
98
                        QIcon icon(flags->getIcon(layoutInfo->name));
 
99
                        if( icon.isNull() ) {
 
100
                                icon = QIcon(emptyPixmap);      // align text with no icons
 
101
                        }
 
102
                        layoutDialogUi->layoutComboBox->addItem(icon, layoutInfo->description, layoutInfo->name);
 
103
                }
 
104
                else {
 
105
                        layoutDialogUi->layoutComboBox->addItem(layoutInfo->description, layoutInfo->name);
 
106
                }
 
107
        }
 
108
    }
 
109
    layoutDialogUi->layoutComboBox->model()->sort(0);
 
110
        layoutDialogUi->layoutComboBox->setCurrentIndex(0);
 
111
        layoutChanged(0);
 
112
 
 
113
        selectedLanguage = lang;
 
114
}
 
115
 
 
116
void AddLayoutDialog::layoutChanged(int layoutIdx)
 
117
{
 
118
        QString layoutName = layoutDialogUi->layoutComboBox->itemData(layoutIdx).toString();
 
119
        if( layoutName == selectedLayout )
 
120
                return;
 
121
 
 
122
        QString lang = layoutDialogUi->languageComboBox->itemData(layoutDialogUi->languageComboBox->currentIndex()).toString();
 
123
 
 
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);
 
129
        }
 
130
    }
 
131
 
 
132
    if( lang.isEmpty() || layoutInfo->languages.contains(lang) ) {
 
133
        layoutDialogUi->variantComboBox->model()->sort(0);
 
134
        layoutDialogUi->variantComboBox->insertItem(0, i18nc("variant", "Default"), "");
 
135
    }
 
136
        layoutDialogUi->variantComboBox->setCurrentIndex(0);
 
137
 
 
138
        layoutDialogUi->labelEdit->setText(layoutName);
 
139
 
 
140
        selectedLayout = layoutName;
 
141
}
 
142
 
 
143
void AddLayoutDialog::accept()
 
144
{
 
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 ) {
 
149
                label = "";
 
150
        }
 
151
        selectedLayoutUnit.setDisplayName( label );
 
152
        selectedLayoutUnit.setShortcut(layoutDialogUi->kkeysequencewidget->keySequence());
 
153
        QDialog::accept();
 
154
}