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