Salome HOME
refs #1340 part.2
[modules/hydro.git] / src / HYDROGUI / HYDROGUI_BathymetryOp.cxx
1 // Copyright (C) 2014-2015  EDF-R&D
2 // This library is free software; you can redistribute it and/or
3 // modify it under the terms of the GNU Lesser General Public
4 // License as published by the Free Software Foundation; either
5 // version 2.1 of the License, or (at your option) any later version.
6 //
7 // This library is distributed in the hope that it will be useful,
8 // but WITHOUT ANY WARRANTY; without even the implied warranty of
9 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
10 // Lesser General Public License for more details.
11 //
12 // You should have received a copy of the GNU Lesser General Public
13 // License along with this library; if not, write to the Free Software
14 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
15 //
16 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
17 //See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19
20 #include <HYDROGUI_BathymetryOp.h>
21 #include <HYDROGUI_Operations.h>
22 #include <HYDROGUI_BathymetryPrs.h>
23 #include <HYDROGUI_ShapeBathymetry.h>
24 #include <HYDROGUI_Module.h>
25 #include <HYDROGUI_OCCDisplayer.h>
26 #include <LightApp_Application.h>
27 #include <OCCViewer_ViewManager.h>
28 #include <OCCViewer_ViewWindow.h>
29 #include <QtxDoubleSpinBox.h>
30 #include <SUIT_Desktop.h>
31 #include <QLayout>
32 #include <QPushButton>
33 #include <QApplication>
34
35 HYDROGUI_BathymetryLimitsDlg::HYDROGUI_BathymetryLimitsDlg( QWidget* theParent )
36   : QDialog( theParent )
37 {
38   QGridLayout* layout = new QGridLayout();
39   setLayout( layout );
40
41   layout->addWidget( new QLabel( tr( "Min value" ) ), 0, 0 );
42   layout->addWidget( new QLabel( tr( "Max value" ) ), 1, 0 );
43
44   myMin = new QtxDoubleSpinBox( this );
45   myMin->setRange( -1000, 1000 );
46   myMax = new QtxDoubleSpinBox( this );
47   myMax->setRange( -1000, 1000 );
48
49   layout->addWidget( myMin, 0, 1 );
50   layout->addWidget( myMax, 1, 1 );
51
52   QFrame* aBtnFrame = new QFrame( this );
53   QHBoxLayout* aBtnLayout = new QHBoxLayout( aBtnFrame );
54   layout->addWidget( aBtnFrame, 2, 0, 1, 2 );
55
56   QPushButton* ok = new QPushButton( tr( "OK" ), this );
57   QPushButton* cancel = new QPushButton( tr( "Cancel" ), this );
58   aBtnLayout->addWidget( ok );
59   aBtnLayout->addWidget( cancel );
60
61   connect( ok, SIGNAL( clicked() ), this, SLOT( accept() ) );
62   connect( cancel, SIGNAL( clicked() ), this, SLOT( reject() ) );
63 }
64
65 HYDROGUI_BathymetryLimitsDlg::~HYDROGUI_BathymetryLimitsDlg()
66 {
67 }
68
69 double HYDROGUI_BathymetryLimitsDlg::GetMin() const
70 {
71   return myMin->value();
72 }
73
74 double HYDROGUI_BathymetryLimitsDlg::GetMax() const
75 {
76   return myMax->value();
77 }
78
79 void HYDROGUI_BathymetryLimitsDlg::SetMinMax( double theMin, double theMax )
80 {
81   myMin->setValue( theMin );
82   myMax->setValue( theMax );
83 }
84
85
86
87
88
89 HYDROGUI_BathymetryOp::HYDROGUI_BathymetryOp( HYDROGUI_Module* theModule, int theMode )
90 : HYDROGUI_Operation( theModule ), myMode( theMode ), myIsActivate( false )
91 {
92 }
93
94 HYDROGUI_BathymetryOp::~HYDROGUI_BathymetryOp()
95 {
96 }
97
98 OCCViewer_Viewer* getViewer( HYDROGUI_Module* theModule );
99 Handle(AIS_InteractiveContext) getContext( HYDROGUI_Module* theModule );
100 QList<Handle(HYDROGUI_BathymetryPrs)> getShownBathymetries( HYDROGUI_Module* theModule );
101
102 void HYDROGUI_BathymetryOp::startOperation()
103 {
104   activate( true );
105 }
106
107 void HYDROGUI_BathymetryOp::commitOperation()
108 {
109   activate( false );
110 }
111
112 void HYDROGUI_BathymetryOp::abortOperation()
113 {
114   activate( false );
115 }
116
117 OCCViewer_ViewWindow* HYDROGUI_BathymetryOp::activeViewWindow() const
118 {
119   LightApp_Application* app = module()->getApp();
120   OCCViewer_ViewManager* mgr = dynamic_cast<OCCViewer_ViewManager*>
121     ( app->getViewManager( OCCViewer_Viewer::Type(), true ) );
122   return dynamic_cast<OCCViewer_ViewWindow*>( mgr->getActiveView() );
123 }
124
125 void HYDROGUI_BathymetryOp::activate( bool isActivate )
126 {
127   if( myIsActivate==isActivate )
128     return;
129
130   myIsActivate = isActivate;
131   QList<Handle(HYDROGUI_BathymetryPrs)> baths = getShownBathymetries( module() );
132   bool isUpdateCS = false;
133
134   if( myMode!=BathymetryRescaleUserId )
135     qApp->setOverrideCursor( Qt::WaitCursor );
136
137   switch( myMode )
138   {
139   case BathymetryTextId:
140     {
141       foreach( Handle(HYDROGUI_BathymetryPrs) bath, baths )
142         bath->GetShape()->TextLabels( isActivate );
143       break;
144     }
145
146   case BathymetryRescaleSelectionId:
147     {
148       if( isActivate )
149       {
150         foreach( Handle(HYDROGUI_BathymetryPrs) bath, baths )
151           bath->GetShape()->RescaleBySelection();
152         isUpdateCS = true;
153       }
154       commit();
155       break;
156     }
157
158   case BathymetryRescaleVisibleId:
159     {
160       if( isActivate )
161       {
162         foreach( Handle(HYDROGUI_BathymetryPrs) bath, baths )
163           bath->GetShape()->RescaleByVisible( activeViewWindow() );
164         isUpdateCS = true;
165       }
166       commit();
167       break;
168     }
169
170   case BathymetryRescaleUserId:
171     {
172       if( isActivate )
173       {
174         double min=0, max=0, lmin=0, lmax=0;
175         bool first = true;
176         foreach( Handle(HYDROGUI_BathymetryPrs) bath, baths )
177         {
178           bath->GetShape()->GetRange( lmin, lmax );
179           if( first || lmin < min )
180             min = lmin;
181           if( first || lmax > max )
182             max = lmax;
183           first = false;
184         }
185
186         HYDROGUI_BathymetryLimitsDlg dlg( module()->getApp()->desktop() );
187         dlg.SetMinMax( min, max );
188         if( dlg.exec()==QDialog::Accepted )
189         {
190           qApp->setOverrideCursor( Qt::WaitCursor );
191
192           min = dlg.GetMin();
193           max = dlg.GetMax();
194           foreach( Handle(HYDROGUI_BathymetryPrs) bath, baths )
195             bath->GetShape()->Rescale( min, max );
196
197           isUpdateCS = true;
198           commit();
199         }
200         else
201           abort();
202         break;
203       }
204     }
205
206   case BathymetryRescaleDefaultId:
207     {
208       if( isActivate )
209       {
210         foreach( Handle(HYDROGUI_BathymetryPrs) bath, baths )
211           bath->GetShape()->RescaleDefault();
212         isUpdateCS = true;
213       }
214       commit();
215       break;
216     }
217   }
218
219   if( isUpdateCS )
220     module()->getOCCDisplayer()->UpdateColorScale( getViewer( module() ) );
221
222   qApp->restoreOverrideCursor();
223 }