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