00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "qobjecttreemodel.h"
00021 #include <QDebug>
00022 #include <typeinfo>
00023 #include <gluon/gluonobject.h>
00024
00025 using namespace Gluon::Creator;
00026
00027 QObjectTreeModel::QObjectTreeModel( QObject* root, QObject* parent ): QAbstractItemModel( parent )
00028 {
00029 m_root = new QObject( this );
00030 root->setParent( m_root );
00031 }
00032
00033 QVariant QObjectTreeModel::data( const QModelIndex& index, int role ) const
00034 {
00035 if( !index.isValid() )
00036 return QVariant();
00037
00038 if( role != Qt::DisplayRole )
00039 return QVariant();
00040
00041 QObject* item = static_cast<QObject*>( index.internalPointer() );
00042
00043 switch( index.column() )
00044 {
00045 case 0:
00046 {
00047 Gluon::GluonObject* gobj = qobject_cast<Gluon::GluonObject*>( item );
00048 if( gobj ) return gobj->name();
00049 return item->objectName();
00050 break;
00051 }
00052 case 1:
00053 return item->metaObject()->className();
00054 break;
00055 default:
00056 return QVariant();
00057 }
00058 }
00059
00060 int QObjectTreeModel::columnCount( const QModelIndex& ) const
00061 {
00062 return 2;
00063 }
00064
00065 int QObjectTreeModel::rowCount( const QModelIndex& parent ) const
00066 {
00067 QObject* parentItem;
00068 if( parent.column() > 0 )
00069 return 0;
00070
00071 if( !parent.isValid() )
00072 parentItem = m_root;
00073 else
00074 parentItem = static_cast<QObject*>( parent.internalPointer() );
00075
00076 return parentItem->children().count();
00077 }
00078
00079 QModelIndex QObjectTreeModel::parent( const QModelIndex& child ) const
00080 {
00081 if( !child.isValid() )
00082 return QModelIndex();
00083
00084 QObject* childItem = static_cast<QObject*>( child.internalPointer() );
00085 QObject* parentItem = childItem->parent();
00086
00087 if( parentItem == m_root )
00088 return QModelIndex();
00089
00090 return createIndex( rowIndex( parentItem ), 0, parentItem );
00091 }
00092
00093 QModelIndex QObjectTreeModel::index( int row, int column, const QModelIndex& parent ) const
00094 {
00095 if( !hasIndex( row, column, parent ) )
00096 return QModelIndex();
00097
00098 QObject* parentItem;
00099
00100 if( !parent.isValid() )
00101 parentItem = m_root;
00102 else
00103 parentItem = static_cast<QObject*>( parent.internalPointer() );
00104
00105 QObject* childItem = parentItem->children().at( row );
00106 if( childItem )
00107 return createIndex( row, column, childItem );
00108 else
00109 return QModelIndex();
00110 }
00111
00112 QVariant QObjectTreeModel::headerData( int section, Qt::Orientation orientation, int role ) const
00113 {
00114 if( orientation == Qt::Horizontal && role == Qt::DisplayRole )
00115 {
00116 switch( section )
00117 {
00118 case 0:
00119 return QVariant( "Name" );
00120 break;
00121 case 1:
00122 return QVariant( "Type" );
00123 break;
00124 default:
00125 return QVariant();
00126 }
00127 }
00128
00129 return QVariant();
00130 }
00131
00132 int QObjectTreeModel::rowIndex( QObject* object ) const
00133 {
00134 if( object->parent() )
00135 {
00136 return object->parent()->children().indexOf( object );
00137 }
00138 return 0;
00139 }
00140
00141
00142