]> SALOME platform Git repositories - modules/hydro.git/commitdiff
Salome HOME
refs #524: fix selection issues. BR_SHAPE_RECOGNITION
authormzn <mzn@opencascade.com>
Tue, 9 Jun 2015 08:25:15 +0000 (11:25 +0300)
committermzn <mzn@opencascade.com>
Tue, 9 Jun 2015 08:25:15 +0000 (11:25 +0300)
src/HYDROGUI/CMakeLists.txt
src/HYDROGUI/HYDROGUI_DataOwner.cxx [new file with mode: 0644]
src/HYDROGUI/HYDROGUI_DataOwner.h [new file with mode: 0644]
src/HYDROGUI/HYDROGUI_OCCSelector.cxx

index e6417fd98c1d682a02e47c359bda2c0905a3e66a..2e3f96707a1517f80085031eefcebe2c164fe836 100644 (file)
@@ -18,6 +18,7 @@ set(PROJECT_HEADERS
     HYDROGUI_DataModel.h
     HYDROGUI_DataModelSync.h
     HYDROGUI_DataObject.h
+       HYDROGUI_DataOwner.h
     HYDROGUI_DeleteDlg.h
     HYDROGUI_DeleteOp.h
     HYDROGUI_DigueDlg.h
@@ -133,6 +134,7 @@ set(PROJECT_SOURCES
     HYDROGUI_DataModel.cxx
     HYDROGUI_DataModelSync.cxx
     HYDROGUI_DataObject.cxx
+       HYDROGUI_DataOwner.cxx
     HYDROGUI_DeleteDlg.cxx
     HYDROGUI_DeleteOp.cxx
     HYDROGUI_DigueDlg.cxx
diff --git a/src/HYDROGUI/HYDROGUI_DataOwner.cxx b/src/HYDROGUI/HYDROGUI_DataOwner.cxx
new file mode 100644 (file)
index 0000000..040085b
--- /dev/null
@@ -0,0 +1,49 @@
+// 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, 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
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#include "HYDROGUI_DataOwner.h"
+
+
+HYDROGUI_DataOwner::HYDROGUI_DataOwner()
+{
+}
+
+HYDROGUI_DataOwner::HYDROGUI_DataOwner( const Handle(AIS_InteractiveObject)& theIO ):
+  myIO(theIO)
+{
+}
+
+HYDROGUI_DataOwner::~HYDROGUI_DataOwner()
+{
+}
+
+QString HYDROGUI_DataOwner::keyString() const
+{
+  QString aKey;
+
+  if ( !myIO.IsNull() ) {
+    aKey = QString().sprintf( "%08p", myIO.operator->() );
+  }
+
+  return aKey;
+}
+
+const Handle(AIS_InteractiveObject)& HYDROGUI_DataOwner::IO() const
+{
+  return myIO;
+}
diff --git a/src/HYDROGUI/HYDROGUI_DataOwner.h b/src/HYDROGUI/HYDROGUI_DataOwner.h
new file mode 100644 (file)
index 0000000..f955cbb
--- /dev/null
@@ -0,0 +1,66 @@
+// 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, 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
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#ifndef HYDROGUI_DATAOWNER_H
+#define HYDROGUI_DATAOWNER_H
+
+#include <SUIT_DataOwner.h>
+
+#include <AIS_InteractiveObject.hxx>
+
+
+/*!
+  This class provide data owner objects.
+*/
+class HYDROGUI_DataOwner : public SUIT_DataOwner
+{
+public:
+    /**
+     * Constructor. Initialize by \a AIS_InteractiveObject.
+     */
+    HYDROGUI_DataOwner( const Handle(AIS_InteractiveObject)& theIO );
+
+    /**
+     * Constructor.
+     */
+    HYDROGUI_DataOwner();
+
+    /**
+     * Destructor.
+     */
+    virtual ~HYDROGUI_DataOwner();
+
+    /**
+     * Gets key string, used for data owners comparison.
+     * \return the empty string
+     */
+    virtual QString keyString() const;
+
+    /**
+     * Gets SALOME_InteractiveObject.
+     * \return the SALOME interactive object
+     */
+    const Handle(AIS_InteractiveObject)& IO() const;
+
+private:
+    Handle(AIS_InteractiveObject) myIO; ///< the AIS interactive object
+};
+
+typedef SMART(HYDROGUI_DataOwner) HYDROGUI_DataOwnerPtr;
+
+#endif
index eebfdf3575b8dba74f9c0cbd283dcf59b57294b6..432306627ff08164ce644a83d348cb9dca394d77 100644 (file)
@@ -20,6 +20,7 @@
 
 #include "HYDROGUI_DataModel.h"
 #include "HYDROGUI_DataObject.h"
+#include "HYDROGUI_DataOwner.h"
 #include "HYDROGUI_Module.h"
 
 #include <AIS_ListOfInteractive.hxx>
@@ -53,8 +54,14 @@ void HYDROGUI_OCCSelector::getSelection( SUIT_DataOwnerPtrList& aList ) const
   for ( AIS_ListIteratorOfListOfInteractive anIt( aSelList ); anIt.More(); anIt.Next() )
     if ( !anIt.Value().IsNull() )
     {
-      if ( !isLocalContext )
-        aList.append( SUIT_DataOwnerPtr( new LightApp_DataOwner( entry( anIt.Value() ) ) ) );
+      if ( !isLocalContext ) {
+        QString anEntry = entry( anIt.Value() );
+        if ( !anEntry.isEmpty() ) {
+          aList.append( SUIT_DataOwnerPtr( new LightApp_DataOwner( entry( anIt.Value() ) ) ) );
+        } else {
+          aList.append( SUIT_DataOwnerPtr( new HYDROGUI_DataOwner( anIt.Value() ) ) );
+        }
+      }
     }
   // add externally selected objects
   SUIT_DataOwnerPtrList::const_iterator anExtIter;
@@ -70,11 +77,39 @@ void HYDROGUI_OCCSelector::setSelection( const SUIT_DataOwnerPtrList& aList )
     return;
 
   Handle(AIS_InteractiveContext) aContext = aViewer->getAISContext();
-  if ( aContext->HasOpenedContext() ) {
+  if ( aContext.IsNull() || aContext->HasOpenedContext() ) {
     return;
   }
 
-  LightApp_OCCSelector::setSelection( aList );
+  QMap<QString, Handle(AIS_InteractiveObject)> aDisplayed;
+  AIS_ListOfInteractive aDispList, aSelList;
+  aContext->DisplayedObjects( aDispList );
+
+  for ( AIS_ListIteratorOfListOfInteractive it( aDispList ); it.More(); it.Next() )
+  {
+    QString entryStr = entry( it.Value() );
+    if ( !entryStr.isEmpty() )
+      aDisplayed.insert( entryStr, it.Value() );
+  }
+  
+  mySelectedExternals.clear();
+
+  for ( SUIT_DataOwnerPtrList::const_iterator itr = aList.begin(); itr != aList.end(); ++itr )
+  {
+    const LightApp_DataOwner* owner = dynamic_cast<const LightApp_DataOwner*>( (*itr).operator->() );
+    if ( owner && aDisplayed.contains( owner->entry() ) )
+      aSelList.Append( aDisplayed[owner->entry()] );
+    else {
+      const HYDROGUI_DataOwner* hydroOwner = dynamic_cast<const HYDROGUI_DataOwner*>( (*itr).operator->() );
+      if ( hydroOwner && !hydroOwner->IO().IsNull() ) {
+        aSelList.Append( hydroOwner->IO() );
+      } else
+        mySelectedExternals.append(*itr);
+    }
+  }
+  aViewer->unHighlightAll( false );
+  aViewer->setObjectsSelected( aSelList );
 }
 
 QString HYDROGUI_OCCSelector::entry( const Handle(AIS_InteractiveObject)& anAIS ) const