]> SALOME platform Git repositories - modules/hydro.git/commitdiff
Salome HOME
draft implementation of the drag-n-drop
authorasl <asl@opencascade.com>
Wed, 19 Mar 2014 13:21:37 +0000 (13:21 +0000)
committerasl <asl@opencascade.com>
Wed, 19 Mar 2014 13:21:37 +0000 (13:21 +0000)
src/ZLEVEL/HYDROGUI_ZLevelsDlg.cxx
src/ZLEVEL/HYDROGUI_ZLevelsModel.cxx
src/ZLEVEL/HYDROGUI_ZLevelsModel.h
src/ZLEVEL/main.cpp

index 7448ad3662234a55205216f75e30a8e41571908d..0808a2a51ba7dd7703f7ae909744acff76488b08 100644 (file)
@@ -41,7 +41,12 @@ HYDROGUI_ZLevelsDlg::HYDROGUI_ZLevelsDlg( QWidget* theParent )
 
   myList = new QListView( this );
   myList->setSelectionMode( QAbstractItemView::ExtendedSelection );
-  
+  myList->setDragEnabled( true );
+  myList->setAcceptDrops( true );
+  myList->viewport()->setAcceptDrops( true );
+  myList->setDropIndicatorShown( true );
+  myList->setDragDropMode( QAbstractItemView::InternalMove );
+
   HYDROGUI_ZLevelsModel* aModel = new HYDROGUI_ZLevelsModel();
   QSortFilterProxyModel* aFilteredModel = new QSortFilterProxyModel();
   aFilteredModel->setSourceModel( aModel );
@@ -120,7 +125,7 @@ void HYDROGUI_ZLevelsDlg::onMove( int theType )
         aSelectedSourceIndexes << aFilterModel->mapToSource( anIndex );
       }
       QList<int> aSelectedIds = aModel->getIds( aSelectedSourceIndexes );
-      aModel->move( aSelectedIds, theType );      
+      aModel->move( aSelectedIds, ( HYDROGUI_ZLevelsModel::OpType )theType );      
     }
   }
 }
index fe49aac2969ef7d92b752882164ccd339dd8565a..70d575b3a4c0057b44fefe0ff7265f5d7d8dae02 100644 (file)
 //
 
 #include "HYDROGUI_ZLevelsModel.h"
+#include <QMimeData>
+
+const QString OBJ_LIST_MIME_TYPE = "application/hydro.objects.list";
 
 HYDROGUI_ZLevelsModel::HYDROGUI_ZLevelsModel( QObject* theParent )
  : QAbstractListModel( theParent )
 {
   myEmpty = QPixmap( 16, 16 );
   myEmpty.fill( Qt::white );
-  myEye = QPixmap( "eye.png" );
+  myEye = QPixmap( "eye.png" );//TODO: loading from resources
+  setSupportedDragActions( Qt::MoveAction | Qt::CopyAction );
 }
 
 HYDROGUI_ZLevelsModel::~HYDROGUI_ZLevelsModel()
@@ -51,6 +55,7 @@ QVariant HYDROGUI_ZLevelsModel::data( const QModelIndex &theIndex, int theRole )
         return QVariant();
     }
     break;
+
   case Qt::DecorationRole:
     {
       if( aColumn==0 && aRow >=0 && aRow < myObjects.count() )
@@ -64,11 +69,13 @@ QVariant HYDROGUI_ZLevelsModel::data( const QModelIndex &theIndex, int theRole )
       return QVariant();
     }
     break;
+
   case HYDROGUI_VisibleRole:
     {
       bool isVisible = IsObjectVisible( aRow );
       return QVariant( isVisible ).toString();
     }
+    break;
   }
 
   return aVariant;
@@ -112,6 +119,68 @@ QVariant HYDROGUI_ZLevelsModel::headerData( int theSection,
   return QVariant();
 }
 
