Fix keysequence strings for Mac again
[quassel.git] / src / qtui / settingspages / shortcutssettingspage.cpp
1
2 /***************************************************************************
3  *   Copyright (C) 2010 by the Quassel Project                             *
4  *   devel@quassel-irc.org                                                 *
5  *                                                                         *
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.                                           *
10  *                                                                         *
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.                          *
15  *                                                                         *
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  ***************************************************************************/
21
22 #include <QTimer>
23
24 #include "shortcutssettingspage.h"
25
26 #include "action.h"
27 #include "actioncollection.h"
28 #include "qtui.h"
29 #include "shortcutsmodel.h"
30 #include "util.h"
31
32 ShortcutsFilter::ShortcutsFilter(QObject *parent) : QSortFilterProxyModel(parent) {
33   setDynamicSortFilter(true);
34 }
35
36 void ShortcutsFilter::setFilterString(const QString &filterString) {
37   _filterString = filterString;
38   invalidateFilter();
39 }
40
41 bool ShortcutsFilter::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const {
42   if(!source_parent.isValid())
43     return true;
44
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())
48     return false;
49
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))
52       return true;
53   }
54   return false;
55 }
56
57 /****************************************************************************/
58
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))
63 {
64   ui.setupUi(this);
65
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);
71
72   ui.keySequenceWidget->setModel(_shortcutsModel);
73   connect(ui.keySequenceWidget, SIGNAL(keySequenceChanged(QKeySequence,QModelIndex)), SLOT(keySequenceChanged(QKeySequence,QModelIndex)));
74
75   connect(ui.shortcutsView->selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), SLOT(setWidgetStates()));
76
77   setWidgetStates();
78
79   connect(ui.useDefault, SIGNAL(clicked(bool)), SLOT(toggledCustomOrDefault()));
80   connect(ui.useCustom, SIGNAL(clicked(bool)), SLOT(toggledCustomOrDefault()));
81
82   connect(_shortcutsModel, SIGNAL(hasChanged(bool)), SLOT(setChangedState(bool)));
83
84   // fugly, but directly setting it from the ctor doesn't seem to work
85   QTimer::singleShot(0, ui.searchEdit, SLOT(setFocus()));
86 }
87
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);
94     if(active == def) {
95       ui.useDefault->setChecked(true);
96       ui.keySequenceWidget->setKeySequence(QKeySequence());
97     } else {
98       ui.useCustom->setChecked(true);
99       ui.keySequenceWidget->setKeySequence(active);
100     }
101   } else {
102     ui.defaultShortcut->setText(tr("None"));
103     ui.actionBox->setEnabled(false);
104     ui.useDefault->setChecked(true);
105     ui.keySequenceWidget->setKeySequence(QKeySequence());
106   }
107 }
108
109 void ShortcutsSettingsPage::on_searchEdit_textChanged(const QString &text) {
110   _shortcutsFilter->setFilterString(text);
111 }
112
113 void ShortcutsSettingsPage::keySequenceChanged(const QKeySequence &seq, const QModelIndex &conflicting) {
114   if(conflicting.isValid())
115     _shortcutsModel->setData(conflicting, QKeySequence(), ShortcutsModel::ActiveShortcutRole);
116
117   QModelIndex rowIdx = _shortcutsFilter->mapToSource(ui.shortcutsView->currentIndex());
118   Q_ASSERT(rowIdx.isValid());
119   _shortcutsModel->setData(rowIdx, seq, ShortcutsModel::ActiveShortcutRole);
120   setWidgetStates();
121 }
122
123 void ShortcutsSettingsPage::toggledCustomOrDefault() {
124   if(!ui.shortcutsView->currentIndex().isValid())
125     return;
126
127   QModelIndex index = _shortcutsFilter->mapToSource(ui.shortcutsView->currentIndex());
128   Q_ASSERT(index.isValid());
129
130   if(ui.useDefault->isChecked()) {
131     _shortcutsModel->setData(index, index.data(ShortcutsModel::DefaultShortcutRole));
132   } else {
133     _shortcutsModel->setData(index, QKeySequence());
134   }
135   setWidgetStates();
136 }
137
138 void ShortcutsSettingsPage::save() {
139   _shortcutsModel->commit();
140   QtUi::saveShortcuts();
141   SettingsPage::save();
142 }
143
144 void ShortcutsSettingsPage::load() {
145   _shortcutsModel->load();
146
147   SettingsPage::load();
148 }
149
150 void ShortcutsSettingsPage::defaults() {
151   _shortcutsModel->defaults();
152
153   SettingsPage::defaults();
154 }