File indexing completed on 2024-05-12 05:35:50
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 }