Salome HOME
Fix for Bug IPAL8945
[modules/visu.git] / src / VVTK / VVTK_PickingDlg.cxx
1 //  VISU VISUGUI : GUI of VISU component
2 //
3 //  Copyright (C) 2003  CEA/DEN, EDF R&D
4 //
5 //
6 //
7 //  File   : VVTK_PickingDlg.cxx
8 //  Author : Oleg Uvarov
9 //  Module : VISU
10
11 #include "VVTK_PickingDlg.h"
12
13 #include "VISU_GaussPtsAct.h"
14 #include "VISU_GaussPtsSettings.h"
15
16 #include "SUIT_ResourceMgr.h"
17 #include "SUIT_Session.h"
18
19 #include "SVTK_RenderWindowInteractor.h"
20
21 #include <vtkActorCollection.h>
22 #include <vtkCallbackCommand.h>
23 #include <vtkObjectFactory.h>
24 #include <vtkRenderer.h>
25 #include <vtkGenericRenderWindowInteractor.h>
26 #include <vtkSmartPointer.h>
27
28 #include "utilities.h"
29
30 #include <qcheckbox.h>
31 #include <qcolordialog.h>
32 #include <qcombobox.h>
33 #include <qgroupbox.h>
34 #include <qlabel.h>
35 #include <qlayout.h>
36 #include <qpushbutton.h>
37 #include <qvbox.h>
38
39 #include "QtxAction.h"
40 #include "QtxDblSpinBox.h"
41 #include "QtxIntSpinBox.h"
42
43 using namespace std;
44
45 VVTK_PickingDlg::VVTK_PickingDlg( QWidget* parent, const char* name )
46   :QDialog( parent, name, false, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu ),
47    myEventCallbackCommand( vtkCallbackCommand::New() ),
48    myPickingSettings( VISU_PickingSettings::New() )
49 {
50   myPriority = 0.0;
51   myEventCallbackCommand->Delete();
52   myEventCallbackCommand->SetClientData(this); 
53   myEventCallbackCommand->SetCallback(VVTK_PickingDlg::ProcessEvents);
54
55   SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
56
57   setCaption( tr( "PICKING_DLG_TITLE" ) );
58   setSizeGripEnabled(TRUE);
59
60   QVBoxLayout* TopLayout = new QVBoxLayout( this );
61   TopLayout->setSpacing(6);
62   TopLayout->setMargin(11);
63
64   QVBox* aBox = new QVBox( this );
65   aBox->setMargin(0);
66   aBox->setSpacing(6);
67
68   // Cursor
69   QGroupBox* CursorGroup = new QGroupBox( tr( "CURSOR_TITLE" ), aBox, "CursorGroup" );
70   CursorGroup->setColumnLayout(0, Qt::Vertical );
71   CursorGroup->layout()->setSpacing( 0 );
72   CursorGroup->layout()->setMargin( 0 );
73
74   QGridLayout* CursorGroupLayout = new QGridLayout (CursorGroup->layout());
75   CursorGroupLayout->setAlignment(Qt::AlignTop | Qt::AlignCenter);
76   CursorGroupLayout->setSpacing(6);
77   CursorGroupLayout->setMargin(11);
78
79   QLabel* CursorSizeLabel = new QLabel( tr( "CURSOR_SIZE" ), CursorGroup );
80   myCursorSizeSpinBox = new QtxDblSpinBox( 0, 1, 0.1, CursorGroup );
81   myCursorSizeSpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
82
83   QLabel* PyramidHeightLabel = new QLabel( tr( "PYRAMID_HEIGHT" ), CursorGroup );
84   double aHeightMin=1.e-7;
85   double aHeightMax=10.;
86   double aHeightStep=0.1;
87   myPyramidHeightSpinBox = new QtxDblSpinBox(aHeightMin, aHeightMax, aHeightStep, CursorGroup );
88   myPyramidHeightSpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
89   
90   QLabel* SelectionColorLabel = new QLabel( tr( "SELECTION_COLOR" ), CursorGroup );
91   mySelectionColorButton = new QPushButton( CursorGroup );
92   mySelectionColorButton->setPaletteBackgroundColor( Qt::blue );
93   mySelectionColorButton->setPaletteForegroundColor( Qt::blue );
94   connect( mySelectionColorButton, SIGNAL( clicked() ), this, SLOT( onColorButtonPressed() ) );
95
96   CursorGroupLayout->addWidget( CursorSizeLabel, 0, 0 );
97   CursorGroupLayout->addWidget( myCursorSizeSpinBox, 0, 1 );
98   CursorGroupLayout->addWidget( PyramidHeightLabel, 1, 0 );
99   CursorGroupLayout->addWidget( myPyramidHeightSpinBox, 1, 1 );
100   CursorGroupLayout->addWidget( SelectionColorLabel, 2, 0 );
101   CursorGroupLayout->addWidget( mySelectionColorButton, 2, 1 );
102
103   // Tolerance
104   QGroupBox* ToleranceGroup = new QGroupBox( tr( "TOLERANCE_TITLE" ), aBox, "ToleranceGroup" );
105   ToleranceGroup->setColumnLayout(0, Qt::Vertical );
106   ToleranceGroup->layout()->setSpacing( 0 );
107   ToleranceGroup->layout()->setMargin( 0 );
108
109   QGridLayout* ToleranceGroupLayout = new QGridLayout (ToleranceGroup->layout());
110   ToleranceGroupLayout->setAlignment(Qt::AlignTop | Qt::AlignCenter);
111   ToleranceGroupLayout->setSpacing(6);
112   ToleranceGroupLayout->setMargin(11);
113
114   QLabel* PointToleranceLabel = new QLabel( tr( "POINT_TOLERANCE" ), ToleranceGroup );
115   myPointToleranceSpinBox = new QtxDblSpinBox( 0.001, 10.0, 0.01, ToleranceGroup );
116   myPointToleranceSpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
117
118   ToleranceGroupLayout->addWidget( PointToleranceLabel, 0, 0 );
119   ToleranceGroupLayout->addWidget( myPointToleranceSpinBox, 0, 1 );
120
121   // Information window
122   QGroupBox* InfoWindowGroup = new QGroupBox( tr( "INFO_WINDOW_TITLE" ), aBox, "InfoWindowGroup" );
123   InfoWindowGroup->setColumnLayout(0, Qt::Vertical );
124   InfoWindowGroup->layout()->setSpacing( 0 );
125   InfoWindowGroup->layout()->setMargin( 0 );
126
127   QGridLayout* InfoWindowGroupLayout = new QGridLayout (InfoWindowGroup->layout());
128   InfoWindowGroupLayout->setAlignment(Qt::AlignTop | Qt::AlignCenter);
129   InfoWindowGroupLayout->setSpacing(6);
130   InfoWindowGroupLayout->setMargin(11);
131
132   QLabel* TransparencyLabel = new QLabel( tr( "TRANSPARENCY" ), InfoWindowGroup );
133   myTransparencySpinBox = new QtxIntSpinBox( 0, 100, 10, InfoWindowGroup );
134   myTransparencySpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
135
136   InfoWindowGroupLayout->addWidget( TransparencyLabel, 0, 0 );
137   InfoWindowGroupLayout->addWidget( myTransparencySpinBox, 0, 1 );
138
139   QLabel* PositionLabel = new QLabel( tr( "POSITION" ), InfoWindowGroup );
140   myPositionComboBox = new QComboBox( InfoWindowGroup );
141   myPositionComboBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
142
143   myPositionComboBox->insertItem( tr( "BELOW_POINT" ) );
144   myPositionComboBox->insertItem( tr( "TOP_LEFT_CORNER" ) );
145
146   InfoWindowGroupLayout->addWidget( TransparencyLabel, 0, 0 );
147   InfoWindowGroupLayout->addWidget( myTransparencySpinBox, 0, 1 );
148   InfoWindowGroupLayout->addWidget( PositionLabel, 1, 0 );
149   InfoWindowGroupLayout->addWidget( myPositionComboBox, 1, 1 );
150
151   // Movement of the camera
152   QGroupBox* CameraGroup = new QGroupBox( tr( "CAMERA_TITLE" ), aBox, "CameraGroup" );
153   CameraGroup->setColumnLayout(0, Qt::Vertical );
154   CameraGroup->layout()->setSpacing( 0 );
155   CameraGroup->layout()->setMargin( 0 );
156
157   QGridLayout* CameraGroupLayout = new QGridLayout (CameraGroup->layout());
158   CameraGroupLayout->setAlignment(Qt::AlignTop | Qt::AlignCenter);
159   CameraGroupLayout->setSpacing(6);
160   CameraGroupLayout->setMargin(11);
161
162   QLabel* ZoomFactorLabel = new QLabel( tr( "ZOOM_FACTOR" ), CameraGroup );
163   myZoomFactorSpinBox = new QtxDblSpinBox( 0.1, 10.0, 0.1, CameraGroup );
164   myZoomFactorSpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
165
166   QLabel* StepNumberLabel = new QLabel( tr( "STEP_NUMBER" ), CameraGroup );
167   myStepNumberSpinBox = new QtxIntSpinBox( 1, 100, 1, CameraGroup );
168   myStepNumberSpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
169
170   CameraGroupLayout->addWidget( ZoomFactorLabel, 0, 0 );
171   CameraGroupLayout->addWidget( myZoomFactorSpinBox, 0, 1 );
172   CameraGroupLayout->addWidget( StepNumberLabel, 1, 0 );
173   CameraGroupLayout->addWidget( myStepNumberSpinBox, 1, 1 );
174
175   // Display parent mesh element
176   QGroupBox* ParentMeshGroup = new QGroupBox( tr( "PARENT_MESH_TITLE" ), aBox, "ParentMeshGroup" );
177   ParentMeshGroup->setColumnLayout(0, Qt::Vertical );
178   ParentMeshGroup->layout()->setSpacing( 0 );
179   ParentMeshGroup->layout()->setMargin( 0 );
180
181   QGridLayout* ParentMeshGroupLayout = new QGridLayout (ParentMeshGroup->layout());
182   ParentMeshGroupLayout->setAlignment(Qt::AlignTop | Qt::AlignLeft);
183   ParentMeshGroupLayout->setSpacing(6);
184   ParentMeshGroupLayout->setMargin(11);
185
186   myDisplayParentMeshCheckBox = new QCheckBox( tr( "DISPLAY_PARENT_MESH" ), ParentMeshGroup );
187   ParentMeshGroupLayout->addWidget( myDisplayParentMeshCheckBox, 0, 0 );
188
189   // Common buttons ===========================================================
190   QGroupBox* GroupButtons = new QGroupBox( this, "GroupButtons" );
191   GroupButtons->setColumnLayout(0, Qt::Vertical );
192   GroupButtons->layout()->setSpacing( 0 );
193   GroupButtons->layout()->setMargin( 0 );
194   QGridLayout* GroupButtonsLayout = new QGridLayout( GroupButtons->layout() );
195   GroupButtonsLayout->setAlignment( Qt::AlignTop );
196   GroupButtonsLayout->setSpacing( 6 );
197   GroupButtonsLayout->setMargin( 11 );
198
199   QPushButton* buttonApply = new QPushButton( tr( "&Apply" ), GroupButtons, "buttonApply" );
200   buttonApply->setAutoDefault( TRUE );
201   buttonApply->setDefault( TRUE );
202   GroupButtonsLayout->addWidget( buttonApply, 0, 0 );
203   GroupButtonsLayout->addItem( new QSpacerItem( 5, 5, QSizePolicy::Expanding, QSizePolicy::Minimum ), 0, 1 );
204
205   QPushButton* buttonClose = new QPushButton( tr( "&Close" ) , GroupButtons, "buttonClose" );
206   buttonClose->setAutoDefault( TRUE );
207   GroupButtonsLayout->addWidget( buttonClose, 0, 2 );
208
209   TopLayout->addWidget( aBox );
210   TopLayout->addWidget( GroupButtons );
211
212   connect( buttonApply, SIGNAL( clicked() ), this, SLOT( onClickApply() ) );
213   connect( buttonClose, SIGNAL( clicked() ), this, SLOT( onClickClose() ) );
214 }
215
216 VVTK_PickingDlg::~VVTK_PickingDlg()
217 {
218 }
219
220 void VVTK_PickingDlg::AddActor( VISU_GaussPtsAct* theActor )
221 {
222   theActor->SetPickingSettings( myPickingSettings.GetPointer() );
223 }
224
225 void VVTK_PickingDlg::RemoveActor( VISU_GaussPtsAct* theActor )
226 {
227   theActor->SetPickingSettings( NULL );
228 }
229
230 void VVTK_PickingDlg::Update()
231 {
232   float aCursorSize = 0.5;
233   float aPyramidHeight = 10.0;
234   float aPointTolerance = 0.1;
235   QColor aColor = Qt::yellow;
236   int anInfoWindowTransparency = 50;
237   int anInfoWindowPosition = VISU_PickingSettings::BelowPoint;
238   float aZoomFactor = 1.5;
239   int aStepNumber = 10;
240   bool aDisplayParentMesh = false;
241
242   if( !myPickingSettings->GetInitial() )
243   {
244     myCursorSizeSpinBox->setValue( myPickingSettings->GetCursorSize() );
245     myPyramidHeightSpinBox->setValue( myPickingSettings->GetPyramidHeight() );
246     myPointToleranceSpinBox->setValue( myPickingSettings->GetPointTolerance() );
247     myTransparencySpinBox->setValue( int(myPickingSettings->GetInfoWindowTransparency() * 100.0) );
248     myPositionComboBox->setCurrentItem( myPickingSettings->GetInfoWindowPosition() );
249     myZoomFactorSpinBox->setValue( myPickingSettings->GetZoomFactor() );
250     myStepNumberSpinBox->setValue( myPickingSettings->GetStepNumber() );
251     myDisplayParentMeshCheckBox->setChecked( myPickingSettings->GetDisplayParentMesh() );
252
253     float* aColor = myPickingSettings->GetColor();
254     mySelectionColorButton->setPaletteBackgroundColor( QColor( ( int )( aColor[0] * 255.0 ),
255                                                                ( int )( aColor[1] * 255.0 ),
256                                                                ( int )( aColor[2] * 255.0 ) ) );
257
258     return;
259   }
260
261   SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
262
263   aCursorSize = aResourceMgr->doubleValue( "VISU", "picking_cursor_size", aCursorSize );
264   myCursorSizeSpinBox->setValue( aCursorSize );
265
266   aPyramidHeight = aResourceMgr->doubleValue( "VISU", "picking_pyramid_height", aPyramidHeight );
267   myPyramidHeightSpinBox->setValue( aPyramidHeight );
268
269   aPointTolerance = aResourceMgr->doubleValue( "VISU", "picking_point_tolerance", aPointTolerance );
270   myPointToleranceSpinBox->setValue( aPointTolerance );
271
272   aColor = aResourceMgr->colorValue( "VISU", "picking_selection_color", aColor );
273   mySelectionColorButton->setPaletteBackgroundColor( aColor );
274
275   anInfoWindowTransparency = aResourceMgr->integerValue( "VISU", "picking_transparency", anInfoWindowTransparency );
276   myTransparencySpinBox->setValue( anInfoWindowTransparency );
277
278   anInfoWindowPosition = aResourceMgr->integerValue( "VISU", "picking_position", anInfoWindowPosition );
279   myPositionComboBox->setCurrentItem( anInfoWindowPosition );
280
281   aZoomFactor = aResourceMgr->doubleValue( "VISU", "picking_zoom_factor", aZoomFactor );
282   myZoomFactorSpinBox->setValue( aZoomFactor );
283
284   aStepNumber = aResourceMgr->integerValue( "VISU", "picking_step_number", aStepNumber );
285   myStepNumberSpinBox->setValue( aStepNumber );
286
287   aDisplayParentMesh = aResourceMgr->booleanValue( "VISU", "picking_display_parent_mesh", aDisplayParentMesh );
288   myDisplayParentMeshCheckBox->setChecked( aDisplayParentMesh );
289
290   onClickApply();
291 }
292
293
294 VISU_PickingSettings* 
295 VVTK_PickingDlg
296 ::GetPickingSettings()
297 {
298   return myPickingSettings.GetPointer();
299 }
300
301 void VVTK_PickingDlg::SetInteractor( SVTK_RenderWindowInteractor* theInteractor )
302 {
303   myInteractor = theInteractor;
304
305   theInteractor->GetDevice()->AddObserver(vtkCommand::KeyPressEvent, 
306                                           myEventCallbackCommand.GetPointer(), 
307                                           myPriority);
308 }
309
310
311 void VVTK_PickingDlg::ProcessEvents(vtkObject* vtkNotUsed(theObject), 
312                                     unsigned long theEvent,
313                                     void* theClientData, 
314                                     void* vtkNotUsed(theCallData))
315 {
316   VVTK_PickingDlg* self = reinterpret_cast<VVTK_PickingDlg*>(theClientData);
317
318   switch(theEvent){
319   case vtkCommand::KeyPressEvent:
320     self->KeyPressed();
321     break;
322   }
323 }
324
325 void VVTK_PickingDlg::KeyPressed()
326 {
327   if( myInteractor->GetDevice()->GetKeyCode() == 'P' )
328   {
329     bool aDisplayParentMesh = !myPickingSettings->GetDisplayParentMesh();
330     myPickingSettings->SetDisplayParentMesh( aDisplayParentMesh );
331
332     myDisplayParentMeshCheckBox->setChecked( aDisplayParentMesh );
333
334     myPickingSettings->InvokeEvent(VISU::UpdatePickingSettingsEvent,NULL);
335   }
336 }
337
338 void VVTK_PickingDlg::onClickApply()
339 {
340   myPickingSettings->SetInitial( false );
341
342   myPickingSettings->SetCursorSize( myCursorSizeSpinBox->value() );
343   myPickingSettings->SetPyramidHeight( myPyramidHeightSpinBox->value() );
344   myPickingSettings->SetPointTolerance( myPointToleranceSpinBox->value() );
345   myPickingSettings->SetInfoWindowTransparency( myTransparencySpinBox->value() / 100.0 );
346   myPickingSettings->SetInfoWindowPosition( myPositionComboBox->currentItem() );
347   myPickingSettings->SetZoomFactor( myZoomFactorSpinBox->value() );
348   myPickingSettings->SetStepNumber( myStepNumberSpinBox->value() );
349   myPickingSettings->SetDisplayParentMesh( myDisplayParentMeshCheckBox->isChecked() );
350
351   QColor aButtonColor = mySelectionColorButton->paletteBackgroundColor();
352   float aColor[3];
353   aColor[0] = aButtonColor.red() / 255.0;
354   aColor[1] = aButtonColor.green() / 255.0;
355   aColor[2] = aButtonColor.blue() / 255.0;
356   myPickingSettings->SetColor( aColor );
357
358   myPickingSettings->InvokeEvent(VISU::UpdatePickingSettingsEvent,NULL);
359 }
360
361 void VVTK_PickingDlg::onClickClose()
362 {
363   myAction->setOn( false );
364   reject();
365 }
366
367 void VVTK_PickingDlg::done( int r )
368 {
369   myAction->setOn( false );
370   QDialog::done( r );
371 }
372
373 void VVTK_PickingDlg::onColorButtonPressed()
374 {
375   QColor aColor = QColorDialog::getColor( mySelectionColorButton->paletteBackgroundColor(), this );
376   if( aColor.isValid() )
377     mySelectionColorButton->setPaletteBackgroundColor( aColor );
378 }