Salome HOME
Update version number: 3.1.0a2
[modules/smesh.git] / src / SMESHGUI / SMESHGUI_EditMeshDlg.cxx
1
2 #include "SMESHGUI_EditMeshDlg.h"
3
4 #include "SMESHGUI.h"
5 #include "SMESHGUI_Utils.h"
6 #include "SMESHGUI_VTKUtils.h"
7
8 #include "SMESH_TypeFilter.hxx"
9
10 #include "SUIT_Desktop.h"
11 #include "SUIT_Session.h"
12
13 #include "SALOME_ListIO.hxx"
14
15 #include "utilities.h"
16
17 // QT Includes
18 #include <qapplication.h>
19 #include <qbuttongroup.h>
20 #include <qgroupbox.h>
21 #include <qlabel.h>
22 #include <qlineedit.h>
23 #include <qpushbutton.h>
24 #include <qradiobutton.h>
25 #include <qlayout.h>
26 #include <qpixmap.h>
27
28 //=================================================================================
29 // class    : SMESHGUI_EditMeshDlg()
30 // purpose  :
31 //=================================================================================
32 SMESHGUI_EditMeshDlg::SMESHGUI_EditMeshDlg (SMESHGUI* theModule,
33                                             const char* title, const char* icon,
34                                             int theAction)
35   : QDialog(SMESH::GetDesktop(theModule), "SMESHGUI_EditMeshDlg", false, WStyle_Customize |
36             WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu | Qt::WDestructiveClose),
37     mySMESHGUI(theModule),
38     mySelectionMgr(SMESH::GetSelectionMgr(theModule)),
39     myAction(theAction)
40 {
41   resize(303, 185);
42   setCaption(tr(title));
43
44   SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
45   QPixmap image0 (aResMgr->loadPixmap("SMESH", tr(icon)));
46   QPixmap image1 (aResMgr->loadPixmap("SMESH", tr("ICON_SELECT")));
47
48   setSizeGripEnabled(TRUE);
49   DlgLayout = new QGridLayout (this);
50   DlgLayout->setSpacing(6);
51   DlgLayout->setMargin(11);
52
53   /***************************************************************/
54   GroupConstructors = new QButtonGroup (this, "GroupConstructors");
55   GroupConstructors->setExclusive(TRUE);
56   GroupConstructors->setColumnLayout(0, Qt::Vertical);
57   GroupConstructors->layout()->setSpacing(0);
58   GroupConstructors->layout()->setMargin(0);
59   GroupConstructorsLayout = new QGridLayout (GroupConstructors->layout());
60   GroupConstructorsLayout->setAlignment(Qt::AlignTop);
61   GroupConstructorsLayout->setSpacing(6);
62   GroupConstructorsLayout->setMargin(11);
63   Constructor1 = new QRadioButton (GroupConstructors, "Constructor1");
64   Constructor1->setText(tr(""));
65   Constructor1->setPixmap(image0);
66   Constructor1->setChecked(TRUE);
67   Constructor1->setSizePolicy(QSizePolicy((QSizePolicy::SizeType)1,
68                                           (QSizePolicy::SizeType)0,
69                                           Constructor1->sizePolicy().hasHeightForWidth()));
70   Constructor1->setMinimumSize(QSize(50, 0));
71   GroupConstructorsLayout->addWidget(Constructor1, 0, 0);
72   QSpacerItem* spacer = new QSpacerItem (20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
73   GroupConstructorsLayout->addItem(spacer, 0, 1);
74   DlgLayout->addWidget(GroupConstructors, 0, 0);
75
76   /***************************************************************/
77   GroupButtons = new QGroupBox (this, "GroupButtons");
78   GroupButtons->setGeometry(QRect(10, 10, 281, 48));
79   GroupButtons->setTitle(tr("" ));
80   GroupButtons->setColumnLayout(0, Qt::Vertical);
81   GroupButtons->layout()->setSpacing(0);
82   GroupButtons->layout()->setMargin(0);
83   GroupButtonsLayout = new QGridLayout (GroupButtons->layout());
84   GroupButtonsLayout->setAlignment(Qt::AlignTop);
85   GroupButtonsLayout->setSpacing(6);
86   GroupButtonsLayout->setMargin(11);
87   buttonCancel = new QPushButton (GroupButtons, "buttonCancel");
88   buttonCancel->setText(tr("SMESH_BUT_CLOSE" ));
89   buttonCancel->setAutoDefault(TRUE);
90   GroupButtonsLayout->addWidget(buttonCancel, 0, 3);
91   buttonApply = new QPushButton (GroupButtons, "buttonApply");
92   buttonApply->setText(tr("SMESH_BUT_APPLY" ));
93   buttonApply->setAutoDefault(TRUE);
94   GroupButtonsLayout->addWidget(buttonApply, 0, 1);
95   QSpacerItem* spacer_9 = new QSpacerItem (20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
96   GroupButtonsLayout->addItem(spacer_9, 0, 2);
97   buttonOk = new QPushButton (GroupButtons, "buttonOk");
98   buttonOk->setText(tr("SMESH_BUT_OK" ));
99   buttonOk->setAutoDefault(TRUE);
100   buttonOk->setDefault(TRUE);
101   GroupButtonsLayout->addWidget(buttonOk, 0, 0);
102   DlgLayout->addWidget(GroupButtons, 2, 0);
103
104   /***************************************************************/
105   GroupMesh = new QGroupBox (this, "GroupMesh");
106   GroupMesh->setTitle(tr("SMESH_MESH" ));
107   GroupMesh->setMinimumSize(QSize(0, 0));
108   GroupMesh->setFrameShape(QGroupBox::Box);
109   GroupMesh->setFrameShadow(QGroupBox::Sunken);
110   GroupMesh->setColumnLayout(0, Qt::Vertical);
111   GroupMesh->layout()->setSpacing(0);
112   GroupMesh->layout()->setMargin(0);
113   GroupMeshLayout = new QGridLayout (GroupMesh->layout());
114   GroupMeshLayout->setAlignment(Qt::AlignTop);
115   GroupMeshLayout->setSpacing(6);
116   GroupMeshLayout->setMargin(11);
117   TextLabelMesh = new QLabel (GroupMesh, "TextLabelMesh");
118   TextLabelMesh->setText(tr("SMESH_MESH"));
119   TextLabelMesh->setMinimumSize(QSize(50, 0));
120   TextLabelMesh->setFrameShape(QLabel::NoFrame);
121   TextLabelMesh->setFrameShadow(QLabel::Plain);
122   GroupMeshLayout->addWidget(TextLabelMesh, 0, 0);
123   SelectButton = new QPushButton (GroupMesh, "SelectButton");
124   SelectButton->setText(tr(""));
125   SelectButton->setPixmap(image1);
126   SelectButton->setToggleButton(FALSE);
127   GroupMeshLayout->addWidget(SelectButton, 0, 1);
128   LineEditMesh = new QLineEdit (GroupMesh, "LineEditMesh");
129   LineEditMesh->setReadOnly(true);
130   GroupMeshLayout->addWidget(LineEditMesh, 0, 2);
131   DlgLayout->addWidget(GroupMesh, 1, 0);
132
133   Init(); // Initialisations
134 }
135
136 //=================================================================================
137 // function : ~SMESHGUI_EditMeshDlg()
138 // purpose  : Destroys the object and frees any allocated resources
139 //=================================================================================
140 SMESHGUI_EditMeshDlg::~SMESHGUI_EditMeshDlg()
141 {
142   // no need to delete child widgets, Qt does it all for us
143 }
144
145 //=================================================================================
146 // function : Init()
147 // purpose  :
148 //=================================================================================
149 void SMESHGUI_EditMeshDlg::Init()
150 {
151   GroupMesh->show();
152   mySMESHGUI->SetActiveDialogBox((QDialog*)this);
153
154   myMesh = SMESH::SMESH_Mesh::_nil();
155
156   myMeshFilter = new SMESH_TypeFilter (MESH);
157
158   // signals and slots connections
159   connect(buttonOk    , SIGNAL(clicked()), this, SLOT(ClickOnOk()));
160   connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel()));
161   connect(buttonApply , SIGNAL(clicked()), this, SLOT(ClickOnApply()));
162
163   connect(SelectButton, SIGNAL(clicked()), this, SLOT(SelectionIntoArgument()));
164
165   connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
166
167   connect(mySMESHGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog()));
168   connect(mySMESHGUI, SIGNAL(SignalCloseAllDialogs())       , this, SLOT(ClickOnCancel()));
169
170   // Move widget on the bottom right corner of main widget
171   int x, y;
172   mySMESHGUI->DefineDlgPosition(this, x, y);
173   this->move(x, y);
174   this->show(); // displays Dialog
175
176   LineEditMesh->setFocus();
177   mySelectionMgr->clearFilters();
178   mySelectionMgr->installFilter(myMeshFilter);
179
180   SelectionIntoArgument();
181 }
182
183 //=================================================================================
184 // function : ClickOnApply()
185 // purpose  :
186 //=================================================================================
187 void SMESHGUI_EditMeshDlg::ClickOnApply()
188 {
189   if (!myMesh->_is_nil()) {
190     try {
191       QApplication::setOverrideCursor(Qt::waitCursor);
192
193       if (myAction == 1) {
194         SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor();
195         aMeshEditor->MergeEqualElements();
196       }
197
198       QApplication::restoreOverrideCursor();
199     } catch(...) {
200     }
201
202     mySelectionMgr->clearSelected();
203     SMESH::UpdateView();
204   }
205 }
206
207 //=================================================================================
208 // function : ClickOnOk()
209 // purpose  :
210 //=================================================================================
211 void SMESHGUI_EditMeshDlg::ClickOnOk()
212 {
213   ClickOnApply();
214   ClickOnCancel();
215 }
216
217 //=================================================================================
218 // function : ClickOnCancel()
219 // purpose  :
220 //=================================================================================
221 void SMESHGUI_EditMeshDlg::ClickOnCancel()
222 {
223   mySelectionMgr->clearSelected();
224   mySelectionMgr->clearFilters();
225   disconnect(mySelectionMgr, 0, this, 0);
226   mySMESHGUI->ResetState();
227   reject();
228 }
229
230 //=================================================================================
231 // function : SelectionIntoArgument()
232 // purpose  : Called when selection as changed or other case
233 //=================================================================================
234 void SMESHGUI_EditMeshDlg::SelectionIntoArgument()
235 {
236   if (!GroupButtons->isEnabled()) // inactive
237     return;
238
239   QString aString = "";
240
241   SALOME_ListIO aList;
242   mySelectionMgr->selectedObjects(aList);
243   int nbSel = SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aString);
244
245   // mesh
246   if (nbSel != 1) {
247     myMesh = SMESH::SMESH_Mesh::_nil();
248     aString = "";
249   } else {
250     Handle(SALOME_InteractiveObject) IO = aList.First();
251     myMesh = SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(IO);
252     if (myMesh->_is_nil())
253       aString = "";
254   }
255
256   LineEditMesh->setText(aString);
257
258   bool isEnabled = (!myMesh->_is_nil());
259   buttonOk->setEnabled(isEnabled);
260   buttonApply->setEnabled(isEnabled);
261 }
262
263 //=================================================================================
264 // function : DeactivateActiveDialog()
265 // purpose  :
266 //=================================================================================
267 void SMESHGUI_EditMeshDlg::DeactivateActiveDialog()
268 {
269   if (GroupConstructors->isEnabled()) {
270     GroupConstructors->setEnabled(false);
271     GroupMesh->setEnabled(false);
272     GroupButtons->setEnabled(false);
273     mySMESHGUI->ResetState();
274     mySMESHGUI->SetActiveDialogBox(0);
275   }
276 }
277
278 //=================================================================================
279 // function : ActivateThisDialog()
280 // purpose  :
281 //=================================================================================
282 void SMESHGUI_EditMeshDlg::ActivateThisDialog()
283 {
284   /* Emit a signal to deactivate the active dialog */
285   mySMESHGUI->EmitSignalDeactivateDialog();
286   GroupConstructors->setEnabled(true);
287   GroupMesh->setEnabled(true);
288   GroupButtons->setEnabled(true);
289
290   mySMESHGUI->SetActiveDialogBox((QDialog*)this);
291   SelectionIntoArgument();
292 }
293
294 //=================================================================================
295 // function : enterEvent()
296 // purpose  :
297 //=================================================================================
298 void SMESHGUI_EditMeshDlg::enterEvent(QEvent* e)
299 {
300   if (GroupConstructors->isEnabled())
301     return;
302   ActivateThisDialog();
303 }
304
305 //=================================================================================
306 // function : closeEvent()
307 // purpose  :
308 //=================================================================================
309 void SMESHGUI_EditMeshDlg::closeEvent(QCloseEvent* e)
310 {
311   /* same than click on cancel button */
312   this->ClickOnCancel();
313 }
314
315 //=======================================================================
316 //function : hideEvent
317 //purpose  : caused by ESC key
318 //=======================================================================
319 void SMESHGUI_EditMeshDlg::hideEvent (QHideEvent * e)
320 {
321   if (!isMinimized())
322     ClickOnCancel();
323 }