2 * Copyright 2008 Michael Jansen <kde@michael-jansen.biz>
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.
18 #include "kglobalshortcutseditor.h"
20 #include <QStackedWidget>
23 #include "ui_kglobalshortcutseditor.h"
24 #include "kactioncollection.h"
25 #include "kshortcut.h"
27 #include <kglobalaccel.h>
29 //### copied over from kdedglobalaccel.cpp (figure out a header file to put it in!)
34 ComponentFriendly
= 2,
41 * This class was created because the kshortcutseditor class has some shortcomings. That class uses
42 * QTreeWidget and therefore makes it impossible for an outsider to switch the models. But the
43 * global shortcuts editor did that. Each global component ( kded, krunner, kopete ... ) was
44 * destined to be separately edited. If you selected another component the kshortcutseditor was
45 * cleared and refilled. But the items take care of undoing. Therefore when switching the component
46 * you lost the undo history.
48 * To solve that problem this class keeps one kshortcuteditor for each component. That is easier
49 * than rewrite that dialog to a model/view framework.
51 * It perfectly covers a bug of KExtedableItemDelegate when clearing and refilling the associated
57 KShortcutsEditor
*editor
;
61 class KGlobalShortcutsEditor::KGlobalShortcutsEditorPrivate
65 KGlobalShortcutsEditorPrivate(KGlobalShortcutsEditor
*q
)
72 KGlobalShortcutsEditor
*q
;
73 Ui::KGlobalShortcutsEditor ui
;
74 QStackedWidget
*stack
;
75 KShortcutsEditor::ActionTypes actionTypes
;
76 QHash
<QString
, componentData
> components
;
80 void KGlobalShortcutsEditor::KGlobalShortcutsEditorPrivate::initGUI()
83 // Create a stacked widget.
84 stack
= new QStackedWidget(q
);
85 q
->layout()->addWidget(stack
);
86 // Connect our components
87 connect(ui
.components
, SIGNAL(activated(const QString
&)),
88 q
, SLOT(activateComponent(const QString
&)));
92 KGlobalShortcutsEditor::KGlobalShortcutsEditor(QWidget
*parent
, KShortcutsEditor::ActionTypes actionTypes
)
94 d(new KGlobalShortcutsEditorPrivate(this))
96 d
->actionTypes
= actionTypes
;
102 KGlobalShortcutsEditor::~KGlobalShortcutsEditor()
104 // Before closing the door, undo all changes
110 void KGlobalShortcutsEditor::activateComponent(const QString
&component
)
112 QHash
<QString
, componentData
>::Iterator iter
= d
->components
.find(component
);
113 if (iter
== d
->components
.end()) {
114 // Unknown component. Its a bad bad world
115 kWarning() << "The component " << component
<< " is unknown";
116 Q_ASSERT(iter
!= d
->components
.end());
119 // Known component. Get it.
120 d
->stack
->setCurrentWidget((*iter
).editor
);
125 void KGlobalShortcutsEditor::addCollection(
126 KActionCollection
*collection
,
128 const QString
&friendlyName
)
130 KShortcutsEditor
*editor
;
131 // Check if this component is known
132 QHash
<QString
, componentData
>::Iterator iter
= d
->components
.find(friendlyName
);
133 if (iter
== d
->components
.end()) {
134 // Unknown component. Create an editor.
135 editor
= new KShortcutsEditor(this, d
->actionTypes
);
136 d
->stack
->addWidget(editor
);
137 // Add to the component combobox
138 d
->ui
.components
->addItem(friendlyName
);
139 // Add to our component registry
143 d
->components
.insert(friendlyName
, cd
);
144 connect(editor
, SIGNAL(keyChange()), this, SLOT(_k_key_changed()));
147 editor
= (*iter
).editor
;
150 // Add the collection to the editor of the component
151 editor
->addCollection(collection
, friendlyName
);
153 if (d
->ui
.components
->count() > -1) {
154 d
->ui
.components
->setCurrentIndex(0);
155 activateComponent(d
->ui
.components
->itemText(0));
160 void KGlobalShortcutsEditor::allDefault()
162 // The editors are responsible for the reset
164 foreach (const componentData
&cd
, d
->components
) {
165 cd
.editor
->allDefault();
170 void KGlobalShortcutsEditor::clear()
172 // Remove all components and their associated editors
173 foreach (const componentData
&cd
, d
->components
) {
176 d
->components
.clear();
177 d
->ui
.components
->clear();
182 void KGlobalShortcutsEditor::save()
184 // The editors are responsible for the saving
185 kDebug() << "Save the changes";
186 foreach (const componentData
&cd
, d
->components
) {
192 void KGlobalShortcutsEditor::importConfiguration(KConfig
*config
)
194 // The editors are responsible for the writing of the scheme
195 foreach (const componentData
&cd
, d
->components
) {
196 cd
.editor
->importConfiguration(config
);
200 void KGlobalShortcutsEditor::exportConfiguration(KConfig
*config
) const
202 // The editors are responsible for the writing of the scheme
203 foreach (const componentData
&cd
, d
->components
) {
204 cd
.editor
->exportConfiguration(config
);
209 void KGlobalShortcutsEditor::undo()
211 // The editors are responsible for the undo
212 kDebug() << "Undo the changes";
213 foreach (const componentData
&cd
, d
->components
) {
214 cd
.editor
->undoChanges();
219 bool KGlobalShortcutsEditor::isModified() const
221 foreach (const componentData
&cd
, d
->components
) {
222 if (cd
.editor
->isModified()) {
230 void KGlobalShortcutsEditor::_k_key_changed()
232 emit
changed(isModified());
235 #include "kglobalshortcutseditor.moc"