1 // Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 // File: CurveCreator_EditPntsDlg.cxx
24 // Created: Fri Jul 05 16:29:53 2013
25 // Author: Sergey KHROMOV
29 #include <CurveCreator_EditPntsDlg.h>
30 #include <CurveCreator_PointItem.h>
32 #include <QVBoxLayout>
34 #include <QPushButton>
36 #include <QListWidget>
39 //=======================================================================
40 // function: Constructor
42 //=======================================================================
43 CurveCreator_EditPntsDlg::CurveCreator_EditPntsDlg
44 (QWidget* parent, const CurveCreator::Dimension theDimension)
46 myDimension (theDimension),
60 setWindowTitle(tr("CC_EDIT_POINTS_TITLE"));
62 // Set Add/modify point group
63 QGroupBox *aModifPntGrp =
64 new QGroupBox(tr("CC_EDIT_POINTS_ADD_MODIFY"));
65 QGridLayout *aModifPntLO = new QGridLayout(aModifPntGrp);
67 new QLabel(tr("CC_EDIT_POINTS_X"), aModifPntGrp);
69 new QLabel(tr("CC_EDIT_POINTS_Y"), aModifPntGrp);
71 aXLbl->setAlignment(Qt::AlignRight);
72 aYLbl->setAlignment(Qt::AlignRight);
73 myXSpn = new QDoubleSpinBox(aModifPntGrp);
74 myYSpn = new QDoubleSpinBox(aModifPntGrp);
75 myAddBtn = new QPushButton(tr("CC_EDIT_POINTS_ADD"), aModifPntGrp);
76 myModifBtn = new QPushButton(tr("CC_EDIT_POINTS_MODIFY"), aModifPntGrp);
77 myRmBtn = new QPushButton(tr("CC_EDIT_POINTS_REMOVE"), aModifPntGrp);
78 aModifPntLO->setMargin(9);
79 aModifPntLO->setSpacing(6);
80 aModifPntLO->addWidget(aXLbl, 0, 0);
81 aModifPntLO->addWidget(aYLbl, 1, 0);
82 aModifPntLO->addWidget(myXSpn, 0, 1);
83 aModifPntLO->addWidget(myYSpn, 1, 1);
84 aModifPntLO->addWidget(myAddBtn, 0, 2);
85 aModifPntLO->addWidget(myModifBtn, 1, 2);
86 aModifPntLO->addWidget(myRmBtn, 2, 2);
88 if (myDimension == CurveCreator::Dim3d) {
89 QLabel *aZLbl = new QLabel(tr("CC_EDIT_POINTS_Z"), aModifPntGrp);
91 aZLbl->setAlignment(Qt::AlignRight);
92 myZSpn = new QDoubleSpinBox(aModifPntGrp);
93 aModifPntLO->addWidget(aZLbl, 2, 0);
94 aModifPntLO->addWidget(myZSpn, 2, 1);
98 QGroupBox *aPntsGrp = new QGroupBox();
99 QGridLayout *aPntsLO = new QGridLayout(aPntsGrp);
101 myClearBtn = new QPushButton(tr("CC_EDIT_POINTS_CLEAR"), aModifPntGrp);
102 myPntUpBtn = new QPushButton(tr("CC_EDIT_POINTS_UP"), aPntsGrp);
103 myPntDownBtn = new QPushButton(tr("CC_EDIT_POINTS_DOWN"), aPntsGrp);
104 myPntsList = new QListWidget(aPntsGrp);
105 aPntsLO->setMargin(9);
106 aPntsLO->setSpacing(6);
107 aPntsLO->addWidget(myClearBtn, 0, 0);
108 aPntsLO->addWidget(myPntUpBtn, 2, 4);
109 aPntsLO->addWidget(myPntDownBtn, 3, 4);
110 aPntsLO->addWidget(myPntsList, 1, 0, 4, 4);
112 // Set OK/Cancel buttons group
113 QGroupBox *anOkCancelGrp = new QGroupBox();
114 QGridLayout *anOkCancelLO = new QGridLayout(anOkCancelGrp);
116 myOkBtn = new QPushButton(tr("GEOM_BUT_OK"), anOkCancelGrp);
117 myCancelBtn = new QPushButton(tr("GEOM_BUT_CANCEL"), anOkCancelGrp);
118 anOkCancelLO->setMargin(9);
119 anOkCancelLO->setSpacing(6);
120 anOkCancelLO->addWidget(myOkBtn, 0, 3);
121 anOkCancelLO->addWidget(myCancelBtn, 0, 4);
124 QGroupBox *aMainGrp = new QGroupBox;
125 QVBoxLayout *aMainLO = new QVBoxLayout(aMainGrp);
127 aMainLO->addWidget(aModifPntGrp);
128 aMainLO->addWidget(aPntsGrp);
129 aMainLO->addWidget(anOkCancelGrp);
136 //=======================================================================
137 // function: Destructor
139 //=======================================================================
140 CurveCreator_EditPntsDlg::~CurveCreator_EditPntsDlg()
144 //=======================================================================
145 // function: setPoints
147 //=======================================================================
148 void CurveCreator_EditPntsDlg::setPoints
149 (const CurveCreator::Coordinates &thePoints)
151 myPoints = thePoints;
155 //=======================================================================
156 // function: getPoints
158 //=======================================================================
159 const CurveCreator::Coordinates &CurveCreator_EditPntsDlg::getPoints() const
164 //=======================================================================
167 //=======================================================================
168 void CurveCreator_EditPntsDlg::init()
174 if (myDimension == CurveCreator::Dim3d) {
179 myModifBtn->setEnabled(false);
180 myRmBtn->setEnabled(false);
181 myClearBtn->setEnabled(false);
182 myPntUpBtn->setEnabled(false);
183 myPntDownBtn->setEnabled(false);
184 myOkBtn->setDefault(true);
186 connect(myAddBtn, SIGNAL(clicked()), this, SLOT(appendPoint()));
187 connect(myModifBtn, SIGNAL(clicked()), this, SLOT(modifyPoint()));
188 connect(myRmBtn, SIGNAL(clicked()), this, SLOT(removePoint()));
189 connect(myClearBtn, SIGNAL(clicked()), this, SLOT(clear()));
190 connect(myPntUpBtn, SIGNAL(clicked()), this, SLOT(upPoint()));
191 connect(myPntDownBtn, SIGNAL(clicked()), this, SLOT(downPoint()));
192 connect(myOkBtn, SIGNAL(clicked()), this, SLOT(accept()));
193 connect(myCancelBtn, SIGNAL(clicked()), this, SLOT(reject()));
197 myPntsList->setSelectionMode(QAbstractItemView::ExtendedSelection);
198 myPntsList->setDragEnabled(true);
199 myPntsList->setDragDropMode(QAbstractItemView::InternalMove);
200 myPntsList->viewport()->setAcceptDrops(true);
202 connect(myPntsList, SIGNAL(itemSelectionChanged()),
203 this, SLOT(changeSelection()));
204 connect(this, SIGNAL(numberOfItemsChanged(int)),
205 this, SLOT(onNumberOfItemsChanged(int)));
211 //=======================================================================
212 // function: initSpinBox
214 //=======================================================================
215 void CurveCreator_EditPntsDlg::initSpinBox(QDoubleSpinBox *theSpinBox)
217 const double aCoordMin = -1.e+15;
218 const double aCoordMax = 1.e+15;
219 const double aStep = 10;
220 const int aPrecision = 6;
222 theSpinBox->setDecimals( qAbs( aPrecision ) );
223 theSpinBox->setRange(aCoordMin, aCoordMax);
224 theSpinBox->setSingleStep(aStep);
225 theSpinBox->setValue(0.0);
228 //=======================================================================
229 // function: updateEditList
231 //=======================================================================
232 void CurveCreator_EditPntsDlg::updateEditList()
236 const int aNbCoords = myPoints.size();
238 if (aNbCoords % myDimension == 0) {
241 while (i < aNbCoords) {
242 const CurveCreator::TypeCoord aX = myPoints[i++];
243 const CurveCreator::TypeCoord aY = myPoints[i++];
245 if (myDimension == CurveCreator::Dim3d) {
246 const CurveCreator::TypeCoord aZ = myPoints[i++];
248 new CurveCreator_PointItem(aX, aY, aZ, myPntsList);
250 new CurveCreator_PointItem(aX, aY, myPntsList);
255 emit numberOfItemsChanged(myPntsList->count());
258 //=======================================================================
259 // function: movePoints
261 //=======================================================================
262 void CurveCreator_EditPntsDlg::movePoints(const int theShift)
264 // Sort list items in ascending or descending order depending on
265 // the sign of theShift.
266 QList<QListWidgetItem *> aListItems = myPntsList->selectedItems();
268 if (!aListItems.empty() && theShift != 0) {
269 QMap<int, QListWidgetItem *> aMapItems;
271 foreach(QListWidgetItem *anItem, aListItems) {
272 int aRow = myPntsList->row(anItem);
278 aMapItems.insert(aRow, anItem);
282 QList<int> aListRows = aMapItems.keys();
283 QList<int> aListNewRows;
285 const int aSize = aListRows.size();
289 // Check each row to be positive.
292 for (i = 0; i < aSize; i++) {
293 int aRow = aListRows[i] + theShift;
295 if (aRow < aMinIndex) {
299 aListNewRows.append(aRow);
302 // Check each row to be not greater then a myPntsList's size.
303 int aMaxIndex = myPntsList->count() - 1;
305 for (i = 0; i < aSize; i++) {
306 int aRow = -aListRows[i] + theShift;
308 if (aRow > aMaxIndex) {
312 aListRows[i] = -aListRows[i];
313 aListNewRows.append(aRow);
317 // Move each item to another position.
318 for (i = 0; i < aSize; i++) {
319 if (aListRows[i] != aListNewRows[i]) {
320 QListWidgetItem *anItem = myPntsList->takeItem(aListRows[i]);
322 myPntsList->insertItem(aListNewRows[i], anItem);
326 // Select added items.
327 foreach (int anIndex, aListNewRows) {
328 myPntsList->item(anIndex)->setSelected(true);
333 //=======================================================================
334 // function: setTabOrder
336 //=======================================================================
337 void CurveCreator_EditPntsDlg::setTabOrder()
339 QWidget::setTabOrder(myXSpn, myYSpn);
341 if (myDimension == CurveCreator::Dim3d) {
342 QWidget::setTabOrder(myYSpn, myZSpn);
343 QWidget::setTabOrder(myZSpn, myAddBtn);
345 QWidget::setTabOrder(myYSpn, myAddBtn);
348 QWidget::setTabOrder(myAddBtn, myModifBtn);
349 QWidget::setTabOrder(myModifBtn, myRmBtn);
350 QWidget::setTabOrder(myRmBtn, myClearBtn);
351 QWidget::setTabOrder(myClearBtn, myPntsList);
352 QWidget::setTabOrder(myPntsList, myPntUpBtn);
353 QWidget::setTabOrder(myPntUpBtn, myPntDownBtn);
354 QWidget::setTabOrder(myPntDownBtn, myOkBtn);
355 QWidget::setTabOrder(myOkBtn, myCancelBtn);
358 //=======================================================================
359 // function: appendPoint
361 //=======================================================================
362 void CurveCreator_EditPntsDlg::appendPoint()
364 if (myDimension == CurveCreator::Dim3d) {
365 new CurveCreator_PointItem(myXSpn->value(), myYSpn->value(),
366 myZSpn->value(), myPntsList);
368 new CurveCreator_PointItem(myXSpn->value(), myYSpn->value(), myPntsList);
371 emit numberOfItemsChanged(myPntsList->count());
374 //=======================================================================
375 // function: modifyPoint
377 //=======================================================================
378 void CurveCreator_EditPntsDlg::modifyPoint()
380 QList<QListWidgetItem *> aListItems = myPntsList->selectedItems();
382 if (aListItems.size() == 1) {
383 CurveCreator_PointItem *aPntItem =
384 (CurveCreator_PointItem *)aListItems.first();
386 if (myDimension == CurveCreator::Dim3d) {
387 aPntItem->setCoord(myXSpn->value(), myYSpn->value(), myZSpn->value());
389 aPntItem->setCoord(myXSpn->value(), myYSpn->value());
394 //=======================================================================
395 // function: removePoint
397 //=======================================================================
398 void CurveCreator_EditPntsDlg::removePoint()
400 QList<QListWidgetItem *> aListItems = myPntsList->selectedItems();
403 foreach(QListWidgetItem *anItem, aListItems) {
405 aRow = myPntsList->row(anItem);
412 emit numberOfItemsChanged(myPntsList->count());
415 // Set the new selection.
416 if (aRow >= myPntsList->count()) {
417 aRow = myPntsList->count() - 1;
421 myPntsList->item(aRow)->setSelected(true);
425 //=======================================================================
428 //=======================================================================
429 void CurveCreator_EditPntsDlg::upPoint()
434 //=======================================================================
435 // function: downPoint
437 //=======================================================================
438 void CurveCreator_EditPntsDlg::downPoint()
443 //=======================================================================
444 // function: changeSelection
446 //=======================================================================
447 void CurveCreator_EditPntsDlg::changeSelection()
449 // Update modify button and spin boxes.
450 QList<QListWidgetItem *> aListItems = myPntsList->selectedItems();
451 const int aNbItems = aListItems.size();
454 const CurveCreator_PointItem *aPntItem =
455 (const CurveCreator_PointItem *)aListItems.first();
457 myModifBtn->setEnabled(true);
458 myXSpn->setValue(aPntItem->getX());
459 myYSpn->setValue(aPntItem->getY());
461 if (myDimension == CurveCreator::Dim3d) {
462 myZSpn->setValue(aPntItem->getZ());
464 } else if (myModifBtn->isEnabled()) {
465 myModifBtn->setEnabled(false);
466 myXSpn->setValue(0.0);
467 myYSpn->setValue(0.0);
469 if (myDimension == CurveCreator::Dim3d) {
470 myZSpn->setValue(0.0);
474 // Set enabled remove, up and down points.
475 bool isEnabled = (aNbItems > 0);
477 myRmBtn->setEnabled(isEnabled);
478 isEnabled &= (aNbItems < myPntsList->count());
479 myPntUpBtn->setEnabled(isEnabled);
480 myPntDownBtn->setEnabled(isEnabled);
483 //=======================================================================
486 //=======================================================================
487 void CurveCreator_EditPntsDlg::accept()
492 const int aNbPoints = myPntsList->count();
495 for (i = 0; i < aNbPoints; i++) {
496 const CurveCreator_PointItem *aPntItem =
497 (const CurveCreator_PointItem *)myPntsList->item(i);
499 myPoints.push_back(aPntItem->getX());
500 myPoints.push_back(aPntItem->getY());
502 if (myDimension == CurveCreator::Dim3d) {
503 myPoints.push_back(aPntItem->getZ());
510 //=======================================================================
513 //=======================================================================
514 void CurveCreator_EditPntsDlg::clear()
516 bool isEmpty = (myPntsList->count() == 0);
521 emit onNumberOfItemsChanged(0);
525 //=======================================================================
526 // function: onNumberOfItemsChanged
528 //=======================================================================
529 void CurveCreator_EditPntsDlg::onNumberOfItemsChanged(int theNewValue)
531 myClearBtn->setEnabled(theNewValue > 0);
533 // Update Up and down buttons
534 QList<QListWidgetItem *> aListItems = myPntsList->selectedItems();
535 const int aNbItems = aListItems.size();
536 const bool isEnabled = (aNbItems > 0 && aNbItems < theNewValue);
538 myPntUpBtn->setEnabled(isEnabled);
539 myPntDownBtn->setEnabled(isEnabled);