-// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
-//
-// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
-
-// File: CurveCreator_Widget.cxx
-// Created: Mon Jul 01 12:49:31 2013
-// Author: Sergey KHROMOV
-//
-
-
-#include <CurveCreator_Widget.h>
-#include <CurveCreator_EditPntsWidget.h>
-#include <CurveCreator_UndoOptsDlg.h>
-#include <CurveCreator_EditPntDlg.h>
-#include <CurveCreator_PointItem.h>
-#include <QPushButton>
-#include <QButtonGroup>
-#include <QHBoxLayout>
-#include <QListWidget>
-#include <QGroupBox>
-#include <QLabel>
-#include <QLineEdit>
-#include <QRadioButton>
-#include <QComboBox>
-#include <QCheckBox>
-
-#define SECTION_ADD 0
-#define SECTION_MODIFY 1
-#define POLYLINE_INDEX 0
-#define BSPLINE_INDEX 1
-#define UNDO_REDO_DISABLED 0
-#define UNDO_REDO_UNLIMITED -1
-
-//=======================================================================
-// function: Constructor
-// purpose:
-//=======================================================================
-CurveCreator_Widget::CurveCreator_Widget(QWidget* parent,
- CurveCreator_Curve *theCurve,
- Qt::WindowFlags fl)
- : QWidget (parent, fl),
- myEditor (theCurve),
- myDimension (theCurve == NULL ?
- CurveCreator::Dim2d : theCurve->getDimension()),
- myEnabledUndoLbl (NULL),
- myBufSizeUndoLbl (NULL),
- myUndoBtn (NULL),
- myRedoBtn (NULL),
- myUndoOptsBtn (NULL),
- myUndoOptsDlg (NULL),
- myAddSecGrp (NULL),
- mySecBtnGrp (NULL),
- mySecTypeCmbBox (NULL),
- mySecCloseChkBox (NULL),
- mySecAddModifBtn (NULL),
- mySecRmBtn (NULL),
- mySecJoinBtn (NULL),
- mySecJoinAllBtn (NULL),
- mySecClearBtn (NULL),
- mySecUpBtn (NULL),
- mySecDownBtn (NULL),
- mySecList (NULL),
- myEditSecPnts (NULL),
- myPntsGrp (NULL),
- myPntsList (NULL),
- myPntEditDlg (NULL),
- myEditPnts (NULL),
- myAddPntsBtn (NULL),
- myInsertPntsBtn (NULL),
- myRmPntsBtn (NULL)
-{
- setWindowTitle(tr("CC_TITLE"));
-
- // Set undo/redo options group
- QGroupBox *anUndoOptsGrp = new QGroupBox(tr("CC_UNDO_REDO_OPTIONS"));
- QGridLayout *anUndoOptsLO = new QGridLayout(anUndoOptsGrp);
-
- myEnabledUndoLbl = new QLabel(tr("CC_UNDO_REDO_ENABLED"), anUndoOptsGrp);
- myBufSizeUndoLbl = new QLabel(tr("CC_UNDO_REDO_BUFFER_SIZE"), anUndoOptsGrp);
- myUndoOptsBtn = new QPushButton(tr("CC_UNDO_REDO_MODIFY"), anUndoOptsGrp);
- anUndoOptsLO->setMargin(9);
- anUndoOptsLO->setSpacing(6);
- anUndoOptsLO->addWidget(myEnabledUndoLbl, 0, 0);
- anUndoOptsLO->addWidget(myBufSizeUndoLbl, 1, 0);
- anUndoOptsLO->addWidget(myUndoOptsBtn, 0, 1, 2, 1);
-
- // Set undo/redo group
- QGroupBox *anUndoRedoGrp = new QGroupBox(tr("CC_UNDO_REDO_TITLE"));
- QHBoxLayout *anUndoRedoLO = new QHBoxLayout(anUndoRedoGrp);
-
- myUndoBtn = new QPushButton(tr("CC_UNDO"), anUndoRedoGrp);
- myRedoBtn = new QPushButton(tr("CC_REDO"), anUndoRedoGrp);
- anUndoRedoLO->setMargin(9);
- anUndoRedoLO->setSpacing(6);
- anUndoRedoLO->addWidget(myUndoBtn, 0, Qt::AlignRight);
- anUndoRedoLO->addWidget(myRedoBtn, 0, Qt::AlignLeft);
- anUndoRedoLO->addWidget(anUndoOptsGrp, 0, Qt::AlignRight);
-
- // Set section add/modification group.
- myAddSecGrp = new QGroupBox(tr("CC_SECTION_ADD_TITLE"));
-
- QGridLayout *anAddSecLO = new QGridLayout(myAddSecGrp);
- QLabel *aSectTypeLbl =
- new QLabel(tr("CC_SECTION_TYPE"), myAddSecGrp);
- QLabel *aSecPntsLbl =
- new QLabel(tr("CC_SECTION_POINTS_ADD_LBL"), myAddSecGrp);
-
- mySecCloseChkBox = new QCheckBox(tr("CC_SECTION_CLOSED"), myAddSecGrp);
- mySecTypeCmbBox = new QComboBox(myAddSecGrp);
- mySecAddModifBtn = new QPushButton(tr("CC_SECTION_NEW"), myAddSecGrp);
- myEditSecPnts = new CurveCreator_EditPntsWidget
- (myAddSecGrp, true, myDimension);
- anAddSecLO->setMargin(9);
- anAddSecLO->setSpacing(6);
- anAddSecLO->addWidget(mySecCloseChkBox, 0, 0);
- anAddSecLO->addWidget(aSectTypeLbl, 1, 0);
- anAddSecLO->addWidget(mySecTypeCmbBox, 1, 1);
- anAddSecLO->addWidget(aSecPntsLbl, 2, 0);
- anAddSecLO->addWidget(myEditSecPnts, 2, 1);
- anAddSecLO->addWidget(mySecAddModifBtn, 1, 3);
-
- // Set section group
- QGroupBox *aSecGrp = new QGroupBox(tr("CC_SECTION_TITLE"));
- QGridLayout *aSecLO = new QGridLayout(aSecGrp);
- QRadioButton *anAddSecRdBtn =
- new QRadioButton(tr("CC_SECTION_ADD_TITLE"), aSecGrp);
- QRadioButton *aModifSecRdBtn =
- new QRadioButton(tr("CC_SECTION_MODIFY_TITLE"), aSecGrp);
-
- mySecRmBtn = new QPushButton(tr("CC_SECTION_REMOVE"), aSecGrp);
- mySecJoinBtn = new QPushButton(tr("CC_SECTION_JOIN"), aSecGrp);
- mySecJoinAllBtn = new QPushButton(tr("CC_SECTION_JOIN_ALL"), aSecGrp);
- mySecClearBtn = new QPushButton(tr("CC_SECTION_CLEAR"), aSecGrp);
- mySecUpBtn = new QPushButton(tr("CC_SECTION_UP"), aSecGrp);
- mySecDownBtn = new QPushButton(tr("CC_SECTION_DOWN"), aSecGrp);
- mySecBtnGrp = new QButtonGroup(aSecGrp);
- mySecList = new QListWidget(aSecGrp);
- aSecLO->setMargin(9);
- aSecLO->setSpacing(6);
- aSecLO->addWidget(anAddSecRdBtn, 0, 0);
- aSecLO->addWidget(aModifSecRdBtn, 0, 1);
- aSecLO->addWidget(myAddSecGrp, 1, 0, 1, 5);
- aSecLO->addWidget(mySecRmBtn, 2, 0);
- aSecLO->addWidget(mySecJoinBtn, 2, 1);
- aSecLO->addWidget(mySecJoinAllBtn, 2, 2);
- aSecLO->addWidget(mySecClearBtn, 2, 3);
- aSecLO->addWidget(mySecUpBtn, 4, 4);
- aSecLO->addWidget(mySecDownBtn, 5, 4);
- aSecLO->addWidget(mySecList, 3, 0, 4, 4);
- mySecBtnGrp->addButton(anAddSecRdBtn, SECTION_ADD);
- mySecBtnGrp->addButton(aModifSecRdBtn, SECTION_MODIFY);
-
- // Set point add/modification group.
- QGroupBox *anAddPntsGrp = new QGroupBox(tr("CC_POINTS_ADD_TITLE"));
-
- QGridLayout *anAddPntsLO = new QGridLayout(anAddPntsGrp);
- QLabel *aPntsLbl =
- new QLabel(tr("CC_POINTS_ADD_LBL"), anAddPntsGrp);
-
- myEditPnts = new CurveCreator_EditPntsWidget
- (anAddPntsGrp, false, myDimension);
- myAddPntsBtn = new QPushButton(tr("CC_POINTS_ADD"), anAddPntsGrp);
- myInsertPntsBtn = new QPushButton(tr("CC_POINTS_INSERT"), anAddPntsGrp);
- anAddPntsLO->setMargin(9);
- anAddPntsLO->setSpacing(6);
- anAddPntsLO->addWidget(aPntsLbl, 0, 0);
- anAddPntsLO->addWidget(myEditPnts, 0, 1);
- anAddPntsLO->addWidget(myAddPntsBtn, 0, 4);
- anAddPntsLO->addWidget(myInsertPntsBtn, 1, 4);
-
- // Set Points group
- myPntsGrp = new QGroupBox(tr("CC_POINTS_TITLE"));
-
- QGridLayout *aPntsLO = new QGridLayout(myPntsGrp);
-
- myPntsList = new QListWidget(myPntsGrp);
- myRmPntsBtn = new QPushButton(tr("CC_POINTS_REMOVE"), myPntsGrp);
- aPntsLO->setMargin(9);
- aPntsLO->setSpacing(6);
- aPntsLO->addWidget(anAddPntsGrp, 0, 0, 1, 4);
- aPntsLO->addWidget(myRmPntsBtn, 1, 0);
- aPntsLO->addWidget(myPntsList, 2, 0, 4, 4);
-
- // Set main group
- QGroupBox *aMainGrp = new QGroupBox(tr("CC_TITLE"));
- QGridLayout *aMainLO = new QGridLayout(aMainGrp);
-
- aMainLO->setMargin(9);
- aMainLO->setSpacing(6);
- aMainLO->addWidget(anUndoRedoGrp, 0, 0, 1, 2);
- aMainLO->addWidget(aSecGrp, 1, 0);
- aMainLO->addWidget(myPntsGrp, 1, 1);
-
- setLayout(aMainLO);
-
- init();
-}
-
-//=======================================================================
-// function: init
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::init()
-{
- // Initialize Undo/Redo group.
- QString anUnlim = tr("CC_UNDO_REDO_UNLIMITED");
-
- myEnabledUndoLbl->setText(tr("CC_UNDO_REDO_ENABLED"));
- myBufSizeUndoLbl->setText(tr("CC_UNDO_REDO_BUFFER_SIZE").arg(anUnlim));
- connect(myUndoOptsBtn, SIGNAL(clicked()), this, SLOT(undoOptionsChanged()));
- connect(myUndoBtn, SIGNAL(clicked()), this, SLOT(undo()));
- connect(myRedoBtn, SIGNAL(clicked()), this, SLOT(redo()));
- updateUndoRedoButtons();
-
- // Initialize sections group.
- mySecBtnGrp->setExclusive(true);
- mySecBtnGrp->button(SECTION_ADD)->setChecked(true);
- connect(mySecBtnGrp, SIGNAL(buttonClicked(int)),
- this, SLOT(addModifChanged(int)));
-
- // Init section buttons.
- mySecAddModifBtn->setEnabled(true);
- mySecRmBtn->setEnabled(false);
- mySecJoinBtn->setEnabled(false);
- mySecJoinAllBtn->setEnabled(false);
- mySecClearBtn->setEnabled(false);
- mySecUpBtn->setEnabled(false);
- mySecDownBtn->setEnabled(false);
-
- connect(mySecAddModifBtn, SIGNAL(clicked()),this, SLOT(sectionAddOrModify()));
- connect(mySecRmBtn, SIGNAL(clicked()),this, SLOT(sectionRemove()));
- connect(mySecJoinBtn, SIGNAL(clicked()),this, SLOT(sectionJoin()));
- connect(mySecJoinAllBtn, SIGNAL(clicked()),this, SLOT(sectionJoinAll()));
- connect(mySecClearBtn, SIGNAL(clicked()),this, SLOT(sectionClear()));
- connect(mySecUpBtn, SIGNAL(clicked()),this, SLOT(sectionUp()));
- connect(mySecDownBtn, SIGNAL(clicked()),this, SLOT(sectionDown()));
-
- // Init section input fields.
- mySecCloseChkBox->setChecked(false);
- mySecTypeCmbBox->addItem(tr("CC_SECTION_TYPE_POLYLINE"));
- mySecTypeCmbBox->addItem(tr("CC_SECTION_TYPE_BSPLINE"));
- mySecTypeCmbBox->setCurrentIndex(POLYLINE_INDEX);
- myEditSecPnts->clear();
-
- // Init sections list widget.
- mySecList->setSelectionMode(QAbstractItemView::ExtendedSelection);
-
- connect(this, SIGNAL(numberOfItemsChanged(QListWidget *)),
- this, SLOT(onNumberOfItemsChanged(QListWidget *)));
- initSections();
- connect(mySecList, SIGNAL(itemSelectionChanged()),
- this, SLOT(changeSecSelection()));
-
- // Init points list widget.
- myPntsGrp->setEnabled(false);
- myPntsList->clear();
- myPntsList->setSelectionMode(QAbstractItemView::ExtendedSelection);
-
- connect(myPntsList, SIGNAL(itemSelectionChanged()),
- this, SLOT(changePntsSelection()));
- connect(myPntsList, SIGNAL(itemDoubleClicked(QListWidgetItem *)),
- this, SLOT(editPnt(QListWidgetItem *)));
-
- // Init points buttons.
- connect(myAddPntsBtn, SIGNAL(clicked()),this, SLOT(pntsAdd()));
- connect(myInsertPntsBtn, SIGNAL(clicked()),this, SLOT(pntsInsert()));
- connect(myRmPntsBtn, SIGNAL(clicked()),this, SLOT(pntsRemove()));
-
- // Init edit points widgets.
- myEditSecPnts->setPointsList(myPntsList);
- myEditPnts->setPointsList(myPntsList);
-
- // Set tab order
- setTabOrder();
-}
-
-//=======================================================================
-// function: initSections
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::initSections()
-{
- CurveCreator_Curve *aCurve = myEditor.getCurve();
-
- const int aNbSections = aCurve->getNbSections();
- int i;
-
- mySecList->clear();
-
- for (i = 0; i < aNbSections; i++) {
- addSectionItem(aCurve->getType(i), aCurve->isClosed(i));
- }
-
- emit numberOfItemsChanged(mySecList);
-}
-
-//=======================================================================
-// function: addSectionItem
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::addSectionItem(const CurveCreator::Type theType,
- const bool isClosed)
-{
- const int aRow = mySecList->count();
-
- new QListWidgetItem(mySecList);
- updateSectionItem(aRow, theType, isClosed);
- emit numberOfItemsChanged(mySecList);
-}
-
-//=======================================================================
-// function: updateSectionItem
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::updateSectionItem(const int theRow,
- const CurveCreator::Type theType,
- const bool isClosed)
-{
- QListWidgetItem *anItem = mySecList->item(theRow);
- QString aStrType;
-
- if (theType == CurveCreator::Polyline) {
- aStrType = tr("CC_SECTION_ITEM_POLYLINE");
- } else {
- aStrType = tr("CC_SECTION_ITEM_BSPLINE");
- }
-
- const QString aTrCode =
- (isClosed ? "CC_SECTION_ITEM_CLOSED" : "CC_SECTION_ITEM");
-
- anItem->setText(tr(aTrCode.toLatin1().constData()).arg(aStrType));
-}
-
-//=======================================================================
-// function: sectionMove
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::sectionMove(const int theShift)
-{
- // Sort list items in ascending or descending order depending on
- // the sign of theShift.
- QList<QListWidgetItem *> aListItems = mySecList->selectedItems();
-
- if (!aListItems.empty() && theShift != 0) {
- QMap<int, QListWidgetItem *> aMapItems;
-
- foreach(QListWidgetItem *anItem, aListItems) {
- int aRow = mySecList->row(anItem);
-
- if (theShift > 0) {
- aRow = -aRow;
- }
-
- aMapItems.insert(aRow, anItem);
- }
-
- // Compute new rows
- QList<int> aListRows = aMapItems.keys();
- QList<int> aListNewRows;
- int i;
- const int aSize = aListRows.size();
-
-
- if (theShift < 0) {
- // Check each row to be positive.
- int aMinIndex = 0;
-
- for (i = 0; i < aSize; i++) {
- int aRow = aListRows[i] + theShift;
-
- if (aRow < aMinIndex) {
- aRow = aMinIndex++;
- }
-
- aListNewRows.append(aRow);
- }
- } else {
- // Check each row to be not greater then a mySecList's size.
- int aMaxIndex = mySecList->count() - 1;
-
- for (i = 0; i < aSize; i++) {
- int aRow = -aListRows[i] + theShift;
-
- if (aRow > aMaxIndex) {
- aRow = aMaxIndex--;
- }
-
- aListRows[i] = -aListRows[i];
- aListNewRows.append(aRow);
- }
- }
-
- // Move each item to another position.
- for (i = 0; i < aSize; i++) {
- if (aListRows[i] != aListNewRows[i]) {
- QListWidgetItem *anItem = mySecList->takeItem(aListRows[i]);
-
- // Move section.
- mySecList->insertItem(aListNewRows[i], anItem);
- myEditor.moveSection(aListRows[i], aListNewRows[i]);
- }
- }
-
- // Select added items.
- foreach (int anIndex, aListNewRows) {
- mySecList->item(anIndex)->setSelected(true);
- }
-
- // Update undo/redo buttons.
- updateUndoRedoButtons();
- }
-}
-
-//=======================================================================
-// function: initPoints
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::initPoints(const int theSectionIndex)
-{
- // Clear the points list
- const int aNbPnts = myPntsList->count();
-
- myPntsList->clear();
-
- if (theSectionIndex < 0) {
- if (aNbPnts > 0) {
- emit numberOfItemsChanged(myPntsList);
- }
- } else {
- // Fill the points list with the points of the section.
- const CurveCreator::Coordinates &aPoints =
- myEditor.getCurve()->getPoints(theSectionIndex);
- const int aNbCoords = aPoints.size();
-
- if (aNbCoords % myDimension == 0) {
- int i = 0;
-
- while (i < aNbCoords) {
- const CurveCreator::TypeCoord aX = aPoints[i++];
- const CurveCreator::TypeCoord aY = aPoints[i++];
-
- if (myDimension == CurveCreator::Dim3d) {
- const CurveCreator::TypeCoord aZ = aPoints[i++];
-
- new CurveCreator_PointItem(aX, aY, aZ, myPntsList);
- } else {
- new CurveCreator_PointItem(aX, aY, myPntsList);
- }
- }
- }
-
- if (aNbPnts != aNbCoords/myDimension) {
- emit numberOfItemsChanged(myPntsList);
- }
- }
-}
-
-//=======================================================================
-// function: getCurrentSectionIndex
-// purpose:
-//=======================================================================
-int CurveCreator_Widget::getCurrentSectionIndex()
-{
- int anIndex = -1;
- QList<QListWidgetItem *> aListSec = mySecList->selectedItems();
-
- if (aListSec.size() == 1) {
- anIndex = mySecList->row(aListSec.first());
- }
-
- return anIndex;
-}
-
-//=======================================================================
-// function: updateUndoRedo
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::updateUndoRedo()
-{
- // Update undo/redo buttons.
- updateUndoRedoButtons();
-
- // Update sections.
- CurveCreator_Curve *aCurve = myEditor.getCurve();
- const bool isKeepSelection = (mySecList->count() == aCurve->getNbSections());
- QList<int> aSelectedRows;
- QList<QListWidgetItem *> aListItems = mySecList->selectedItems();
-
- if (isKeepSelection) {
- foreach (QListWidgetItem *anItem, aListItems) {
- aSelectedRows.append(mySecList->row(anItem));
- }
- }
-
- initSections();
-
- // Set selection.
- if (isKeepSelection) {
- foreach (int aRow, aSelectedRows) {
- mySecList->item(aRow)->setSelected(true);
- }
- }
-
- changeSecSelection();
-}
-
-//=======================================================================
-// function: updateUndoRedoButtons
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::updateUndoRedoButtons()
-{
- // Update undo/redo buttons.
- const int anUndoDepth = myEditor.getUndoDepth();
-
- if (anUndoDepth == UNDO_REDO_DISABLED) {
- myUndoBtn->setEnabled(false);
- myRedoBtn->setEnabled(false);
- } else {
- myUndoBtn->setEnabled(myEditor.getNbUndo() > 0);
- myRedoBtn->setEnabled(myEditor.getNbRedo() > 0);
- }
-}
-
-
-//=======================================================================
-// function: setTabOrder
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::setTabOrder()
-{
- QWidget::setTabOrder(myUndoBtn, myRedoBtn);
- QWidget::setTabOrder(myRedoBtn, myUndoOptsBtn);
- QWidget::setTabOrder(myUndoOptsBtn, mySecBtnGrp->button(SECTION_ADD));
- QWidget::setTabOrder(mySecBtnGrp->button(SECTION_ADD),
- mySecBtnGrp->button(SECTION_MODIFY));
- QWidget::setTabOrder(mySecBtnGrp->button(SECTION_MODIFY), mySecCloseChkBox);
- QWidget::setTabOrder(mySecCloseChkBox, mySecTypeCmbBox);
- QWidget::setTabOrder(mySecTypeCmbBox, myEditSecPnts->getPointsEdit());
- QWidget::setTabOrder(myEditSecPnts->getPointsEdit(),
- myEditSecPnts->getPointsButton());
- QWidget::setTabOrder(myEditSecPnts->getPointsButton(), mySecAddModifBtn);
- QWidget::setTabOrder(mySecAddModifBtn, mySecRmBtn);
- QWidget::setTabOrder(mySecRmBtn, mySecJoinBtn);
- QWidget::setTabOrder(mySecJoinBtn, mySecJoinAllBtn);
- QWidget::setTabOrder(mySecJoinAllBtn, mySecClearBtn);
- QWidget::setTabOrder(mySecClearBtn, mySecList);
- QWidget::setTabOrder(mySecList, mySecUpBtn);
- QWidget::setTabOrder(mySecUpBtn, mySecDownBtn);
- QWidget::setTabOrder(mySecDownBtn, myEditPnts->getPointsEdit());
- QWidget::setTabOrder(myEditPnts->getPointsEdit(),
- myEditPnts->getPointsButton());
- QWidget::setTabOrder(myEditPnts->getPointsButton(), myAddPntsBtn);
- QWidget::setTabOrder(myAddPntsBtn, myInsertPntsBtn);
- QWidget::setTabOrder(myInsertPntsBtn, myRmPntsBtn);
- QWidget::setTabOrder(myRmPntsBtn, myPntsList);
-}
-
-//=======================================================================
-// function: undoOptionsChanged
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::undoOptionsChanged()
-{
- if (myUndoOptsDlg == NULL) {
- // Create the dialog.
- myUndoOptsDlg = new CurveCreator_UndoOptsDlg(this);
- }
-
- // set undo depth.
- myUndoOptsDlg->setUndoDepth(myEditor.getUndoDepth());
-
- const int aResult = myUndoOptsDlg->exec();
-
- if (aResult == QDialog::Accepted) {
- // Get undo depth.
- const int anUndoDepth = myUndoOptsDlg->getUndoDepth();
- const bool isEnabled = myUndoOptsDlg->isEnabled();
-
- myEditor.setUndoDepth(anUndoDepth);
-
- // Update options labels.
- myBufSizeUndoLbl->setVisible(isEnabled);
-
- if (isEnabled) {
- QString aSize;
-
- if (myUndoOptsDlg->isUnlimited()) {
- aSize = tr("CC_UNDO_REDO_UNLIMITED");
- } else {
- aSize = QString::number(anUndoDepth);
- }
-
- myEnabledUndoLbl->setText(tr("CC_UNDO_REDO_ENABLED"));
- myBufSizeUndoLbl->setText(tr("CC_UNDO_REDO_BUFFER_SIZE").arg(aSize));
- } else {
- myEnabledUndoLbl->setText(tr("CC_UNDO_REDO_DISABLED"));
- }
- }
-
- // Update Undo Redo buttons.
- updateUndoRedoButtons();
-}
-
-//=======================================================================
-// function: sectionAddOrModify
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::sectionAddOrModify()
-{
- const bool isClosed = mySecCloseChkBox->isChecked();
- CurveCreator::Type aType;
-
- if (mySecTypeCmbBox->currentIndex() == POLYLINE_INDEX) {
- aType = CurveCreator::Polyline;
- } else {
- aType = CurveCreator::BSpline;
- }
-
- if (mySecBtnGrp->checkedId() == SECTION_MODIFY) {
- // Modify section mode.
- QList<QListWidgetItem *> aListItems = mySecList->selectedItems();
-
- if (aListItems.size() == 1) {
- const int aRow = mySecList->row(aListItems.first());
- bool isModified = false;
- CurveCreator_Curve *aCurve = myEditor.getCurve();
-
-
- if (aCurve->getType(aRow) != aType) {
- // Set type.
- isModified = true;
- myEditor.setType(aType, aRow);
- }
-
- if (aCurve->isClosed(aRow) != isClosed) {
- // Set closed flag.
- isModified = true;
- myEditor.setClosed(isClosed, aRow);
- }
-
- if (isModified) {
- updateSectionItem(aRow, aType, isClosed);
-
- // Update undo/redo buttons.
- updateUndoRedoButtons();
- }
- }
- } else {
- // Add section mode. Add section.
- myEditor.addSection(aType, isClosed, myEditSecPnts->getPoints());
- addSectionItem(aType, isClosed);
-
- // Update undo/redo buttons.
- updateUndoRedoButtons();
- }
-}
-
-//=======================================================================
-// function: secButtonClicked
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::addModifChanged(int theId)
-{
- if (theId == SECTION_ADD) {
- // Add section
- myAddSecGrp->setTitle(tr("CC_SECTION_ADD_TITLE"));
- mySecAddModifBtn->setText(tr("CC_SECTION_NEW"));
- myEditSecPnts->setEnabled(true);
- mySecAddModifBtn->setEnabled(true);
- } else {
- // Modify section
- myAddSecGrp->setTitle(tr("CC_SECTION_MODIFICATION_TITLE"));
- mySecAddModifBtn->setText(tr("CC_SECTION_MODIFY"));
- myEditSecPnts->setEnabled(false);
- changeSecSelection();
- }
-}
-
-//=======================================================================
-// function: changeSecSelection
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::changeSecSelection()
-{
- // Update modify button and section data.
- QList<QListWidgetItem *> aListItems = mySecList->selectedItems();
- const int aNbItems = aListItems.size();
-
- if (mySecBtnGrp->checkedId() == SECTION_MODIFY) {
- // Modify section mode.
- if (aNbItems == 1) {
- // Initialize type and closed flags.
- CurveCreator_Curve *aCurve = myEditor.getCurve();
- const int anIndex = mySecList->row(aListItems.first());
-
- mySecAddModifBtn->setEnabled(true);
- mySecCloseChkBox->setChecked(aCurve->isClosed(anIndex));
-
- if (aCurve->getType(anIndex) == CurveCreator::Polyline) {
- mySecTypeCmbBox->setCurrentIndex(POLYLINE_INDEX);
- } else {
- mySecTypeCmbBox->setCurrentIndex(BSPLINE_INDEX);
- }
- } else if (mySecAddModifBtn->isEnabled()) {
- mySecAddModifBtn->setEnabled(false);
- }
- } else {
- // Add section mode.
- mySecAddModifBtn->setEnabled(true);
- }
-
- // Set enabled remove, up and down points.
- bool isEnabled = (aNbItems > 0);
- const int aCount = mySecList->count();
-
- mySecRmBtn->setEnabled(isEnabled);
- isEnabled &= (aNbItems < aCount);
- mySecUpBtn->setEnabled(isEnabled);
- mySecDownBtn->setEnabled(isEnabled);
- mySecJoinBtn->setEnabled(aNbItems == 2);
-
- // Init points.
- myPntsGrp->setEnabled(aNbItems == 1);
-
- if (aNbItems == 1) {
- const int aSecIndex = mySecList->row(aListItems.first());
-
- initPoints(aSecIndex);
- } else {
- initPoints(-1);
- }
-}
-
-//=======================================================================
-// function: sectionRemove
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::sectionRemove()
-{
- QList<QListWidgetItem *> aListItems = mySecList->selectedItems();
-
- if (!aListItems.empty()) {
- QList<int> aListRows;
-
- // Get items rows.
- foreach(QListWidgetItem *anItem, aListItems) {
- aListRows.append(mySecList->row(anItem));
- }
-
- // Delete items.
- foreach(QListWidgetItem *anItem, aListItems) {
- delete anItem;
- }
-
- qSort(aListRows);
-
- // Delete points from curve.
- const int aNbPnts = aListRows.size();
- int i;
-
- for (i = aNbPnts - 1; i >= 0; i--) {
- myEditor.removeSection(aListRows[i]);
- }
-
- // Set the new selection.
- int aRow = aListRows[0];
-
- if (aListRows[0] >= mySecList->count()) {
- aRow = mySecList->count() - 1;
- }
-
- if (aRow >= 0) {
- mySecList->item(aRow)->setSelected(true);
- }
-
- emit numberOfItemsChanged(mySecList);
-
- // Update undo/redo buttons.
- updateUndoRedoButtons();
- }
-}
-
-//=======================================================================
-// function: sectionJoin
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::sectionJoin()
-{
- QList<QListWidgetItem *> aListItems = mySecList->selectedItems();
-
- if (aListItems.size() == 2) {
- int aRowTo = mySecList->row(aListItems.first());
- int aRowFrom = mySecList->row(aListItems.last());
-
- if (aRowTo > aRowFrom) {
- // Swap rows.
- int aTmp = aRowTo;
-
- aRowTo = aRowFrom;
- aRowFrom = aTmp;
- }
-
- // Join two sections.
- myEditor.join(aRowTo, aRowFrom);
- delete mySecList->takeItem(aRowFrom);
- emit numberOfItemsChanged(mySecList);
- // Select the joined item.
- mySecList->item(aRowTo)->setSelected(true);
- changeSecSelection();
-
- // Update undo/redo buttons.
- updateUndoRedoButtons();
- }
-}
-
-//=======================================================================
-// function: sectionJoinAll
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::sectionJoinAll()
-{
- const int aNbItems = mySecList->count();
-
- if (aNbItems > 1) {
- // Join two sections.
- myEditor.join();
-
- // Update mySecList.
- for (int i = 1; i < aNbItems; i++) {
- delete mySecList->takeItem(1);
- }
-
- emit numberOfItemsChanged(mySecList);
- // Select the joined item.
- mySecList->item(0)->setSelected(true);
- changeSecSelection();
-
- // Update undo/redo buttons.
- updateUndoRedoButtons();
- }
-}
-
-//=======================================================================
-// function: sectionClear
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::sectionClear()
-{
- bool isEmpty = (mySecList->count() == 0);
-
- if (!isEmpty) {
- mySecList->clear();
- myEditor.clear();
- emit numberOfItemsChanged(mySecList);
-
- // Update undo/redo buttons.
- updateUndoRedoButtons();
- }
-}
-
-//=======================================================================
-// function: sectionUp
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::sectionUp()
-{
- sectionMove(-1);
-}
-
-//=======================================================================
-// function: sectionDown
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::sectionDown()
-{
- sectionMove(1);
-}
-
-//=======================================================================
-// function: onNumberOfItemsChanged
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::onNumberOfItemsChanged(QListWidget *theListWidget)
-{
- if (theListWidget == mySecList) {
- // List of sections is modified.
- mySecJoinAllBtn->setEnabled(mySecList->count() > 1);
- mySecClearBtn->setEnabled(mySecList->count() > 0);
- } else {
- // List of points is modified.
- QList<QListWidgetItem *> aListItems = myPntsList->selectedItems();
- const int aNbItems = aListItems.size();
-
- myRmPntsBtn->setEnabled(aNbItems > 0);
- }
-}
-
-//=======================================================================
-// function: changePntsSelection
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::changePntsSelection()
-{
- // Update modify buttons and section data.
- QList<QListWidgetItem *> aListItems = myPntsList->selectedItems();
- const int aNbItems = aListItems.size();
- const int aCount = myPntsList->count();
-
- myRmPntsBtn->setEnabled(aNbItems > 0);
- myInsertPntsBtn->setEnabled(aCount == 0 || aNbItems == 1);
-}
-
-//=======================================================================
-// function: editPnt
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::editPnt(QListWidgetItem *theItem)
-{
- if (theItem != NULL) {
- if (myPntEditDlg == NULL) {
- // Create the dialog.
- myPntEditDlg = new CurveCreator_EditPntDlg(this, myDimension);
- }
-
- // Get coordinates.
- CurveCreator_PointItem *aPntItem = (CurveCreator_PointItem *)theItem;
- CurveCreator::Coordinates aPoint;
-
- aPoint.push_back(aPntItem->getX());
- aPoint.push_back(aPntItem->getY());
-
- if (myDimension == CurveCreator::Dim3d) {
- aPoint.push_back(aPntItem->getZ());
- }
-
- myPntEditDlg->setPoint(aPoint);
-
- const int aResult = myPntEditDlg->exec();
-
- if (aResult == QDialog::Accepted) {
- // Get the section index.
- const int aSectionIndex = getCurrentSectionIndex();
-
- if (aSectionIndex >= 0) {
- // Update the point.
- const CurveCreator::Coordinates &aNewPoint = myPntEditDlg->getPoint();
-
- if (myDimension == CurveCreator::Dim3d) {
- aPntItem->setCoord(aNewPoint[0], aNewPoint[1], aNewPoint[2]);
- } else {
- aPntItem->setCoord(aNewPoint[0], aNewPoint[1]);
- }
-
- // Update curve
- const int aPntIndex = myPntsList->row(theItem);
-
- myEditor.setCoordinates(aNewPoint, aSectionIndex, aPntIndex);
-
- // Update undo/redo buttons.
- updateUndoRedoButtons();
- }
- }
- }
-}
-
-//=======================================================================
-// function: pntsAdd
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::pntsAdd()
-{
- const CurveCreator::Coordinates &aNewPoints = myEditPnts->getPoints();
- const int aNbCoords = aNewPoints.size();
-
- if (aNbCoords > 0 && aNbCoords % myDimension == 0) {
- // Get the section index.
- const int aSectionIndex = getCurrentSectionIndex();
-
- if (aSectionIndex >= 0) {
- // Update list.
- int i = 0;
-
- while (i < aNbCoords) {
- const CurveCreator::TypeCoord aX = aNewPoints[i++];
- const CurveCreator::TypeCoord aY = aNewPoints[i++];
-
- if (myDimension == CurveCreator::Dim3d) {
- const CurveCreator::TypeCoord aZ = aNewPoints[i++];
-
- new CurveCreator_PointItem(aX, aY, aZ, myPntsList);
- } else {
- new CurveCreator_PointItem(aX, aY, myPntsList);
- }
- }
-
- // Update curve
- myEditor.addPoints(aNewPoints, aSectionIndex);
- emit numberOfItemsChanged(myPntsList);
-
- // Update undo/redo buttons.
- updateUndoRedoButtons();
- }
- }
-}
-
-//=======================================================================
-// function: pntsInsert
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::pntsInsert()
-{
- const CurveCreator::Coordinates &aNewPoints = myEditPnts->getPoints();
- const int aNbCoords = aNewPoints.size();
-
- if (aNbCoords > 0 && aNbCoords % myDimension == 0) {
- // Get the section index.
- const int aSectionIndex = getCurrentSectionIndex();
-
- if (aSectionIndex >= 0) {
- // Get the selected point index.
- int aPntIndex = -1;
- QList<QListWidgetItem *> aListPnts = myPntsList->selectedItems();
-
- if (aListPnts.size() == 1) {
- aPntIndex = myPntsList->row(aListPnts.first());
- }
-
- // Update list.
- int i = 0;
- int aRow = aPntIndex;
-
- while (i < aNbCoords) {
- const CurveCreator::TypeCoord aX = aNewPoints[i++];
- const CurveCreator::TypeCoord aY = aNewPoints[i++];
- CurveCreator_PointItem *aNewItem = NULL;
-
- if (myDimension == CurveCreator::Dim3d) {
- const CurveCreator::TypeCoord aZ = aNewPoints[i++];
-
- aNewItem = new CurveCreator_PointItem(aX, aY, aZ);
- } else {
- aNewItem = new CurveCreator_PointItem(aX, aY);
- }
-
-
- if (aPntIndex < 0) {
- // Append point.
- myPntsList->addItem(aNewItem);
- } else {
- // Insert point.
- myPntsList->insertItem(aRow++, aNewItem);
- }
- }
-
- // Update curve
- myEditor.insertPoints(aNewPoints, aSectionIndex, aPntIndex);
- emit numberOfItemsChanged(myPntsList);
-
- // Update undo/redo buttons.
- updateUndoRedoButtons();
- }
- }
-}
-
-//=======================================================================
-// function: pntsRemove
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::pntsRemove()
-{
- QList<QListWidgetItem *> aListItems = myPntsList->selectedItems();
- const int aSectionIndex = getCurrentSectionIndex();
-
- if (aSectionIndex >= 0 && aListItems.size() > 0) {
- QList<int> aListRows;
-
- // Get items rows.
- foreach(QListWidgetItem *anItem, aListItems) {
- aListRows.append(myPntsList->row(anItem));
- }
-
- // Delete items.
- foreach(QListWidgetItem *anItem, aListItems) {
- delete anItem;
- }
-
- qSort(aListRows);
-
- // Delete points from curve.
- const int aNbPnts = aListRows.size();
- int aNbPntsRm = 1;
- int aCurRow = aListRows.last();
- int i;
-
- for (i = aNbPnts - 2; i >= 0; i--) {
- if (aListRows[i] == aCurRow - 1) {
- // This is the previous index.
- aCurRow--;
- aNbPntsRm++;
- } else {
- // This is not the previous index. Remove the current chain of points.
- myEditor.removePoints(aSectionIndex, aCurRow, aNbPntsRm);
- aCurRow = aListRows[i];
- aNbPntsRm = 1;
- }
- }
-
- // Remove last points.
- myEditor.removePoints(aSectionIndex, aCurRow, aNbPntsRm);
-
- emit numberOfItemsChanged(myPntsList);
-
- // Set the new selection.
- int aRow = aListRows.first();
-
- if (aRow >= myPntsList->count()) {
- aRow = myPntsList->count() - 1;
- }
-
- if (aRow >= 0) {
- myPntsList->item(aRow)->setSelected(true);
- }
-
- // Update undo/redo buttons.
- updateUndoRedoButtons();
- }
-}
-
-//=======================================================================
-// function: undo
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::undo()
-{
- if (myEditor.getNbUndo() > 0) {
- // Perform undo
- myEditor.undo();
-
- // Reinitialize required widgets.
- updateUndoRedo();
- }
-}
-
-//=======================================================================
-// function: redo
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::redo()
-{
- if (myEditor.getNbRedo() > 0) {
- // Perform undo
- myEditor.redo();
-
- // Reinitialize required widgets.
- updateUndoRedo();
- }
-}
+#include "CurveCreator_NewPointDlg.h"\r
+#include "CurveCreator_NewSectionDlg.h"\r
+#include "CurveCreator_TreeView.h"\r
+#include "CurveCreator_Widget.h"\r
+\r
+#include "CurveCreator.hxx"\r
+#include "CurveCreator_Curve.hxx"\r
+#include "CurveCreator_CurveEditor.hxx"\r
+\r
+#include <SUIT_Session.h>\r
+#include <SUIT_ResourceMgr.h>\r
+\r
+#include <QHBoxLayout>\r
+#include <QVBoxLayout>\r
+#include <QLabel>\r
+#include <QLineEdit>\r
+#include <QGroupBox>\r
+#include <QToolButton>\r
+#include <QToolBar>\r
+#include <QAction>\r
+#include <QMenu>\r
+#include <QPixmap>\r
+\r
+CurveCreator_Widget::CurveCreator_Widget(QWidget* parent,\r
+ CurveCreator_Curve *theCurve,\r
+ Qt::WindowFlags fl ) :\r
+ QWidget(parent), myNewPointEditor(NULL)\r
+{\r
+ myCurve = theCurve; \r
+ myEdit = new CurveCreator_CurveEditor( myCurve );\r
+\r
+ myNewPointEditor = new CurveCreator_NewPointDlg(myCurve->getDimension(), this);\r
+ connect( myNewPointEditor, SIGNAL(addPoint()), this, SLOT(onAddNewPoint()));\r
+\r
+ myNewSectionEditor = new CurveCreator_NewSectionDlg(this);\r
+ connect( myNewSectionEditor, SIGNAL(addSection()), this, SLOT(onAddNewSection()));\r
+\r
+/* QHBoxLayout* aNameLayout = new QHBoxLayout();\r
+ QLabel* aNameLabel = new QLabel(tr("CURVE_NAME_TLT"), this);\r
+ aNameLayout->addWidget(aNameLabel);\r
+ QLineEdit* aNameEdit = new QLineEdit(this);\r
+ aNameLayout->addWidget(aNameEdit); */\r
+\r
+ QGroupBox* aSectionGroup = new QGroupBox(tr("SECTION_GROUP_TLT"),this);\r
+\r
+ mySectionView = new CurveCreator_TreeView(myCurve, aSectionGroup);\r
+ connect( mySectionView, SIGNAL(selectionChanged()), this, SLOT( onSelectionChanged() ) );\r
+ connect( mySectionView, SIGNAL(pointEntered(int,int)), this, SLOT(onEditPoint(int,int)) );\r
+ connect( mySectionView, SIGNAL(sectionEntered(int)), this, SLOT(onEditSection(int)) );\r
+ connect( mySectionView, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(onContextMenu(QPoint)) );\r
+ QToolBar* aTB = new QToolBar(tr("TOOL_BAR_TLT"), aSectionGroup);\r
+// QToolButton* anUndoBtn = new QToolButton(aTB);\r
+\r
+ QPixmap anUndoImage(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_CC_UNDO")));\r
+ QAction* anAct = createAction( UNDO_ID, tr("UNDO"), anUndoImage, tr("UNDO_TLT"), QKeySequence(Qt::ControlModifier|Qt::Key_Z) );\r
+ aTB->addAction(anAct);\r
+\r
+ QPixmap aRedoImage(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_CC_REDO")));\r
+ anAct = createAction( REDO_ID, tr("REDO"), aRedoImage, tr("REDO_TLT"), QKeySequence(Qt::ControlModifier|Qt::Key_Y) );\r
+ aTB->addAction(anAct);\r
+\r
+ aTB->addSeparator();\r
+\r
+ QPixmap aNewSectImage(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_CC_NEW_SECTION")));\r
+ anAct = createAction( NEW_SECTION_ID, tr("NEW_SECTION"), aNewSectImage, tr("NEW_SECTION_TLT"), QKeySequence(Qt::ControlModifier|Qt::Key_N) );\r
+ connect(anAct, SIGNAL(triggered()), this, SLOT(onNewSection()) );\r
+ aTB->addAction(anAct);\r
+\r
+ anAct = createAction( INSERT_SECTION_BEFORE_ID, tr("INSERT_SECTION_BEFORE"), QPixmap(), tr("INSERT_SECTION_BEFORE_TLT"),\r
+ QKeySequence(Qt::ControlModifier | Qt::Key_Insert ) );\r
+ connect(anAct, SIGNAL(triggered()), this, SLOT(onInsertSectionBefore()) );\r
+\r
+ anAct = createAction( INSERT_SECTION_AFTER_ID, tr("INSERT_SECTION_AFTER"), QPixmap(), tr("INSERT_SECTION_AFTER_TLT"),\r
+ QKeySequence(Qt::ControlModifier | Qt::ShiftModifier | Qt::Key_Insert ) );\r
+ connect(anAct, SIGNAL(triggered()), this, SLOT(onInsertSectionAfter()) );\r
+\r
+ QPixmap aNewPointImage(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_CC_NEW_POINT")));\r
+ anAct = createAction( NEW_POINT_ID, tr("NEW_POINT"), aNewPointImage, tr("NEW_POINT_TLT"), QKeySequence(Qt::ControlModifier|Qt::Key_P) );\r
+ connect(anAct, SIGNAL(triggered()), this, SLOT(onNewPoint()) );\r
+ aTB->addAction(anAct);\r
+ aTB->addSeparator();\r
+\r
+ anAct = createAction( INSERT_POINT_BEFORE_ID, tr("INSERT_POINT_BEFORE"), QPixmap(), tr("INSERT_POINT_BEFORE_TLT"), QKeySequence(Qt::ControlModifier|Qt::Key_B) );\r
+ connect(anAct, SIGNAL(triggered()), this, SLOT(onInsertPointBefore()) );\r
+\r
+ anAct = createAction( INSERT_POINT_AFTER_ID, tr("INSERT_POINT_AFTER"), QPixmap(), tr("INSERT_POINT_AFTER_TLT"), QKeySequence(Qt::ControlModifier|Qt::Key_M) );\r
+ connect(anAct, SIGNAL(triggered()), this, SLOT(onInsertPointAfter()) );\r
+\r
+ anAct = createAction( CLOSE_SECTIONS_ID, tr("CLOSE_SECTIONS"), QPixmap(), tr("CLOSE_SECTIONS_TLT"), QKeySequence(Qt::ControlModifier|Qt::Key_W) );\r
+ connect(anAct, SIGNAL(triggered()), this, SLOT(onCloseSections()) );\r
+\r
+ anAct = createAction( UNCLOSE_SECTIONS_ID, tr("UNCLOSE_SECTIONS"), QPixmap(), tr("UNCLOSE_SECTIONS_TLT"), QKeySequence(Qt::ControlModifier|Qt::Key_S) );\r
+ connect(anAct, SIGNAL(triggered()), this, SLOT(onUncloseSections()) );\r
+\r
+ QPixmap aPolylineImage(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_CC_POLYLINE")));\r
+ anAct = createAction( SET_SECTIONS_POLYLINE_ID, tr("SET_SECTIONS_POLYLINE"), aPolylineImage, tr("SET_POLYLINE_TLT"), QKeySequence(Qt::ControlModifier|Qt::Key_E) );\r
+ connect(anAct, SIGNAL(triggered()), this, SLOT(onSetPolyline()) );\r
+\r
+ QPixmap aSplineImage(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_CC_SPLINE")));\r
+ anAct = createAction( SET_SECTIONS_SPLINE_ID, tr("SET_SECTIONS_SPLINE"), aSplineImage, tr("SET_SPLINE_TLT"), QKeySequence(Qt::ControlModifier|Qt::Key_R) );\r
+ connect(anAct, SIGNAL(triggered()), this, SLOT(onSetSpline()) );\r
+\r
+ QPixmap aRemoveImage(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_CC_DELETE")));\r
+ anAct = createAction( REMOVE_ID, tr("REMOVE"), aRemoveImage, tr("REMOVE_TLT"), QKeySequence(Qt::ControlModifier|Qt::Key_Delete ) );\r
+ connect(anAct, SIGNAL(triggered()), this, SLOT(onRemove()) );\r
+ aTB->addAction(anAct);\r
+ aTB->addSeparator();\r
+\r
+ QPixmap aJoinImage(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_CC_JOIN")));\r
+ anAct = createAction( JOIN_ID, tr("JOIN"), aJoinImage, tr("JOIN_TLT"), QKeySequence(Qt::ControlModifier|Qt::Key_Plus ) );\r
+ connect( anAct, SIGNAL(triggered()), this, SLOT(onJoin()) );\r
+ aTB->addAction(anAct);\r
+ aTB->addSeparator();\r
+\r
+ QPixmap aStepUpImage(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_CC_ARROW_UP")));\r
+ anAct = createAction( UP_ID, tr("STEP_UP"), aStepUpImage, tr("STEP_UP_TLT"), QKeySequence(Qt::ControlModifier|Qt::Key_Up ) );\r
+ connect( anAct, SIGNAL(triggered()), this, SLOT(onMoveUp()) );\r
+ aTB->addAction(anAct);\r
+\r
+ QPixmap aStepDownImage(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_CC_ARROW_DOWN")));\r
+ anAct = createAction( DOWN_ID, tr("STEP_DOWN"), aStepDownImage, tr("STEP_DOWN_TLT"), QKeySequence(Qt::ControlModifier|Qt::Key_Down ) );\r
+ connect( anAct, SIGNAL(triggered()), this, SLOT(onMoveDown()) );\r
+ aTB->addAction(anAct);\r
+\r
+ anAct = createAction( CLEAR_ALL_ID, tr("CLEAR_ALL"), QPixmap(), tr("CLEAR_ALL_TLT"), QKeySequence(Qt::ControlModifier | Qt::ShiftModifier | Qt::Key_Delete ) );\r
+ connect( anAct, SIGNAL(triggered()), this, SLOT( onClearAll()) );\r
+\r
+ anAct = createAction( JOIN_ALL_ID, tr("JOIN_ALL"), QPixmap(), tr("JOIN_ALL_TLT"), QKeySequence(Qt::ControlModifier | Qt::ShiftModifier | Qt::Key_Plus ) );\r
+ connect( anAct, SIGNAL(triggered()), this, SLOT(onJoinAll()) );\r
+\r
+ QVBoxLayout* aSectLayout = new QVBoxLayout();\r
+ aSectLayout->addWidget(aTB);\r
+ aSectLayout->addWidget(mySectionView);\r
+ aSectionGroup->setLayout(aSectLayout);\r
+ QVBoxLayout* aLay = new QVBoxLayout();\r
+// aLay->addLayout(aNameLayout);\r
+ aLay->addWidget(aSectionGroup);\r
+ setLayout(aLay);\r
+ onSelectionChanged();\r
+}\r
+\r
+void CurveCreator_Widget::onSelectionChanged()\r
+{\r
+ QList<ActionId> anEnabledAct;\r
+ anEnabledAct << NEW_SECTION_ID;\r
+ int aSectCnt = myCurve->getNbPoints();\r
+ if( aSectCnt > 0 )\r
+ anEnabledAct << CLEAR_ALL_ID;\r
+ if( aSectCnt > 1 )\r
+ anEnabledAct << JOIN_ALL_ID;\r
+ QList<int> aSelSections = mySectionView->getSelectedSections();\r
+ QList< QPair< int, int > > aSelPoints = mySectionView->getSelectedPoints();\r
+ CurveCreator_TreeView::SelectionType aSelType = mySectionView->getSelectionType();\r
+ switch( aSelType ){\r
+ case CurveCreator_TreeView::ST_NOSEL:{\r
+ break;\r
+ }\r
+ case CurveCreator_TreeView::ST_SECTIONS:{\r
+ if( aSelSections.size() > 1 ){\r
+ anEnabledAct << JOIN_ID;\r
+ }\r
+ if( aSelSections[0] > 0 ){\r
+ anEnabledAct << UP_ID;\r
+ }\r
+ if( aSelSections.size() == 1 ){\r
+ anEnabledAct << NEW_POINT_ID << INSERT_SECTION_BEFORE_ID << INSERT_SECTION_AFTER_ID;\r
+ }\r
+ if( aSelSections[ aSelSections.size() - 1 ] < ( myCurve->getNbSections() - 1 ) ){\r
+ anEnabledAct << DOWN_ID;\r
+ }\r
+ anEnabledAct << CLOSE_SECTIONS_ID << UNCLOSE_SECTIONS_ID << SET_SECTIONS_POLYLINE_ID << SET_SECTIONS_SPLINE_ID;\r
+ break;\r
+ }\r
+ case CurveCreator_TreeView::ST_POINTS_ONE_SECTION:{\r
+ if( aSelPoints[0].second > 0 ){\r
+ anEnabledAct << UP_ID;\r
+ }\r
+ int aLastIndex = aSelPoints.size()-1;\r
+ int aSect = aSelPoints[0].first;\r
+ if( aSelPoints[aLastIndex].second < (myCurve->getNbPoints(aSect) - 1)){\r
+ anEnabledAct << DOWN_ID;\r
+ }\r
+ if( aSelPoints.size() == 1){\r
+ anEnabledAct << INSERT_POINT_BEFORE_ID << INSERT_POINT_AFTER_ID;\r
+ }\r
+ break;\r
+ }\r
+ }\r
+ int aSelObjsCnt = aSelPoints.size() + aSelSections.size();\r
+ if( aSelObjsCnt > 0 ){\r
+ anEnabledAct << REMOVE_ID;\r
+ }\r
+ if( myCurve->getNbSections() > 0 ){\r
+ anEnabledAct << REMOVE_ALL_ID;\r
+ }\r
+ if( myCurve->getNbSections() > 1 ){\r
+ anEnabledAct << JOIN_ALL_ID;\r
+ }\r
+ QList<ActionId> anIds = myActionMap.keys();\r
+ for( int i = 0 ; i < anIds.size() ; i++ ){\r
+ if( myActionMap.contains(anIds[i]) ){\r
+ if( anEnabledAct.contains(anIds[i]) ){\r
+ myActionMap[anIds[i]]->setEnabled(true);\r
+ }\r
+ else{\r
+ myActionMap[anIds[i]]->setEnabled(false);\r
+ }\r
+ }\r
+ }\r
+}\r
+\r
+void CurveCreator_Widget::onNewPoint()\r
+{\r
+ mySection= -1;\r
+ myPointNum = -1;\r
+ QList<int> aSelSection = mySectionView->getSelectedSections();\r
+ if( aSelSection.size() > 0 ){\r
+ mySection = aSelSection[0];\r
+ }\r
+ else{\r
+ QList< QPair<int,int> > aSelPoints = mySectionView->getSelectedPoints();\r
+ if( aSelPoints.size() > 0 ){\r
+ mySection = aSelPoints[0].first;\r
+ myPointNum = aSelPoints[0].second + 1;\r
+ }\r
+ }\r
+ QString aSectName;\r
+ if( mySection < 0 ){\r
+ mySection = myCurve->getNbSections() - 1;\r
+ }\r
+ aSectName = QString::fromStdString( myCurve->getSectionName(mySection));\r
+ if( myPointNum < 0 ){\r
+ myPointNum = myCurve->getNbPoints(mySection);\r
+ }\r
+ myNewPointEditor->clear();\r
+ myNewPointEditor->setEditMode(false);\r
+ myNewPointEditor->setSectionName(aSectName);\r
+ if( myNewPointEditor->exec() == QDialog::Accepted ){\r
+ onAddNewPoint();\r
+ }\r
+}\r
+\r
+void CurveCreator_Widget::onAddNewPoint()\r
+{\r
+ CurveCreator::Coordinates aCoords = myNewPointEditor->getCoordinates();\r
+ myEdit->insertPoints(aCoords, mySection, myPointNum );\r
+ mySectionView->pointsAdded( mySection, myPointNum );\r
+ myNewPointEditor->clear();\r
+ myPointNum++;\r
+}\r
+\r
+void CurveCreator_Widget::onNewSection()\r
+{\r
+ myNewSectionEditor->clear();\r
+ myNewSectionEditor->setEditMode(false);\r
+ QString aSectName = QString( myCurve->getUnicSectionName().c_str() );\r
+ myNewSectionEditor->setSectionParameters(aSectName, true, CurveCreator::Polyline );\r
+ if( myNewSectionEditor->exec() == QDialog::Accepted ){\r
+ onAddNewSection();\r
+ }\r
+}\r
+\r
+void CurveCreator_Widget::onAddNewSection()\r
+{\r
+ CurveCreator::Coordinates aCoords;\r
+ myEdit->addSection( myNewSectionEditor->getName().toStdString(), myNewSectionEditor->getSectionType(),\r
+ myNewSectionEditor->isClosed(), aCoords );\r
+ mySectionView->sectionAdded( mySection );\r
+ QString aNewName = QString(myCurve->getUnicSectionName().c_str());\r
+ myNewSectionEditor->setSectionName(aNewName);\r
+ mySection++;\r
+}\r
+\r
+QAction* CurveCreator_Widget::createAction( ActionId theId, const QString& theName, \r
+ const QPixmap& theImage, const QString& theToolTip, \r
+ const QKeySequence& theShortcut )\r
+{\r
+ QAction* anAct = new QAction(theName,this);\r
+ if( !theImage.isNull() ){\r
+ anAct->setIcon(theImage);\r
+ }\r
+ anAct->setShortcut(theShortcut);\r
+ anAct->setToolTip(theToolTip);\r
+ myActionMap[theId] = anAct;\r
+ return anAct;\r
+}\r
+\r
+QAction* CurveCreator_Widget::getAction(ActionId theId)\r
+{\r
+ if( myActionMap.contains(theId) )\r
+ return myActionMap[theId];\r
+ return NULL;\r
+}\r
+\r
+void CurveCreator_Widget::onEditSection( int theSection )\r
+{\r
+ mySection = theSection;\r
+ QString aSectName = QString::fromStdString( myCurve->getSectionName(theSection));\r
+ bool isClosed = myCurve->isClosed(theSection);\r
+ CurveCreator::Type aType = myCurve->getType(theSection);\r
+ myNewSectionEditor->setEditMode(true);\r
+ myNewSectionEditor->setSectionParameters( aSectName, isClosed, aType );\r
+ if( myNewSectionEditor->exec() == QDialog::Accepted ){\r
+ QString aName = myNewSectionEditor->getName();\r
+ bool isClosed = myNewSectionEditor->isClosed();\r
+ CurveCreator::Type aSectType = myNewSectionEditor->getSectionType();\r
+ myEdit->setClosed( isClosed, mySection );\r
+ myEdit->setName( aName.toStdString(), mySection );\r
+ myEdit->setType( aSectType, mySection );\r
+ mySectionView->sectionChanged(mySection);\r
+ }\r
+}\r
+\r
+void CurveCreator_Widget::onEditPoint( int theSection, int thePoint )\r
+{\r
+ if( !myNewPointEditor ){\r
+ }\r
+ QString aSectName = QString::fromStdString( myCurve->getSectionName(theSection));\r
+ myNewPointEditor->setEditMode(true);\r
+ myNewPointEditor->setSectionName(aSectName);\r
+ CurveCreator::Coordinates aCoords = myCurve->getCoordinates(theSection,thePoint);\r
+ myNewPointEditor->setCoordinates(aCoords);\r
+ if( myNewPointEditor->exec() == QDialog::Accepted ){\r
+ aCoords = myNewPointEditor->getCoordinates();\r
+ myEdit->setCoordinates(aCoords, theSection, thePoint);\r
+ mySectionView->pointDataChanged(theSection, thePoint );\r
+ }\r
+}\r
+\r
+void CurveCreator_Widget::onJoin()\r
+{\r
+ QList<int> aSections = mySectionView->getSelectedSections();\r
+ if( aSections.size() == 0 ){\r
+ return;\r
+ }\r
+ int aMainSect = aSections[0];\r
+ int aMainSectSize = myCurve->getNbPoints(aMainSect);\r
+ for( int i = 1 ; i < aSections.size() ; i++ ){\r
+ int aSectNum = aSections[i] - (i-1);\r
+ myEdit->join( aMainSect, aSectNum );\r
+ mySectionView->sectionsRemoved( aSectNum );\r
+ }\r
+ int aNewSectSize = myCurve->getNbPoints(aMainSect);\r
+ if( aNewSectSize != aMainSectSize )\r
+ mySectionView->pointsAdded( aMainSect, aMainSectSize, aNewSectSize-aMainSectSize );\r
+}\r
+\r
+void CurveCreator_Widget::onRemove()\r
+{\r
+ QList< QPair<int,int> > aSelPoints = mySectionView->getSelectedPoints();\r
+ int aCurrSect=-1;\r
+ int aRemoveCnt = 0;\r
+ for( int i = 0 ; i < aSelPoints.size() ; i++ ){\r
+ if( aCurrSect != aSelPoints[i].first ){\r
+ aRemoveCnt = 0;\r
+ aCurrSect = aSelPoints[i].first;\r
+ }\r
+ int aPntIndx = aSelPoints[i].second - aRemoveCnt;\r
+ myEdit->removePoints(aCurrSect,aPntIndx, 1);\r
+ mySectionView->pointsRemoved( aCurrSect, aPntIndx );\r
+ aRemoveCnt++;\r
+ }\r
+ QList<int> aSections = mySectionView->getSelectedSections();\r
+ for( int i = 0 ; i < aSections.size() ; i++ ){\r
+ int aSectNum = aSections[i] - (i);\r
+ myEdit->removeSection( aSectNum );\r
+ mySectionView->sectionsRemoved( aSectNum );\r
+ }\r
+ mySectionView->clearSelection();\r
+}\r
+\r
+void CurveCreator_Widget::onMoveUp()\r
+{\r
+ if( mySectionView->getSelectionType() == CurveCreator_TreeView::ST_SECTIONS ){\r
+//Move sections\r
+ QList<int> aSections = mySectionView->getSelectedSections();\r
+ for( int i = 0 ; i < aSections.size() ; i++ ){\r
+ int anIndx = aSections[i];\r
+ myEdit->moveSection( anIndx, anIndx-1);\r
+ mySectionView->sectionsSwapped( anIndx, -1 );\r
+ }\r
+ }\r
+ else{\r
+//Move points\r
+ QList< QPair<int,int> > aPoints = mySectionView->getSelectedPoints();\r
+ for( int i = 0 ; i < aPoints.size() ; i++ ){\r
+ int aSection = aPoints[i].first;\r
+ int aPoint = aPoints[i].second;\r
+ myEdit->movePoint(aSection, aPoint, aPoint-2);\r
+ mySectionView->pointsSwapped( aSection, aPoint, -1 );\r
+ }\r
+ }\r
+}\r
+\r
+void CurveCreator_Widget::onMoveDown()\r
+{\r
+ if( mySectionView->getSelectionType() == CurveCreator_TreeView::ST_SECTIONS ){\r
+//Move sections\r
+ QList<int> aSections = mySectionView->getSelectedSections();\r
+ for( int i = aSections.size()-1 ; i >=0 ; i-- ){\r
+ int anIndx = aSections[i];\r
+ myEdit->moveSection( anIndx, anIndx+1);\r
+ mySectionView->sectionsSwapped( anIndx, 1 );\r
+ }\r
+ }\r
+ else{\r
+//Move points\r
+ QList< QPair<int,int> > aPoints = mySectionView->getSelectedPoints();\r
+ for( int i = aPoints.size() - 1; i >= 0 ; i-- ){\r
+ int aSection = aPoints[i].first;\r
+ int aPoint = aPoints[i].second;\r
+ myEdit->movePoint(aSection, aPoint, aPoint+1);\r
+ mySectionView->pointsSwapped( aSection, aPoint, 1 );\r
+ }\r
+ }\r
+}\r
+\r
+void CurveCreator_Widget::onClearAll()\r
+{\r
+ myEdit->clear();\r
+ mySectionView->reset();\r
+ onSelectionChanged();\r
+}\r
+\r
+void CurveCreator_Widget::onJoinAll()\r
+{\r
+ myEdit->join();\r
+ mySectionView->reset();\r
+ onSelectionChanged();\r
+}\r
+\r
+void CurveCreator_Widget::onInsertSectionBefore()\r
+{\r
+\r
+}\r
+\r
+void CurveCreator_Widget::onInsertSectionAfter()\r
+{\r
+\r
+}\r
+\r
+void CurveCreator_Widget::onInsertPointBefore()\r
+{\r
+\r
+}\r
+\r
+void CurveCreator_Widget::onInsertPointAfter()\r
+{\r
+\r
+}\r
+\r
+void CurveCreator_Widget::onUndoSettings()\r
+{\r
+\r
+}\r
+\r
+void CurveCreator_Widget::onSetSpline()\r
+{\r
+ QList<int> aSelSections = mySectionView->getSelectedSections();\r
+ for( int i = 0 ; i < aSelSections.size() ; i++ ){\r
+ myEdit->setType(CurveCreator::BSpline, aSelSections[i]);\r
+ mySectionView->sectionChanged(aSelSections[i]);\r
+ }\r
+}\r
+\r
+void CurveCreator_Widget::onSetPolyline()\r
+{\r
+ QList<int> aSelSections = mySectionView->getSelectedSections();\r
+ for( int i = 0 ; i < aSelSections.size() ; i++ ){\r
+ myEdit->setType(CurveCreator::Polyline, aSelSections[i]);\r
+ mySectionView->sectionChanged(aSelSections[i]);\r
+ }\r
+}\r
+\r
+void CurveCreator_Widget::onCloseSections()\r
+{\r
+ QList<int> aSelSections = mySectionView->getSelectedSections();\r
+ for( int i = 0 ; i < aSelSections.size() ; i++ ){\r
+ myEdit->setClosed(true, aSelSections[i]);\r
+ mySectionView->sectionChanged(aSelSections[i]);\r
+ }\r
+}\r
+\r
+void CurveCreator_Widget::onUncloseSections()\r
+{\r
+ QList<int> aSelSections = mySectionView->getSelectedSections();\r
+ for( int i = 0 ; i < aSelSections.size() ; i++ ){\r
+ myEdit->setClosed(false, aSelSections[i]);\r
+ mySectionView->sectionChanged(aSelSections[i]);\r
+ }\r
+}\r
+\r
+void CurveCreator_Widget::onContextMenu( QPoint thePoint )\r
+{\r
+ QList<ActionId> aContextActions;\r
+ aContextActions << CLEAR_ALL_ID << JOIN_ALL_ID << SEPARATOR_ID <<\r
+ INSERT_SECTION_BEFORE_ID << INSERT_SECTION_AFTER_ID << SEPARATOR_ID <<\r
+ CLOSE_SECTIONS_ID << UNCLOSE_SECTIONS_ID << SET_SECTIONS_POLYLINE_ID <<\r
+ SET_SECTIONS_SPLINE_ID << SEPARATOR_ID <<\r
+ INSERT_POINT_BEFORE_ID << INSERT_POINT_AFTER_ID;\r
+ QPoint aGlPoint = mySectionView->mapToGlobal(thePoint);\r
+ bool isVis = false;\r
+ QList<ActionId> aResAct;\r
+ for( int i = 0 ; i < aContextActions.size() ; i++ ){\r
+ if( aContextActions[i] != SEPARATOR_ID ){\r
+ if( myActionMap.contains(aContextActions[i]) ){\r
+ QAction* anAct = myActionMap[aContextActions[i]];\r
+ if( anAct->isEnabled() ){\r
+ aResAct << aContextActions[i];\r
+ isVis = true;\r
+ }\r
+ }\r
+ }\r
+ else{\r
+ aResAct << SEPARATOR_ID;\r
+ }\r
+ }\r
+ if( !isVis )\r
+ return;\r
+\r
+ QMenu* aMenu = new QMenu(this);\r
+ for( int i = 0 ; i < aResAct.size() ; i++ ){\r
+ if( aResAct[i] == SEPARATOR_ID ){\r
+ aMenu->addSeparator();\r
+ }\r
+ else{\r
+ QAction* anAct = myActionMap[aResAct[i]];\r
+ aMenu->insertAction(NULL, anAct);\r
+ }\r
+ }\r
+ aMenu->exec(aGlPoint);\r
+}\r