]> SALOME platform Git repositories - modules/gui.git/blob - src/Plot2d/Plot2d_FitDataDlg.cxx
Salome HOME
500c4c658ff23a08d4cdeb03737c989f74d2594e
[modules/gui.git] / src / Plot2d / Plot2d_FitDataDlg.cxx
1 //  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
6 //  This library is free software; you can redistribute it and/or
7 //  modify it under the terms of the GNU Lesser General Public
8 //  License as published by the Free Software Foundation; either
9 //  version 2.1 of the License.
10 //
11 //  This library is distributed in the hope that it will be useful,
12 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 //  Lesser General Public License for more details.
15 //
16 //  You should have received a copy of the GNU Lesser General Public
17 //  License along with this library; if not, write to the Free Software
18 //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
19 //
20 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22 // File   : Plot2d_FitDataDlg.cxx
23 // Author : Vadim SANDLER, Open CASCADE S.A.S. (vadim.sandler@opencascade.com)
24 //
25 #include "Plot2d_FitDataDlg.h"
26 #include <QLabel>
27 #include <QLayout>
28 #include <QValidator>
29 #include <QPushButton>
30 #include <QRadioButton>
31 #include <QGroupBox>
32 #include <QLineEdit>
33
34 #define SPACING_SIZE      6
35 #define MARGIN_SIZE       11
36 #define MIN_EDIT_SIZE     100
37
38 /*!
39   Constructor 
40 */
41 Plot2d_FitDataDlg::Plot2d_FitDataDlg( QWidget* parent, bool secondAxisY )
42      : QDialog( parent ? parent : 0,
43          Qt::WindowTitleHint | Qt::WindowSystemMenuHint ),
44        myY2MinEdit( 0 ), myY2MaxEdit( 0 ), mySecondAxisY( secondAxisY )
45
46 {
47   setObjectName( "Plot2d_FitDataDlg" );
48   setModal( true );
49   setWindowTitle( tr( "FIT_DATA_TLT" ) );
50   setSizeGripEnabled( TRUE );
51   QGridLayout* topLayout = new QGridLayout( this ); 
52   topLayout->setSpacing( SPACING_SIZE );
53   topLayout->setMargin( MARGIN_SIZE );
54
55   // 'Range' group
56   myRangeGrp = new QGroupBox( this );
57   QGridLayout* aGridLayout = new QGridLayout( myRangeGrp );
58   myRangeGrp->setLayout( aGridLayout );
59   aGridLayout->setAlignment( Qt::AlignTop );
60   aGridLayout->setMargin( MARGIN_SIZE );
61   aGridLayout->setSpacing( SPACING_SIZE );
62
63   myModeAllRB  = new QRadioButton( tr( "FIT_ALL" ),        myRangeGrp );
64   myModeHorRB  = new QRadioButton( tr( "FIT_HORIZONTAL" ), myRangeGrp );
65   myModeVerRB  = new QRadioButton( tr( "FIT_VERTICAL" ),   myRangeGrp );
66
67   QDoubleValidator* aValidator = new QDoubleValidator( this );
68   myXMinEdit = new QLineEdit( myRangeGrp );
69   myXMinEdit->setValidator( aValidator );
70   myXMinEdit->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
71   myXMinEdit->setMinimumSize( MIN_EDIT_SIZE, 0 );
72   myXMinEdit->setText( "0.0" );
73
74   myYMinEdit = new QLineEdit( myRangeGrp );
75   myYMinEdit->setValidator( aValidator );
76   myYMinEdit->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
77   myYMinEdit->setMinimumSize( MIN_EDIT_SIZE, 0 );
78   myYMinEdit->setText( "0.0" );
79
80   myXMaxEdit = new QLineEdit( myRangeGrp );
81   myXMaxEdit->setValidator( aValidator );
82   myXMaxEdit->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
83   myXMaxEdit->setMinimumSize( MIN_EDIT_SIZE, 0 );
84   myXMaxEdit->setText( "0.0" );
85
86   myYMaxEdit = new QLineEdit( myRangeGrp );
87   myYMaxEdit->setValidator( aValidator );
88   myYMaxEdit->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
89   myYMaxEdit->setMinimumSize( MIN_EDIT_SIZE, 0 );
90   myYMaxEdit->setText( "0.0" );
91
92   if (mySecondAxisY) {
93     myY2MinEdit = new QLineEdit( myRangeGrp );
94     myY2MinEdit->setValidator( aValidator );
95     myY2MinEdit->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
96     myY2MinEdit->setMinimumSize( MIN_EDIT_SIZE, 0 );
97     myY2MinEdit->setText( "0.0" );
98
99     myY2MaxEdit = new QLineEdit( myRangeGrp );
100     myY2MaxEdit->setValidator( aValidator );
101     myY2MaxEdit->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
102     myY2MaxEdit->setMinimumSize( MIN_EDIT_SIZE, 0 );
103     myY2MaxEdit->setText( "0.0" );
104   }
105
106   QFrame* aHLine = new QFrame( myRangeGrp );
107   aHLine->setFrameStyle( QFrame::HLine | QFrame::Sunken );
108
109   QHBoxLayout* aModeLayout = new QHBoxLayout;
110   aModeLayout->setMargin( 0 );
111   aModeLayout->setSpacing( SPACING_SIZE );
112   aModeLayout->addWidget( myModeAllRB );
113   aModeLayout->addWidget( myModeHorRB );
114   aModeLayout->addWidget( myModeVerRB );
115
116   QLabel* horLab = new QLabel( tr( "HORIZONTAL_AXIS" ), myRangeGrp );
117   QLabel* verLab = new QLabel( tr( "VERTICAL_AXIS" ), myRangeGrp );
118   if (mySecondAxisY)
119     verLab->setText( tr( "VERTICAL_LEFT_AXIS" ) );
120
121   QFont font = horLab->font(); font.setBold( true );
122   horLab->setFont( font ); verLab->setFont( font );
123
124   aGridLayout->addLayout( aModeLayout,    0, 0, 1, 5 );
125   aGridLayout->addWidget( aHLine,         1, 0, 1, 5 );
126   aGridLayout->addWidget( horLab,         2,    0 );
127   aGridLayout->addWidget( new QLabel( tr( "MIN_VALUE_LAB" ), myRangeGrp ), 
128                                           2,    1 );
129   aGridLayout->addWidget( myXMinEdit,     2,    2 );
130   aGridLayout->addWidget( new QLabel( tr( "MAX_VALUE_LAB" ), myRangeGrp ), 
131                                           2,    3 );
132   aGridLayout->addWidget( myXMaxEdit,     2,    4 );
133   aGridLayout->addWidget( verLab,         3,    0 );
134   aGridLayout->addWidget( new QLabel( tr( "MIN_VALUE_LAB" ), myRangeGrp ), 
135                                           3,    1 );
136   aGridLayout->addWidget( myYMinEdit,     3,    2 );
137   aGridLayout->addWidget( new QLabel( tr( "MAX_VALUE_LAB" ), myRangeGrp ), 
138                                           3,    3 );
139   aGridLayout->addWidget( myYMaxEdit,     3,    4 );
140
141   if (mySecondAxisY) {
142     QLabel* ver2Lab = new QLabel(tr( "VERTICAL_RIGHT_AXIS" ), myRangeGrp );
143     ver2Lab->setFont( font );
144     aGridLayout->addWidget( ver2Lab,        4,    0 );
145     aGridLayout->addWidget( new QLabel( tr( "MIN_VALUE_LAB" ), myRangeGrp ), 
146                                             4,    1 );
147     aGridLayout->addWidget( myY2MinEdit,    4,    2 );
148     aGridLayout->addWidget( new QLabel( tr( "MAX_VALUE_LAB" ), myRangeGrp ), 
149                                             4,    3 );
150     aGridLayout->addWidget( myY2MaxEdit,    4,    4 );
151   }
152
153   // OK/Cancel buttons
154   myOkBtn = new QPushButton( tr( "BUT_OK" ), this );
155   myOkBtn->setObjectName( "buttonOk" );
156   myOkBtn->setAutoDefault( TRUE );
157   myOkBtn->setDefault( TRUE );
158   myCancelBtn = new QPushButton(  tr( "BUT_CANCEL" ), this );
159   myCancelBtn->setObjectName( "buttonCancel" );
160   myCancelBtn->setAutoDefault( TRUE );
161
162   topLayout->addWidget( myRangeGrp, 0, 0, 1, 3 );
163   topLayout->addWidget( myOkBtn, 1, 0 );
164   topLayout->setColumnStretch( 1, 5 );
165   topLayout->addWidget( myCancelBtn, 1, 2 );
166
167   // connect signals
168   connect( myOkBtn,      SIGNAL( clicked() ),      this, SLOT( accept() ) );
169   connect( myCancelBtn,  SIGNAL( clicked() ),      this, SLOT( reject() ) );
170   connect( myRangeGrp,   SIGNAL( clicked( int ) ), this, SLOT( onModeChanged( int ) ) );
171
172   // initial state
173   myModeAllRB->setChecked( true );
174   onModeChanged( 0 );
175 }
176
177 /*!
178   Sets range
179 */
180 void Plot2d_FitDataDlg::setRange( const double xMin, 
181                                   const double xMax,
182                                   const double yMin,
183                                   const double yMax,
184                                   const double y2Min,
185                                   const double y2Max) 
186 {
187   myXMinEdit->setText( QString::number( xMin ) );
188   myXMaxEdit->setText( QString::number( xMax ) );
189   myYMinEdit->setText( QString::number( yMin ) );
190   myYMaxEdit->setText( QString::number( yMax ) );
191   if (mySecondAxisY) {
192     myY2MinEdit->setText( QString::number( y2Min ) );
193     myY2MaxEdit->setText( QString::number( y2Max ) );
194   }
195 }
196
197 /*!
198   Gets range, returns mode (see getMode())
199 */
200 int Plot2d_FitDataDlg::getRange( double& xMin, 
201                                  double& xMax,
202                                  double& yMin,
203                                  double& yMax,
204                                  double& y2Min,
205                                  double& y2Max) 
206 {
207   xMin = myXMinEdit->text().toDouble();
208   xMax = myXMaxEdit->text().toDouble();
209   yMin = myYMinEdit->text().toDouble();
210   yMax = myYMaxEdit->text().toDouble();
211   if (mySecondAxisY) {
212     y2Min = myY2MinEdit->text().toDouble();
213     y2Max = myY2MaxEdit->text().toDouble();
214   }
215   else {
216     y2Min = 0;
217     y2Max = 0;
218   }
219   int myMode = 0;
220   if ( myModeAllRB->isChecked() )
221     myMode = 0;
222   if ( myModeHorRB->isChecked() )
223     myMode = 1;
224   if ( myModeVerRB->isChecked() )
225     myMode = 2;
226   return myMode;
227 }
228
229 /*!
230   Gets mode : 0 - Fit all; 1 - Fit horizontal, 2 - Fit vertical
231 */
232 int Plot2d_FitDataDlg::getMode() 
233 {
234   int myMode = 0;
235   if ( myModeAllRB->isChecked() )
236     myMode = 0;
237   if ( myModeHorRB->isChecked() )
238     myMode = 1;
239   if ( myModeVerRB->isChecked() )
240     myMode = 2;
241   return myMode;
242 }
243
244 /*!
245   Called when range mode changed
246 */
247 void Plot2d_FitDataDlg::onModeChanged(int mode) 
248 {
249   bool badFocus;
250   switch( mode ) {
251   case 0: // fit all mode
252     myXMinEdit->setEnabled(true);
253     myXMaxEdit->setEnabled(true);
254     myYMinEdit->setEnabled(true);
255     myYMaxEdit->setEnabled(true);
256     if (mySecondAxisY) {
257       myY2MinEdit->setEnabled(true);
258       myY2MaxEdit->setEnabled(true);
259     }
260     break;
261   case 1: // fit horizontal mode
262     badFocus = myYMinEdit->hasFocus() || myYMaxEdit->hasFocus();
263     myXMinEdit->setEnabled(true);
264     myXMaxEdit->setEnabled(true);
265     myYMinEdit->setEnabled(false);
266     myYMaxEdit->setEnabled(false);
267     if (mySecondAxisY) {
268       myY2MinEdit->setEnabled(false);
269       myY2MaxEdit->setEnabled(false);
270     }
271     if (badFocus)
272       myXMinEdit->setFocus();
273     break;
274   case 2: // fit vertical mode
275     badFocus = myXMinEdit->hasFocus() || myXMaxEdit->hasFocus();
276     myXMinEdit->setEnabled(false);
277     myXMaxEdit->setEnabled(false);
278     myYMinEdit->setEnabled(true);
279     myYMaxEdit->setEnabled(true);
280     if (mySecondAxisY) {
281       myY2MinEdit->setEnabled(true);
282       myY2MaxEdit->setEnabled(true);
283     }
284     if (badFocus)
285       myYMinEdit->setFocus();
286     break;
287   }
288 }
289