Salome HOME
The first implementation of drag and drop + dialog buttons icons and translations.
authormzn <mzn@opencascade.com>
Fri, 21 Mar 2014 14:17:39 +0000 (14:17 +0000)
committermzn <mzn@opencascade.com>
Fri, 21 Mar 2014 14:17:39 +0000 (14:17 +0000)
src/HYDROGUI/HYDROGUI_ZLevelsDlg.cxx
src/HYDROGUI/HYDROGUI_ZLevelsDlg.h
src/HYDROGUI/HYDROGUI_ZLevelsModel.cxx
src/HYDROGUI/HYDROGUI_ZLevelsModel.h
src/HYDROGUI/HYDROGUI_ZLevelsOp.cxx

index 7055cd082f588afc506015a31ba3c6af71db0ac0..9e85de975c455ed1be26c4bbfb1e7697ef95ffa4 100644 (file)
 #include "HYDROGUI_ZLevelsDlg.h"
 #include "HYDROGUI_ZLevelsModel.h"
 
+#include <SUIT_Session.h>
+#include <SUIT_ResourceMgr.h>
+
 #include <QCheckBox>
 #include <QLayout>
 #include <QListView>
 #include <QPushButton>
+#include <QToolButton>
 #include <QSignalMapper>
 #include <QSortFilterProxyModel>
 
