Salome HOME
Initial merge of branch 'BR_HYDRO_IMPS_2016' into BR_PORTING_OCCT_7
[modules/hydro.git] / src / HYDROGUI / HYDROGUI_PriorityTableModel.cxx
index 6d737e3aa4b34fc8df467e39c5ffe854e4be1af9..0b008616eb8ae6a49aee0c150043d076ce3f742e 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
 
 #include "HYDROGUI_PriorityTableModel.h"
 
+#include <HYDROGUI_DataObject.h>
 
 /**
   Constructor.
   @param theParent the parent object
 */
 HYDROGUI_PriorityTableModel::HYDROGUI_PriorityTableModel( QObject* theParent )
- : QAbstractTableModel( theParent )
+ : QAbstractTableModel( theParent ),
+   myColumnCount( 4 )
 {
 }
 
@@ -87,7 +85,7 @@ QVariant HYDROGUI_PriorityTableModel::data( const QModelIndex &theIndex, int the
     if ( aColumn == 0 || aColumn == 2 ) {
       QStringList aNames;
       HYDROData_CustomRule aRule = myRules.at( aRow );
-      Handle(HYDROData_Object) aUsedObject = aColumn == 0 ? aRule.Object2 : aRule.Object1;
+      Handle(HYDROData_Entity) aUsedObject = aColumn == 0 ? aRule.Object2 : aRule.Object1;
       if ( !aUsedObject.IsNull() ) {
         aNames = getAvailablePairs( aUsedObject );
       }
@@ -121,14 +119,17 @@ bool HYDROGUI_PriorityTableModel::setData( const QModelIndex & theIndex, const Q
   }
 
   bool aRes = false;
-
+  
   if ( theRole ==  Qt::EditRole ) {
+    bool aRuleChanged = false;
+    myPrevRules = myRules;
+
     int aColumn = theIndex.column();
 
     if ( aColumn == 0 || aColumn == 2 ) {
-      Handle(HYDROData_Object) anObject;
+      Handle(HYDROData_Entity) anObject;
       QString anObjName = theValue.toString();
-      foreach ( const Handle(HYDROData_Object) anObj, myObjects ) {
+      foreach ( const Handle(HYDROData_Entity) anObj, myObjects ) {
         if ( anObj->GetName() == anObjName ) {
           anObject = anObj;
           break;
@@ -137,9 +138,16 @@ bool HYDROGUI_PriorityTableModel::setData( const QModelIndex & theIndex, const Q
       if ( !anObject.IsNull() ) {
         HYDROData_CustomRule anEditedRule = myRules[aRow];
         
+        QString anEntryNew = HYDROGUI_DataObject::dataObjectEntry( anObject );
         if ( aColumn == 0 ) {
+          QString anEntryOld = HYDROGUI_DataObject::dataObjectEntry( anEditedRule.Object1 );
+          if ( anEntryOld != anEntryNew )
+            aRuleChanged = true;
           anEditedRule.Object1 = anObject;
         } else {
+          QString anEntryOld = HYDROGUI_DataObject::dataObjectEntry( anEditedRule.Object2 );
+          if ( anEntryOld != anEntryNew )
+            aRuleChanged = true;
           anEditedRule.Object2 = anObject;
         }
         
@@ -147,14 +155,24 @@ bool HYDROGUI_PriorityTableModel::setData( const QModelIndex & theIndex, const Q
           myRules[aRow] = anEditedRule;
           aRes = true;
         } else {
+          aRuleChanged = false;
           emit showError( tr("ALREADY_EXISTS") );
         }
       }
     } else if ( aColumn == 1 ) {
-      myRules[aRow].Priority = (HYDROData_PriorityType)theValue.toInt();
+      HYDROData_PriorityType aNewPriority = (HYDROData_PriorityType)theValue.toInt();
+      if ( myRules[aRow].Priority != aNewPriority )
+        aRuleChanged = true;
+      myRules[aRow].Priority = aNewPriority;
     } else if ( aColumn == 3 ) {
-      myRules[aRow].MergeType = (HYDROData_Zone::MergeAltitudesType)theValue.toInt();;
+      HYDROData_Zone::MergeType aNewMergeType = (HYDROData_Zone::MergeType)theValue.toInt();
+      if ( myRules[aRow].MergeType != aNewMergeType )
+        aRuleChanged = true;
+      myRules[aRow].MergeType = aNewMergeType;
     }
+
+    if ( aRuleChanged )
+      emit ruleChanged();
   }
 
   return aRes;
@@ -171,7 +189,7 @@ int HYDROGUI_PriorityTableModel::rowCount( const QModelIndex &theParent ) const
  */
 int HYDROGUI_PriorityTableModel::columnCount( const QModelIndex &theParent ) const
 {
-  return 4;
+  return myColumnCount;
 }
 
 /**
@@ -181,6 +199,7 @@ int HYDROGUI_PriorityTableModel::columnCount( const QModelIndex &theParent ) con
 void HYDROGUI_PriorityTableModel::setRules( const HYDROData_ListOfRules& theRules )
 {
   beginResetModel();
+  myPrevRules = myRules;
   myRules = theRules;
   endResetModel();
 }
@@ -219,7 +238,10 @@ QVariant HYDROGUI_PriorityTableModel::headerData( int theSection,
       aData = tr( "OBJECT2" );
       break;
     case 3:
-      aData = tr( "BATHYMETRY" );
+      {
+        if ( getObjectsKind() != KIND_LAND_COVER_MAP )
+          aData = tr( "BATHYMETRY" );
+      }
       break;
     };
   } else if ( theOrientation == Qt::Vertical ) {
@@ -233,10 +255,12 @@ QVariant HYDROGUI_PriorityTableModel::headerData( int theSection,
   Set objects which could be used for rules definition.
   @param theObjects the ordered list of objects
  */
-void HYDROGUI_PriorityTableModel::setObjects( const QList<Handle(HYDROData_Object)>& theObjects )
+void HYDROGUI_PriorityTableModel::setObjects( const QList<Handle(HYDROData_Entity)>& theObjects )
 {
   myObjects = theObjects;
     
+  myPrevRules = myRules;
+
   beginResetModel();
 
   // Remove rules which use objects which are no longer available
@@ -278,7 +302,7 @@ bool HYDROGUI_PriorityTableModel::createNewRule()
   // Try to find:
   // 1. the new pair of objects 
   // 2. the priority type corresponding to the objects order
-  Handle(HYDROData_Object) anObject1, anObject2;
+  Handle(HYDROData_Entity) anObject1, anObject2;
   HYDROData_PriorityType aPriorityType = GREATER;
 
   int aNbObjects = myObjects.count();
@@ -316,6 +340,8 @@ bool HYDROGUI_PriorityTableModel::createNewRule()
     aNewRule.Priority = aPriorityType;
     aNewRule.MergeType = HYDROData_Zone::Merge_ZMIN;
 
+    myPrevRules = myRules;
+
     beginResetModel();
     myRules << aNewRule;
     endResetModel();
@@ -350,6 +376,8 @@ bool HYDROGUI_PriorityTableModel::removeRows ( int theRow, int theCount, const Q
     aLastRow = myRules.count() - 1;
   }
 
+  myPrevRules = myRules;
+
   beginRemoveRows( theParent, theRow, aLastRow );
 
   // Remove the corresponding rules
@@ -376,7 +404,7 @@ bool HYDROGUI_PriorityTableModel::removeAll()
  @param theObject the object
  @return the list of object names
  */
-QStringList HYDROGUI_PriorityTableModel::getAvailablePairs(  const Handle(HYDROData_Object)& theObject ) const
+QStringList HYDROGUI_PriorityTableModel::getAvailablePairs(  const Handle(HYDROData_Entity)& theObject ) const
 {
   QStringList aNames;
 
@@ -450,8 +478,8 @@ QString HYDROGUI_PriorityTableModel::mergeTypeToString( const int theMergeType )
   Check if the given pair of objects is already used.
   @return true if the pair is used
  */
-bool HYDROGUI_PriorityTableModel::isUsed( const Handle(HYDROData_Object)& theObj1, 
-                                          const Handle(HYDROData_Object)& theObj2 ) const
+bool HYDROGUI_PriorityTableModel::isUsed( const Handle(HYDROData_Entity)& theObj1, 
+                                          const Handle(HYDROData_Entity)& theObj2 ) const
 {
   bool isUsed = false;
 
@@ -476,11 +504,43 @@ QStringList HYDROGUI_PriorityTableModel::getAvailableObjectNames() const
 {
   QStringList aNames;
 
-  foreach ( const Handle(HYDROData_Object) anObj, myObjects ) {
+  foreach ( const Handle(HYDROData_Entity) anObj, myObjects ) {
     if ( !anObj.IsNull() ) {
       aNames << anObj->GetName();
     }
   }
 
   return aNames;
-}
\ No newline at end of file
+}
+
+/**
+  Set number of columns in the table.
+  @param theColumnCount the number of columns
+ */
+void HYDROGUI_PriorityTableModel::setColumnCount( int theColumnCount )
+{
+  myColumnCount = theColumnCount;
+}
+
+/**
+ Undo last change in the list of priority rules.
+ */
+void HYDROGUI_PriorityTableModel::undoLastChange()
+{
+  beginResetModel();
+  myRules = myPrevRules;
+  endResetModel();
+}
+
+/**
+  Get type of objects for which rules are defined assuming,
+  that all objects in the list have the same type.
+  @return the type of objects
+ */
+const ObjectKind HYDROGUI_PriorityTableModel::getObjectsKind() const
+{
+  if ( myObjects.isEmpty() )
+    return KIND_UNKNOWN;
+  
+  return myObjects.at( 0 )->GetKind();
+}