Salome HOME
Initial version
[modules/gui.git] / src / SalomeApp / SalomeApp_GLSelector.cxx
1 #include "SalomeApp_GLSelector.h"
2
3 #include "SalomeApp_DataOwner.h"
4
5 #include <SALOME_GLOwner.h>
6
7 #include <GLViewer_Context.h>
8
9 SalomeApp_GLSelector::SalomeApp_GLSelector( GLViewer_Viewer2d* viewer, SUIT_SelectionMgr* mgr )
10 : QObject( 0 ),
11 SUIT_Selector( mgr ),
12 myViewer( viewer )
13 {
14   if ( myViewer )
15     connect( myViewer, SIGNAL( selectionChanged() ), this, SLOT( onSelectionChanged() ) );
16 }
17
18 SalomeApp_GLSelector::~SalomeApp_GLSelector()
19 {
20 }
21
22 GLViewer_Viewer2d* SalomeApp_GLSelector::viewer() const
23 {
24   return myViewer;
25 }
26
27 void SalomeApp_GLSelector::onSelectionChanged()
28 {
29   selectionChanged();
30 }
31
32 void SalomeApp_GLSelector::getSelection( SUIT_DataOwnerPtrList& aList ) const
33 {
34   if ( !myViewer )
35     return;
36
37   GLViewer_Context* cont = myViewer->getGLContext();
38   if ( !cont )
39     return;
40
41   for ( cont->InitSelected(); cont->MoreSelected(); cont->NextSelected() )
42   {
43     GLViewer_Object* obj = cont->SelectedObject();
44     if ( obj )
45     {
46       SALOME_GLOwner* owner = dynamic_cast< SALOME_GLOwner* >( obj->owner() );
47       if( owner )
48         aList.append( SUIT_DataOwnerPtr( new SalomeApp_DataOwner( owner->entry() ) ) );
49     }
50   }
51 }
52
53 void SalomeApp_GLSelector::setSelection( const SUIT_DataOwnerPtrList& aList )
54 {
55   if ( !myViewer )
56     return;
57
58   GLViewer_Context* cont = myViewer->getGLContext();
59   if ( !cont )
60     return;
61
62   QMap<QString, GLViewer_Object*> aDisplayed;
63   const ObjectMap& displayed = cont->getObjects();
64   for ( ObjectMap::const_iterator it = displayed.begin(); it != displayed.end(); ++it )
65   {
66     if ( it.key()->getVisible() )
67     {
68       GLViewer_Object* obj = it.key();
69       if ( obj )
70       {
71         SALOME_GLOwner* owner = dynamic_cast< SALOME_GLOwner* >( obj->owner() );
72             if ( owner )
73           aDisplayed.insert( owner->entry(), obj );
74       }
75     }
76   }
77
78   int Nb = 0;
79   cont->clearSelected( false );
80   for ( SUIT_DataOwnerPtrList::const_iterator itr = aList.begin(); itr != aList.end(); ++itr )
81   {
82     const SalomeApp_DataOwner* owner = dynamic_cast<const SalomeApp_DataOwner*>( (*itr).operator->() );
83
84     if ( !owner )
85       continue;
86
87     if ( aDisplayed.contains( owner->entry() ) )
88     {
89       cont->setSelected( aDisplayed[owner->entry()], false );
90       Nb++;
91     }
92   }
93
94   if ( Nb > 0 )
95     myViewer->updateAll();
96 }