1 /***************************************************************************
2 * Copyright (C) 2005-2013 by the Quassel Project *
3 * devel@quassel-irc.org *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) version 3. *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the *
17 * Free Software Foundation, Inc., *
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
19 ***************************************************************************/
23 #include "shortcutssettingspage.h"
26 #include "actioncollection.h"
28 #include "shortcutsmodel.h"
31 ShortcutsFilter::ShortcutsFilter(QObject *parent) : QSortFilterProxyModel(parent)
33 setDynamicSortFilter(true);
37 void ShortcutsFilter::setFilterString(const QString &filterString)
39 _filterString = filterString;
44 bool ShortcutsFilter::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
46 if (!source_parent.isValid())
49 QModelIndex index = source_parent.model()->index(source_row, 0, source_parent);
50 Q_ASSERT(index.isValid());
51 if (!qobject_cast<Action *>(index.data(ShortcutsModel::ActionRole).value<QObject *>())->isShortcutConfigurable())
54 for (int col = 0; col < source_parent.model()->columnCount(source_parent); col++) {
55 if (source_parent.model()->index(source_row, col, source_parent).data().toString().contains(_filterString, Qt::CaseInsensitive))
62 /****************************************************************************/
64 ShortcutsSettingsPage::ShortcutsSettingsPage(const QHash<QString, ActionCollection *> &actionCollections, QWidget *parent)
65 : SettingsPage(tr("Interface"), tr("Shortcuts"), parent),
66 _shortcutsModel(new ShortcutsModel(actionCollections, this)),
67 _shortcutsFilter(new ShortcutsFilter(this))
71 _shortcutsFilter->setSourceModel(_shortcutsModel);
72 ui.shortcutsView->setModel(_shortcutsFilter);
73 ui.shortcutsView->expandAll();
74 ui.shortcutsView->resizeColumnToContents(0);
75 ui.shortcutsView->sortByColumn(0, Qt::AscendingOrder);
77 ui.keySequenceWidget->setModel(_shortcutsModel);
78 connect(ui.keySequenceWidget, SIGNAL(keySequenceChanged(QKeySequence, QModelIndex)), SLOT(keySequenceChanged(QKeySequence, QModelIndex)));
80 connect(ui.shortcutsView->selectionModel(), SIGNAL(currentChanged(QModelIndex, QModelIndex)), SLOT(setWidgetStates()));
84 connect(ui.useDefault, SIGNAL(clicked(bool)), SLOT(toggledCustomOrDefault()));
85 connect(ui.useCustom, SIGNAL(clicked(bool)), SLOT(toggledCustomOrDefault()));
87 connect(_shortcutsModel, SIGNAL(hasChanged(bool)), SLOT(setChangedState(bool)));
89 // fugly, but directly setting it from the ctor doesn't seem to work
90 QTimer::singleShot(0, ui.searchEdit, SLOT(setFocus()));
94 void ShortcutsSettingsPage::setWidgetStates()
96 if (ui.shortcutsView->currentIndex().isValid() && ui.shortcutsView->currentIndex().parent().isValid()) {
97 QKeySequence active = ui.shortcutsView->currentIndex().data(ShortcutsModel::ActiveShortcutRole).value<QKeySequence>();
98 QKeySequence def = ui.shortcutsView->currentIndex().data(ShortcutsModel::DefaultShortcutRole).value<QKeySequence>();
99 ui.defaultShortcut->setText(def.isEmpty() ? tr("None") : def.toString(QKeySequence::NativeText));
100 ui.actionBox->setEnabled(true);
102 ui.useDefault->setChecked(true);
103 ui.keySequenceWidget->setKeySequence(QKeySequence());
106 ui.useCustom->setChecked(true);
107 ui.keySequenceWidget->setKeySequence(active);
111 ui.defaultShortcut->setText(tr("None"));
112 ui.actionBox->setEnabled(false);
113 ui.useDefault->setChecked(true);
114 ui.keySequenceWidget->setKeySequence(QKeySequence());
119 void ShortcutsSettingsPage::on_searchEdit_textChanged(const QString &text)
121 _shortcutsFilter->setFilterString(text);
125 void ShortcutsSettingsPage::keySequenceChanged(const QKeySequence &seq, const QModelIndex &conflicting)
127 if (conflicting.isValid())
128 _shortcutsModel->setData(conflicting, QKeySequence(), ShortcutsModel::ActiveShortcutRole);
130 QModelIndex rowIdx = _shortcutsFilter->mapToSource(ui.shortcutsView->currentIndex());
131 Q_ASSERT(rowIdx.isValid());
132 _shortcutsModel->setData(rowIdx, seq, ShortcutsModel::ActiveShortcutRole);
137 void ShortcutsSettingsPage::toggledCustomOrDefault()
139 if (!ui.shortcutsView->currentIndex().isValid())
142 QModelIndex index = _shortcutsFilter->mapToSource(ui.shortcutsView->currentIndex());
143 Q_ASSERT(index.isValid());
145 if (ui.useDefault->isChecked()) {
146 _shortcutsModel->setData(index, index.data(ShortcutsModel::DefaultShortcutRole));
149 _shortcutsModel->setData(index, QKeySequence());
155 void ShortcutsSettingsPage::save()
157 _shortcutsModel->commit();
158 QtUi::saveShortcuts();
159 SettingsPage::save();
163 void ShortcutsSettingsPage::load()
165 _shortcutsModel->load();
167 SettingsPage::load();
171 void ShortcutsSettingsPage::defaults()
173 _shortcutsModel->defaults();
175 SettingsPage::defaults();