File indexing completed on 2024-05-12 17:07:26

0001 /*
0002     SPDX-FileCopyrightText: 2009 Ben Cooksley <ben@eclipse.endoftheinternet.org>
0003     SPDX-FileCopyrightText: 2007 Will Stephenson <wstephenson@kde.org>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 #include "PredicateModel.h"
0009 
0010 #include "PredicateItem.h"
0011 
0012 class PredicateModel::Private
0013 {
0014 public:
0015     Private()
0016     {
0017     }
0018 
0019     PredicateItem *rootItem;
0020 };
0021 
0022 PredicateModel::PredicateModel(PredicateItem *menuRoot, QObject *parent)
0023     : QAbstractItemModel(parent)
0024     , d(new Private())
0025 {
0026     d->rootItem = menuRoot;
0027 }
0028 
0029 PredicateModel::~PredicateModel()
0030 {
0031     delete d;
0032 }
0033 
0034 int PredicateModel::columnCount(const QModelIndex &parent) const
0035 {
0036     Q_UNUSED(parent);
0037     return 1;
0038 }
0039 
0040 int PredicateModel::rowCount(const QModelIndex &parent) const
0041 {
0042     PredicateItem *mi;
0043     if (parent.isValid()) {
0044         mi = static_cast<PredicateItem *>(parent.internalPointer());
0045     } else {
0046         mi = d->rootItem;
0047     }
0048 
0049     return mi->children().count();
0050 }
0051 
0052 QVariant PredicateModel::data(const QModelIndex &index, int role) const
0053 {
0054     PredicateItem *mi = nullptr;
0055     QVariant theData;
0056     if (!index.isValid()) {
0057         return QVariant();
0058     }
0059 
0060     mi = static_cast<PredicateItem *>(index.internalPointer());
0061     switch (role) {
0062     case Qt::DisplayRole:
0063         theData.setValue(mi->prettyName());
0064         break;
0065     case Qt::UserRole:
0066         theData.setValue(mi);
0067         break;
0068     default:
0069         break;
0070     }
0071     return theData;
0072 }
0073 
0074 Qt::ItemFlags PredicateModel::flags(const QModelIndex &index) const
0075 {
0076     if (!index.isValid()) {
0077         return Qt::ItemFlags();
0078     }
0079 
0080     return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
0081 }
0082 
0083 QModelIndex PredicateModel::index(int row, int column, const QModelIndex &parent) const
0084 {
0085     if (!hasIndex(row, column, parent)) {
0086         return QModelIndex();
0087     }
0088 
0089     PredicateItem *parentItem;
0090     if (!parent.isValid()) {
0091         parentItem = d->rootItem;
0092     } else {
0093         parentItem = static_cast<PredicateItem *>(parent.internalPointer());
0094     }
0095 
0096     PredicateItem *childItem = parentItem->children().value(row);
0097     if (childItem) {
0098         return createIndex(row, column, childItem);
0099     } else {
0100         return QModelIndex();
0101     }
0102 }
0103 
0104 QModelIndex PredicateModel::parent(const QModelIndex &index) const
0105 {
0106     PredicateItem *childItem = static_cast<PredicateItem *>(index.internalPointer());
0107     if (!childItem) {
0108         return QModelIndex();
0109     }
0110 
0111     PredicateItem *parent = childItem->parent();
0112     PredicateItem *grandParent = parent->parent();
0113 
0114     int childRow = 0;
0115     if (grandParent) {
0116         childRow = grandParent->children().indexOf(parent);
0117     }
0118 
0119     if (parent == d->rootItem) {
0120         return QModelIndex();
0121     }
0122     return createIndex(childRow, 0, parent);
0123 }
0124 
0125 PredicateItem *PredicateModel::rootItem() const
0126 {
0127     return d->rootItem;
0128 }
0129 
0130 void PredicateModel::setRootPredicate(PredicateItem *item)
0131 {
0132     beginResetModel();
0133     d->rootItem = item;
0134     endResetModel();
0135 }
0136 
0137 void PredicateModel::itemUpdated(const QModelIndex &item)
0138 {
0139     Q_EMIT dataChanged(item, item);
0140 }
0141 
0142 void PredicateModel::childrenChanging(const QModelIndex &item, Solid::Predicate::Type oldType)
0143 {
0144     PredicateItem *currentItem = static_cast<PredicateItem *>(item.internalPointer());
0145     Solid::Predicate::Type newType = currentItem->itemType;
0146 
0147     if (oldType == newType) {
0148         return;
0149     }
0150 
0151     if (rowCount(item) != 0 && newType != Solid::Predicate::Conjunction && newType != Solid::Predicate::Disjunction) {
0152         beginRemoveRows(item, 0, 1);
0153         currentItem->updateChildrenStatus();
0154         endRemoveRows();
0155         return;
0156     }
0157 
0158     bool hasChildren = (newType == Solid::Predicate::Conjunction || newType == Solid::Predicate::Disjunction);
0159 
0160     if (rowCount(item) == 0 && hasChildren) {
0161         beginInsertRows(item, 0, 1);
0162         currentItem->updateChildrenStatus();
0163         endInsertRows();
0164     }
0165 }