Salome HOME
Initial version
[modules/gui.git] / src / Plot2d / Plot2d_FitDataDlg.cxx
1 //  Copyright (C) 2003  CEA/DEN, EDF R&D
2 //
3 //
4 //
5 //  File   : Plot2d_FitDataDlg.cxx
6 //  Author : Vadim SANDLER
7 //  Module : SALOME
8 //  $Header$
9
10 #include "Plot2d_FitDataDlg.h"
11 #include <qlabel.h>
12 #include <qlayout.h>
13 #include <qvalidator.h>
14
15 #define SPACING_SIZE      6
16 #define MARGIN_SIZE       11
17 #define MIN_EDIT_SIZE     100
18
19 /*!
20   Constructor 
21 */
22 Plot2d_FitDataDlg::Plot2d_FitDataDlg( QWidget* parent, bool secondAxisY )
23      : QDialog( parent ? parent : 0,
24          "Plot2d_FitDataDlg", 
25          true, 
26          WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu ),
27          myY2MinEdit( 0 ), myY2MaxEdit( 0 ), mySecondAxisY( secondAxisY )
28
29 {
30   setCaption( tr( "FIT_DATA_TLT" ) );
31   setSizeGripEnabled( TRUE );
32   QGridLayout* topLayout = new QGridLayout( this ); 
33   topLayout->setSpacing( SPACING_SIZE );
34   topLayout->setMargin( MARGIN_SIZE );
35
36   // 'Range' group
37   myRangeGrp = new QButtonGroup( this );
38   myRangeGrp->setColumnLayout( 0, Qt::Vertical );
39   myRangeGrp->layout()->setSpacing( 0 );
40   myRangeGrp->layout()->setMargin( 0 );
41   QGridLayout* aGridLayout = new QGridLayout( myRangeGrp->layout() );
42   aGridLayout->setAlignment( Qt::AlignTop );
43   aGridLayout->setMargin( MARGIN_SIZE );
44   aGridLayout->setSpacing( SPACING_SIZE );
45
46   myModeAllRB  = new QRadioButton( tr( "FIT_ALL" ),        myRangeGrp );
47   myModeHorRB  = new QRadioButton( tr( "FIT_HORIZONTAL" ), myRangeGrp );
48   myModeVerRB  = new QRadioButton( tr( "FIT_VERTICAL" ),   myRangeGrp );
49
50   QDoubleValidator* aValidator = new QDoubleValidator( this );
51   myXMinEdit = new QLineEdit( myRangeGrp );
52   myXMinEdit->setValidator( aValidator );
53   myXMinEdit->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
54   myXMinEdit->setMinimumSize( MIN_EDIT_SIZE, 0 );
55   myXMinEdit->setText( "0.0" );
56
57   myYMinEdit = new QLineEdit( myRangeGrp );
58   myYMinEdit->setValidator( aValidator );
59   myYMinEdit->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
60   myYMinEdit->setMinimumSize( MIN_EDIT_SIZE, 0 );
61   myYMinEdit->setText( "0.0" );
62
63   myXMaxEdit = new QLineEdit( myRangeGrp );
64   myXMaxEdit->setValidator( aValidator );
65   myXMaxEdit->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
66   myXMaxEdit->setMinimumSize( MIN_EDIT_SIZE, 0 );
67   myXMaxEdit->setText( "0.0" );
68
69   myYMaxEdit = new QLineEdit( myRangeGrp );
70   myYMaxEdit->setValidator( aValidator );
71   myYMaxEdit->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
72   myYMaxEdit->setMinimumSize( MIN_EDIT_SIZE, 0 );
73   myYMaxEdit->setText( "0.0" );
74
75   if (mySecondAxisY) {
76     myY2MinEdit = new QLineEdit( myRangeGrp );
77     myY2MinEdit->setValidator( aValidator );
78     myY2MinEdit->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
79     myY2MinEdit->setMinimumSize( MIN_EDIT_SIZE, 0 );
80     myY2MinEdit->setText( "0.0" );
81
82     myY2MaxEdit = new QLineEdit( myRangeGrp );
83     myY2MaxEdit->setValidator( aValidator );
84     myY2MaxEdit->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
85     myY2MaxEdit->setMinimumSize( MIN_EDIT_SIZE, 0 );
86     myY2MaxEdit->setText( "0.0" );
87   }
88
89   QFrame* aHLine = new QFrame( myRangeGrp );
90   aHLine->setFrameStyle( QFrame::HLine | QFrame::Sunken );
91
92   QHBoxLayout* aModeLayout = new QHBoxLayout;
93   aModeLayout->setMargin( 0 );
94   aModeLayout->setSpacing( SPACING_SIZE );
95   aModeLayout->addWidget( myModeAllRB );
96   aModeLayout->addWidget( myModeHorRB );
97   aModeLayout->addWidget( myModeVerRB );
98
99   QLabel* horLab = new QLabel( tr( "HORIZONTAL_AXIS" ), myRangeGrp );
100   QLabel* verLab = new QLabel( tr( "VERTICAL_AXIS" ), myRangeGrp );
101   if (mySecondAxisY)
102     verLab->setText( tr( "VERTICAL_LEFT_AXIS" ) );
103
104   QFont font = horLab->font(); font.setBold( true );
105   horLab->setFont( font ); verLab->setFont( font );
106
107   aGridLayout->addMultiCellLayout( aModeLayout,    0, 0, 0, 4 );
108   aGridLayout->addMultiCellWidget( aHLine,         1, 1, 0, 4 );
109   aGridLayout->addWidget         ( horLab,         2,    0 );
110   aGridLayout->addWidget         ( new QLabel( tr( "MIN_VALUE_LAB" ), myRangeGrp ), 
111                                                    2,    1 );
112   aGridLayout->addWidget         ( myXMinEdit,     2,    2 );
113   aGridLayout->addWidget         ( new QLabel( tr( "MAX_VALUE_LAB" ), myRangeGrp ), 
114                                                    2,    3 );
115   aGridLayout->addWidget         ( myXMaxEdit,     2,    4 );
116   aGridLayout->addWidget         ( verLab,         3,    0 );
117   aGridLayout->addWidget         ( new QLabel( tr( "MIN_VALUE_LAB" ), myRangeGrp ), 
118                                                    3,    1 );
119   aGridLayout->addWidget         ( myYMinEdit,     3,    2 );
120   aGridLayout->addWidget         ( new QLabel( tr( "MAX_VALUE_LAB" ), myRangeGrp ), 
121                                                    3,    3 );
122   aGridLayout->addWidget         ( myYMaxEdit,     3,    4 );
123
124   if (mySecondAxisY) {
125     QLabel* ver2Lab = new QLabel(tr( "VERTICAL_RIGHT_AXIS" ), myRangeGrp );
126     ver2Lab->setFont( font );
127     aGridLayout->addWidget       ( ver2Lab,        4,    0 );
128     aGridLayout->addWidget       ( new QLabel( tr( "MIN_VALUE_LAB" ), myRangeGrp ), 
129                                                    4,    1 );
130     aGridLayout->addWidget       ( myY2MinEdit,    4,    2 );
131     aGridLayout->addWidget       ( new QLabel( tr( "MAX_VALUE_LAB" ), myRangeGrp ), 
132                                                    4,    3 );
133     aGridLayout->addWidget       ( myY2MaxEdit,    4,    4 );
134   }
135
136   // OK/Cancel buttons
137   myOkBtn = new QPushButton( tr( "BUT_OK" ), this, "buttonOk" );
138   myOkBtn->setAutoDefault( TRUE );
139   myOkBtn->setDefault( TRUE );
140   myCancelBtn = new QPushButton(  tr( "BUT_CANCEL" ), this, "buttonCancel" );
141   myCancelBtn->setAutoDefault( TRUE );
142
143   topLayout->addMultiCellWidget( myRangeGrp, 0, 0, 0, 2 );
144   topLayout->addWidget( myOkBtn, 1, 0 );
145   topLayout->setColStretch( 1, 5 );
146   topLayout->addWidget( myCancelBtn, 1, 2 );
147
148   // connect signals
149   connect( myOkBtn,      SIGNAL( clicked() ),      this, SLOT( accept() ) );
150   connect( myCancelBtn,  SIGNAL( clicked() ),      this, SLOT( reject() ) );
151   connect( myRangeGrp,   SIGNAL( clicked( int ) ), this, SLOT( onModeChanged( int ) ) );
152
153   // initial state
154   myModeAllRB->setChecked( true );
155   onModeChanged( 0 );
156 }
157
158 /*!
159   Sets range
160 */
161 void Plot2d_FitDataDlg::setRange( const double xMin, 
162                                   const double xMax,
163                                   const double yMin,
164                                   const double yMax,
165                                   const double y2Min,
166                                   const double y2Max) 
167 {
168   myXMinEdit->setText( QString::number( xMin ) );
169   myXMaxEdit->setText( QString::number( xMax ) );
170   myYMinEdit->setText( QString::number( yMin ) );
171   myYMaxEdit->setText( QString::number( yMax ) );
172   if (mySecondAxisY) {
173     myY2MinEdit->setText( QString::number( y2Min ) );
174     myY2MaxEdit->setText( QString::number( y2Max ) );
175   }
176 }
177
178 /*!
179   Gets range, returns mode (see getMode())
180 */
181 int Plot2d_FitDataDlg::getRange( double& xMin, 
182                                  double& xMax,
183                                  double& yMin,
184                                  double& yMax,
185                                  double& y2Min,
186                                  double& y2Max) 
187 {
188   xMin = myXMinEdit->text().toDouble();
189   xMax = myXMaxEdit->text().toDouble();
190   yMin = myYMinEdit->text().toDouble();
191   yMax = myYMaxEdit->text().toDouble();
192   if (mySecondAxisY) {
193     y2Min = myY2MinEdit->text().toDouble();
194     y2Max = myY2MaxEdit->text().toDouble();
195   }
196   else {
197     y2Min = 0;
198     y2Max = 0;
199   }
200   int myMode = 0;
201   if ( myModeAllRB->isChecked() )
202     myMode = 0;
203   if ( myModeHorRB->isChecked() )
204     myMode = 1;
205   if ( myModeVerRB->isChecked() )
206     myMode = 2;
207   return myMode;
208 }
209
210 /*!
211   Gets mode : 0 - Fit all; 1 - Fit horizontal, 2 - Fit vertical
212 */
213 int Plot2d_FitDataDlg::getMode() 
214 {
215   int myMode = 0;
216   if ( myModeAllRB->isChecked() )
217     myMode = 0;
218   if ( myModeHorRB->isChecked() )
219     myMode = 1;
220   if ( myModeVerRB->isChecked() )
221     myMode = 2;
222   return myMode;
223 }
224
225 /*!
226   Called when range mode changed
227 */
228 void Plot2d_FitDataDlg::onModeChanged(int mode) 
229 {
230   bool badFocus;
231   switch( mode ) {
232   case 0: // fit all mode
233     myXMinEdit->setEnabled(true);
234     myXMaxEdit->setEnabled(true);
235     myYMinEdit->setEnabled(true);
236     myYMaxEdit->setEnabled(true);
237     if (mySecondAxisY) {
238       myY2MinEdit->setEnabled(true);
239       myY2MaxEdit->setEnabled(true);
240     }
241     break;
242   case 1: // fit horizontal mode
243     badFocus = myYMinEdit->hasFocus() || myYMaxEdit->hasFocus();
244     myXMinEdit->setEnabled(true);
245     myXMaxEdit->setEnabled(true);
246     myYMinEdit->setEnabled(false);
247     myYMaxEdit->setEnabled(false);
248     if (mySecondAxisY) {
249       myY2MinEdit->setEnabled(false);
250       myY2MaxEdit->setEnabled(false);
251     }
252     if (badFocus)
253       myXMinEdit->setFocus();
254     break;
255   case 2: // fit vertical mode
256     badFocus = myXMinEdit->hasFocus() || myXMaxEdit->hasFocus();
257     myXMinEdit->setEnabled(false);
258     myXMaxEdit->setEnabled(false);
259     myYMinEdit->setEnabled(true);
260     myYMaxEdit->setEnabled(true);
261     if (mySecondAxisY) {
262       myY2MinEdit->setEnabled(true);
263       myY2MaxEdit->setEnabled(true);
264     }
265     if (badFocus)
266       myYMinEdit->setFocus();
267     break;
268   }
269 }
270