1 // Copyright (C) 2007-2023 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License, or (at your option) any later version.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 #include "SUIT_SelectionMgr.h"
25 #include "SUIT_Selector.h"
26 #include "SUIT_SelectionFilter.h"
28 /*!\class SUIT_SelectionMgr
29 * Provide selection manager. Manipulate by selection filters, modes, data owners.
32 /*!constructor. initialize myIterations and myIsSelChangeEnabled.*/
33 SUIT_SelectionMgr::SUIT_SelectionMgr( const bool Feedback, QObject* p )
35 myIterations( Feedback ? 1 : 0 ),
36 myAutoDelFilter( false ),
37 myIsSelChangeEnabled( true )
41 /*!destructor. mySelectors auto delete.*/
42 SUIT_SelectionMgr::~SUIT_SelectionMgr()
44 while( !mySelectors.empty() ) {
45 SelectorList::iterator it = mySelectors.begin();
50 /*!Add selector \a sel to selectors list,if it's not exists in list.*/
51 void SUIT_SelectionMgr::installSelector( SUIT_Selector* sel )
53 if ( sel && !mySelectors.contains( sel ) )
54 mySelectors.append( sel );
57 /*!Remove selector \a sel from list.*/
58 void SUIT_SelectionMgr::removeSelector( SUIT_Selector* sel )
60 mySelectors.removeAll( sel );
63 /*!Gets selectors list to \a lst.*/
64 void SUIT_SelectionMgr::selectors( QList<SUIT_Selector*>& lst ) const
67 for ( SelectorList::const_iterator it = mySelectors.begin(); it != mySelectors.end(); ++it )
71 /*!Gets selectors list to \a lst with type \a typ.*/
72 void SUIT_SelectionMgr::selectors( const QString& typ, QList<SUIT_Selector*>& lst ) const
75 for ( SelectorList::const_iterator it = mySelectors.begin(); it != mySelectors.end(); ++it )
77 if ( (*it)->type() == typ )
82 /*! Sets ebabled to \a on for all data owners with type \a typ.
84 void SUIT_SelectionMgr::setEnabled( const bool on, const QString& typ )
86 for ( SelectorList::const_iterator it = mySelectors.begin(); it != mySelectors.end(); ++it )
88 if ( typ.isEmpty() || (*it)->type() == typ )
89 (*it)->setEnabled( on );
93 /*! Gets selected data owners from list with type \a type to list \a lst.
95 void SUIT_SelectionMgr::selected( SUIT_DataOwnerPtrList& lst, const QString& type, const bool onlyOne ) const
99 for ( SelectorList::const_iterator it = mySelectors.begin(); it != mySelectors.end(); ++it )
101 if ( !(*it)->isEnabled() )
103 if ( !type.isEmpty() && (*it)->type() != type )
106 SUIT_DataOwnerPtrList curList( /*skipAllEqual=*/false );
107 (*it)->selected( curList );
110 for ( SUIT_DataOwnerPtrList::const_iterator itr = curList.begin(); itr != curList.end(); ++itr )
113 if ( lst.count() > 1 )
122 for ( SUIT_DataOwnerPtrList::const_iterator itr = curList.begin(); itr != curList.end(); ++itr )
128 /*! Sets selected data owners from \a lst and append to list, if \a append - true.
130 void SUIT_SelectionMgr::setSelected( const SUIT_DataOwnerPtrList& lst, const bool append )
132 SUIT_DataOwnerPtrList owners;
133 filterOwners( lst, owners );
135 for ( SelectorList::const_iterator it = mySelectors.begin(); it != mySelectors.end(); ++it )
139 SUIT_DataOwnerPtrList current;
140 (*it)->selected( current );
141 for ( SUIT_DataOwnerPtrList::const_iterator it = current.begin(); it != current.end(); ++it )
142 owners.append( *it );
144 (*it)->setSelected( owners );
148 /*! Clear selected data owners.
150 void SUIT_SelectionMgr::clearSelected()
152 setSelected( SUIT_DataOwnerPtrList() );
155 /*! On selection \a sel changed.
157 void SUIT_SelectionMgr::selectionChanged( SUIT_Selector* sel )
159 if ( !sel || !myIsSelChangeEnabled || !sel->isEnabled() )
162 SUIT_DataOwnerPtrList owners;
164 myIsSelChangeEnabled = false;
165 sel->selected( owners );
167 SUIT_DataOwnerPtrList newOwners;
168 filterOwners( owners, newOwners );
170 for ( int i = 0; i < myIterations; i++ )
172 for ( SelectorList::iterator it = mySelectors.begin(); it != mySelectors.end(); ++it )
174 // Temporary action(to avoid selection of the objects which don't pass the filters):
176 (*it)->setSelected( newOwners );
179 myIsSelChangeEnabled = true;
181 emit selectionChanged();
185 Returns true if selection manger is in synchronising mode
186 (during synchonisation of the selectors selection).
188 bool SUIT_SelectionMgr::isSynchronizing() const
190 return !myIsSelChangeEnabled;
193 /*! Checks: Is selection manager has selection mode \a mode?
195 bool SUIT_SelectionMgr::hasSelectionMode( const int mode ) const
197 return mySelModes.contains( mode );
200 /*! Gets selection modes to list \a vals.
202 void SUIT_SelectionMgr::selectionModes( QList<int>& vals ) const
207 /*! Set selection mode \a mode to list of selection modes.
209 void SUIT_SelectionMgr::setSelectionModes( const int mode )
213 setSelectionModes( lst );
216 /*! Sets selection modes list from \a lst.
218 void SUIT_SelectionMgr::setSelectionModes( const QList<int>& lst )
223 /*! Append selection mode \a mode to list of selection modes.
225 void SUIT_SelectionMgr::appendSelectionModes( const int mode )
229 appendSelectionModes( lst );
232 /*! Append selection modes \a lst list.
234 void SUIT_SelectionMgr::appendSelectionModes( const QList<int>& lst )
237 for ( QList<int>::const_iterator it = mySelModes.begin(); it != mySelModes.end(); ++it )
238 map.insert( *it, 0 );
240 for ( QList<int>::const_iterator itr = lst.begin(); itr != lst.end(); ++itr )
242 if ( !map.contains( *itr ) )
243 mySelModes.append( *itr );
247 /*! Remove selection mode \a mode from list.
249 void SUIT_SelectionMgr::removeSelectionModes( const int mode )
253 removeSelectionModes( lst );
256 /*! Remove selection modea \a lst from list.
258 void SUIT_SelectionMgr::removeSelectionModes( const QList<int>& lst )
261 for ( QList<int>::const_iterator it = mySelModes.begin(); it != mySelModes.end(); ++it )
262 map.insert( *it, 0 );
264 for ( QList<int>::const_iterator itr = lst.begin(); itr != lst.end(); ++itr )
268 for ( QMap<int, int>::ConstIterator iter = map.begin(); iter != map.end(); ++iter )
269 mySelModes.append( iter.key() );
272 /*! Checks data owner is ok?
274 bool SUIT_SelectionMgr::isOk( const SUIT_DataOwner* owner ) const
280 for ( SelFilterList::const_iterator it = myFilters.begin(); it != myFilters.end() && ok; ++it )
281 ok = (*it)->isOk( owner );
286 /*! Checks data owner pointer is ok?
288 bool SUIT_SelectionMgr::isOk( const SUIT_DataOwnerPtr& ptr ) const
293 return isOk( ptr.operator->() );
296 /*! Checks selection manager has filter \a f?
298 bool SUIT_SelectionMgr::hasFilter( SUIT_SelectionFilter* f ) const
300 return myFilters.contains( f );
303 /*! Install filter \a f and set selected, if \a update = true.
305 void SUIT_SelectionMgr::installFilter( SUIT_SelectionFilter* f, const bool updateSelection )
307 if ( !hasFilter( f ) )
309 SUIT_DataOwnerPtrList selOwners;
310 if( updateSelection )
311 selected( selOwners );
313 myFilters.append( f );
315 if( updateSelection )
316 setSelected( selOwners );
320 /*! Remove filter \a f from filters list.
322 void SUIT_SelectionMgr::removeFilter( SUIT_SelectionFilter* f )
324 if ( !myFilters.contains( f ) )
327 myFilters.removeAll( f );
329 if ( autoDeleteFilter() )
333 /*! Clear filters list.
335 void SUIT_SelectionMgr::clearFilters()
337 if ( autoDeleteFilter() )
339 for ( SelFilterList::const_iterator it = myFilters.begin(); it != myFilters.end(); ++it )
346 /*! Sets auto delete filter.
348 bool SUIT_SelectionMgr::autoDeleteFilter() const
350 return myAutoDelFilter;
353 /*! Sets auto delete filter to \a on.
355 void SUIT_SelectionMgr::setAutoDeleteFilter( const bool on )
357 myAutoDelFilter = on;
360 /*! Gets good data owners list to \a out from \a in.
362 void SUIT_SelectionMgr::filterOwners( const SUIT_DataOwnerPtrList& in, SUIT_DataOwnerPtrList& out ) const
365 for ( SUIT_DataOwnerPtrList::const_iterator it = in.begin(); it != in.end(); ++it )