Salome HOME
Merge from V6_3_BR 15/07/2011
[modules/visu.git] / src / VISUGUI / VisuGUI_SelectionPrefDlg.cxx
1 // Copyright (C) 2007-2011  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License.
7 //
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 // Lesser General Public License for more details.
12 //
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19
20 //  File   : VisuGUI_SelectionPrefDlg.cxx
21 //  Author : Oleg UVAROV
22 //  Module : SALOME
23 //
24 #include "VisuGUI_SelectionPrefDlg.h"
25 #include "VisuGUI.h"
26 #include "VisuGUI_Tools.h"
27
28 #include "VISU_PickingSettings.h"
29
30 #include <SUIT_Session.h>
31 #include <SUIT_Application.h>
32 #include <SUIT_Desktop.h>
33 #include <SUIT_Tools.h>
34 #include <SUIT_MessageBox.h>
35 #include <SUIT_ResourceMgr.h>
36
37 #include <LightApp_Application.h>
38
39 #include <SalomeApp_IntSpinBox.h>
40 #include <SalomeApp_DoubleSpinBox.h>
41
42 #include <QtxColorButton.h>
43
44 #include <QComboBox>
45 #include <QGroupBox>
46 #include <QKeyEvent>
47 #include <QLabel>
48 #include <QLayout>
49 #include <QLineEdit>
50 #include <QPushButton>
51
52 /*!
53   Constructor
54 */
55 VisuGUI_SelectionPrefDlg::VisuGUI_SelectionPrefDlg( QWidget* parent )
56     : QDialog( parent ? parent : SUIT_Session::session()->activeApplication()->desktop(), 
57                Qt::WindowTitleHint | Qt::WindowSystemMenuHint )
58 {
59   setWindowTitle( tr("TLT_SELECTION_PREFERENCES") );
60   setSizeGripEnabled( TRUE );
61   setModal( true );
62
63   QVBoxLayout* topLayout = new QVBoxLayout( this );
64   topLayout->setMargin( 11 ); topLayout->setSpacing( 6 );
65
66   // Cursor (gauss points)
67   QGroupBox* CursorGroup = new QGroupBox( tr( "CURSOR_TITLE" ), this );
68   QGridLayout* CursorGroupLayout = new QGridLayout (CursorGroup);
69   CursorGroupLayout->setAlignment(Qt::AlignTop | Qt::AlignCenter);
70   CursorGroupLayout->setSpacing(6);
71   CursorGroupLayout->setMargin(11);
72
73   QLabel* CursorSizeLabel = new QLabel( tr( "CURSOR_SIZE" ), CursorGroup );
74   myCursorSizeSpinBox = new SalomeApp_DoubleSpinBox( CursorGroup );
75   VISU::initSpinBox( myCursorSizeSpinBox, 0, 1, 0.1, "parametric_precision" );
76   myCursorSizeSpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
77
78   QLabel* PyramidHeightLabel = new QLabel( tr( "PYRAMID_HEIGHT" ), CursorGroup );
79   double aHeightMin=1.e-7;
80   double aHeightMax=10.;
81   double aHeightStep=0.1;
82   myPyramidHeightSpinBox = new SalomeApp_DoubleSpinBox(CursorGroup );
83   VISU::initSpinBox( myPyramidHeightSpinBox, aHeightMin, aHeightMax, aHeightStep, "length_precision" );  
84   myPyramidHeightSpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
85   
86   QLabel* SelectionColorLabel = new QLabel( tr( "SELECTION_COLOR" ), CursorGroup );
87   mySelectionColorButton = new QtxColorButton( CursorGroup );
88   mySelectionColorButton->setColor( Qt::blue );
89
90   CursorGroupLayout->addWidget( CursorSizeLabel, 0, 0 );
91   CursorGroupLayout->addWidget( myCursorSizeSpinBox, 0, 1 );
92   CursorGroupLayout->addWidget( PyramidHeightLabel, 1, 0 );
93   CursorGroupLayout->addWidget( myPyramidHeightSpinBox, 1, 1 );
94   CursorGroupLayout->addWidget( SelectionColorLabel, 2, 0 );
95   CursorGroupLayout->addWidget( mySelectionColorButton, 2, 1 );
96
97   topLayout->addWidget( CursorGroup );
98
99   // Tolerance (gauss points)
100   QGroupBox* ToleranceGroup = new QGroupBox( tr( "TOLERANCE_TITLE" ), this );
101   QGridLayout* ToleranceGroupLayout = new QGridLayout (ToleranceGroup);
102   ToleranceGroupLayout->setAlignment(Qt::AlignTop | Qt::AlignCenter);
103   ToleranceGroupLayout->setSpacing(6);
104   ToleranceGroupLayout->setMargin(11);
105
106   QLabel* PointToleranceLabel = new QLabel( tr( "POINT_TOLERANCE" ), ToleranceGroup );
107   myPointToleranceSpinBox = new SalomeApp_DoubleSpinBox(ToleranceGroup );
108   VISU::initSpinBox( myPointToleranceSpinBox, 0.001, 10.0, 0.01, "len_tol_precision" );  
109   myPointToleranceSpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
110
111   ToleranceGroupLayout->addWidget( PointToleranceLabel, 0, 0 );
112   ToleranceGroupLayout->addWidget( myPointToleranceSpinBox, 0, 1 );
113
114   topLayout->addWidget( ToleranceGroup );
115
116   // Information window
117   myInfoWindowGroup = new QGroupBox( tr( "INFO_WINDOW_TITLE" ), this );
118   myInfoWindowGroup->setCheckable( true );
119
120   QGridLayout* InfoWindowGroupLayout = new QGridLayout (myInfoWindowGroup);
121   InfoWindowGroupLayout->setAlignment(Qt::AlignTop | Qt::AlignCenter);
122
123   QLabel* TransparencyLabel = new QLabel( tr( "TRANSPARENCY" ), myInfoWindowGroup );
124   myTransparencySpinBox = new SalomeApp_IntSpinBox( 0, 100, 10, myInfoWindowGroup );
125   myTransparencySpinBox->setAcceptNames( false );
126   myTransparencySpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
127
128   InfoWindowGroupLayout->addWidget( TransparencyLabel, 0, 0 );
129   InfoWindowGroupLayout->addWidget( myTransparencySpinBox, 0, 1 );
130
131   QLabel* PositionLabel = new QLabel( tr( "POSITION" ), myInfoWindowGroup );
132   myPositionComboBox = new QComboBox( myInfoWindowGroup );
133   myPositionComboBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
134
135   myPositionComboBox->addItem( tr( "BELOW_POINT" ) );
136   myPositionComboBox->addItem( tr( "TOP_LEFT_CORNER" ) );
137
138   InfoWindowGroupLayout->addWidget( TransparencyLabel, 0, 0 );
139   InfoWindowGroupLayout->addWidget( myTransparencySpinBox, 0, 1 );
140   InfoWindowGroupLayout->addWidget( PositionLabel, 1, 0 );
141   InfoWindowGroupLayout->addWidget( myPositionComboBox, 1, 1 );
142
143   topLayout->addWidget( myInfoWindowGroup );
144
145   // Movement of the camera
146   myCameraGroup = new QGroupBox( tr( "CAMERA_TITLE" ), this );
147   myCameraGroup->setCheckable( true );
148
149   QGridLayout* CameraGroupLayout = new QGridLayout (myCameraGroup);
150   CameraGroupLayout->setAlignment(Qt::AlignTop | Qt::AlignCenter);
151
152   QLabel* ZoomFactorLabel = new QLabel( tr( "ZOOM_FACTOR" ), myCameraGroup );
153   myZoomFactorSpinBox = new SalomeApp_DoubleSpinBox( myCameraGroup );
154   VISU::initSpinBox( myZoomFactorSpinBox, 0.1, 10.0, 0.1, "parametric_precision" );
155   myZoomFactorSpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
156
157   QLabel* StepNumberLabel = new QLabel( tr( "STEP_NUMBER" ), myCameraGroup );
158   StepNumberLabel->setToolTip( tr( "STEP_NUMBER_TIP" ) );
159   myStepNumberSpinBox = new SalomeApp_IntSpinBox( 1, 100, 1, myCameraGroup );
160   myStepNumberSpinBox->setAcceptNames( false );
161   myStepNumberSpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
162
163   CameraGroupLayout->addWidget( ZoomFactorLabel, 0, 0 );
164   CameraGroupLayout->addWidget( myZoomFactorSpinBox, 0, 1 );
165   CameraGroupLayout->addWidget( StepNumberLabel, 1, 0 );
166   CameraGroupLayout->addWidget( myStepNumberSpinBox, 1, 1 );
167
168   topLayout->addWidget( myCameraGroup );
169
170   // Common buttons
171   QGroupBox* GroupButtons = new QGroupBox( this );
172   QHBoxLayout* GroupButtonsLayout = new QHBoxLayout( GroupButtons );
173   GroupButtonsLayout->setAlignment( Qt::AlignTop );
174   GroupButtonsLayout->setMargin( 11 ); GroupButtonsLayout->setSpacing( 6 );
175   
176   myButtonOk = new QPushButton( GroupButtons );
177   myButtonOk->setText( tr( "BUT_OK"  ) );
178   myButtonOk->setAutoDefault( TRUE ); myButtonOk->setDefault( TRUE );
179   GroupButtonsLayout->addWidget( myButtonOk );
180
181   myButtonApply = new QPushButton( GroupButtons );
182   myButtonApply->setText( tr( "BUT_APPLY"  ) );
183   myButtonApply->setAutoDefault( TRUE );
184   GroupButtonsLayout->addWidget( myButtonApply );
185
186   GroupButtonsLayout->addStretch();
187   
188   myButtonCancel = new QPushButton( GroupButtons );
189   myButtonCancel->setText( tr( "BUT_CANCEL"  ) );
190   myButtonCancel->setAutoDefault( TRUE );
191   GroupButtonsLayout->addWidget( myButtonCancel );
192
193   myButtonHelp = new QPushButton( GroupButtons );
194   myButtonHelp->setText( tr( "BUT_HELP"  ) );
195   myButtonHelp->setAutoDefault( TRUE );
196   GroupButtonsLayout->addWidget( myButtonHelp );
197   /***************************************************************/
198   
199   //topLayout->addWidget( GroupC1 );
200   topLayout->addWidget( GroupButtons );
201   
202   // signals and slots connections
203   connect( myButtonOk,     SIGNAL( clicked() ), this, SLOT( accept() ) );
204   connect( myButtonApply,  SIGNAL( clicked() ), this, SLOT( onApply() ) );
205   connect( myButtonCancel, SIGNAL( clicked() ), this, SLOT( reject() ) );
206   connect( myButtonHelp,   SIGNAL( clicked() ), this, SLOT( onHelp() ) );
207   
208   /* Move widget on the botton right corner of main widget */
209   SUIT_Tools::centerWidget( this, parent );
210 }
211
212 /*!
213   Destructor
214 */
215 VisuGUI_SelectionPrefDlg::~VisuGUI_SelectionPrefDlg()
216 {
217 }
218
219 void VisuGUI_SelectionPrefDlg::update()
220 {
221   VISU_PickingSettings* aPickingSettings = VISU_PickingSettings::Get();
222
223   myCursorSizeSpinBox->setValue( aPickingSettings->GetCursorSize() );
224   myPyramidHeightSpinBox->setValue( aPickingSettings->GetPyramidHeight() );
225   myPointToleranceSpinBox->setValue( aPickingSettings->GetPointTolerance() );
226
227   vtkFloatingPointType* aColor = aPickingSettings->GetColor();
228   mySelectionColorButton->setColor( QColor( ( int )( aColor[0] * 255.0 ),
229                                             ( int )( aColor[1] * 255.0 ),
230                                             ( int )( aColor[2] * 255.0 ) ) );
231
232   myInfoWindowGroup->setChecked( aPickingSettings->GetInfoWindowEnabled() );
233   // VSR 28.06.2011 : IPAL 22513: add 0.5 to eliminate any prevision problems
234   vtkFloatingPointType transparency = aPickingSettings->GetInfoWindowTransparency() * 100.0 + 0.5;
235   myTransparencySpinBox->setValue( (int) transparency );
236   myPositionComboBox->setCurrentIndex( aPickingSettings->GetInfoWindowPosition() );
237   myCameraGroup->setChecked( aPickingSettings->GetCameraMovementEnabled() );
238   myZoomFactorSpinBox->setValue( aPickingSettings->GetZoomFactor() );
239   myStepNumberSpinBox->setValue( aPickingSettings->GetStepNumber() );
240 }
241
242 void VisuGUI_SelectionPrefDlg::accept()
243 {
244   onApply();
245
246   QDialog::accept();
247 }
248
249 void VisuGUI_SelectionPrefDlg::onApply()
250 {
251   VISU_PickingSettings* aPickingSettings = VISU_PickingSettings::Get();
252
253   aPickingSettings->SetCursorSize( myCursorSizeSpinBox->value() );
254   aPickingSettings->SetPyramidHeight( myPyramidHeightSpinBox->value() );
255   aPickingSettings->SetPointTolerance( myPointToleranceSpinBox->value() );
256
257   QColor aButtonColor = mySelectionColorButton->color();
258   vtkFloatingPointType aColor[3];
259   aColor[0] = aButtonColor.red() / 255.0;
260   aColor[1] = aButtonColor.green() / 255.0;
261   aColor[2] = aButtonColor.blue() / 255.0;
262   aPickingSettings->SetColor( aColor );
263
264   aPickingSettings->SetInfoWindowEnabled( myInfoWindowGroup->isChecked() );
265   aPickingSettings->SetInfoWindowTransparency( myTransparencySpinBox->value() / 100.0 );
266   aPickingSettings->SetInfoWindowPosition( myPositionComboBox->currentIndex() );
267   aPickingSettings->SetCameraMovementEnabled( myCameraGroup->isChecked() );
268   aPickingSettings->SetZoomFactor( myZoomFactorSpinBox->value() );
269   aPickingSettings->SetStepNumber( myStepNumberSpinBox->value() );
270
271   aPickingSettings->InvokeEvent( VISU::UpdatePickingSettingsEvent,NULL );
272 }
273
274 void VisuGUI_SelectionPrefDlg::onHelp()
275 {
276   QString aHelpFileName = "selection_preferences_page.html";
277   LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());
278   if (app) {
279     VisuGUI* aVisuGUI = dynamic_cast<VisuGUI*>( app->activeModule() );
280     app->onHelpContextModule(aVisuGUI ? app->moduleName(aVisuGUI->moduleName()) : QString(""), aHelpFileName);
281   }
282   else {
283     QString platform;
284 #ifdef WIN32
285     platform = "winapplication";
286 #else
287     platform = "application";
288 #endif
289     SUIT_MessageBox::warning(0, QObject::tr("WRN_WARNING"),
290                              QObject::tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
291                              arg(app->resourceMgr()->stringValue("ExternalBrowser", platform)).arg(aHelpFileName) );
292   }
293 }
294
295 void VisuGUI_SelectionPrefDlg::keyPressEvent( QKeyEvent* e )
296 {
297   QDialog::keyPressEvent( e );
298   if ( e->isAccepted() )
299     return;
300
301   if ( e->key() == Qt::Key_F1 )
302     {
303       e->accept();
304       onHelp();
305     }
306 }