diff --git a/include/ResourceItem.h b/include/ResourceItem.h index 294b9798e..6e2492988 100644 --- a/include/ResourceItem.h +++ b/include/ResourceItem.h @@ -200,6 +200,11 @@ public: Type guessType( void ) const; + static const char * mimeKey() + { + return "ResourceItem"; + } + static QString getBaseDirectory( BaseDirectory _bd, const ResourceItem * _item = NULL ); diff --git a/include/ResourceTreeModel.h b/include/ResourceTreeModel.h index d78db12d0..d8a75195e 100644 --- a/include/ResourceTreeModel.h +++ b/include/ResourceTreeModel.h @@ -42,10 +42,7 @@ public: virtual QVariant data( const QModelIndex & _idx, int _role = Qt::DisplayRole ) const; - virtual Qt::ItemFlags flags( const QModelIndex & _index ) const - { - return Qt::ItemIsEnabled | Qt::ItemIsSelectable; - } + virtual Qt::ItemFlags flags( const QModelIndex & _index ) const; int rowCount( const QModelIndex & _parent = QModelIndex() ) const; @@ -58,7 +55,13 @@ public: virtual QModelIndex index( int _row, int _col, const QModelIndex & _parent = QModelIndex() ) const; - virtual QModelIndex parent ( const QModelIndex & index ) const; + virtual QModelIndex parent( const QModelIndex & index ) const; + + // return list of possible MIME types for items in this model + virtual QStringList mimeTypes() const; + + // used for drag'n'drop - return proper MIME data for indexes + virtual QMimeData * mimeData( const QModelIndexList & _indexes ) const; void setFilter( const QString & _s ); diff --git a/src/core/ResourceTreeModel.cpp b/src/core/ResourceTreeModel.cpp index 01c748f63..5005bc47a 100644 --- a/src/core/ResourceTreeModel.cpp +++ b/src/core/ResourceTreeModel.cpp @@ -25,12 +25,15 @@ #include "ResourceTreeModel.h" #include "embed.h" +#include "string_pair_drag.h" ResourceTreeModel::ResourceTreeModel( ResourceDB * _db, QObject * _parent ) : QAbstractItemModel( _parent ), m_db( _db ) { + setSupportedDragActions( Qt::CopyAction ); + connect( m_db, SIGNAL( itemsChanged() ), this, SIGNAL( itemsChanged() ) ); } @@ -105,6 +108,32 @@ default: +Qt::ItemFlags ResourceTreeModel::flags( const QModelIndex & _index ) const +{ + Qt::ItemFlags flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable; + if( _index.isValid() ) + { + switch( item( _index )->type() ) + { + case ResourceItem::TypeSample: + case ResourceItem::TypePreset: + case ResourceItem::TypePluginSpecificPreset: + case ResourceItem::TypeProject: + case ResourceItem::TypeMidiFile: + case ResourceItem::TypeImage: + case ResourceItem::TypePlugin: + flags |= Qt::ItemIsDragEnabled; + break; + default: + break; + } + } + return flags; +} + + + + int ResourceTreeModel::rowCount( const QModelIndex & _parent ) const { ResourceTreeItem * parentItem; @@ -182,6 +211,30 @@ QModelIndex ResourceTreeModel::parent( const QModelIndex & _idx ) const +QStringList ResourceTreeModel::mimeTypes() const +{ + return QStringList() << ResourceItem::mimeKey(); +} + + + + +QMimeData * ResourceTreeModel::mimeData( const QModelIndexList & _list ) const +{ + // we'll only process first item - look whether it is valid + if( !_list.first().isValid() ) + { + return NULL; + } + + // create a QMimeData object containing hash of current item + return stringPairDrag::createMimeData( ResourceItem::mimeKey(), + item( _list.first() )->hash() ); +} + + + + void ResourceTreeModel::setFilter( const QString & _s ) { filterItems( m_db->topLevelNode(),