Salome HOME
Fix pb with labels of rotation spin boxes (bad update after switch from IJK pane...
[modules/visu.git] / src / VISUGUI / VisuGUI_OffsetDlg.cxx
1
2 #include "VisuGUI_OffsetDlg.h"
3
4 #include "VisuGUI.h"
5 #include "VisuGUI_Tools.h"
6
7 #include "VISU_ViewManager_i.hh"
8 #include "VISU_Actor.h"
9
10 #include "SalomeApp_Application.h"
11 #include "SVTK_ViewWindow.h"
12 #include "SVTK_ViewModel.h"
13 #include "SUIT_Desktop.h"
14
15 #include "QtxDblSpinBox.h"
16
17 // VTK Includes
18 #include "vtkRenderer.h"
19
20 // QT Includes
21 #include <qhbox.h>
22 #include <qlabel.h>
23 #include <qlayout.h>
24 #include <qcheckbox.h>
25 #include <qgroupbox.h>
26 #include <qpushbutton.h>
27
28
29 #define  MAXVAL 1e10
30
31
32 VisuGUI_OffsetDlg::VisuGUI_OffsetDlg (VisuGUI* theModule)
33 : QDialog(VISU::GetDesktop(theModule), 0, false, WStyle_Customize |
34           WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu | WDestructiveClose),
35 myModule(theModule)
36 {
37   myPrsList.setAutoDelete(false);
38
39   setName("VisuGUI_OffsetDlg");
40   setCaption(tr("TIT_OFFSETDLG"));
41   setSizeGripEnabled(TRUE);
42
43   QVBoxLayout* TopLayout = new QVBoxLayout (this);
44   TopLayout->setSpacing(6);
45   TopLayout->setMargin(11);
46
47   QHBox* aOffsetsPane = new QHBox (this);
48   aOffsetsPane->setSpacing(6);
49
50   new QLabel ("dX:", aOffsetsPane);
51   myDxEdt = new QtxDblSpinBox (aOffsetsPane, "myDxEdt");
52   myDxEdt->setRange(-MAXVAL, MAXVAL);
53
54   new QLabel("dY:", aOffsetsPane);
55   myDyEdt = new QtxDblSpinBox (aOffsetsPane, "myDyEdt");
56   myDyEdt->setRange(-MAXVAL, MAXVAL);
57
58   new QLabel("dZ:", aOffsetsPane);
59   myDzEdt = new QtxDblSpinBox (aOffsetsPane, "myDzEdt");
60   myDzEdt->setRange(-MAXVAL, MAXVAL);
61
62   QPushButton* aResetBtn = new QPushButton(tr("BTN_RESET"), aOffsetsPane);
63   connect(aResetBtn, SIGNAL(clicked()), this, SLOT(onReset()));
64
65   TopLayout->addWidget(aOffsetsPane);
66
67   if (!VISU::GetCStudy(VISU::GetAppStudy(theModule))->GetProperties()->IsLocked()) {
68     mySaveChk = new QCheckBox ("Save to presentation", this);
69     TopLayout->addWidget(mySaveChk);
70     mySaveChk->setChecked(true);
71   } else {
72     mySaveChk = 0;
73   }
74
75   // Common buttons ===========================================================
76   QGroupBox* GroupButtons = new QGroupBox(this, "GroupButtons");
77   GroupButtons->setColumnLayout(0, Qt::Vertical);
78   GroupButtons->layout()->setSpacing(0);
79   GroupButtons->layout()->setMargin(0);
80   QGridLayout* GroupButtonsLayout = new QGridLayout(GroupButtons->layout());
81   GroupButtonsLayout->setAlignment(Qt::AlignTop);
82   GroupButtonsLayout->setSpacing(6);
83   GroupButtonsLayout->setMargin(11);
84
85   QPushButton* buttonOk = new QPushButton(tr("&OK"), GroupButtons, "buttonOk");
86   buttonOk->setAutoDefault(TRUE);
87   buttonOk->setDefault(TRUE);
88   GroupButtonsLayout->addWidget(buttonOk, 0, 0);
89   GroupButtonsLayout->addItem(new QSpacerItem(5, 5, QSizePolicy::Expanding, QSizePolicy::Minimum), 0, 1);
90
91   QPushButton* buttonApply = new QPushButton(tr("&Apply"), GroupButtons, "buttonApply");
92   buttonOk->setAutoDefault(TRUE);
93   GroupButtonsLayout->addWidget(buttonApply, 0, 2);
94   GroupButtonsLayout->addItem(new QSpacerItem(5, 5, QSizePolicy::Expanding, QSizePolicy::Minimum), 0, 3);
95
96   QPushButton* buttonCancel = new QPushButton(tr("&Cancel") , GroupButtons, "buttonCancel");
97   buttonCancel->setAutoDefault(TRUE);
98   GroupButtonsLayout->addWidget(buttonCancel, 0, 4);
99
100   TopLayout->addWidget(GroupButtons);
101
102   connect(buttonOk,     SIGNAL(clicked()), this, SLOT(accept()));
103   connect(buttonApply,  SIGNAL(clicked()), this, SLOT(onApply()));
104   connect(buttonCancel, SIGNAL(clicked()), this, SLOT(reject()));
105 }
106
107 void VisuGUI_OffsetDlg::addPresentation (VISU::Prs3d_i* thePrs)
108 {
109   myPrsList.append(thePrs);
110   OffsetStruct aOffs;
111   thePrs->GetOffset(aOffs.myOffset);
112   myOldOffsets.append(aOffs);
113   if (myPrsList.count() == 1) {
114     setOffset(aOffs.myOffset);
115   } else if (myPrsList.count() == 2) {
116     float aOffset[3];
117     aOffset[0] = aOffset[1] = aOffset[2] = 0;
118     setOffset(aOffset);
119   }
120 }
121
122 void VisuGUI_OffsetDlg::setOffset (const float* theOffset)
123 {
124   myDxEdt->setValue(theOffset[0]);
125   myDyEdt->setValue(theOffset[1]);
126   myDzEdt->setValue(theOffset[2]);
127 }
128
129 void VisuGUI_OffsetDlg::getOffset (float* theOffset) const
130 {
131   theOffset[0] = myDxEdt->value();
132   theOffset[1] = myDyEdt->value();
133   theOffset[2] = myDzEdt->value();
134 }
135
136 void VisuGUI_OffsetDlg::onReset()
137 {
138   myDxEdt->setValue(0);
139   myDyEdt->setValue(0);
140   myDzEdt->setValue(0);
141 }
142
143 bool VisuGUI_OffsetDlg::isToSave() const
144 {
145   if (mySaveChk)
146     return mySaveChk->isChecked();
147   else
148     return false;
149 }
150
151 void VisuGUI_OffsetDlg::updateOffset (VISU::Prs3d_i* thePrs, float* theOffset)
152 {
153   if (myPrsList.count() == 0) return;
154
155   if (isToSave()) thePrs->SetOffset(theOffset);
156
157   ViewManagerList aViewManagerList;
158   SalomeApp_Application* anApp = myModule->getApp();
159   anApp->viewManagers(SVTK_Viewer::Type(), aViewManagerList);
160   QPtrListIterator<SUIT_ViewManager> anVMIter (aViewManagerList);
161   for (; anVMIter.current(); ++anVMIter) {
162     SUIT_ViewManager* aViewManager = anVMIter.current();
163     QPtrVector<SUIT_ViewWindow> aViews = aViewManager->getViews();
164     for (int i = 0, iEnd = aViews.size(); i < iEnd; i++) {
165       if (SUIT_ViewWindow* aViewWindow = aViews.at(i)) {
166         if (SVTK_ViewWindow* vw = dynamic_cast<SVTK_ViewWindow*>(aViewWindow)) {
167           vw->onAdjustTrihedron();
168
169           if (VISU_Actor* anActor = VISU::GetActor(thePrs, vw)) {
170             anActor->SetPosition(theOffset);
171             vw->getRenderer()->ResetCameraClippingRange();
172             vw->Repaint();
173
174             Handle(SALOME_InteractiveObject) anIO;
175             CORBA::Object_var anObject = VISU::GetSelectedObj(myModule, &anIO);
176             if (!CORBA::is_nil(anObject))
177               vw->highlight(anIO, 1);
178           }
179         }
180       }
181     }
182   }
183 }
184
185 void VisuGUI_OffsetDlg::accept()
186 {
187   float aOffset[3];
188   getOffset(aOffset);
189   for (int i = 0; i < myPrsList.count(); i++) {
190     updateOffset(myPrsList.at(i), aOffset);
191   }
192   QDialog::accept();
193 }
194
195 void VisuGUI_OffsetDlg::reject()
196 {
197   for (int i = 0; i < myPrsList.count(); i++) {
198     updateOffset(myPrsList.at(i), myOldOffsets[i].myOffset);
199   }
200   QDialog::reject();
201 }
202
203 void VisuGUI_OffsetDlg::onApply()
204 {
205   float aOffset[3];
206   getOffset(aOffset);
207   for (int i = 0; i < myPrsList.count(); i++) {
208     updateOffset(myPrsList.at(i), aOffset);
209   }
210 }