+Qt::ItemFlags HYDROGUI_ZLevelsModel::flags( const QModelIndex& theIndex ) const
+{
+  Qt::ItemFlags aDefaultFlags = QAbstractListModel::flags( theIndex );
+  if( theIndex.isValid() )
+    return Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled | aDefaultFlags;
+  else
+    return Qt::ItemIsDropEnabled | aDefaultFlags;
+}
+
+QMimeData* HYDROGUI_ZLevelsModel::mimeData( const QModelIndexList& theIndices ) const
+{
+  QMimeData* aMimeData = new QMimeData();
+  QByteArray anEncodedData;
+  QDataStream aStream( &anEncodedData, QIODevice::WriteOnly );
+
+  QList<int> anIdsList = getIds( theIndices );
+  foreach( int anId, anIdsList )
+    aStream << anId;
+
+  aMimeData->setData( OBJ_LIST_MIME_TYPE, anEncodedData );
+  return aMimeData;
+}
+
+QStringList HYDROGUI_ZLevelsModel::mimeTypes() const
+{
+  QStringList aTypes;
+  aTypes << OBJ_LIST_MIME_TYPE;
+  return aTypes;
+}
+
+bool HYDROGUI_ZLevelsModel::dropMimeData( const QMimeData* theData, Qt::DropAction theAction,
+                                          int theRow, int theColumn, const QModelIndex& theParent )
+{
+  if( theAction == Qt::IgnoreAction)
+    return true;
+
+  if( !theData->hasFormat( OBJ_LIST_MIME_TYPE ))
+    return false;
+
+  if( theColumn > 0 )
+    return false;
+
+  int aDropItemId = theParent.row();
+
+  QByteArray anEncodedData = theData->data( OBJ_LIST_MIME_TYPE );
+  QDataStream aStream( &anEncodedData, QIODevice::ReadOnly );
+  QList<int> anIdsList;
+  while( !aStream.atEnd() )
+  {
+    int anId;
+    aStream >> anId;
+    anIdsList << anId;
+  }
+  move( anIdsList, DragAndDrop, aDropItemId );
+  return true;
+}
+
+Qt::DropActions HYDROGUI_ZLevelsModel::supportedDropActions() const
+{
+  return Qt::MoveAction | Qt::CopyAction;
+}
+
 QList<int> HYDROGUI_ZLevelsModel::getIds( const QModelIndexList& theIndexes, bool theIsToSort ) const
 {
   QList<int> anIds;
@@ -126,7 +195,7 @@ QList<int> HYDROGUI_ZLevelsModel::getIds( const QModelIndexList& theIndexes, boo
   return anIds;
 }
 
-bool HYDROGUI_ZLevelsModel::move( const int theItem, const int theType, 
+bool HYDROGUI_ZLevelsModel::move( const int theItem, const OpType theType, 
                                   const int theDropItem )
 {
   bool aRes = false;
@@ -149,8 +218,8 @@ bool HYDROGUI_ZLevelsModel::move( const int theItem, const int theType,
   return aRes;
 }
 
-bool HYDROGUI_ZLevelsModel::move( const QList<int>& theItems, const int theType, 
-                               const int theDropItem )
+bool HYDROGUI_ZLevelsModel::move( const QList<int>& theItems, const OpType theType, 
+                                  const int theDropItem )
 {
   bool aRes = true;
 
@@ -176,4 +245,5 @@ bool HYDROGUI_ZLevelsModel::move( const QList<int>& theItems, const int theType,
   reset(); //TODO dataChanged?
 
   return aRes;
-}
\ No newline at end of file
+}
+
index 5dbd2a9f8e50683716dbbb944c8517fe32bcce94..028b65845ebe55d78d7e97938af730b7462e292b 100644 (file)
@@ -50,14 +50,20 @@ public:
   virtual QVariant headerData( int theSection,
                                Qt::Orientation theOrientation,
                                int theRole = Qt::DisplayRole ) const;
+  virtual Qt::ItemFlags flags( const QModelIndex& theIndex ) const;
+  virtual QMimeData* mimeData( const QModelIndexList& theIndices ) const;
+  virtual QStringList mimeTypes() const;
+  virtual bool dropMimeData( const QMimeData* theData, Qt::DropAction theAction,
+                             int theRow, int theColumn, const QModelIndex& theParent );
+  virtual Qt::DropActions supportedDropActions() const;
 
   QList<int> getIds( const QModelIndexList& theIndexes, bool theIsToSort = true ) const;
 
   void setObjects( const QList<QString>& theObjects );
 
-  bool move( const int theItem, const int theType, 
+  bool move( const int theItem, const OpType theType, 
              const int theDropItem = -1 );
-  bool move( const QList<int>& theItems, const int theType, 
+  bool move( const QList<int>& theItems, const OpType theType, 
              const int theDropItem = -1 );
 
 protected:
index 8c51cb3dd3f77a0e205aed884be442edfb840217..48b9828df32ee69ce89c2acbd9ef2126e02e989f 100644 (file)
@@ -9,7 +9,7 @@ int main( int argc, char** argv ){
   QList< QString > anObjects;
   anObjects << "A" << "B" << "C" << "D" << "E" << "F" << "G" << "H";
   aDlg->setObjects( anObjects );
-  aDlg->exec();
+  aDlg->show();
 
   return app.exec();
 }
\ No newline at end of file