From: mzn Date: Tue, 9 Jun 2015 08:25:15 +0000 (+0300) Subject: refs #524: fix selection issues. X-Git-Tag: v1.4.1~7^2 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=refs%2Fheads%2FBR_SHAPE_RECOGNITION;p=modules%2Fhydro.git refs #524: fix selection issues. --- diff --git a/src/HYDROGUI/CMakeLists.txt b/src/HYDROGUI/CMakeLists.txt index e6417fd9..2e3f9670 100644 --- a/src/HYDROGUI/CMakeLists.txt +++ b/src/HYDROGUI/CMakeLists.txt @@ -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 index 00000000..040085b1 --- /dev/null +++ b/src/HYDROGUI/HYDROGUI_DataOwner.cxx @@ -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 index 00000000..f955cbb4 --- /dev/null +++ b/src/HYDROGUI/HYDROGUI_DataOwner.h @@ -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 + +#include + + +/*! + 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 diff --git a/src/HYDROGUI/HYDROGUI_OCCSelector.cxx b/src/HYDROGUI/HYDROGUI_OCCSelector.cxx index eebfdf35..43230662 100644 --- a/src/HYDROGUI/HYDROGUI_OCCSelector.cxx +++ b/src/HYDROGUI/HYDROGUI_OCCSelector.cxx @@ -20,6 +20,7 @@ #include "HYDROGUI_DataModel.h" #include "HYDROGUI_DataObject.h" +#include "HYDROGUI_DataOwner.h" #include "HYDROGUI_Module.h" #include @@ -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 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( (*itr).operator->() ); + if ( owner && aDisplayed.contains( owner->entry() ) ) + aSelList.Append( aDisplayed[owner->entry()] ); + else { + const HYDROGUI_DataOwner* hydroOwner = dynamic_cast( (*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