1 /***************************************************************************
2 * Copyright (C) 2010 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 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 Item *item = new Item();
35 item->collection = coll;
36 for(int i = 0; i < coll->actions().count(); i++) {
37 Action *action = qobject_cast<Action *>(coll->actions().at(i));
40 Item *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() {
53 qDeleteAll(_categoryItems);
56 QModelIndex ShortcutsModel::parent(const QModelIndex &child) const {
60 Item *item = static_cast<Item *>(child.internalPointer());
66 return createIndex(item->parentItem->row, 0, item->parentItem);
69 QModelIndex ShortcutsModel::index(int row, int column, const QModelIndex &parent) const {
72 return createIndex(row, column, static_cast<Item *>(parent.internalPointer())->actionItems.at(row));
74 // top level category item
75 return createIndex(row, column, _categoryItems.at(row));
78 int ShortcutsModel::columnCount(const QModelIndex &parent) const {
83 Item *item = static_cast<Item *>(parent.internalPointer());
92 int ShortcutsModel::rowCount(const QModelIndex &parent) const {
94 return _categoryItems.count();
96 Item *item = static_cast<Item *>(parent.internalPointer());
100 return item->actionItems.count();
105 QVariant ShortcutsModel::headerData(int section, Qt::Orientation orientation, int role) const {
106 if(orientation != Qt::Horizontal || role != Qt::DisplayRole)
112 return tr("Shortcut");
118 QVariant ShortcutsModel::data(const QModelIndex &index, int role) const {
122 Item *item = static_cast<Item *>(index.internalPointer());
125 if(!item->parentItem) {
126 if(index.column() != 0)
129 case Qt::DisplayRole:
130 return item->collection->property("Category");
136 Action *action = qobject_cast<Action *>(item->action);
140 case Qt::DisplayRole:
141 switch(index.column()) {
143 return stripAcceleratorMarkers(action->text());
145 return item->shortcut.toString(QKeySequence::NativeText);
150 case Qt::DecorationRole:
151 if(index.column() == 0)
152 return action->icon();
156 return QVariant::fromValue<QObject *>(action);
158 case DefaultShortcutRole:
159 return action->shortcut(Action::DefaultShortcut);
160 case ActiveShortcutRole:
161 return item->shortcut;
163 case IsConfigurableRole:
164 return action->isShortcutConfigurable();
171 bool ShortcutsModel::setData(const QModelIndex &index, const QVariant &value, int role) {
172 if(role != ActiveShortcutRole)
175 if(!index.parent().isValid())
178 Item *item = static_cast<Item *>(index.internalPointer());
181 QKeySequence newSeq = value.value<QKeySequence>();
182 QKeySequence oldSeq = item->shortcut;
183 QKeySequence storedSeq = item->action->shortcut(Action::ActiveShortcut);
185 item->shortcut = newSeq;
186 emit dataChanged(index, index.sibling(index.row(), 1));
188 if(oldSeq == storedSeq && newSeq != storedSeq) {
189 if(++_changedCount == 1)
190 emit hasChanged(true);
191 } else if(oldSeq != storedSeq && newSeq == storedSeq) {
192 if(--_changedCount == 0)
193 emit hasChanged(false);
199 void ShortcutsModel::load() {
200 foreach(Item *catItem, _categoryItems) {
201 foreach(Item *actItem, catItem->actionItems) {
202 actItem->shortcut = actItem->action->shortcut(Action::ActiveShortcut);
205 emit dataChanged(index(0, 1), index(rowCount()-1, 1));
206 if(_changedCount != 0) {
208 emit hasChanged(false);
212 void ShortcutsModel::commit() {
213 foreach(Item *catItem, _categoryItems) {
214 foreach(Item *actItem, catItem->actionItems) {
215 actItem->action->setShortcut(actItem->shortcut, Action::ActiveShortcut);
218 if(_changedCount != 0) {
220 emit hasChanged(false);
224 void ShortcutsModel::defaults() {
225 for(int cat = 0; cat < rowCount(); cat++) {
226 QModelIndex catidx = index(cat, 0);
227 for(int act = 0; act < rowCount(catidx); act++) {
228 QModelIndex actidx = index(act, 1, catidx);
229 setData(actidx, actidx.data(DefaultShortcutRole), ActiveShortcutRole);