1 /***************************************************************************
2 * Copyright (C) 2005-2018 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 ***************************************************************************/
21 #include "shortcutsmodel.h"
24 #include "actioncollection.h"
27 ShortcutsModel::ShortcutsModel(const QHash<QString, ActionCollection*>& actionCollections, QObject* parent)
28 : QAbstractItemModel(parent)
31 for (int r = 0; r < actionCollections.values().count(); r++) {
32 ActionCollection* coll = actionCollections.values().at(r);
33 auto* item = new Item();
35 item->collection = coll;
36 for (int i = 0; i < coll->actions().count(); i++) {
37 auto* action = qobject_cast<Action*>(coll->actions().at(i));
40 auto* actionItem = new Item();
41 actionItem->parentItem = item;
43 actionItem->collection = coll;
44 actionItem->action = action;
45 actionItem->shortcut = action->shortcut();
46 item->actionItems.append(actionItem);
48 _categoryItems.append(item);
52 ShortcutsModel::~ShortcutsModel()
54 qDeleteAll(_categoryItems);
57 QModelIndex ShortcutsModel::parent(const QModelIndex& child) const
62 auto* item = static_cast<Item*>(child.internalPointer());
65 if (!item->parentItem)
68 return createIndex(item->parentItem->row, 0, item->parentItem);
71 QModelIndex ShortcutsModel::index(int row, int column, const QModelIndex& parent) const
74 return createIndex(row, column, static_cast<Item*>(parent.internalPointer())->actionItems.at(row));
76 // top level category item
77 return createIndex(row, column, _categoryItems.at(row));
80 int ShortcutsModel::columnCount(const QModelIndex& parent) const
83 if (!parent.isValid())
86 auto* item = static_cast<Item*>(parent.internalPointer());
89 if (!item->parentItem)
95 int ShortcutsModel::rowCount(const QModelIndex& parent) const
97 if (!parent.isValid())
98 return _categoryItems.count();
100 auto* item = static_cast<Item*>(parent.internalPointer());
103 if (!item->parentItem)
104 return item->actionItems.count();
109 QVariant ShortcutsModel::headerData(int section, Qt::Orientation orientation, int role) const
111 if (orientation != Qt::Horizontal || role != Qt::DisplayRole)
117 return tr("Shortcut");
123 QVariant ShortcutsModel::data(const QModelIndex& index, int role) const
125 if (!index.isValid())
128 auto* item = static_cast<Item*>(index.internalPointer());
131 if (!item->parentItem) {
132 if (index.column() != 0)
135 case Qt::DisplayRole:
136 return item->collection->property("Category");
142 auto* action = qobject_cast<Action*>(item->action);
146 case Qt::DisplayRole:
147 switch (index.column()) {
149 return stripAcceleratorMarkers(action->text());
151 return item->shortcut.toString(QKeySequence::NativeText);
156 case Qt::DecorationRole:
157 if (index.column() == 0)
158 return action->icon();
162 return QVariant::fromValue<QObject*>(action);
164 case DefaultShortcutRole:
165 return action->shortcut(Action::DefaultShortcut);
166 case ActiveShortcutRole:
167 return item->shortcut;
169 case IsConfigurableRole:
170 return action->isShortcutConfigurable();
177 bool ShortcutsModel::setData(const QModelIndex& index, const QVariant& value, int role)
179 if (role != ActiveShortcutRole)
182 if (!index.parent().isValid())
185 auto* item = static_cast<Item*>(index.internalPointer());
188 QKeySequence newSeq = value.value<QKeySequence>();
189 QKeySequence oldSeq = item->shortcut;
190 QKeySequence storedSeq = item->action->shortcut(Action::ActiveShortcut);
192 item->shortcut = newSeq;
193 emit dataChanged(index, index.sibling(index.row(), 1));
195 if (oldSeq == storedSeq && newSeq != storedSeq) {
196 if (++_changedCount == 1)
199 else if (oldSeq != storedSeq && newSeq == storedSeq) {
200 if (--_changedCount == 0)
207 void ShortcutsModel::load()
209 foreach (Item* catItem, _categoryItems) {
210 foreach (Item* actItem, catItem->actionItems) {
211 actItem->shortcut = actItem->action->shortcut(Action::ActiveShortcut);
214 emit dataChanged(index(0, 1), index(rowCount() - 1, 1));
215 if (_changedCount != 0) {
221 void ShortcutsModel::commit()
223 foreach (Item* catItem, _categoryItems) {
224 foreach (Item* actItem, catItem->actionItems) {
225 actItem->action->setShortcut(actItem->shortcut, Action::ActiveShortcut);
228 if (_changedCount != 0) {
234 void ShortcutsModel::defaults()
236 for (int cat = 0; cat < rowCount(); cat++) {
237 QModelIndex catidx = index(cat, 0);
238 for (int act = 0; act < rowCount(catidx); act++) {
239 QModelIndex actidx = index(act, 1, catidx);
240 setData(actidx, actidx.data(DefaultShortcutRole), ActiveShortcutRole);