X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROCurveCreator%2FCurveCreator_Widget.cxx;h=b595c2217d16d73f6481aae0e861c8dc92027260;hb=09d10e66ba0fac5353c8d1f138055fc6fe86fb65;hp=28f7c5b5a3a523fe2bd7ea1719cb3780b6049952;hpb=97c743a2841f1a7985dcbe9a8532ae94e0825f22;p=modules%2Fhydro.git diff --git a/src/HYDROCurveCreator/CurveCreator_Widget.cxx b/src/HYDROCurveCreator/CurveCreator_Widget.cxx index 28f7c5b5..b595c221 100644 --- a/src/HYDROCurveCreator/CurveCreator_Widget.cxx +++ b/src/HYDROCurveCreator/CurveCreator_Widget.cxx @@ -79,6 +79,7 @@ CurveCreator_Widget::CurveCreator_Widget(QWidget* parent, CurveCreator_ICurve *theCurve, const int theActionFlags, + const QStringList& theCoordTitles, Qt::WindowFlags fl, int theLocalPointRowLimit ) : QWidget(parent), myNewSectionEditor(NULL), myCurve(theCurve), mySection(0), @@ -95,11 +96,12 @@ CurveCreator_Widget::CurveCreator_Widget(QWidget* parent, QGroupBox* aSectionGroup = new QGroupBox(tr("Sections"),this); mySectionView = new CurveCreator_TreeView(myCurve, aSectionGroup); + mySectionView->setSelectionMode( QTreeView::ExtendedSelection ); connect( mySectionView, SIGNAL(selectionChanged()), this, SLOT( onSelectionChanged() ) ); connect( mySectionView, SIGNAL(sectionEntered(int)), this, SLOT(onEditSection(int)) ); connect( mySectionView, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(onContextMenu(QPoint)) ); - myLocalPointView = new CurveCreator_TableView( myCurve, this ); + myLocalPointView = new CurveCreator_TableView( myCurve, this, theCoordTitles ); connect( myLocalPointView, SIGNAL( cellChanged( int, int ) ), this, SLOT( onCellChanged( int, int ) ) ); @@ -185,22 +187,20 @@ CurveCreator_Widget::CurveCreator_Widget(QWidget* parent, connect(anAct, SIGNAL(triggered()), this, SLOT(onRemove()) ); aTB->addAction(anAct); - // TODO join - //aTB->addSeparator(); + aTB->addSeparator(); - //anAct = createAction( JOIN_ID, tr("JOIN"), aJoinPixmap, tr("JOIN_TLT"), - // QKeySequence(Qt::ControlModifier|Qt::Key_Plus ) ); - //connect( anAct, SIGNAL(triggered()), this, SLOT(onJoin()) ); - //aTB->addAction(anAct); + anAct = createAction( JOIN_ID, tr("JOIN"), aJoinPixmap, tr("JOIN_TLT"), + QKeySequence(Qt::ControlModifier|Qt::Key_Plus ) ); + connect( anAct, SIGNAL(triggered()), this, SLOT(onJoin()) ); + aTB->addAction(anAct); anAct = createAction( CLEAR_ALL_ID, tr("CLEAR_ALL"), QPixmap(), tr("CLEAR_ALL_TLT"), QKeySequence(Qt::ControlModifier | Qt::ShiftModifier | Qt::Key_Delete ) ); connect( anAct, SIGNAL(triggered()), this, SLOT( onClearAll()) ); - // TODO join - //anAct = createAction( JOIN_ALL_ID, tr("JOIN_ALL"), QPixmap(), tr("JOIN_ALL_TLT"), - // QKeySequence(Qt::ControlModifier | Qt::ShiftModifier | Qt::Key_Plus ) ); - //connect( anAct, SIGNAL(triggered()), this, SLOT(onJoinAll()) ); + anAct = createAction( JOIN_ALL_ID, tr("JOIN_ALL"), QPixmap(), tr("JOIN_ALL_TLT"), + QKeySequence(Qt::ControlModifier | Qt::ShiftModifier | Qt::Key_Plus ) ); + connect( anAct, SIGNAL(triggered()), this, SLOT(onJoinAll()) ); QVBoxLayout* aSectLayout = new QVBoxLayout(); aSectLayout->setMargin( 5 ); @@ -344,7 +344,6 @@ void CurveCreator_Widget::updateActionsStates() if ( removeEnabled() ) anEnabledAct << REMOVE_ID; QList aSelSections = mySectionView->getSelectedSections(); - QList< QPair< int, int > > aSelPoints = mySectionView->getSelectedPoints(); CurveCreator_TreeView::SelectionType aSelType = mySectionView->getSelectionType(); switch( aSelType ){ case CurveCreator_TreeView::ST_NOSEL:{ @@ -369,22 +368,31 @@ void CurveCreator_Widget::updateActionsStates() } break; case ModificationMode: { - anEnabledAct << CLOSE_SECTIONS_ID << UNCLOSE_SECTIONS_ID << SET_SECTIONS_POLYLINE_ID << SET_SECTIONS_SPLINE_ID; + if ( myNewSectionEditor->isEnableClosed() ) + anEnabledAct << CLOSE_SECTIONS_ID << UNCLOSE_SECTIONS_ID; + anEnabledAct << SET_SECTIONS_POLYLINE_ID << SET_SECTIONS_SPLINE_ID; int aSectCnt = myCurve->getNbSections(); if( aSectCnt > 0 ) anEnabledAct << CLEAR_ALL_ID; - // TODO - //if( aSectCnt > 1 ) - // anEnabledAct << JOIN_ALL_ID; - //if( aSelSections.size() > 1 ){ - // anEnabledAct << JOIN_ID; - //} + if( aSectCnt > 1 ) + anEnabledAct << JOIN_ALL_ID; + if( aSelSections.size() > 1 ){ + anEnabledAct << JOIN_ID; + } } break; case DetectionMode: { } break; case NoneMode: + { + int aSectCnt = myCurve->getNbSections(); + if( aSectCnt > 1 ) + anEnabledAct << JOIN_ALL_ID; + if( aSelSections.size() > 1 ) + anEnabledAct << JOIN_ID; + } + break; default: break; } @@ -417,10 +425,9 @@ void CurveCreator_Widget::updateActionsStates() if( (myCurve->getNbSections() + myCurve->getNbPoints()) > 0 ){ anEnabledAct << REMOVE_ALL_ID; }*/ - // TODO - //if( myCurve->getNbSections() > 1 ){ - // anEnabledAct << JOIN_ALL_ID; - //} + if( myCurve->getNbSections() > 1 ){ + anEnabledAct << JOIN_ALL_ID; + } } QList anIds = myActionMap.keys(); for( int i = 0 ; i < anIds.size() ; i++ ){ @@ -450,13 +457,6 @@ void CurveCreator_Widget::onAdditionMode(bool checked) if( aSelSection.size() > 0 ){ mySection = aSelSection[0]; } - else{ - QList< QPair > aSelPoints = mySectionView->getSelectedPoints(); - if( aSelPoints.size() > 0 ){ - mySection = aSelPoints[0].first; - myPointNum = aSelPoints[0].second + 1; - } - } // emit subOperationStarted( myNewPointEditor ); } @@ -578,50 +578,6 @@ QAction* CurveCreator_Widget::getAction( ActionMode theMode ) return anAction; } -void CurveCreator_Widget::setActionMode( const ActionMode& theMode ) -{ - ActionMode aPrevMode = getActionMode(); - QAction* aPrevAction = getAction( aPrevMode ); - switch ( theMode ) { - case NoneMode: { - if ( aPrevAction ) { - if ( aPrevAction->isChecked() ) - aPrevAction->setChecked( false ); - } - if ( aPrevMode == ModificationMode ) - onModificationMode( false ); - if ( aPrevMode == AdditionMode ) - onAdditionMode( false ); - } - break; - case AdditionMode: { - // TODO - } - break; - case ModificationMode: - { - //TODO - } - break; - case DetectionMode: - break; - } -} - -CurveCreator_Widget::ActionMode CurveCreator_Widget::getActionMode() const -{ - ActionMode aMode = NoneMode; - - if ( myActionMap[ADDITION_MODE_ID]->isChecked() ) - aMode = AdditionMode; - else if ( myActionMap[MODIFICATION_MODE_ID]->isChecked() ) - aMode = ModificationMode; - else if ( myActionMap[DETECTION_MODE_ID]->isChecked() ) - aMode = DetectionMode; - - return aMode; -} - void CurveCreator_Widget::onEditSection( int theSection ) { if( !myCurve ) @@ -668,16 +624,26 @@ void CurveCreator_Widget::onJoin() } stopActionMode(); - int aMainSect = aSections[0]; - int aMainSectSize = myCurve->getNbPoints(aMainSect); - for( int i = 1 ; i < aSections.size() ; i++ ){ - int aSectNum = aSections[i] - (i-1); - myCurve->join( aMainSect, aSectNum ); - mySectionView->sectionsRemoved( aSectNum ); + std::list aSectionsToJoin; + for( int i = 0; i < aSections.size() ; i++ ){ + aSectionsToJoin.push_back( aSections[i] ); } + //int aMainSect = aSectionsToJoin.front(); + //int aMainSectSize = myCurve->getNbPoints(aMainSect); + if ( myCurve->join( aSectionsToJoin ) ) + { + std::list::const_iterator anIt = aSectionsToJoin.begin(), + aLast = aSectionsToJoin.end(); + // the first section should be skipped. It is not removed, but is modified + anIt++; + for ( ; anIt != aLast; anIt++ ) + mySectionView->sectionsRemoved( *anIt ); + } + + /* The update for the points of the main section int aNewSectSize = myCurve->getNbPoints(aMainSect); if( aNewSectSize != aMainSectSize ) - mySectionView->pointsAdded( aMainSect, aMainSectSize, aNewSectSize-aMainSectSize ); + mySectionView->pointsAdded( aMainSect, aMainSectSize, aNewSectSize-aMainSectSize );*/ updateUndoRedo(); } @@ -714,7 +680,13 @@ void CurveCreator_Widget::onJoinAll() if( !myCurve ) return; stopActionMode(); - myCurve->join(); + + std::list aSectionsToJoin; + for( int i = 0, aNb = myCurve->getNbSections(); i < aNb ; i++ ){ + aSectionsToJoin.push_back( i ); + } + bool aRes = myCurve->join( aSectionsToJoin ); + mySectionView->reset(); updateActionsStates(); updateUndoRedo(); @@ -827,7 +799,7 @@ void CurveCreator_Widget::updateUndoRedo() void CurveCreator_Widget::onContextMenu( QPoint thePoint ) { QList aContextActions; - aContextActions << CLEAR_ALL_ID << JOIN_ALL_ID << SEPARATOR_ID << + aContextActions << CLEAR_ALL_ID << JOIN_ID << JOIN_ALL_ID << SEPARATOR_ID << CLOSE_SECTIONS_ID << UNCLOSE_SECTIONS_ID << SET_SECTIONS_POLYLINE_ID << SET_SECTIONS_SPLINE_ID; QPoint aGlPoint = mySectionView->mapToGlobal(thePoint); @@ -868,9 +840,11 @@ QList CurveCreator_Widget::getSelectedSections() return mySectionView->getSelectedSections(); } -QList< QPair< int, int > > CurveCreator_Widget::getSelectedPoints() +void CurveCreator_Widget::setSelectedSections( const QList& theSections ) { - return mySectionView->getSelectedPoints(); + mySectionView->setSelectedSections( theSections ); + updateActionsStates(); + updateUndoRedo(); } /** @@ -896,6 +870,55 @@ bool CurveCreator_Widget::removeEnabled() return isEnabled; } +void CurveCreator_Widget::setActionMode( const ActionMode& theMode ) +{ + ActionMode aPrevMode = getActionMode(); + QAction* aPrevAction = getAction( aPrevMode ); + QAction* anAction = getAction( theMode ); + switch ( theMode ) { + case NoneMode: + case AdditionMode: { + if ( aPrevAction ) { + if ( aPrevAction->isChecked() ) { + aPrevAction->setChecked( false ); + } + } + if ( aPrevMode == ModificationMode ) + onModificationMode( false ); + if ( aPrevMode == AdditionMode ) + onAdditionMode( false ); + + if ( theMode == AdditionMode ) + { + anAction->setChecked( true ); + onModeChanged( true ); + } + } + break; + break; + case ModificationMode: + { + //TODO + } + break; + case DetectionMode: + break; + } +} + +CurveCreator_Widget::ActionMode CurveCreator_Widget::getActionMode() const +{ + ActionMode aMode = NoneMode; + + if ( myActionMap[ADDITION_MODE_ID]->isChecked() ) + aMode = AdditionMode; + else if ( myActionMap[MODIFICATION_MODE_ID]->isChecked() ) + aMode = ModificationMode; + else if ( myActionMap[DETECTION_MODE_ID]->isChecked() ) + aMode = DetectionMode; + + return aMode; +} //================================================================================= // function : GeometryGUI::addCoordsByClick() @@ -944,6 +967,9 @@ void CurveCreator_Widget::onMousePress( SUIT_ViewWindow*, QMouseEvent* theEvent if ( theEvent->button() != Qt::LeftButton ) return; + myPressedX = theEvent->x(); + myPressedY = theEvent->y(); + switch( getActionMode() ) { case ModificationMode: { //store initial cursor position for Drag&Drop @@ -972,7 +998,7 @@ void CurveCreator_Widget::onMouseRelease( SUIT_ViewWindow*, QMouseEvent* theEven if ( myDragStarted ) { bool isDragged = myDragged; CurveCreator_ICurve::SectionToPointList aDraggedPoints; - CurveCreator_ICurve::SectionToPointCoordsList anInitialDragPointsCoords; + QMap > anInitialDragPointsCoords; if ( myDragged ) { aDraggedPoints = myDragPoints; anInitialDragPointsCoords = myInitialDragPointsCoords; @@ -981,7 +1007,31 @@ void CurveCreator_Widget::onMouseRelease( SUIT_ViewWindow*, QMouseEvent* theEven setDragStarted( false ); if ( aDraggedPoints.size() > 0 ) { + // Collect old coordinates of the dragged points + CurveCreator_ICurve::SectionToPointCoordsList anOldPoints; + foreach ( const CurveCreator_ICurve::SectionToPoint aSectionToPoint, anInitialDragPointsCoords.keys() ) { + CurveCreator::Coordinates aCoords = anInitialDragPointsCoords.value( aSectionToPoint ); + anOldPoints.push_back( std::make_pair( aSectionToPoint, aCoords ) ); + } + if ( myCurve->canPointsBeSorted() ) { + // Add old coordinates of the curve points (except the dragged points) to the list + for( int aSectionId = 0 ; aSectionId < myCurve->getNbSections() ; aSectionId++ ) { + CurveCreator::Coordinates aCoords; + for ( int aPointId = 0, aNb = myCurve->getNbPoints( aSectionId ); aPointId < aNb; aPointId++ ) { + aCoords = myCurve->getPoint( aSectionId, aPointId ); + if ( aCoords.size() < 2 ) { + continue; + } + + CurveCreator_ICurve::SectionToPoint aSectionToPoint = std::make_pair( aSectionId, aPointId ); + + if ( !anInitialDragPointsCoords.contains( aSectionToPoint ) ) { + anOldPoints.push_back( std::make_pair( aSectionToPoint, aCoords ) ); + } + } + } + // Apply points sorting CurveCreator_ICurve::SectionToPointList aPoints; startCurveModification( aPoints, false ); @@ -1005,22 +1055,26 @@ void CurveCreator_Widget::onMouseRelease( SUIT_ViewWindow*, QMouseEvent* theEven finishCurveModification( aDraggedPoints ); } else { // if the drag of some points has happened, restore the drag selection - if ( aDraggedPoints.size() > 0 ) { - START_MEASURE_TIME; - setSelectedPoints( aDraggedPoints ); - END_MEASURE_TIME( "drop" ); - } + START_MEASURE_TIME; + setSelectedPoints( aDraggedPoints ); + END_MEASURE_TIME( "drop" ); } // Save drag difference - myCurve->saveCoordDiff( anInitialDragPointsCoords ); + myCurve->saveCoordDiff( anOldPoints ); } } else // check whether the segment is clicked an a new point should be added to the segment - insertPointToSelectedSegment( theEvent->pos().x(), theEvent->pos().y() ); + { + int aReleasedX = theEvent->x(); + int aReleasedY = theEvent->y(); + if ( myPressedX == aReleasedX && myPressedY == aReleasedY ) + insertPointToSelectedSegment( aReleasedX, aReleasedY ); + } // updates the input panel table to show the selected point coordinates updateLocalPointView(); + updateUndoRedo(); } /** @@ -1097,19 +1151,6 @@ void CurveCreator_Widget::removeSection() { stopActionMode(); - QList< QPair > aSelPoints = mySectionView->getSelectedPoints(); - int aCurrSect=-1; - int aRemoveCnt = 0; - for( int i = 0 ; i < aSelPoints.size() ; i++ ){ - if( aCurrSect != aSelPoints[i].first ){ - aRemoveCnt = 0; - aCurrSect = aSelPoints[i].first; - } - int aPntIndx = aSelPoints[i].second - aRemoveCnt; - myCurve->removePoint( aCurrSect, aPntIndx ); - mySectionView->pointsRemoved( aCurrSect, aPntIndx ); - aRemoveCnt++; - } QList aSections = mySectionView->getSelectedSections(); for( int i = 0 ; i < aSections.size() ; i++ ){ int aSectNum = aSections[i] - (i); @@ -1186,6 +1227,7 @@ void CurveCreator_Widget::insertPointToSelectedSegment( const int theX, CurveCreator_ICurve::SectionToPointList::const_iterator anIt = aPoints1.begin(), aLast = aPoints1.end(); int aSectionId = -1; + // find the indices of the neighbour point // there can be a case when a new point is added into two sections int aPoint1Id = -1, aPoint2Id = -1; for ( ; anIt != aLast && aSectionId < 0; anIt++ ) { @@ -1248,9 +1290,7 @@ void CurveCreator_Widget::moveSelectedPoints( const int theXPosition, // Remember drag points coordinates if ( !myDragged ) { - myInitialDragPointsCoords.push_back( - std::make_pair(std::make_pair( aSectionId, aPointId ), - aChangedPos )); + myInitialDragPointsCoords.insert( std::make_pair( aSectionId, aPointId ), aChangedPos ); } aChangedPos[0] = aChangedPos[0] - aXDelta; @@ -1282,11 +1322,8 @@ void CurveCreator_Widget::updateLocalPointView() if ( !isRowLimit ) { bool isBlocked = myLocalPointView->blockSignals(true); - myLocalPointView->setRowCount( 0 ); - CurveCreator_ICurve::SectionToPointList::const_iterator anIt = myLocalPoints.begin(), - aLast = myLocalPoints.end(); - for ( ; anIt != aLast; anIt++ ) - myLocalPointView->addLocalPointToTable( *anIt ); + + myLocalPointView->setLocalPointsToTable( myLocalPoints ); myLocalPointView->blockSignals( isBlocked ); }