2 /***************************************************************************
3 * Copyright (C) 2010 by the Quassel Project *
4 * devel@quassel-irc.org *
6 * This program is free software; you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License as published by *
8 * the Free Software Foundation; either version 2 of the License, or *
9 * (at your option) version 3. *
11 * This program is distributed in the hope that it will be useful, *
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14 * GNU General Public License for more details. *
16 * You should have received a copy of the GNU General Public License *
17 * along with this program; if not, write to the *
18 * Free Software Foundation, Inc., *
19 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
20 ***************************************************************************/
24 #include "shortcutssettingspage.h"
27 #include "actioncollection.h"
29 #include "shortcutsmodel.h"
32 ShortcutsFilter::ShortcutsFilter(QObject *parent) : QSortFilterProxyModel(parent) {
33 setDynamicSortFilter(true);
36 void ShortcutsFilter::setFilterString(const QString &filterString) {
37 _filterString = filterString;
41 bool ShortcutsFilter::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const {
42 if(!source_parent.isValid())
45 QModelIndex index = source_parent.model()->index(source_row, 0, source_parent);
46 Q_ASSERT(index.isValid());
47 if(!qobject_cast<Action *>(index.data(ShortcutsModel::ActionRole).value<QObject *>())->isShortcutConfigurable())
50 for(int col = 0; col < source_parent.model()->columnCount(source_parent); col++) {
51 if(source_parent.model()->index(source_row, col, source_parent).data().toString().contains(_filterString, Qt::CaseInsensitive))
57 /****************************************************************************/
59 ShortcutsSettingsPage::ShortcutsSettingsPage(const QHash<QString, ActionCollection *> &actionCollections, QWidget *parent)
60 : SettingsPage(tr("Interface"), tr("Shortcuts"), parent),
61 _shortcutsModel(new ShortcutsModel(actionCollections, this)),
62 _shortcutsFilter(new ShortcutsFilter(this))
66 _shortcutsFilter->setSourceModel(_shortcutsModel);
67 ui.shortcutsView->setModel(_shortcutsFilter);
68 ui.shortcutsView->expandAll();
69 ui.shortcutsView->resizeColumnToContents(0);
70 ui.shortcutsView->sortByColumn(0, Qt::AscendingOrder);
72 ui.keySequenceWidget->setModel(_shortcutsModel);
73 connect(ui.keySequenceWidget, SIGNAL(keySequenceChanged(QKeySequence,QModelIndex)), SLOT(keySequenceChanged(QKeySequence,QModelIndex)));
75 connect(ui.shortcutsView->selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), SLOT(setWidgetStates()));
79 connect(ui.useDefault, SIGNAL(clicked(bool)), SLOT(toggledCustomOrDefault()));
80 connect(ui.useCustom, SIGNAL(clicked(bool)), SLOT(toggledCustomOrDefault()));
82 connect(_shortcutsModel, SIGNAL(hasChanged(bool)), SLOT(setChangedState(bool)));
84 // fugly, but directly setting it from the ctor doesn't seem to work
85 QTimer::singleShot(0, ui.searchEdit, SLOT(setFocus()));
88 void ShortcutsSettingsPage::setWidgetStates() {
89 if(ui.shortcutsView->currentIndex().isValid() && ui.shortcutsView->currentIndex().parent().isValid()) {
90 QKeySequence active = ui.shortcutsView->currentIndex().data(ShortcutsModel::ActiveShortcutRole).value<QKeySequence>();
91 QKeySequence def = ui.shortcutsView->currentIndex().data(ShortcutsModel::DefaultShortcutRole).value<QKeySequence>();
92 ui.defaultShortcut->setText(def.isEmpty()? tr("None") : def.toString(QKeySequence::NativeText));
93 ui.actionBox->setEnabled(true);
95 ui.useDefault->setChecked(true);
96 ui.keySequenceWidget->setKeySequence(QKeySequence());
98 ui.useCustom->setChecked(true);
99 ui.keySequenceWidget->setKeySequence(active);
102 ui.defaultShortcut->setText(tr("None"));
103 ui.actionBox->setEnabled(false);
104 ui.useDefault->setChecked(true);
105 ui.keySequenceWidget->setKeySequence(QKeySequence());
109 void ShortcutsSettingsPage::on_searchEdit_textChanged(const QString &text) {
110 _shortcutsFilter->setFilterString(text);
113 void ShortcutsSettingsPage::keySequenceChanged(const QKeySequence &seq, const QModelIndex &conflicting) {
114 if(conflicting.isValid())
115 _shortcutsModel->setData(conflicting, QKeySequence(), ShortcutsModel::ActiveShortcutRole);
117 QModelIndex rowIdx = _shortcutsFilter->mapToSource(ui.shortcutsView->currentIndex());
118 Q_ASSERT(rowIdx.isValid());
119 _shortcutsModel->setData(rowIdx, seq, ShortcutsModel::ActiveShortcutRole);
123 void ShortcutsSettingsPage::toggledCustomOrDefault() {
124 if(!ui.shortcutsView->currentIndex().isValid())
127 QModelIndex index = _shortcutsFilter->mapToSource(ui.shortcutsView->currentIndex());
128 Q_ASSERT(index.isValid());
130 if(ui.useDefault->isChecked()) {
131 _shortcutsModel->setData(index, index.data(ShortcutsModel::DefaultShortcutRole));
133 _shortcutsModel->setData(index, QKeySequence());
138 void ShortcutsSettingsPage::save() {
139 _shortcutsModel->commit();
140 QtUi::saveShortcuts();
141 SettingsPage::save();
144 void ShortcutsSettingsPage::load() {
145 _shortcutsModel->load();
147 SettingsPage::load();
150 void ShortcutsSettingsPage::defaults() {
151 _shortcutsModel->defaults();
153 SettingsPage::defaults();