Salome HOME
New item (FontItem), allowing to show information about font setting and to select...
[modules/gui.git] / src / GLViewer / GLViewer_Selector2d.cxx
1 // File:      GLViewer_Selector2d.cxx
2 // Created:   November, 2004
3 // Author:    OCC team
4 // Copyright (C) CEA 2004
5
6 /****************************************************************************
7 **  Class:   GLViewer_Selector2d 
8 **  Descr:   OpenGL Selector 2D
9 **  Module:  GLViewer
10 **  Created: UI team, 20.09.02
11 *****************************************************************************/
12
13 //#include <GLViewerAfx.h>
14 #include "GLViewer_Selector2d.h"
15 #include "GLViewer_Viewer2d.h"
16 #include "GLViewer_Context.h"
17 #include "GLViewer_ViewPort2d.h"
18
19 GLViewer_Selector2d::GLViewer_Selector2d( GLViewer_Viewer2d* v2d, GLViewer_Context* glc ) :
20 GLViewer_Selector( v2d ),
21 myGLContext( glc )
22 {   
23 //  myGLContext->SetHighlightColor( Quantity_NOC_CYAN1 );
24 //  myGLContext->SetSelectionColor( Quantity_NOC_RED );
25 }
26
27 GLViewer_Selector2d::~GLViewer_Selector2d()
28 {
29 }
30
31 void GLViewer_Selector2d::setHilightColor( Quantity_NameOfColor color )
32 {
33   myGLContext->SetHighlightColor( color );
34 }
35
36 void GLViewer_Selector2d::setSelectColor( Quantity_NameOfColor color )
37 {
38   myGLContext->SetSelectionColor( color );
39 }
40
41 void GLViewer_Selector2d::detect( int x, int y )
42 {
43   //cout << "GLViewer_Selector2d    : detect ( " << x << " , " << y << " )" << endl;
44   if ( myLocked || !myGLContext || !myViewer || !myViewer->getActiveView() || 
45        myViewer->getSelectionMode() == GLViewer_Viewer::NoSelection )
46     return;
47
48   GLViewer_ViewPort* vp = myViewer->getActiveView()->getViewPort();
49   if( !vp->inherits( "GLViewer_ViewPort2d" ) )
50     return;
51
52   myGLContext->MoveTo( x, y );
53 }
54
55 void GLViewer_Selector2d::undetectAll()
56 {
57   if ( myLocked || !myGLContext || !myViewer || !myViewer->getActiveView() || 
58        myViewer->getSelectionMode() == GLViewer_Viewer::NoSelection )
59     return;
60
61   GLViewer_ViewPort* vp = myViewer->getActiveView()->getViewPort();
62   if( !vp->inherits( "GLViewer_ViewPort2d" ) )
63     return;
64
65   myGLContext->clearHighlighted();
66 }
67
68 void GLViewer_Selector2d::select( bool append )
69 {
70   //cout << "GLViewer_Selector2d    : select ( " << (int)append << " )" << endl;
71   GLViewer_Viewer::SelectionMode selMode = myViewer->getSelectionMode();
72   if ( myLocked || !myGLContext || !myViewer || !myViewer->getActiveView() ||
73        selMode == GLViewer_Viewer::NoSelection ) 
74     return;
75
76   int selBefore = numSelected();
77   if ( selBefore && append && selMode != GLViewer_Viewer::Multiple )
78     return;    
79
80   GLViewer_ViewPort* vp = myViewer->getActiveView()->getViewPort();
81   if( !vp->inherits( "GLViewer_ViewPort2d" ) )
82       return;
83
84   int status = myGLContext->Select( append );
85   checkSelection( selBefore, append, status );
86 }
87
88 void GLViewer_Selector2d::select( const QRect& selRect, bool append )
89 {
90     GLViewer_Viewer::SelectionMode selMode = myViewer->getSelectionMode();
91     if ( myLocked || !myGLContext || !myViewer || !myViewer->getActiveView() ||
92        selMode == GLViewer_Viewer::NoSelection ) 
93     return;
94
95     int selBefore = numSelected();
96     if ( selBefore && append && selMode != GLViewer_Viewer::Multiple )
97         return;    
98
99     GLViewer_ViewPort* vp = myViewer->getActiveView()->getViewPort();
100     if( !vp->inherits( "GLViewer_ViewPort2d" ) )
101         return;
102
103     int aStatus = myGLContext->SelectByRect( selRect, append );
104     checkSelection( selBefore, append, aStatus );
105 }
106
107 void GLViewer_Selector2d::unselectAll()
108 {
109   if ( myLocked || !myViewer ) 
110     return;
111
112 //  bool updateViewer = true;
113   bool hadSelection = ( numSelected() > 0 );
114      
115 //     bool lcOpen = ( myAISContext->IndexOfCurrentLocal() != -1 );
116 //     lcOpen ? myAISContext->ClearSelected( updateViewer ) :    
117 //              myAISContext->ClearCurrent( updateViewer );     
118   if ( hadSelection ) emit selSelectionCancel();
119 }
120
121 /*  Checks selection state and emits  'selSelectionDone' or 'selSelectionCancel'     
122     Should be called by after non-interactive selection. */
123 void GLViewer_Selector2d::checkSelection( int selBefore, bool append, int aStatus )
124 {
125     int selAfter = numSelected();
126     if ( selBefore > 0 && selAfter < 1 )     
127         emit selSelectionCancel();
128     else if ( selAfter > 0 )
129     {
130         switch( aStatus )
131         {
132         case SS_LocalChanged:
133             emit selSelectionDone( selAfter > 1, SCS_Local );
134             break;
135         case SS_GlobalChanged:
136             emit selSelectionDone( selAfter > 1, SCS_Global );
137             break;
138         }
139     }
140 }
141
142 int GLViewer_Selector2d::numSelected() const
143 {
144   return myGLContext->NbSelected();
145 }
146