mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
225 lines
7.7 KiB
225 lines
7.7 KiB
/* |
|
SPDX-FileCopyrightText: 2020 David Redondo <[email protected]> |
|
|
|
SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL |
|
*/ |
|
|
|
#include "basemodel.h" |
|
|
|
#include "kcmkeys_debug.h" |
|
|
|
BaseModel::BaseModel(QObject *parent) |
|
: QAbstractItemModel(parent) |
|
{ |
|
} |
|
|
|
void BaseModel::addShortcut(const QModelIndex &index, const QKeySequence &shortcut) |
|
{ |
|
if (!checkIndex(index, QAbstractItemModel::CheckIndexOption::IndexIsValid) || !index.parent().isValid()) { |
|
return; |
|
} |
|
if (shortcut.isEmpty()) { |
|
return; |
|
} |
|
qCDebug(KCMKEYS) << "Adding shortcut" << index << shortcut; |
|
Action &a = m_components[index.parent().row()].actions[index.row()]; |
|
a.activeShortcuts.insert(shortcut); |
|
Q_EMIT dataChanged(index, index, {ActiveShortcutsRole, CustomShortcutsRole, IsDefaultRole}); |
|
Q_EMIT dataChanged(index.parent(), index.parent(), {IsDefaultRole}); |
|
} |
|
|
|
void BaseModel::disableShortcut(const QModelIndex &index, const QKeySequence &shortcut) |
|
{ |
|
if (!checkIndex(index, QAbstractItemModel::CheckIndexOption::IndexIsValid) || !index.parent().isValid()) { |
|
return; |
|
} |
|
qCDebug(KCMKEYS) << "Disabling shortcut" << index << shortcut; |
|
Action &a = m_components[index.parent().row()].actions[index.row()]; |
|
a.activeShortcuts.remove(shortcut); |
|
Q_EMIT dataChanged(index, index, {ActiveShortcutsRole, CustomShortcutsRole, IsDefaultRole}); |
|
Q_EMIT dataChanged(index.parent(), index.parent(), {IsDefaultRole}); |
|
} |
|
|
|
void BaseModel::changeShortcut(const QModelIndex &index, const QKeySequence &oldShortcut, const QKeySequence &newShortcut) |
|
{ |
|
if (!checkIndex(index, QAbstractItemModel::CheckIndexOption::IndexIsValid) || !index.parent().isValid()) { |
|
return; |
|
} |
|
if (newShortcut.isEmpty()) { |
|
return; |
|
} |
|
qCDebug(KCMKEYS) << "Changing Shortcut" << index << oldShortcut << " to " << newShortcut; |
|
Action &a = m_components[index.parent().row()].actions[index.row()]; |
|
a.activeShortcuts.remove(oldShortcut); |
|
a.activeShortcuts.insert(newShortcut); |
|
Q_EMIT dataChanged(index, index, {ActiveShortcutsRole, CustomShortcutsRole}); |
|
} |
|
|
|
void BaseModel::defaults() |
|
{ |
|
for (int i = 0; i < m_components.size(); ++i) { |
|
const auto componentIndex = index(i, 0); |
|
for (auto action_it = m_components[i].actions.begin(); action_it != m_components[i].actions.end(); ++action_it) { |
|
action_it->activeShortcuts = action_it->defaultShortcuts; |
|
} |
|
Q_EMIT dataChanged(index(0, 0, componentIndex), |
|
index(m_components[i].actions.size() - 1, 0, componentIndex), |
|
{ActiveShortcutsRole, CustomShortcutsRole, IsDefaultRole}); |
|
} |
|
Q_EMIT dataChanged(index(0, 0), index(m_components.size() - 1, 0), {IsDefaultRole}); |
|
} |
|
|
|
bool BaseModel::needsSave() const |
|
{ |
|
for (const auto &component : qAsConst(m_components)) { |
|
if (component.pendingDeletion) { |
|
return true; |
|
} |
|
for (const auto &action : qAsConst(component.actions)) { |
|
if (action.initialShortcuts != action.activeShortcuts) { |
|
return true; |
|
} |
|
} |
|
} |
|
return false; |
|
} |
|
|
|
bool BaseModel::isDefault() const |
|
{ |
|
for (const auto &component : qAsConst(m_components)) { |
|
for (const auto &action : qAsConst(component.actions)) { |
|
if (action.defaultShortcuts != action.activeShortcuts) { |
|
return false; |
|
} |
|
} |
|
} |
|
return true; |
|
} |
|
|
|
QModelIndex BaseModel::index(int row, int column, const QModelIndex &parent) const |
|
{ |
|
if (row < 0 || column != 0) { |
|
return QModelIndex(); |
|
} |
|
if (parent.isValid() && row < rowCount(parent) && column == 0) { |
|
return createIndex(row, column, parent.row() + 1); |
|
} else if (column == 0 && row < m_components.size()) { |
|
return createIndex(row, column, nullptr); |
|
} |
|
return QModelIndex(); |
|
} |
|
|
|
QModelIndex BaseModel::parent(const QModelIndex &child) const |
|
{ |
|
if (child.internalId()) { |
|
return createIndex(child.internalId() - 1, 0, nullptr); |
|
} |
|
return QModelIndex(); |
|
} |
|
|
|
int BaseModel::rowCount(const QModelIndex &parent) const |
|
{ |
|
if (parent.isValid()) { |
|
if (parent.parent().isValid()) { |
|
return 0; |
|
} |
|
return m_components[parent.row()].actions.size(); |
|
} |
|
return m_components.size(); |
|
} |
|
|
|
int BaseModel::columnCount(const QModelIndex &parent) const |
|
{ |
|
Q_UNUSED(parent); |
|
return 1; |
|
} |
|
|
|
QVariant BaseModel::data(const QModelIndex &index, int role) const |
|
{ |
|
if (!checkIndex(index, QAbstractItemModel::CheckIndexOption::IndexIsValid)) { |
|
return QVariant(); |
|
} |
|
|
|
if (index.parent().isValid()) { |
|
const Action &action = m_components[index.parent().row()].actions[index.row()]; |
|
switch (role) { |
|
case Qt::DisplayRole: |
|
return action.displayName.isEmpty() ? action.id : action.displayName; |
|
case ActionRole: |
|
return action.id; |
|
case ActiveShortcutsRole: |
|
return QVariant::fromValue(action.activeShortcuts); |
|
case DefaultShortcutsRole: |
|
return QVariant::fromValue(action.defaultShortcuts); |
|
case CustomShortcutsRole: { |
|
auto shortcuts = action.activeShortcuts; |
|
return QVariant::fromValue(shortcuts.subtract(action.defaultShortcuts)); |
|
} |
|
case IsDefaultRole: |
|
return action.activeShortcuts == action.defaultShortcuts; |
|
case SupportsMultipleKeysRole: |
|
return true; |
|
} |
|
return QVariant(); |
|
} |
|
const Component &component = m_components[index.row()]; |
|
switch (role) { |
|
case Qt::DisplayRole: |
|
return component.displayName; |
|
case Qt::DecorationRole: |
|
return component.icon; |
|
case SectionRole: |
|
return component.type; |
|
case ComponentRole: |
|
return component.id; |
|
case CheckedRole: |
|
return component.checked; |
|
case PendingDeletionRole: |
|
return component.pendingDeletion; |
|
case IsDefaultRole: |
|
return std::all_of(component.actions.begin(), component.actions.end(), [](const Action &action) { |
|
return action.activeShortcuts == action.defaultShortcuts; |
|
}); |
|
} |
|
return QVariant(); |
|
} |
|
|
|
bool BaseModel::setData(const QModelIndex &index, const QVariant &value, int role) |
|
{ |
|
if (!checkIndex(index, QAbstractListModel::CheckIndexOption::IndexIsValid | QAbstractListModel::CheckIndexOption::ParentIsInvalid)) { |
|
return false; |
|
} |
|
const bool boolValue = value.toBool(); |
|
switch (role) { |
|
case CheckedRole: |
|
if (m_components[index.row()].checked != boolValue) { |
|
m_components[index.row()].checked = boolValue; |
|
Q_EMIT dataChanged(index, index, {CheckedRole}); |
|
return true; |
|
} |
|
break; |
|
case PendingDeletionRole: |
|
if (m_components[index.row()].pendingDeletion != boolValue) { |
|
m_components[index.row()].pendingDeletion = boolValue; |
|
Q_EMIT dataChanged(index, index, {PendingDeletionRole}); |
|
return true; |
|
} |
|
break; |
|
} |
|
return false; |
|
} |
|
|
|
QHash<int, QByteArray> BaseModel::roleNames() const |
|
{ |
|
return {{Qt::DisplayRole, QByteArrayLiteral("display")}, |
|
{Qt::DecorationRole, QByteArrayLiteral("decoration")}, |
|
{SectionRole, QByteArrayLiteral("section")}, |
|
{ComponentRole, QByteArrayLiteral("component")}, |
|
{ActiveShortcutsRole, QByteArrayLiteral("activeShortcuts")}, |
|
{DefaultShortcutsRole, QByteArrayLiteral("defaultShortcuts")}, |
|
{CustomShortcutsRole, QByteArrayLiteral("customShortcuts")}, |
|
{CheckedRole, QByteArrayLiteral("checked")}, |
|
{PendingDeletionRole, QByteArrayLiteral("pendingDeletion")}, |
|
{IsDefaultRole, QByteArrayLiteral("isDefault")}, |
|
{SupportsMultipleKeysRole, QByteArrayLiteral("supportsMultipleKeys")}}; |
|
}
|
|
|