Salome HOME
refs #567: add "POLYLINES" partition and modified icon for Land Cover object.
[modules/hydro.git] / src / HYDROGUI / HYDROGUI_ListModel.cxx
index bfda69d93709223f5370cecc760ecefe35a1ab40..b112dd34a5c3d2261b47df452e377369f3654e54 100644 (file)
@@ -1,12 +1,8 @@
-// Copyright (C) 2007-2013  CEA/DEN, EDF R&D, OPEN CASCADE
-//
-// Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
+// Copyright (C) 2014-2015  EDF-R&D
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
 // License as published by the Free Software Foundation; either
-// version 2.1 of the License.
+// version 2.1 of the License, or (at your option) any later version.
 //
 // This library is distributed in the hope that it will be useful,
 // but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -37,7 +33,7 @@ const QString OBJ_LIST_MIME_TYPE = "application/hydro.objects.list";
   @param theParent the parent object
 */
 HYDROGUI_ListModel::HYDROGUI_ListModel( QObject* theParent )
- : QAbstractListModel( theParent )
+ : QAbstractListModel( theParent ), myIsDecorationEnabled( true )
 {
   // Get resource manager
   SUIT_ResourceMgr* aResMgr = 0;
@@ -48,7 +44,7 @@ HYDROGUI_ListModel::HYDROGUI_ListModel( QObject* theParent )
 
   // Define eye icon and empty icon
   myEmpty = QPixmap( 16, 16 );
-  myEmpty.fill( Qt::white );
+  myEmpty.fill( Qt::transparent );
   if ( aResMgr ) {
     myEye = aResMgr->loadPixmap( "HYDRO", tr( "EYE_ICO" ) );
   } else {
@@ -89,8 +85,8 @@ QVariant HYDROGUI_ListModel::data( const QModelIndex &theIndex, int theRole ) co
 
   case Qt::DecorationRole:
     {
-      if( aColumn==0 && aRow >=0 && aRow < myObjects.count() )
-      {
+      if( myIsDecorationEnabled && 
+          aColumn==0 && aRow >=0 && aRow < myObjects.count() ) {
         bool isVisible = isObjectVisible( aRow );
         if( isVisible )
           return myEye;
@@ -152,6 +148,36 @@ HYDROGUI_ListModel::ObjectList HYDROGUI_ListModel::getObjects() const
   return anObjects;
 }
 
+/**
+  Add the object to the end of the list.
+  @param theObjects the pair (object; visibility)
+*/
+void HYDROGUI_ListModel::addObject( const Object2Visible& theObject )
+{
+  myObjects << theObject;
+
+  reset();
+}
+
+/**
+  Remove the object from the list.
+  @param theObjectName the name of the object to remove
+*/
+void HYDROGUI_ListModel::removeObjectByName( const QString& theObjectName )
+{
+  Object2Visible anItem;
+  foreach( anItem, myObjects ) {
+    if ( anItem.first->GetName() == theObjectName ) {
+      break;
+    }
+  }
+
+  myObjects.removeAll(anItem);
+
+  reset();
+}
+
+
 /**
   Check if the object is visible.
   @param theIndex the object index
@@ -171,8 +197,8 @@ bool HYDROGUI_ListModel::isObjectVisible( int theIndex ) const
 /**
 */
 QVariant HYDROGUI_ListModel::headerData( int theSection,
-                                            Qt::Orientation theOrientation,
-                                            int theRole ) const
+                                         Qt::Orientation theOrientation,
+                                         int theRole ) const
 {
   if( theOrientation==Qt::Horizontal && theRole==Qt::DisplayRole )
   {
@@ -206,7 +232,7 @@ QMimeData* HYDROGUI_ListModel::mimeData( const QModelIndexList& theIndexes ) con
   QByteArray anEncodedData;
   QDataStream aStream( &anEncodedData, QIODevice::WriteOnly );
 
-  QList<int> anIdsList = getIds( theIndexes );
+  QList<int> anIdsList = getIds( theIndexes, true );
   foreach( int anId, anIdsList )
     aStream << anId;
 
@@ -226,7 +252,7 @@ QStringList HYDROGUI_ListModel::mimeTypes() const
 /**
 */
 bool HYDROGUI_ListModel::dropMimeData( const QMimeData* theData, Qt::DropAction theAction,
-                                          int theRow, int theColumn, const QModelIndex& theParent )
+                                       int theRow, int theColumn, const QModelIndex& theParent )
 {
   if( theAction == Qt::IgnoreAction)
     return true;
@@ -237,7 +263,8 @@ bool HYDROGUI_ListModel::dropMimeData( const QMimeData* theData, Qt::DropAction
   if( theColumn > 0 )
     return false;
 
-  int aDropItemId = theParent.row();
+  // TODO: to disable drop between items use: int aDropItemId = theParent.row();
+  int aDropItemId = theParent.isValid() ? theParent.row() : theRow;
 
   QByteArray anEncodedData = theData->data( OBJ_LIST_MIME_TYPE );
   QDataStream aStream( &anEncodedData, QIODevice::ReadOnly );
@@ -248,7 +275,7 @@ bool HYDROGUI_ListModel::dropMimeData( const QMimeData* theData, Qt::DropAction
     aStream >> anId;
     anIdsList << anId;
   }
-  qSort( anIdsList ); // TODO should be moved?
+
   move( anIdsList, DragAndDrop, false, aDropItemId ); //TODO set visibility?
   return true;
 }
@@ -265,7 +292,8 @@ Qt::DropActions HYDROGUI_ListModel::supportedDropActions() const
   @param theIsToSort defines if the list of ids should be sorted in ascending order
   @return the list of ids
 */
-QList<int> HYDROGUI_ListModel::getIds( const QModelIndexList& theIndexes, bool theIsToSort ) const
+QList<int> HYDROGUI_ListModel::getIds( const QModelIndexList& theIndexes, 
+                                       bool theIsToSort ) const
 {
   QList<int> anIds;
   foreach( const QModelIndex& anIndex, theIndexes ) {
@@ -288,7 +316,7 @@ QList<int> HYDROGUI_ListModel::getIds( const QModelIndexList& theIndexes, bool t
   @return true in case of success
 */
 bool HYDROGUI_ListModel::move( const int theItem, const OpType theType,
-                                  bool theIsVisibleOnly, const int theDropItem )
+                               bool theIsVisibleOnly, const int theDropItem )
 {
   bool aRes = false;
   if ( theItem < 0 || theItem >= myObjects.count() ) {
@@ -344,6 +372,7 @@ bool HYDROGUI_ListModel::move( const int theItem, const OpType theType,
   if ( aDestinationIndex >= 0 && aDestinationIndex < myObjects.count() ) {
     int aDestinationRow = isInsertBefore ? aDestinationIndex : aDestinationIndex + 1;
     if ( beginMoveRows( QModelIndex(), theItem, theItem, QModelIndex(), aDestinationRow ) ) {
+      myPrevObjects = myObjects;
       myObjects.move( theItem, aDestinationIndex );
       endMoveRows();
       aRes = true;
@@ -362,7 +391,7 @@ bool HYDROGUI_ListModel::move( const int theItem, const OpType theType,
   @return true in case of success
 */
 bool HYDROGUI_ListModel::move( const QList<int>& theItems, const OpType theType, 
-                                  bool theIsVisibleOnly, const int theDropItem )
+                               bool theIsVisibleOnly, const int theDropItem )
 {
   bool aRes = true;
 
@@ -437,11 +466,13 @@ bool HYDROGUI_ListModel::move( const QList<int>& theItems, const OpType theType,
   @return true if drag and drop allowed
 */
 bool HYDROGUI_ListModel::isDragAndDropAllowed( const QList<int>& theItems, 
-                                                  const int theDropItem ) const
+                                               const int theDropItem ) const
 {
   bool isAllowed = false;
 
-  if ( theDropItem >= 0 && theDropItem < myObjects.count() &&
+  if ( theDropItem >= 0 && 
+       // TODO: to disable drop between items use: theDropItem < myObjects.count()
+       theDropItem <= myObjects.count() &&
        !theItems.empty() && theItems.count() < myObjects.count() &&
        !theItems.contains( theDropItem )) {
     isAllowed = true;
@@ -449,3 +480,18 @@ bool HYDROGUI_ListModel::isDragAndDropAllowed( const QList<int>& theItems,
 
   return isAllowed;
 }
+
+/**
+  Enable/disable decoration (eye icon).
+  @param theIsToEnable if true - the decoration will be enabled
+*/
+void HYDROGUI_ListModel::setDecorationEnabled( const bool theIsToEnable )
+{
+  myIsDecorationEnabled = theIsToEnable;
+}
+
+void HYDROGUI_ListModel::undoLastMove()
+{
+  myObjects = myPrevObjects;
+  reset();
+}