Files
cantata/support/shortcutsmodel.cpp
Craig Drummond eff0e66d39 Use AUTOMOC
2018-03-07 19:04:14 +00:00

240 lines
6.9 KiB
C++

/***************************************************************************
* Copyright (C) 2010 by the Quassel Project *
* devel@quassel-irc.org *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) version 3. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#include "shortcutsmodel.h"
#include "action.h"
#include "actioncollection.h"
#include "utils.h"
#include <QCoreApplication>
ShortcutsModel::ShortcutsModel(const QHash<QString, ActionCollection *> &actionCollections, QObject *parent)
: QAbstractItemModel(parent),
_changedCount(0)
{
_showIcons=!QCoreApplication::testAttribute(Qt::AA_DontShowIconsInMenus);
for(int r = 0; r < actionCollections.values().count(); r++) {
ActionCollection *coll = actionCollections.values().at(r);
Item *item = new Item();
item->row = r;
item->collection = coll;
for(int i = 0; i < coll->actions().count(); i++) {
Action *action = qobject_cast<Action *>(coll->actions().at(i));
if(!action)
continue;
Item *actionItem = new Item();
actionItem->parentItem = item;
actionItem->row = i;
actionItem->collection = coll;
actionItem->action = action;
actionItem->shortcut = action->shortcut();
item->actionItems.append(actionItem);
}
_categoryItems.append(item);
}
}
ShortcutsModel::~ShortcutsModel() {
qDeleteAll(_categoryItems);
}
QModelIndex ShortcutsModel::parent(const QModelIndex &child) const {
if(!child.isValid())
return QModelIndex();
Item *item = static_cast<Item *>(child.internalPointer());
Q_ASSERT(item);
if(!item->parentItem)
return QModelIndex();
return createIndex(item->parentItem->row, 0, item->parentItem);
}
QModelIndex ShortcutsModel::index(int row, int column, const QModelIndex &parent) const {
if(parent.isValid())
return createIndex(row, column, static_cast<Item *>(parent.internalPointer())->actionItems.at(row));
// top level category item
return createIndex(row, column, _categoryItems.at(row));
}
int ShortcutsModel::columnCount(const QModelIndex &parent) const {
Q_UNUSED(parent)
return 2;
/*if(!parent.isValid())
return 2;
Item *item = static_cast<Item *>(parent.internalPointer());
Q_ASSERT(item);
if(!item->parentItem)
return 2;
return 2;*/
}
int ShortcutsModel::rowCount(const QModelIndex &parent) const {
if(!parent.isValid())
return _categoryItems.count();
Item *item = static_cast<Item *>(parent.internalPointer());
Q_ASSERT(item);
if(!item->parentItem)
return item->actionItems.count();
return 0;
}
QVariant ShortcutsModel::headerData(int section, Qt::Orientation orientation, int role) const {
if(orientation != Qt::Horizontal || role != Qt::DisplayRole)
return QVariant();
switch(section) {
case 0:
return tr("Action");
case 1:
return tr("Shortcut");
default:
return QVariant();
}
}
QVariant ShortcutsModel::data(const QModelIndex &index, int role) const {
if(!index.isValid())
return QVariant();
Item *item = static_cast<Item *>(index.internalPointer());
Q_ASSERT(item);
if(!item->parentItem) {
if(index.column() != 0)
return QVariant();
switch(role) {
case Qt::DisplayRole:
return item->collection->property("Category");
default:
return QVariant();
}
}
Action *action = qobject_cast<Action *>(item->action);
Q_ASSERT(action);
switch(role) {
case Qt::DisplayRole:
switch(index.column()) {
case 0: {
return Action::settingsText(action);
}
case 1:
return item->shortcut.toString(QKeySequence::NativeText);
default:
return QVariant();
}
case Qt::DecorationRole:
if(index.column() == 0 && _showIcons)
return action->icon();
return QVariant();
case ActionRole:
return QVariant::fromValue<QObject *>(action);
case DefaultShortcutRole:
return action->shortcut(Action::DefaultShortcut);
case ActiveShortcutRole:
return item->shortcut;
case IsConfigurableRole:
return action->isShortcutConfigurable();
default:
return QVariant();
}
}
bool ShortcutsModel::setData(const QModelIndex &index, const QVariant &value, int role) {
if(role != ActiveShortcutRole)
return false;
if(!index.parent().isValid())
return false;
Item *item = static_cast<Item *>(index.internalPointer());
Q_ASSERT(item);
Q_ASSERT(item->action);
QKeySequence newSeq = value.value<QKeySequence>();
QKeySequence oldSeq = item->shortcut;
QKeySequence storedSeq = item->action->shortcut(Action::ActiveShortcut);
item->shortcut = newSeq;
emit dataChanged(index, index.sibling(index.row(), 1));
if(oldSeq == storedSeq && newSeq != storedSeq) {
if(++_changedCount == 1)
emit hasChanged(true);
} else if(oldSeq != storedSeq && newSeq == storedSeq) {
if(--_changedCount == 0)
emit hasChanged(false);
}
return true;
}
void ShortcutsModel::load() {
for (Item *catItem: _categoryItems) {
for (Item *actItem: catItem->actionItems) {
actItem->shortcut = actItem->action->shortcut(Action::ActiveShortcut);
}
}
emit dataChanged(index(0, 1), index(rowCount()-1, 1));
if(_changedCount != 0) {
_changedCount = 0;
emit hasChanged(false);
}
}
void ShortcutsModel::commit() {
for (Item *catItem: _categoryItems) {
for (Item *actItem: catItem->actionItems) {
actItem->action->setShortcut(actItem->shortcut, Action::ActiveShortcut);
}
catItem->collection->writeSettings();
}
if(_changedCount != 0) {
_changedCount = 0;
emit hasChanged(false);
}
}
void ShortcutsModel::defaults() {
for(int cat = 0; cat < rowCount(); cat++) {
QModelIndex catidx = index(cat, 0);
for(int act = 0; act < rowCount(catidx); act++) {
QModelIndex actidx = index(act, 1, catidx);
setData(actidx, actidx.data(DefaultShortcutRole), ActiveShortcutRole);
}
}
}
#include "moc_shortcutsmodel.cpp"