@@ -34,6 +38,8 @@
 HYDROGUI_ZLevelsDlg::HYDROGUI_ZLevelsDlg( QWidget* theParent )
 : QDialog( theParent )
 {
+  setWindowTitle( tr( "CHANGE_LAYER_ORDER" ) );
+
   QVBoxLayout* aMainLayout = new QVBoxLayout( this );
   aMainLayout->setMargin( 5 );
 
@@ -55,10 +61,19 @@ HYDROGUI_ZLevelsDlg::HYDROGUI_ZLevelsDlg( QWidget* theParent )
 
   myList->setModel( aFilteredModel );
 
-  myTop = new QPushButton( tr("TOP") );
-  myUp = new QPushButton( tr("UP") );
-  myDown = new QPushButton( tr("DOWN") );
-  myBottom = new QPushButton( tr("BOTTOM") );
+  SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
+  myTop = new QToolButton;
+  myTop->setIcon( aResMgr->loadPixmap( "HYDRO", tr( "ARROW_TOP_ICO" ) ) );
+  myTop->setIconSize( QSize( 32, 32 ) );
+  myUp = new QToolButton;
+  myUp->setIcon( aResMgr->loadPixmap( "HYDRO", tr( "ARROW_UP_ICO" ) ) );
+  myUp->setIconSize( myTop->iconSize() );
+  myDown = new QToolButton;
+  myDown->setIcon( aResMgr->loadPixmap( "HYDRO", tr( "ARROW_DOWN_ICO" ) ) );
+  myDown->setIconSize( myTop->iconSize() );
+  myBottom = new QToolButton;
+  myBottom->setIcon( aResMgr->loadPixmap( "HYDRO", tr( "ARROW_BOTTOM_ICO" ) ) );
+  myBottom->setIconSize( myTop->iconSize() );
   QVBoxLayout* aListButtonsLayout = new QVBoxLayout();
   aListButtonsLayout->addWidget( myTop );
   aListButtonsLayout->addWidget( myUp );
index 6d249784d0c866adbc2981164c0398f2454535be..e67dcc38f24eae2f1123dd7d7ec3379e19c18981 100644 (file)
 class QCheckBox;
 class QListView;
 class QPushButton;
+class QToolButton;
 
 /** 
  * \class HYDROGUI_ZLevelsDlg
  * \brief The class representing widget for managing Z levels
  */
-class HYDROGUI_ZLevelsDlg : public QDialog
+class HYDRO_EXPORT HYDROGUI_ZLevelsDlg : public QDialog
 {
   Q_OBJECT
 
@@ -55,10 +56,10 @@ private:
 
 private:
   QListView* myList;
-  QPushButton* myTop;
-  QPushButton* myUp;
-  QPushButton* myDown;
-  QPushButton* myBottom;
+  QToolButton* myTop;
+  QToolButton* myUp;
+  QToolButton* myDown;
+  QToolButton* myBottom;
   QCheckBox* myAllObjects;
   QPushButton* myApply;
   QPushButton* myClose;
index 320ea9631cf4c51f14a2ea6f8594ec447e0f82fd..20fb48f5f3c685dc9f038da3338bdfe4f50b407a 100644 (file)
 //
 
 #include "HYDROGUI_ZLevelsModel.h"
+
+#include <SUIT_Session.h>
+#include <SUIT_ResourceMgr.h>
+
 #include <QMimeData>
 
 const QString OBJ_LIST_MIME_TYPE = "application/hydro.objects.list";
@@ -28,9 +32,11 @@ const QString OBJ_LIST_MIME_TYPE = "application/hydro.objects.list";
 HYDROGUI_ZLevelsModel::HYDROGUI_ZLevelsModel( QObject* theParent )
  : QAbstractListModel( theParent )
 {
+  SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
+
   myEmpty = QPixmap( 16, 16 );
   myEmpty.fill( Qt::white );
-  myEye = QPixmap( "eye.png" );//TODO: loading from resources
+  myEye = aResMgr->loadPixmap( "HYDRO", tr( "EYE_ICO" ) );
   setSupportedDragActions( Qt::MoveAction | Qt::CopyAction );
 }
 
@@ -185,7 +191,8 @@ bool HYDROGUI_ZLevelsModel::dropMimeData( const QMimeData* theData, Qt::DropActi
     aStream >> anId;
     anIdsList << anId;
   }
-  move( anIdsList, DragAndDrop, aDropItemId );
+  qSort( anIdsList ); // TODO should be moved?
+  move( anIdsList, DragAndDrop, false, aDropItemId ); //TODO set visibility?
   return true;
 }
 
@@ -217,9 +224,11 @@ bool HYDROGUI_ZLevelsModel::move( const int theItem, const OpType theType,
   }
 
   int aDestinationIndex = -1;
+  bool isInsertBefore = false;
 
   switch ( theType ) {
     case Up:
+      isInsertBefore = true;
       if ( theItem > 0 ) {
         aDestinationIndex = theItem - 1;
         if ( theIsVisibleOnly ) {
@@ -240,6 +249,7 @@ bool HYDROGUI_ZLevelsModel::move( const int theItem, const OpType theType,
       }
       break;
     case Top:
+      isInsertBefore = true;
       if ( theItem > 0 ) {
         aDestinationIndex = 0;
       }
@@ -249,10 +259,18 @@ bool HYDROGUI_ZLevelsModel::move( const int theItem, const OpType theType,
         aDestinationIndex = myObjects.count() - 1;
       }
       break;
+    case DragAndDrop:
+      if ( theItem > theDropItem ) {
+        isInsertBefore = true;
+        aDestinationIndex = theDropItem;
+      } else {
+        aDestinationIndex = theDropItem - 1;
+      }
+      break;
   }
 
   if ( aDestinationIndex >= 0 && aDestinationIndex < myObjects.count() ) {
-    int aDestinationRow = (theType == Up || theType == Top) ? aDestinationIndex : aDestinationIndex + 1;
+    int aDestinationRow = isInsertBefore ? aDestinationIndex : aDestinationIndex + 1;
     if ( beginMoveRows( QModelIndex(), theItem, theItem, QModelIndex(), aDestinationRow ) ) {
       myObjects.move( theItem, aDestinationIndex );
       endMoveRows();
@@ -268,38 +286,80 @@ bool HYDROGUI_ZLevelsModel::move( const QList<int>& theItems, const OpType theTy
 {
   bool aRes = true;
 
-  bool isReverse = theType == Top || theType == Down;
   QListIterator<int> anIt( theItems );
-  int aShift = 0;
-  if ( isReverse ) {
-    anIt.toBack();
-    while ( anIt.hasPrevious() ) {
-      int anId = anIt.previous();
-      if ( theType == Top ) {
-        anId += aShift;
-        aShift++;
-      }
-      if ( !move( anId, theType, theIsVisibleOnly, theDropItem ) ) {
-        aRes = false;
-        break;
+  int aDragShift = 0;
+
+  switch ( theType ) {
+    case Top:
+    case Down:
+      // reverse order
+      anIt.toBack();
+      while ( anIt.hasPrevious() ) {
+        int anId = anIt.previous();
+        if ( theType == Top ) {
+          anId += aDragShift;
+          aDragShift++;
+        }
+        if ( !move( anId, theType, theIsVisibleOnly, theDropItem ) ) {
+          aRes = false;
+          break;
+        }
       }
-    }
-  } else {
-    while ( anIt.hasNext() ) {
-      int anId = anIt.next();
-      if ( theType == Bottom ) {
-        anId -= aShift;
-        aShift++;
+      break;
+    case Bottom:
+    case Up:
+      // direct order
+      while ( anIt.hasNext() ) {
+        int anId = anIt.next();
+        if ( theType == Bottom ) {
+          anId -= aDragShift;
+          aDragShift++;
+        }
+        if ( !move( anId, theType, theIsVisibleOnly, theDropItem ) ) {
+          aRes = false;
+          break;
+        }
       }
-      if ( !move( anId, theType, theIsVisibleOnly, theDropItem ) ) {
-        aRes = false;
-        break;
+      break;
+    case DragAndDrop:
+      // direct order
+      aRes = isDragAndDropAllowed( theItems, theDropItem );
+      if ( aRes ) {
+        int aDropShift = 0;
+        int aDropItem = theDropItem;
+        while ( anIt.hasNext() ) {
+          int anId = anIt.next();
+          aDropItem = theDropItem + aDropShift;
+          if ( anId > aDropItem ) {
+            aDragShift = 0;
+            aDropShift++;
+          } else {
+            anId -= aDragShift;
+            if ( ( aDropItem - anId ) != 1 ) {
+              aDragShift++;
+            }
+          }
+          move( anId, theType, theIsVisibleOnly, aDropItem );
+        }
       }
-    }
+      break;
+    default:
+      aRes = false;
   }
-
-  // reset(); //TODO dataChanged?
-
+  
   return aRes;
 }
 
+bool HYDROGUI_ZLevelsModel::isDragAndDropAllowed( const QList<int>& theItems, 
+                                                  const int theDropItem ) const
+{
+  bool isAllowed = false;
+
+  if ( theDropItem >= 0 && theDropItem < myObjects.count() &&
+       !theItems.empty() && theItems.count() < myObjects.count() &&
+       !theItems.contains( theDropItem )) {
+    isAllowed = true;
+  }
+
+  return isAllowed;
+}
index fd2fb37444c8a0a2b0fdc2f2fbaa3fa9e9030eba..e1585abdd28c3989a90f4b21b8c6ac28b59bef62 100644 (file)
@@ -75,6 +75,7 @@ public:
 
 protected:
   bool isObjectVisible( int theIndex ) const;
+  bool isDragAndDropAllowed( const QList<int>& theItems, const int theDropItem ) const;
 
 private:
   friend class test_HYDROGUI_ZLevelsModel;
index 7d12d15a7a0885f8e3ad4d4df800eb7ec1cadb2a..61f318b9c8c8c29eda6e208350db507de0e5ad08 100644 (file)
@@ -50,8 +50,36 @@ void HYDROGUI_ZLevelsOp::startOperation()
 {
   HYDROGUI_Operation::startOperation();
 
-  // TODO
-  abort();
+  HYDROGUI_ZLevelsModel::Object2VisibleList anObject2VisibleList;
+
+  // Get the document
+  Handle(HYDROData_Document) aDoc = doc();
+  if( !aDoc.IsNull() ) {
+    // Get active OCC view id
+    size_t anActiveOCCViewId = HYDROGUI_Tool::GetActiveOCCViewId( module() );
+
+    // Get objects list
+    HYDROData_SequenceOfObjects aSeqOfObjects = aDoc->GetObjectsLayerOrder( Standard_True );
+    HYDROData_SequenceOfObjects::Iterator anIter( aSeqOfObjects );
+    for ( ; anIter.More(); anIter.Next() ) {
+      Handle(HYDROData_Entity) anObject = anIter.Value();
+      if ( !anObject.IsNull() ) {
+        bool isVisible = module()->isObjectVisible( anActiveOCCViewId, anObject );
+        anObject2VisibleList << HYDROGUI_ZLevelsModel::Object2Visible( anObject, isVisible );
+      }
+    }
+  }
+
+  // Show the dialog
+  myZLevelsDlg = new HYDROGUI_ZLevelsDlg( module()->getApp()->desktop() );
+  myZLevelsDlg->setModal( true );
+  myZLevelsDlg->setObjects( anObject2VisibleList );
+
+  //TODO: reimplement
+  connect( myZLevelsDlg, SIGNAL( accepted() ), this, SLOT( commit() ) );
+  connect( myZLevelsDlg, SIGNAL( rejected() ), this, SLOT( abort() ) );
+
+  myZLevelsDlg->exec();
 }
 
 bool HYDROGUI_ZLevelsOp::processApply( int& theUpdateFlags,