00001 #include <QtCore/QAbstractItemModel>
00002 #include <QtCore/QString>
00003 #include <QtCore/QStringList>
00004 #include <QtCore/QtDebug>
00005 #include <QtCore/QSettings>
00006
00007 #include <iostream>
00008
00009 #include "ACE/foldertreeitem.h"
00010 #include "ACE/foldertreemodel.h"
00011
00012
00013 FolderTreeModel::FolderTreeModel( cool::IDatabasePtr dbPtr, const QString connectionString, QObject* parent ) :
00014 QAbstractItemModel( parent ),
00015 coolConnectionString( connectionString ),
00016 coolDBPtr( dbPtr )
00017 {
00018 QSettings settings;
00019 std::vector< std::string > nodeList( coolDBPtr->listAllNodes() );
00020 setupFolderTreeModelData( nodeList );
00021 settings.beginGroup( "Preferences/FolderTrees" );
00022 modifiedColour = static_cast<Qt::GlobalColor>( settings.value( "ModifiedColour", static_cast<int>( Qt::cyan ) ).toInt() );
00023 settings.endGroup();
00024 }
00025
00026 FolderTreeModel::~FolderTreeModel()
00027 {
00028 delete rootTreeItem;
00029 }
00030
00031 int FolderTreeModel::columnCount( const QModelIndex& parent ) const
00032 {
00033 if ( parent.isValid() )
00034 return static_cast<FolderTreeItem*>( parent.internalPointer() )->columnCount();
00035 else
00036 return rootTreeItem->columnCount();
00037 }
00038
00039 QVariant FolderTreeModel::data( const QModelIndex& index, int role ) const
00040 {
00041 if ( !index.isValid() )
00042 return QVariant();
00043
00044 FolderTreeItem *item = static_cast<FolderTreeItem*>( index.internalPointer() );
00045
00046 if ( role == Qt::DisplayRole )
00047 {
00048 return item->data( index.column() );
00049 }
00050 else if ( role == Qt::BackgroundRole )
00051 {
00052 if ( modifiedFolders.contains( index ) )
00053 {
00054 return QVariant( modifiedColour );
00055 }
00056
00057
00058
00059
00060 }
00061
00062
00063
00064
00065 return QVariant();
00066 }
00067
00068 QString FolderTreeModel::folderName( const QModelIndex& index ) const
00069 {
00070 QStringList tNames;
00071 QModelIndex tIndex( index );
00072 while ( tIndex.isValid() )
00073 {
00074 const QString tName( data( tIndex ).toString() );
00075 tNames.prepend( tName );
00076 tIndex = parent( tIndex );
00077 }
00078 return QString("/").append( tNames.join( "/" ) );
00079 }
00080
00081 cool::IDatabasePtr FolderTreeModel::getCoolDBPtr() const
00082 {
00083 return coolDBPtr;
00084 }
00085
00086 bool FolderTreeModel::isModified() const
00087 {
00088 return !modifiedFolders.isEmpty();
00089 }
00090
00091 QSet< QModelIndex > FolderTreeModel::getModifiedFolders() const
00092 {
00093 return modifiedFolders;
00094 }
00095
00096 void FolderTreeModel::setModifiedFolders( const QModelIndex& index, const bool modified )
00097 {
00098 if ( modified )
00099 {
00100 modifiedFolders.insert( index );
00101 }
00102 else
00103 {
00104 modifiedFolders.remove( index );
00105 }
00106 }
00107
00108 Qt::ItemFlags FolderTreeModel::flags( const QModelIndex& index ) const
00109 {
00110 if ( !index.isValid() )
00111 return 0;
00112
00113 return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
00114 }
00115
00116 QVariant FolderTreeModel::headerData( int section, Qt::Orientation orientation, int role ) const
00117 {
00118 if ( orientation == Qt::Horizontal && role == Qt::DisplayRole )
00119 return rootTreeItem->data( section );
00120
00121 return QVariant();
00122 }
00123
00124 QModelIndex FolderTreeModel::index( int row, int column, const QModelIndex& parent) const
00125 {
00126 if ( !hasIndex( row, column, parent ) )
00127 return QModelIndex();
00128
00129 FolderTreeItem* parentItem;
00130
00131 if ( !parent.isValid() )
00132 parentItem = rootTreeItem;
00133 else
00134 parentItem = static_cast<FolderTreeItem*>( parent.internalPointer() );
00135
00136 FolderTreeItem* childItem = parentItem->child( row );
00137 if ( childItem )
00138 return createIndex( row, column, childItem );
00139 else
00140 return QModelIndex();
00141 }
00142
00143 QModelIndex FolderTreeModel::index( const QString& fullFolderName) const
00144 {
00145 QStringList parsedFolderName = fullFolderName.split( "/", QString::SkipEmptyParts );
00146 FolderTreeItem* currentTreeItem = rootTreeItem;
00147 int entryPos( -1 );
00148
00149 foreach( QString parsedFolderNameToken, parsedFolderName )
00150 {
00151 entryPos = currentTreeItem->pos( parsedFolderNameToken );
00152 if ( entryPos < 0 ) {
00153 qWarning() << "[FolderTreeModel::index()]" << parsedFolderNameToken << "folder not found (" << parsedFolderName << ").";
00154 return QModelIndex();
00155 }
00156 currentTreeItem = currentTreeItem->child( entryPos );
00157 qDebug() << "currentTreeItem's data is" << currentTreeItem->data() << ".";
00158 }
00159 qDebug() << "Creating index for entryPos=" << entryPos << "of" << currentTreeItem->parent()->data() << ".";
00160 return createIndex( entryPos, 0, currentTreeItem );
00161 }
00162
00163 QModelIndex FolderTreeModel::parent( const QModelIndex& index ) const
00164 {
00165 if ( !index.isValid() )
00166 return QModelIndex();
00167
00168 FolderTreeItem* childItem = static_cast<FolderTreeItem*>( index.internalPointer() );
00169 FolderTreeItem* parentItem = childItem->parent();
00170
00171 if ( parentItem == rootTreeItem )
00172 return QModelIndex();
00173
00174 return createIndex( parentItem->row(), 0, parentItem );
00175 }
00176
00177 int FolderTreeModel::rowCount( const QModelIndex& parent ) const
00178 {
00179 FolderTreeItem* parentItem;
00180 if ( parent.column() > 0 )
00181 return 0;
00182
00183 if ( !parent.isValid() )
00184 parentItem = rootTreeItem;
00185 else
00186 parentItem = static_cast<FolderTreeItem*>( parent.internalPointer() );
00187
00188 return parentItem->childCount();
00189 }
00190
00191 void FolderTreeModel::setupFolderTreeModelData( std::vector< std::string >& nodeList )
00192 {
00193 std::vector<std::string>::iterator nodeList_i;
00194
00195
00196 QList<QVariant> rootData;
00197 rootData << "Folders";
00198
00199 rootTreeItem = new FolderTreeItem( rootData );
00200
00201 for ( nodeList_i = nodeList.begin(); nodeList_i != nodeList.end(); nodeList_i++ )
00202 {
00203 QString node = QString::fromStdString( *nodeList_i );
00204 QStringList parsedNode = node.split( "/", QString::SkipEmptyParts );
00205
00206 FolderTreeItem* currentTreeItem = rootTreeItem;
00207 foreach ( QString parsedNode_Entry, parsedNode )
00208 {
00209 int entryPos = currentTreeItem->pos( parsedNode_Entry );
00210 if ( entryPos < 0 )
00211 {
00212 QList<QVariant> entryData;
00213 entryData << parsedNode_Entry;
00214
00215 FolderTreeItem* newTreeItem = new FolderTreeItem( entryData, currentTreeItem );
00216 currentTreeItem->appendChild( newTreeItem );
00217 currentTreeItem = newTreeItem;
00218 }
00219 else
00220 {
00221
00222 currentTreeItem = currentTreeItem->child( entryPos );
00223 }
00224 }
00225 }
00226 }
00227
00228 bool FolderTreeModel::setData( const QModelIndex& index, const QVariant& value, int role )
00229 {
00230 if ( index.isValid() && role == Qt::EditRole )
00231 {
00232 FolderTreeItem* currentItem = static_cast<FolderTreeItem*>( index.internalPointer() );
00233 currentItem->setData( value );
00234 emit dataChanged( index, index );
00235 return true;
00236 }
00237 return false;
00238 }
00239
00240 void FolderTreeModel::emitDataChanged( const QModelIndex& index, const bool changed )
00241 {
00242 setModifiedFolders( index, changed );
00243 emit dataChanged( index, index );
00244 }
00245
00246 bool FolderTreeModel::setHeaderData( int , Qt::Orientation , const QVariant& , int )
00247 {
00248
00249
00250
00251
00252 return false;
00253 }
00254
00255 bool FolderTreeModel::removeRows( int row, int count, const QModelIndex& parent )
00256 {
00257 if ( count < 1 || row < 0 )
00258 {
00259 qWarning() << "Either count < 1 or row < 0";
00260 return false;
00261 }
00262 FolderTreeItem* parentItem;
00263 if ( !parent.isValid() )
00264 parentItem = rootTreeItem;
00265 else
00266 parentItem = static_cast<FolderTreeItem*>( parent.internalPointer() );
00267
00268 beginRemoveRows( parent, row, row + count - 1 );
00269 while ( count-- )
00270 {
00271 delete parentItem->child( row );
00272 parentItem->removeChildAt( row );
00273 }
00274 endRemoveRows();
00275 return true;
00276 }
00277
00278 bool FolderTreeModel::insertRows( int row, int count, const QModelIndex& parent )
00279 {
00280 if ( count < 1 || row < 0 )
00281 {
00282 qWarning() << "Either count < 1 or row < 0";
00283 return false;
00284 }
00285 FolderTreeItem* parentItem;
00286 if ( !parent.isValid() )
00287 parentItem = rootTreeItem;
00288 else
00289 parentItem = static_cast<FolderTreeItem*>( parent.internalPointer() );
00290
00291 beginInsertRows( parent, row, row + count - 1 );
00292 while ( count-- )
00293 {
00294 QList<QVariant> entryData;
00295 entryData << "newfolder";
00296 qDebug() << "[FolderTreeModel::insertRows] Adding new folder to the" << parentItem->data(0) << "parent folder.";
00297 FolderTreeItem* newTreeItem = new FolderTreeItem( entryData, parentItem );
00298 parentItem->insertChild( newTreeItem, row );
00299 }
00300 endInsertRows();
00301 return true;
00302 }
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325