32 #include <QtWidgets/QApplication>
33 #include <QtCore/QMetaProperty>
34 #include <QtWidgets/QItemEditorFactory>
49 m_rootItem =
new Property(
"Root",0,
this);
61 parentItem = static_cast<Property*>(parent.internalPointer());
62 if (row >= parentItem->children().size() || row < 0)
64 return createIndex(row, column, parentItem->children().at(row));
76 if (!parentItem || parentItem == m_rootItem)
79 return createIndex(parentItem->
row(), 0, parentItem);
86 parentItem = static_cast<Property*>(parent.internalPointer());
87 return parentItem->children().size();
103 case Qt::ToolTipRole:
104 case Qt::DecorationRole:
105 case Qt::DisplayRole:
107 if (index.column() == 0)
108 return item->objectName().replace(
'_',
' ');
109 if (index.column() == 1)
110 return item->
value(role);
111 case Qt::BackgroundRole:
112 if (item->
isRoot())
return QApplication::palette(
"QTreeView").brush(QPalette::Normal, QPalette::Button).color();
121 if (index.isValid() && role == Qt::EditRole)
125 emit dataChanged(index, index);
133 if (!index.isValid())
134 return Qt::ItemIsEnabled;
138 return Qt::ItemIsEnabled;
140 return Qt::ItemIsDragEnabled | Qt::ItemIsSelectable;
142 return Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable;
148 if (orientation == Qt::Horizontal && role == Qt::DisplayRole)
163 if (index.isValid() && index.column() == 0)
164 return createIndex(index.row(), 1, index.internalPointer());
171 QList<PropertyPair> propertyMap;
172 QList<const QMetaObject*> classList;
173 const QMetaObject* metaObject = propertyObject->metaObject();
176 int count = metaObject->propertyCount();
177 for (
int i=0; i<count; ++i)
179 QMetaProperty
property = metaObject->property(i);
180 if( property.isDesignable() )
183 int index = propertyMap.indexOf(pair);
185 propertyMap[
index] = pair;
187 propertyMap.push_back(pair);
190 classList.push_front(metaObject);
192 while ((metaObject = metaObject->superClass())!=0);
194 QList<const QMetaObject*> finalClassList;
196 foreach(
const QMetaObject* obj, classList)
208 finalClassList.push_back(obj);
214 beginInsertRows( QModelIndex(), i, i + finalClassList.count() );
224 propertyItem =
new Property(
"General", 0, m_rootItem);
230 QMetaProperty property(pair.
Property);
232 if (property.type() == QVariant::UserType && !m_userCallbacks.isEmpty())
234 QList<QPropertyEditorWidget::UserTypeCB>::iterator iter = m_userCallbacks.begin();
235 while( p == 0 && iter != m_userCallbacks.end() )
237 p = (*iter)(
property.name(), propertyObject, propertyItem);
243 uint classinfo_count = propertyObject->metaObject()->classInfoCount();
244 bool forced_type =
false;
245 for(uint i = 0; i < classinfo_count; i++)
247 QMetaClassInfo info = propertyObject->metaObject()->classInfo(i);
248 if(strcmp(info.name(),
property.name()) == 0)
251 std::string var = items[0];
252 std::string var_value = items[1];
253 if(var ==
"CustomEnum")
255 if(var_value ==
"CClasses")
267 if(property.isEnumType())
269 p =
new EnumProperty(property.name(), propertyObject, propertyItem);
271 p =
new Property(property.name(), propertyObject, propertyItem);
275 int index = metaObject->indexOfClassInfo(property.name());
282 if( propertyItem ) addDynamicProperties( propertyItem, propertyObject );
288 if (parent.isValid())
289 parentItem = static_cast<Property*>(parent.internalPointer());
294 QModelIndex itemIndex = createIndex(parentItem->
row(), 0,
static_cast<Property*
>(parentItem));
295 dataChanged(itemIndex, createIndex(parentItem->
row(), 1,
static_cast<Property*
>(parentItem)));
296 QList<QByteArray> dynamicProperties = propertyObject->dynamicPropertyNames();
297 QList<QObject*> childs = parentItem->parent()->children();
299 for(
int i = 0; i < childs.count(); ++i )
301 QObject* obj = childs[i];
302 if( !obj->property(
"__Dynamic").toBool() || dynamicProperties.contains( obj->objectName().toLocal8Bit() ) )
304 beginRemoveRows(itemIndex.parent(), i - removed, i - removed);
309 addDynamicProperties(static_cast<Property*>(parentItem->parent()), propertyObject);
313 void QPropertyModel::addDynamicProperties(
Property* parent, QObject* propertyObject )
316 QList<QByteArray> dynamicProperties = propertyObject->dynamicPropertyNames();
318 QList<QObject*> childs = parent->children();
321 for(
int i = 0; i < childs.count(); ++i )
323 if( !childs[i]->property(
"__Dynamic").toBool() )
continue;
325 int index = dynamicProperties.indexOf( childs[i]->objectName().toLocal8Bit() );
328 dynamicProperties.removeAt(index);
334 for(
int i = 0; i < dynamicProperties.size(); ++i )
336 QString dynProp = dynamicProperties[i];
339 if( dynProp.startsWith(
"_") || !propertyObject->property( qPrintable(dynProp) ).isValid() )
341 dynamicProperties.removeAt(i);
346 if( dynamicProperties.empty() )
return;
348 QModelIndex parentIndex = createIndex(parent->
row(), 0,
static_cast<Property*
>(
parent));
350 beginInsertRows(parentIndex, rows, rows + dynamicProperties.count() - 1 );
352 foreach(QByteArray dynProp, dynamicProperties )
354 QVariant v = propertyObject->property(dynProp);
356 if( v.type() == QVariant::UserType && !m_userCallbacks.isEmpty() )
358 QList<QPropertyEditorWidget::UserTypeCB>::iterator iter = m_userCallbacks.begin();
359 while( p == 0 && iter != m_userCallbacks.end() )
361 p = (*iter)(dynProp, propertyObject,
parent);
365 if( p == 0 ) p =
new Property(dynProp, propertyObject, parent);
366 p->setProperty(
"__Dynamic",
true);
373 beginRemoveRows(QModelIndex(), 0,
rowCount());
375 m_rootItem =
new Property(
"Root",0,
this);
381 if ( !m_userCallbacks.contains(callback) )
382 m_userCallbacks.push_back(callback);
387 int index = m_userCallbacks.indexOf(callback);
389 m_userCallbacks.removeAt(index);
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const
QAbstractItemModel implementation.
static const QStringList & types()
void unregisterCustomPropertyCB(QPropertyEditorWidget::UserTypeCB callback)
bool setData(const QModelIndex &index, const QVariant &value, int role=Qt::EditRole)
QAbstractItemModel implementation.
virtual void setValue(const QVariant &value)
void registerCustomPropertyCB(QPropertyEditorWidget::UserTypeCB callback)
QModelIndex parent(const QModelIndex &index) const
QAbstractItemModel implementation.
virtual ~QPropertyModel()
Destructor.
QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const
QAbstractItemModel implementation.
int rowCount(const QModelIndex &parent=QModelIndex()) const
QAbstractItemModel implementation.
void updateItem(QObject *propertyObject, const QModelIndex &parent=QModelIndex())
bool operator==(const PropertyPair &other) const
QPropertyModel(QObject *parent=0)
QModelIndex buddy(const QModelIndex &index) const
QAbstractItemModel implementation.
PropertyPair(const QMetaObject *obj, QMetaProperty property)
virtual QVariant value(int role=Qt::UserRole) const
int columnCount(const QModelIndex &parent=QModelIndex()) const
QAbstractItemModel implementation.
QObject * propertyObject()
QVariant headerData(int section, Qt::Orientation orientation, int role=Qt::DisplayRole) const
QAbstractItemModel implementation.
Qt::ItemFlags flags(const QModelIndex &index) const
QAbstractItemModel implementation.
const QMetaObject * Object
Property * findPropertyObject(QObject *propertyObject)
static std::vector< std::string > split(const std::string &str, const std::string &delimiters)
virtual void setEditorHints(const QString &hints)
void addItem(QObject *propertyObject)