Salome HOME
Fix for bug 10438: Crash during Explode on Blocks operation (Global selection on...
[modules/gui.git] / src / SVTK / SVTK_RenderWindow.cxx
1 #include "SVTK_RenderWindow.h"
2
3 #include <qcolordialog.h>
4 #include <qpopupmenu.h>
5
6 #include <stdlib.h>
7 #include <math.h>
8
9 #include <vtkRenderWindowInteractor.h>
10 #include <vtkRendererCollection.h>
11 #include <vtkCamera.h>
12 #ifndef WNT
13 #include <vtkXOpenGLRenderWindow.h>
14 //#include <GL/gl.h>
15 //#include <GL/glu.h>
16 //#include <qgl.h>
17 #else
18 #include <vtkRenderWindow.h>
19 #endif
20
21 #if QT_VERSION > 300
22 #include <qcursor.h>
23 #endif
24
25 //==========================================================
26 SVTK_RenderWindow
27 ::SVTK_RenderWindow(QWidget* parent, const char* name) :
28   QWidget(parent, name, 
29           Qt::WStyle_NoBorder | Qt::WDestructiveClose | 
30           Qt::WResizeNoErase | Qt::WRepaintNoErase)
31 {
32   myRW = vtkRenderWindow::New();
33 #ifndef WNT
34   myRW->SetDisplayId((void*)x11Display());
35 #endif
36   myRW->SetWindowId((void*)winId());
37   myRW->DoubleBufferOn();
38   setMouseTracking(true);
39 }
40
41 //==========================================================
42 SVTK_RenderWindow
43 ::~SVTK_RenderWindow() 
44 {
45   myRW->Delete();
46 }
47
48 //==========================================================
49 void
50 SVTK_RenderWindow
51 ::paintEvent(QPaintEvent* theEvent) 
52 {
53   myRW->Render();
54 }
55
56 //==========================================================
57 void
58 SVTK_RenderWindow
59 ::resizeEvent(QResizeEvent* theEvent) 
60 {
61   int aWidth = myRW->GetSize()[0], aHeight = myRW->GetSize()[1];
62   if(vtkRenderWindowInteractor* aRWI = myRW->GetInteractor())
63     aRWI->UpdateSize(width(), height());
64   if(aWidth != width() || aHeight != height()){
65     vtkRendererCollection * aRenderers = myRW->GetRenderers();
66     aRenderers->InitTraversal();
67     double aCoeff = 1.0;
68     if(vtkRenderer *aRenderer = aRenderers->GetNextItem()){
69       vtkCamera *aCamera = aRenderer->GetActiveCamera();
70       double aScale = aCamera->GetParallelScale();
71       if((aWidth - width())*(aHeight - height()) > 0)
72         aCoeff = sqrt(double(aWidth)/double(width())*double(height())/double(aHeight));
73       else
74         aCoeff = double(aWidth)/double(width());
75       aCamera->SetParallelScale(aScale*aCoeff);
76     }
77   }
78 }
79
80 //==========================================================
81 void
82 SVTK_RenderWindow
83 ::mouseMoveEvent(QMouseEvent* event) 
84 {
85   emit MouseMove(event) ;
86 }
87
88 //==========================================================
89 void
90 SVTK_RenderWindow
91 ::mousePressEvent(QMouseEvent* event) 
92 {
93   emit MouseButtonPressed( event );
94 }
95
96 //==========================================================
97 void
98 SVTK_RenderWindow
99 ::mouseReleaseEvent( QMouseEvent *event )
100 {
101   emit MouseButtonReleased( event );
102 }
103
104 //==========================================================
105 void
106 SVTK_RenderWindow::mouseDoubleClickEvent( QMouseEvent* event )
107 {
108   emit MouseDoubleClicked( event );
109 }
110
111 //==========================================================
112 void
113 SVTK_RenderWindow
114 ::keyPressEvent (QKeyEvent* event) 
115 {
116   emit KeyPressed(event) ;
117 }
118
119 //==========================================================
120 void
121 SVTK_RenderWindow
122 ::keyReleaseEvent (QKeyEvent * event) 
123 {
124   emit KeyReleased(event) ;
125 }
126
127 //==========================================================
128 void
129 SVTK_RenderWindow
130 ::wheelEvent(QWheelEvent* event)
131 {
132   emit WheelMoved(event) ;
133 }
134
135 //==========================================================
136 void
137 SVTK_RenderWindow
138 ::onChangeBackgroundColor()
139 {
140   //float red, green, blue;
141   float backint[3];
142
143   vtkRendererCollection * theRenderers = myRW->GetRenderers();
144   theRenderers->InitTraversal();
145   vtkRenderer * theRenderer = theRenderers->GetNextItem();
146   theRenderer->GetBackground(backint);
147
148   QColor selColor = QColorDialog::getColor ( QColor(int(backint[0]*255), int(backint[1]*255), int(backint[2]*255)), NULL );     
149   if ( selColor.isValid() ) {
150     theRenderer->SetBackground( selColor.red()/255., selColor.green()/255., selColor.blue()/255. ); 
151   }
152 }
153
154 //==========================================================
155 void
156 SVTK_RenderWindow
157 ::contextMenuEvent ( QContextMenuEvent * e )
158 {
159   if ( e->reason() != QContextMenuEvent::Mouse )
160     emit contextMenuRequested( e );
161 }