Salome HOME
refs #1326: waiting cursor is applied for bathymetry operations
[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   qApp->setOverrideCursor( Qt::WaitCursor );
135
136   switch( myMode )
137   {
138   case BathymetryTextId:
139     {
140       foreach( Handle(HYDROGUI_BathymetryPrs) bath, baths )
141         bath->GetShape()->TextLabels( isActivate );
142       break;
143     }
144
145   case BathymetryRescaleSelectionId:
146     {
147       if( isActivate )
148       {
149         foreach( Handle(HYDROGUI_BathymetryPrs) bath, baths )
150           bath->GetShape()->RescaleBySelection();
151         isUpdateCS = true;
152       }
153       commit();
154       break;
155     }
156
157   case BathymetryRescaleVisibleId:
158     {
159       if( isActivate )
160       {
161         foreach( Handle(HYDROGUI_BathymetryPrs) bath, baths )
162           bath->GetShape()->RescaleByVisible( activeViewWindow() );
163         isUpdateCS = true;
164       }
165       commit();
166       break;
167     }
168
169   case BathymetryRescaleUserId:
170     {
171       if( isActivate )
172       {
173         double min=0, max=0, lmin=0, lmax=0;
174         bool first = true;
175         foreach( Handle(HYDROGUI_BathymetryPrs) bath, baths )
176         {
177           bath->GetShape()->GetRange( lmin, lmax );
178           if( first || lmin < min )
179             min = lmin;
180           if( first || lmax > max )
181             max = lmax;
182           first = false;
183         }
184
185         HYDROGUI_BathymetryLimitsDlg dlg( module()->getApp()->desktop() );
186         dlg.SetMinMax( min, max );
187         if( dlg.exec()==QDialog::Accepted )
188         {
189           min = dlg.GetMin();
190           max = dlg.GetMax();
191           foreach( Handle(HYDROGUI_BathymetryPrs) bath, baths )
192             bath->GetShape()->Rescale( min, max );
193
194           isUpdateCS = true;
195           commit();
196         }
197         else
198           abort();
199         break;
200       }
201     }
202
203   case BathymetryRescaleDefaultId:
204     {
205       if( isActivate )
206       {
207         foreach( Handle(HYDROGUI_BathymetryPrs) bath, baths )
208           bath->GetShape()->RescaleDefault();
209         isUpdateCS = true;
210       }
211       commit();
212       break;
213     }
214   }
215
216   if( isUpdateCS )
217     module()->getOCCDisplayer()->UpdateColorScale( getViewer( module() ) );
218
219   qApp->restoreOverrideCursor();
220 }