X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FDependencyTree%2FDependencyTree_View.cxx;h=2164574db669c68983c5514d8d984bb2765872aa;hb=8422ddce7f07cce7117b80c6c8e26fb0bd8cbe78;hp=5d1323278c0f72763511a94e8249c568aa623c41;hpb=66d16d30f7a96a46754373ad9e8957418c3f4b95;p=modules%2Fgeom.git diff --git a/src/DependencyTree/DependencyTree_View.cxx b/src/DependencyTree/DependencyTree_View.cxx index 5d1323278..2164574db 100644 --- a/src/DependencyTree/DependencyTree_View.cxx +++ b/src/DependencyTree/DependencyTree_View.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2014 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2014-2016 CEA/DEN, EDF R&D, OPEN CASCADE // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -17,40 +17,33 @@ // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // +// Internal includes #include "DependencyTree_View.h" #include "DependencyTree_Object.h" #include "DependencyTree_Arrow.h" -#include -#include -#include - // GUI includes #include #include #include #include #include -#include +#include + +// GEOM includes +#include // Qt includes -#include #include -#include - -#define DRAW_EVENT ( QEvent::User + 1 ) - -#include +#include +#include DependencyTree_View::DependencyTree_View( QWidget* theParent ) -:GraphicsView_ViewPort(theParent), +:GraphicsView_ViewPort( theParent ), +myLevelsNumber(0), myMaxDownwardLevelsNumber(0), myMaxUpwardLevelsNumber(0), -myLevelsNumber(0), -myIsCompute(false), -myIsUpdate( true ), -myTotalCost(0), -myComputedCost(0) +myIsUpdate( true ) { SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() ); if ( !app ) return; @@ -61,33 +54,36 @@ myComputedCost(0) mySelectionMgr = app->selectionMgr(); if ( !mySelectionMgr ) return; + myMainEntries = new GEOM::string_array(); + getNewTreeModel(); } DependencyTree_View::~DependencyTree_View() { + clearView( true ); } +//================================================================================= +// function : init() +// purpose : this method is obligatory for initialize view frame actions +//================================================================================= void DependencyTree_View::init( GraphicsView_ViewFrame* theViewFrame ) { - qthread = new DependencyTree_ComputeDlg_QThread( this ); - - SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); - myNodesMovable = new QCheckBox( tr( "MOVE_NODES" ) ); QWidgetAction* nodesMovableAction = new QWidgetAction( theViewFrame ); nodesMovableAction->setDefaultWidget( myNodesMovable ); myDisplayAscendants = new QCheckBox( tr( "DISPLAY_ASCENDANTS" ) ); - QWidgetAction* ShowParentsAction = new QWidgetAction( theViewFrame ); - ShowParentsAction->setDefaultWidget( myDisplayAscendants ); + QWidgetAction* displayAscendantsAction = new QWidgetAction( theViewFrame ); + displayAscendantsAction->setDefaultWidget( myDisplayAscendants ); myDisplayDescendants = new QCheckBox(tr("DISPLAY_DESCENDANTS")); - QWidgetAction* ShowChildrenAction = new QWidgetAction(theViewFrame); - ShowChildrenAction->setDefaultWidget( myDisplayDescendants ); + QWidgetAction* displayDescendantsAction = new QWidgetAction( theViewFrame ); + displayDescendantsAction->setDefaultWidget( myDisplayDescendants ); QLabel* hierarchyDepthLabel = new QLabel( tr( "HIERARCHY_DEPTH" ) ); - QWidgetAction* hierarchyDepthLabelAction = new QWidgetAction(theViewFrame); + QWidgetAction* hierarchyDepthLabelAction = new QWidgetAction( theViewFrame ); hierarchyDepthLabelAction->setDefaultWidget( hierarchyDepthLabel ); myLevelsNumber = checkMaxLevelsNumber(); @@ -103,198 +99,112 @@ void DependencyTree_View::init( GraphicsView_ViewFrame* theViewFrame ) QWidgetAction* updateAction = new QWidgetAction( theViewFrame ); updateAction->setDefaultWidget( updateButton ); - QPushButton* cancelButton = new QPushButton( tr( "CANCEL" ) ); - cancelButton->setCheckable( true ); - cancelAction = new QWidgetAction( theViewFrame ); - cancelAction->setDefaultWidget( cancelButton ); - cancelAction->setVisible( false ); - - QProgressBar* progressBar = new QProgressBar( this ); - progressBar->setMinimum( 0 ); - progressBar->setMaximum( 100 ); - progressBar->setFixedWidth( 100 ); - progressAction = new QWidgetAction( theViewFrame ); - progressAction->setDefaultWidget( progressBar ); - progressAction->setVisible( false ); - QAction* separator1 = theViewFrame->toolMgr()->separator( false ); QAction* separator2 = theViewFrame->toolMgr()->separator( false ); theViewFrame->toolMgr()->append( separator1, theViewFrame->getToolBarId() ); - theViewFrame->toolMgr()->append( nodesMovableAction, theViewFrame->getToolBarId() ); theViewFrame->toolMgr()->append( hierarchyDepthLabelAction, theViewFrame->getToolBarId() ); theViewFrame->toolMgr()->append( hierarchyDepthAction, theViewFrame->getToolBarId() ); - theViewFrame->toolMgr()->append( ShowParentsAction, theViewFrame->getToolBarId() ); - theViewFrame->toolMgr()->append( ShowChildrenAction, theViewFrame->getToolBarId() ); + theViewFrame->toolMgr()->append( displayAscendantsAction, theViewFrame->getToolBarId() ); + theViewFrame->toolMgr()->append( displayDescendantsAction, theViewFrame->getToolBarId() ); + theViewFrame->toolMgr()->append( nodesMovableAction, theViewFrame->getToolBarId() ); theViewFrame->toolMgr()->append( separator2, theViewFrame->getToolBarId() ); theViewFrame->toolMgr()->append( updateAction, theViewFrame->getToolBarId() ); - theViewFrame->toolMgr()->append( progressAction, theViewFrame->getToolBarId() ); - theViewFrame->toolMgr()->append( cancelAction, theViewFrame->getToolBarId() ); connect( myNodesMovable, SIGNAL( toggled( bool ) ), this, SLOT( onMoveNodes( bool ) ) ); connect( myHierarchyDepth, SIGNAL( valueChanged ( int ) ), this, SLOT( onHierarchyType() ) ); connect( myDisplayAscendants , SIGNAL( toggled( bool ) ), this, SLOT( onHierarchyType() ) ); connect( myDisplayDescendants, SIGNAL( toggled( bool ) ), this, SLOT( onHierarchyType() ) ); - connect( updateButton, SIGNAL( clicked() ), this, SLOT( onUpdateModel( false ) ) ); - connect( cancelButton, SIGNAL( clicked() ), this, SLOT( onCancel() ) ); - - setPrefBackgroundColor( resMgr->colorValue( "Geometry", "dependency_tree_background_color", QColor( 255, 255, 255 ) ) ); - setNodesMovable( resMgr->booleanValue( "Geometry", "dependency_tree_move_nodes", true ) ); - setHierarchyType( resMgr->integerValue( "Geometry", "dependency_tree_hierarchy_type", 0 ) ); -} + connect( updateButton, SIGNAL( clicked() ), this, SLOT( onUpdateModel() ) ); -void DependencyTree_View::updateModel( bool getSelectedObjects ) -{ - getNewTreeModel( getSelectedObjects ); + SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() ); + GeometryGUI* aGeomGUI = dynamic_cast( app->module( "Geometry" ) ); + if ( aGeomGUI ) { + connect( aGeomGUI, SIGNAL( SignalDependencyTreeParamChanged( const QString&, const QString& ) ), + this, SLOT( onPreferenceChanged( const QString&, const QString& ) ) ); + connect( aGeomGUI, SIGNAL( SignalDependencyTreeRenameObject( const QString& ) ), + this, SLOT( onRenameObject( const QString& ) ) ); + } SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); - setPrefBackgroundColor( resMgr->colorValue( "Geometry", "dependency_tree_background_color", QColor( 255, 255, 255 ) ) ); setNodesMovable( resMgr->booleanValue( "Geometry", "dependency_tree_move_nodes", true ) ); setHierarchyType( resMgr->integerValue( "Geometry", "dependency_tree_hierarchy_type", 0 ) ); } -void DependencyTree_View::drawTree() +//================================================================================= +// function : updateModel() +// purpose : run all stage of dependency tree creation +//================================================================================= +void DependencyTree_View::updateModel( bool theUseSelectedObject, bool theUseOB ) { - myComputedCost = 0; - calcTotalCost(); - std::cout << "\n\n\n TOTAL COST = " << myTotalCost << std::endl; - - if( !myIsCompute ) - return; - - clearView( false ); - clearSelected(); - - // draw nodes on scene - std::map< std::string, int > entryLevelMap; - std::map< int, std::vector< std::string > > levelObjects; - int currentLevel; - int horDistance, verDistance; - GEOMUtils::TreeModel::const_reverse_iterator i; - for( i = myTreeModel.rbegin(); i != myTreeModel.rend(); i++ ) { - if( !myIsCompute ) - return; - currentLevel = 0; - myComputedCost++; - std::string objectEntry = i->first; - DependencyTree_Object* objectItem = myTreeMap[ objectEntry ]; - horDistance = 100 + int( objectItem->boundingRect().width() ); - verDistance = 3 * int( objectItem->boundingRect().height() ); - if( isItemAdded( objectItem ) ) - currentLevel = entryLevelMap[ objectEntry ]; - else { - addNewItem( objectItem ); - objectItem->unselect(); - entryLevelMap[ objectEntry ] = currentLevel; - levelObjects[ currentLevel ].push_back( objectEntry ); - } - objectItem->setIsMainObject( true ); - - if( myDisplayAscendants->isChecked() ) - drawWard( i->second.first, entryLevelMap, levelObjects, currentLevel, -1 ); - if( myDisplayDescendants->isChecked() ) - drawWard( i->second.second, entryLevelMap, levelObjects, currentLevel, 1 ); - } - - std::map< int, std::vector< std::string > >::const_iterator level; - for( level = levelObjects.begin(); level != levelObjects.end(); level++ ) { - int step = -horDistance * ( level->second.size() - 1 ) / 2; - std::cout<<"\n\n LEVEL = " << level->first << std::endl; - for( int objIter = 0; objIter < level->second.size(); objIter++ ) { - std::cout << level->second.at( objIter ) << ", "; - DependencyTree_Object* anObject = myTreeMap[ level->second.at( objIter ) ]; - anObject->setPos( step, verDistance * level->first ); - step += horDistance; - } - } + getNewTreeModel( theUseSelectedObject, theUseOB ); + onHierarchyType(); +} - // draw arrows on scene - GEOMUtils::TreeModel::const_iterator j; - for( j = myTreeModel.begin(); j != myTreeModel.end(); j++ ) { - DependencyTree_Object* Main_object = myTreeMap[ j->first ]; - if( j->second.first.size() > 0 ) { - GEOMUtils::LevelInfo Levelup = j->second.first.at(0); - if( myDisplayAscendants ->isChecked() ) { - GEOMUtils::LevelInfo::const_iterator node; - for (node = Levelup.begin(); node != Levelup.end(); node++ ) { - DependencyTree_Object* object = myTreeMap[node->first]; - DependencyTree_Arrow* arrow = myArrows[std::pair(Main_object, object)]; - if( arrow && !isItemAdded( arrow) ) - addNewItem( arrow ); - } - } - } - if( myDisplayAscendants->isChecked() ) - drawWardArrows( j->second.first ); - if( myDisplayDescendants->isChecked() ) - drawWardArrows( j->second.second ); +//================================================================================= +// function : mouseMoveEvent() +// purpose : make some actions when mouse was moved +//================================================================================= +void DependencyTree_View::mouseMoveEvent( QMouseEvent *event ) +{ + QGraphicsView::mouseMoveEvent( event ); + ArrowsInfo::const_iterator i; + for( i = myArrows.begin(); i != myArrows.end(); i++ ) { + if( DependencyTree_Arrow* arrow = myArrows[ i->first ] ) + arrow->update(); } - std::cout << "\n ComputedCost = " << myComputedCost << std::endl; - } -int DependencyTree_View::select( const QRectF& theRect, bool theIsAppend ) +//================================================================================= +// function : wheelEvent() +// purpose : add zoom action when wheel is spinning +//================================================================================= +void DependencyTree_View::wheelEvent( QWheelEvent* event ) { - GraphicsView_ViewPort::select( theRect, theIsAppend ); - - mySelectionMgr->clearSelected(); + int inc = 10; // zoom coefficient + double cx = width() / 2; + double cy = height() / 2; + if( event->delta() > 0 ) + zoom( cx, cy, cx + inc, cy + inc ); + else + zoom( cx, cy, cx - inc, cy - inc ); - // get selection - SALOME_ListIO listIO; - int StudyId = myStudy->StudyId(); - for( initSelected(); moreSelected(); nextSelected() ) - if( DependencyTree_Object* treeObject = dynamic_cast( selectedObject() ) ) { - CORBA::String_var studyEntry = treeObject->getGeomObject()->GetStudyEntry(); - Handle(SALOME_InteractiveObject) tmpIO = - new SALOME_InteractiveObject( studyEntry.in(), "GEOM", "TEMP_IO"); - listIO.Append( tmpIO ); - } - mySelectionMgr->setSelectedObjects( listIO, true ); + QGraphicsView::wheelEvent( event ); } -void DependencyTree_View::customEvent( QEvent * event ) +//================================================================================= +// function : getViewName() +// purpose : return the name of current view +//================================================================================= +QString DependencyTree_View::getViewName() const { - if( event->type() == DRAW_EVENT ) { - - QPushButton* cancelButton = dynamic_cast( cancelAction->defaultWidget() ); - QProgressBar* progressBar = dynamic_cast( progressAction->defaultWidget() ); - - if ( !cancelButton->isChecked() ) - progressBar->setValue( progressBar->maximum() * getComputeProgress() ); - - std::cout << "\n\n *** qthread->isFinished() = " << qthread->isFinished() << std::endl; - if( !myIsCompute || qthread->isFinished() ) { - changeWidgetState( false ); - cancelButton->setChecked( false ); - progressBar->setValue(0); - fitAll(); - QApplication::removePostedEvents( this, ( QEvent::Type )DRAW_EVENT ); - } - } - event->accept(); + return tr( "DEPENDENCY_TREE" ); } -void DependencyTree_View::addNewItem( QGraphicsItem* theObject ) +//================================================================================= +// function : getStudyId() +// purpose : return Id of current study +//================================================================================= +int DependencyTree_View::getStudyId() const { - qthread->sleepDraw(); - if( theObject ) - addItem( theObject ); - SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() ); - QApplication::postEvent( this, new QEvent( ( QEvent::Type )DRAW_EVENT ) ); + return myStudy->StudyId(); } -void DependencyTree_View::mouseMoveEvent(QMouseEvent *event) +//================================================================================= +// function : getObjectByEntry() +// purpose : return DependencyTree_Object by entry +//================================================================================= +DependencyTree_Object* DependencyTree_View::getObjectByEntry( const std::string& theEntry ) { - QGraphicsView::mouseMoveEvent( event ); - ArrowsInfo::const_iterator j; - for (j = myArrows.begin(); j != myArrows.end(); j++ ) { - DependencyTree_Arrow* arrow = myArrows[ j->first ]; - arrow->update(); - } + return myTreeMap[ theEntry ]; } +//================================================================================= +// function : setHierarchyType() +// purpose : set hierarchy type of dependency tree +//================================================================================= void DependencyTree_View::setHierarchyType( const int theType ) { myIsUpdate = false; @@ -313,17 +223,23 @@ void DependencyTree_View::setHierarchyType( const int theType ) break; } myIsUpdate = true; - myLevelsNumber = checkMaxLevelsNumber(); - onHierarchyType(); } +//================================================================================= +// function : setNodesMovable() +// purpose : set possibility to move nodes or not +//================================================================================= void DependencyTree_View::setNodesMovable( const bool theIsMovable ) { myNodesMovable->setChecked( theIsMovable ); } +//================================================================================= +// function : setPrefBackgroundColor() +// purpose : set background color from preferences +//================================================================================= void DependencyTree_View::setPrefBackgroundColor( const QColor& theColor ) { if( isForegroundEnabled() ) @@ -335,127 +251,145 @@ void DependencyTree_View::setPrefBackgroundColor( const QColor& theColor ) setBackgroundColor( theColor ); } +//================================================================================= +// function : setNodeColor() +// purpose : set node color from preferences +//================================================================================= void DependencyTree_View::setNodeColor( const QColor& theColor ) { EntryObjectMap::const_iterator i; - for (i = myTreeMap.begin(); i != myTreeMap.end(); i++ ) { + for( i = myTreeMap.begin(); i != myTreeMap.end(); i++ ) { DependencyTree_Object* object = myTreeMap[ i->first ]; object->setColor( theColor ); } } +//================================================================================= +// function : setMainNodeColor() +// purpose : set main node color from preferences +//================================================================================= void DependencyTree_View::setMainNodeColor( const QColor& theColor ) { EntryObjectMap::const_iterator i; - for (i = myTreeMap.begin(); i != myTreeMap.end(); i++ ) { + for( i = myTreeMap.begin(); i != myTreeMap.end(); i++ ) { DependencyTree_Object* object = myTreeMap[ i->first ]; object->setMainObjectColor( theColor ); } } +//================================================================================= +// function : setUnpublishNodeColor() +// purpose : set unpublished node color from preferences +//================================================================================= +void DependencyTree_View::setUnpublishNodeColor( const QColor& theColor ) +{ + EntryObjectMap::const_iterator i; + for( i = myTreeMap.begin(); i != myTreeMap.end(); i++ ) { + DependencyTree_Object* object = myTreeMap[ i->first ]; + object->setUnpublishObjectColor( theColor ); + } +} + +//================================================================================= +// function : setSelectNodeColor() +// purpose : set selected node color from preferences +//================================================================================= void DependencyTree_View::setSelectNodeColor( const QColor& theColor ) { EntryObjectMap::const_iterator i; - for (i = myTreeMap.begin(); i != myTreeMap.end(); i++ ) { + for( i = myTreeMap.begin(); i != myTreeMap.end(); i++ ) { DependencyTree_Object* object = myTreeMap[ i->first ]; object->setSelectColor( theColor ); } } +//================================================================================= +// function : setArrowColor() +// purpose : set arrow color from preferences +//================================================================================= void DependencyTree_View::setArrowColor( const QColor& theColor ) { - ArrowsInfo::const_iterator j; - for (j = myArrows.begin(); j != myArrows.end(); j++ ) { - DependencyTree_Arrow* arrow = myArrows[ j->first ]; + ArrowsInfo::const_iterator i; + for( i = myArrows.begin(); i != myArrows.end(); i++ ) { + DependencyTree_Arrow* arrow = myArrows[ i->first ]; arrow->setColor( theColor ); } } +//================================================================================= +// function : setHighlightArrowColor() +// purpose : set highlighted arrow color from preferences +//================================================================================= void DependencyTree_View::setHighlightArrowColor( const QColor& theColor ) { - ArrowsInfo::const_iterator j; - for (j = myArrows.begin(); j != myArrows.end(); j++ ) { - DependencyTree_Arrow* arrow = myArrows[ j->first ]; + ArrowsInfo::const_iterator i; + for( i = myArrows.begin(); i != myArrows.end(); i++ ) { + DependencyTree_Arrow* arrow = myArrows[ i->first ]; arrow->setHighlightColor( theColor ); } } +//================================================================================= +// function : setSelectArrowColor() +// purpose : set selected arrow color from preferences +//================================================================================= void DependencyTree_View::setSelectArrowColor( const QColor& theColor ) { - ArrowsInfo::const_iterator j; - for (j = myArrows.begin(); j != myArrows.end(); j++ ) { - DependencyTree_Arrow* arrow = myArrows[ j->first ]; + ArrowsInfo::const_iterator i; + for( i = myArrows.begin(); i != myArrows.end(); i++ ) { + DependencyTree_Arrow* arrow = myArrows[ i->first ]; arrow->setSelectColor( theColor ); } } -void DependencyTree_View::setIsCompute( bool theIsCompute ) +//================================================================================= +// function : onRebuildModel() +// purpose : slot for updating tree model using selected objects in viewer +//================================================================================= +void DependencyTree_View::onRebuildModel() { - myIsCompute = theIsCompute; + updateModel( true, false ); } -bool DependencyTree_View::getIsCompute() +//================================================================================= +// function : resizeEvent() +// purpose : reimplemented from QGraphicsView::resizeEvent() +//================================================================================= +void DependencyTree_View::resizeEvent(QResizeEvent *event) { - return myIsCompute; + QPointF aCenter = mapToScene( event->oldSize().width()/2, + event->oldSize().height()/2 ); + QGraphicsView::resizeEvent( event ); + centerOn( aCenter.x(),aCenter.y() ); } -//void DependencyTree_View::timerEvent(QTimerEvent *event) -//{ -// QPushButton* cancelButton = dynamic_cast( cancelAction->defaultWidget() ); -// QProgressBar* progressBar = dynamic_cast( progressAction->defaultWidget() ); -// -// std::cout << "TIMER! " << std::endl; -// if ( !cancelButton->isChecked() ) -// progressBar->setValue( progressBar->maximum() * getComputeProgress() ); -// -// if( !myIsCompute || qthread->isFinished() ) { -// changeWidgetState( false ); -// killTimer( myTimer ); -// cancelButton->setChecked( false ); -// progressBar->setValue(0); -// } -// event->accept(); -//} - -void DependencyTree_View::closeEvent( QCloseEvent* event ) -{ - if(qthread->isRunning()) - { - event->ignore(); - return; - } - event->accept(); -} - -void DependencyTree_View::onUpdateModel( bool getSelectedObjects ) +//================================================================================= +// function : onUpdateModel() +// purpose : slot for updating tree model for main objects in viewer +//================================================================================= +void DependencyTree_View::onUpdateModel() { - updateModel( getSelectedObjects ); -} - -void DependencyTree_View::updateView() -{ - if( !myIsUpdate ) - return; - - changeWidgetState( true ); - - qthread->start(); - - - - + updateModel( false ); } +//================================================================================= +// function : onMoveNodes() +// purpose : slot for setting the possibility to move nodes in viewer +//================================================================================= void DependencyTree_View::onMoveNodes( bool theIsMoveNodes ) { EntryObjectMap::const_iterator i; - for (i = myTreeMap.begin(); i != myTreeMap.end(); i++ ) { + for( i = myTreeMap.begin(); i != myTreeMap.end(); i++ ) { DependencyTree_Object* object = myTreeMap[ i->first ]; if( object ) object->setMovable( theIsMoveNodes ); } } +//================================================================================= +// function : onHierarchyType() +// purpose : slot for setting the hierarchy type of tree +//================================================================================= void DependencyTree_View::onHierarchyType() { myHierarchyDepth->setRange( 0, checkMaxLevelsNumber() ); @@ -470,119 +404,259 @@ void DependencyTree_View::onHierarchyType() updateView(); } -void DependencyTree_View::onCancel() +//================================================================================= +// function : onPreferencesChanged() +// purpose : slot for changing tree parameters from preferences +//================================================================================= +void DependencyTree_View::onPreferenceChanged( const QString& section, const QString& param ) { - qthread->cancel(); - //qthread->deleteLater(); -} + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); -void DependencyTree_View::addNode( const std::string& theEntry ) -{ - if( !myTreeMap[theEntry] ) - myTreeMap[theEntry] = new DependencyTree_Object( theEntry ); + if( param == QString("dependency_tree_hierarchy_type") ) { + int hierarchyType = resMgr->integerValue( section, param, 0); + setHierarchyType( hierarchyType ); + } + else if( param == QString("dependency_tree_move_nodes") ) { + bool isNodesMovable = resMgr->booleanValue( section, param, true); + setNodesMovable( isNodesMovable ); + } + else if( param == QString("dependency_tree_background_color") ) { + QColor c = resMgr->colorValue( section, param, QColor( 255, 255, 255 ) ); + setPrefBackgroundColor( c ); + } + else if( param == QString("dependency_tree_node_color") ) { + QColor c = resMgr->colorValue( section, param, QColor( 62, 180, 238 ) ); + setNodeColor( c ); + } + else if( param == QString("dependency_tree_main_node_color") ) { + QColor c = resMgr->colorValue( section, param, QColor( 238, 90, 125 ) ); + setMainNodeColor( c ); + } + else if( param == QString("dependency_tree_unpublish_node_color") ) { + QColor c = resMgr->colorValue( section, param, QColor( 255, 255, 255 ) ); + setUnpublishNodeColor( c ); + } + else if( param == QString("dependency_tree_select_node_color") ) { + QColor c = resMgr->colorValue( section, param, QColor( 237, 243, 58 ) ); + setSelectNodeColor( c ); + } + else if( param == QString("dependency_tree_arrow_color") ) { + QColor c = resMgr->colorValue( section, param, QColor( 0, 0, 130 ) ); + setArrowColor( c ); + } + else if( param == QString("dependency_tree_highlight_arrow_color") ) { + QColor c = resMgr->colorValue( section, param, QColor( 0, 0, 255 ) ); + setHighlightArrowColor( c ); + } + else if( param == QString("dependency_tree_select_arrow_color") ) { + QColor c = resMgr->colorValue( section, param, QColor( 255, 0, 0 ) ); + setSelectArrowColor( c ); + } } -void DependencyTree_View::addArrow( DependencyTree_Object *startItem, DependencyTree_Object *endItem ) +//================================================================================= +// function : onRenameObject() +// purpose : update object name, having edited it in Object Browser +//================================================================================= +void DependencyTree_View::onRenameObject( const QString& theEntry ) { - bool isFind = false; - - std::cout << " " << startItem->getEntry() << " " << endItem->getEntry() << std::endl; - ArrowsInfo::const_iterator i; - for (i = myArrows.begin(); i != myArrows.end(); i++ ) { - DependencyTree_Arrow* arrow = i->second; - if( arrow->getStartItem() == startItem && arrow->getEndItem() == endItem ) { - isFind = true; - std::cout<<" theSame " << std::endl; - } - else if( arrow->getStartItem() == endItem && arrow->getEndItem() == startItem ) { - arrow->setIsBiLink( true ); - std::cout<<" Bilink " << std::endl; - isFind = true; - } - } - - if( !isFind ) { - DependencyTree_Arrow *arrow = new DependencyTree_Arrow(startItem, endItem); - myArrows[std::pair( startItem, endItem )] = arrow; - std::cout<<" addArrow " << std::endl; - } + if( DependencyTree_Object* object = getObjectByEntry( theEntry.toStdString() ) ) + object->updateName(); } +//================================================================================= +// function : parseTree() +// purpose : parse created model to initialize all nodes and arrows +//================================================================================= void DependencyTree_View::parseTree() { - GEOMUtils::TreeModel::const_iterator i; - for (i = myTreeModel.begin(); i != myTreeModel.end(); i++ ) { + for( i = myTreeModel.begin(); i != myTreeModel.end(); i++ ) { std::string objectEntry = i->first; addNode( objectEntry ); parseTreeWard( i->second.first ); - if( i->second.first.size() > myMaxUpwardLevelsNumber ) + if((int) i->second.first.size() > myMaxUpwardLevelsNumber ) myMaxUpwardLevelsNumber = i->second.first.size(); parseTreeWard( i->second.second ); - if( i->second.second.size() > myMaxDownwardLevelsNumber ) + if((int) i->second.second.size() > myMaxDownwardLevelsNumber ) myMaxDownwardLevelsNumber = i->second.second.size(); } - for (i = myTreeModel.begin(); i != myTreeModel.end(); i++ ) { - DependencyTree_Object* Main_object = myTreeMap[i->first]; + for( i = myTreeModel.begin(); i != myTreeModel.end(); i++ ) { + DependencyTree_Object* Main_object = myTreeMap[ i->first ]; if( i->second.first.size() > 0 ) { GEOMUtils::LevelInfo Levelup = i->second.first.at(0); GEOMUtils::LevelInfo::const_iterator node; - for (node = Levelup.begin(); node != Levelup.end(); node++ ) { - DependencyTree_Object* object = myTreeMap[node->first]; - addArrow( Main_object, object ); + for( node = Levelup.begin(); node != Levelup.end(); node++ ) { + DependencyTree_Object* object = myTreeMap[ node->first ]; + addArrow( object, Main_object ); } } parseTreeWardArrow( i->second.first ); parseTreeWardArrow( i->second.second ); } - - } -void DependencyTree_View::parseTreeWard(const GEOMUtils::LevelsList theWard) + +//================================================================================= +// function : parseTreeWard() +// purpose : parse tree ward to initialize all nodes of current ward +//================================================================================= +void DependencyTree_View::parseTreeWard( const GEOMUtils::LevelsList& theWard ) { int levelsNumber = theWard.size(); for( int level = 0; level < levelsNumber; level++ ) { GEOMUtils::LevelInfo levelInfo = theWard[ level ]; GEOMUtils::LevelInfo::const_iterator node; - for (node = levelInfo.begin(); node != levelInfo.end(); node++ ) { + for( node = levelInfo.begin(); node != levelInfo.end(); node++ ) addNode( node->first ); - } } } -void DependencyTree_View::parseTreeWardArrow(const GEOMUtils::LevelsList theWard) + +//================================================================================= +// function : parseTreeWardArrow() +// purpose : parse tree ward to initialize all arrows of current ward +//================================================================================= +void DependencyTree_View::parseTreeWardArrow( const GEOMUtils::LevelsList& theWard) { - for(int j = 0; j < theWard.size(); j++ ) { - GEOMUtils::LevelInfo Level = theWard.at(j); - GEOMUtils::LevelInfo::const_iterator node; - for (node = Level.begin(); node != Level.end(); node++ ) { - DependencyTree_Object* object = myTreeMap[node->first]; + for( size_t j = 0; j < theWard.size(); j++ ) { + GEOMUtils::LevelInfo Level = theWard.at(j); + GEOMUtils::LevelInfo::const_iterator node; + for( node = Level.begin(); node != Level.end(); node++ ) { + DependencyTree_Object* object = myTreeMap[ node->first ]; std::vector Links = node->second; - for( int link = 0; link < Links.size(); link++ ) { - DependencyTree_Object* LinkObject = myTreeMap[Links[link]]; + for( size_t link = 0; link < Links.size(); link++ ) { + DependencyTree_Object* LinkObject = myTreeMap[ Links[ link ] ]; if( object && LinkObject ) - addArrow( object, LinkObject ); + addArrow( LinkObject, object ); + } + } + } +} + +//================================================================================= +// function : addNode() +// purpose : add node to viewer +//================================================================================= +void DependencyTree_View::addNode( const std::string& theEntry ) +{ + if( !myTreeMap[theEntry] ) + myTreeMap[theEntry] = new DependencyTree_Object( theEntry ); +} + +//================================================================================= +// function : addArrow() +// purpose : add arrow to viewer +//================================================================================= +void DependencyTree_View::addArrow( DependencyTree_Object* startItem, DependencyTree_Object* endItem ) +{ + bool isFind = false; + + ArrowsInfo::const_iterator i; + for( i = myArrows.begin(); i != myArrows.end(); i++ ) { + DependencyTree_Arrow* arrow = i->second; + if( arrow->getStartItem() == startItem && arrow->getEndItem() == endItem ) + isFind = true; + else if( arrow->getStartItem() == endItem && arrow->getEndItem() == startItem ) { + arrow->setIsBiLink( true ); + isFind = true; + } + } + if( !isFind ) { + DependencyTree_Arrow *arrow = new DependencyTree_Arrow( startItem, endItem ); + myArrows[ std::pair( startItem, endItem ) ] = arrow; + } +} + +//================================================================================= +// function : drawTree() +// purpose : redraw dependency tree using existing model +//================================================================================= +void DependencyTree_View::drawTree() +{ + clearView( false ); + clearSelected(); + + // draw nodes on scene + std::map< std::string, int > entryLevelMap; + std::map< int, std::vector< std::string > > levelObjects; + int currentLevel; + int horDistance, verDistance; + GEOMUtils::TreeModel::const_reverse_iterator i; + for( i = myTreeModel.rbegin(); i != myTreeModel.rend(); i++ ) { + currentLevel = 0; + std::string objectEntry = i->first; + DependencyTree_Object* objectItem = myTreeMap[ objectEntry ]; + horDistance = 100 + int( objectItem->boundingRect().width() ); + verDistance = 3 * int( objectItem->boundingRect().height() ); + if( isItemAdded( objectItem ) ) + currentLevel = entryLevelMap[ objectEntry ]; + else { + addItem( objectItem ); + objectItem->unselect(); + entryLevelMap[ objectEntry ] = currentLevel; + levelObjects[ currentLevel ].push_back( objectEntry ); + } + objectItem->setIsMainObject( true ); + + if( myDisplayAscendants->isChecked() ) + drawWard( i->second.first, entryLevelMap, levelObjects, currentLevel, -1 ); + if( myDisplayDescendants->isChecked() ) + drawWard( i->second.second, entryLevelMap, levelObjects, currentLevel, 1 ); + } + + std::map< int, std::vector< std::string > >::const_iterator level; + for( level = levelObjects.begin(); level != levelObjects.end(); level++ ) { + int step = -horDistance * ( int(level->second.size()) - 1 ) / 2; + for( size_t objIter = 0; objIter < level->second.size(); objIter++ ) { + DependencyTree_Object* anObject = myTreeMap[ level->second.at( objIter ) ]; + anObject->setPos( step, verDistance * level->first ); + step += horDistance; + } + } + + // draw arrows on scene + GEOMUtils::TreeModel::const_iterator j; + for( j = myTreeModel.begin(); j != myTreeModel.end(); j++ ) { + DependencyTree_Object* Main_object = myTreeMap[ j->first ]; + if( j->second.first.size() > 0 ) { + GEOMUtils::LevelInfo Levelup = j->second.first.at(0); + if( myDisplayAscendants ->isChecked() ) { + GEOMUtils::LevelInfo::const_iterator node; + for( node = Levelup.begin(); node != Levelup.end(); node++ ) { + DependencyTree_Object* object = myTreeMap[ node->first ]; + DependencyTree_Arrow* arrow = + myArrows[ std::pair( object, Main_object )]; + if( arrow && !isItemAdded( arrow ) ) + addItem( arrow ); + } } } + if( myDisplayAscendants->isChecked() ) + drawWardArrows( j->second.first ); + if( myDisplayDescendants->isChecked() ) + drawWardArrows( j->second.second ); } } +//================================================================================= +// function : drawWard() +// purpose : draw nodes of dependency tree ward (ascendant or descendant) +//================================================================================= void DependencyTree_View::drawWard( const GEOMUtils::LevelsList& theWard, std::map< std::string, int >& theEntryLevelMap, std::map< int, std::vector< std::string > >& theLevelObjects, int theCurrentLevel, const int theLevelStep ) { - for( int level = 0; level < theWard.size(); level++ ) { - if( level >= myLevelsNumber || !myIsCompute ) + for( int level = 0, size = theWard.size(); level < size; level++ ) { + if( level >= myLevelsNumber ) return; - myComputedCost++; theCurrentLevel += theLevelStep; GEOMUtils::LevelInfo levelInfo = theWard.at( level ); GEOMUtils::LevelInfo::const_iterator node; - for (node = levelInfo.begin(); node != levelInfo.end(); node++ ) { + for( node = levelInfo.begin(); node != levelInfo.end(); node++ ) { DependencyTree_Object* object = myTreeMap[ node->first ]; - if( !isItemAdded( object ) ) { - addNewItem( object ); + if( object && !isItemAdded( object ) ) { + addItem( object ); object->unselect(); theEntryLevelMap[ node->first ] = theCurrentLevel; theLevelObjects[ theCurrentLevel ].push_back( node->first ); @@ -591,154 +665,164 @@ void DependencyTree_View::drawWard( const GEOMUtils::LevelsList& theWard, } } -void DependencyTree_View::drawWardArrows( GEOMUtils::LevelsList theWard ) +//================================================================================= +// function : drawWardArrows() +// purpose : draw arrows of dependency tree ward (ascendant or descendant) +//================================================================================= +void DependencyTree_View::drawWardArrows( const GEOMUtils::LevelsList& theWard ) { - for(int j = 0; j < theWard.size(); j++ ) { - if( j >= myLevelsNumber || !myIsCompute ) + for( int j = 0, size = theWard.size(); j < size; j++ ) { + if( j >= myLevelsNumber ) break; - myComputedCost++; GEOMUtils::LevelInfo Level = theWard.at(j); GEOMUtils::LevelInfo::const_iterator node; - for (node = Level.begin(); node != Level.end(); node++ ) { - DependencyTree_Object* object = myTreeMap[node->first]; + for( node = Level.begin(); node != Level.end(); node++ ) { + DependencyTree_Object* object = myTreeMap[ node->first ]; GEOMUtils::NodeLinks Links = node->second; - for( int link = 0; link < Links.size(); link++ ) { - DependencyTree_Object* LinkObject = myTreeMap[Links[link]]; + for( size_t link = 0; link < Links.size(); link++ ) { + DependencyTree_Object* LinkObject = myTreeMap[ Links[ link ] ]; if( isItemAdded( object ) && isItemAdded( LinkObject ) ) { - DependencyTree_Arrow* arrow = myArrows[std::pair(object, LinkObject)]; - if( arrow && !isItemAdded( arrow) ) - addNewItem( arrow ); + DependencyTree_Arrow* arrow = myArrows[ std::pair( LinkObject, object ) ]; + if( arrow && !isItemAdded( arrow ) ) + addItem( arrow ); } } } } } -void DependencyTree_View::getNewTreeModel( bool getSelectedObjects ) +//================================================================================= +// function : updateView() +// purpose : update viewer using created dependency tree model +//================================================================================= +void DependencyTree_View::updateView() { - clearView( true ); - - if( getSelectedObjects ) - mySelectionMgr->selectedObjects( myMainObjects ); - - // create a list of selected object entry - GEOM::string_array_var objectsEntry = new GEOM::string_array(); - objectsEntry->length( myMainObjects.Extent()); - int iter = 0; - for ( SALOME_ListIteratorOfListIO It( myMainObjects ); It.More(); It.Next(), iter++ ) { - Handle( SALOME_InteractiveObject ) io = It.Value(); - GEOM::GEOM_Object_var geomObject = GEOM::GEOM_Object::_nil(); - geomObject = GEOMBase::ConvertIOinGEOMObject( io ); - QString entry = geomObject->GetEntry(); - objectsEntry[ iter ] = entry.toLatin1().constData(); - } - - // get string which describes dependency tree structure - SALOMEDS::TMPFile_var SeqFile = - GeometryGUI::GetGeomGen()->GetDependencyTree( myStudy, objectsEntry ); - char* buf = (char*) &SeqFile[0]; - - std::cout << "\n\n\n\n\n TREE = " << buf << std::endl; - - // get dependency tree structure - GEOMUtils::ConvertStringToTree( buf, myTreeModel ); - - mySelectionMgr->clearSelected(); - - parseTree(); + if( !myIsUpdate ) + return; + drawTree(); + fitWindow(); } +//================================================================================= +// function : clearView() +// purpose : clear viewer and initialize all variables +//================================================================================= void DependencyTree_View::clearView( bool isClearModel ) { EntryObjectMap::const_iterator objectIter; for( objectIter = myTreeMap.begin(); objectIter != myTreeMap.end(); objectIter++ ) { - DependencyTree_Object* object = objectIter->second; - if( object ) + if( DependencyTree_Object* object = objectIter->second ) if( isItemAdded( object ) ) - removeItem( object ); + removeItem( object ); } ArrowsInfo::const_iterator arrowIter; for( arrowIter = myArrows.begin(); arrowIter != myArrows.end(); arrowIter++ ) { - DependencyTree_Arrow* object = arrowIter->second; - if( object ) - if( isItemAdded( object ) ) - removeItem( object ); + if( DependencyTree_Arrow* arrow = arrowIter->second ) + if( isItemAdded( arrow ) ) + removeItem( arrow ); } + if( isClearModel ) { + EntryObjectMap::const_iterator objectIter; + for( objectIter = myTreeMap.begin(); objectIter != myTreeMap.end(); objectIter++ ) { + if( DependencyTree_Object* object = objectIter->second ) + delete object; + } + + ArrowsInfo::const_iterator arrowIter; + for( arrowIter = myArrows.begin(); arrowIter != myArrows.end(); arrowIter++ ) { + if( DependencyTree_Arrow* arrow = arrowIter->second ) + delete arrow; + } myTreeMap.clear(); myArrows.clear(); myTreeModel.clear(); + myLevelsNumber = 0; myMaxDownwardLevelsNumber = 0; myMaxUpwardLevelsNumber = 0; - myLevelsNumber = 0; - myIsCompute = false; myIsUpdate = true; } } -int DependencyTree_View::checkMaxLevelsNumber() +//================================================================================= +// function : fitWindow() +// purpose : scale the window considering a size of scene +//================================================================================= +void DependencyTree_View::fitWindow() { - if( myDisplayAscendants->isChecked() && myDisplayDescendants->isChecked() ) - return myMaxUpwardLevelsNumber>myMaxDownwardLevelsNumber?myMaxUpwardLevelsNumber:myMaxDownwardLevelsNumber; - else if( myDisplayAscendants ->isChecked() ) - return myMaxUpwardLevelsNumber; - else if( myDisplayDescendants->isChecked() ) - return myMaxDownwardLevelsNumber; -} - -void DependencyTree_View::calcTotalCost() -{ - myTotalCost = myTreeModel.size(); - GEOMUtils::TreeModel::const_iterator i; - for( i = myTreeModel.begin(); i != myTreeModel.end(); i++ ) { - if( myDisplayAscendants->isChecked() ) - myTotalCost += 2*( myLevelsNumber < i->second.first.size() ? myLevelsNumber : i->second.first.size() ); - if( myDisplayDescendants->isChecked() ) - myTotalCost += 2*( myLevelsNumber < i->second.second.size() ? myLevelsNumber : i->second.second.size() ); + int sizeFactor = 4; + if( objectsBoundingRect(true).width() > sizeFactor*size().width() || + objectsBoundingRect(true).height() > sizeFactor*size().width() ) { + QRectF aRect = QRectF( -sizeFactor*size().width()/2, -sizeFactor*size().height()/2, + sizeFactor*size().width(), sizeFactor*size().height() ); + fitInView( aRect, Qt::KeepAspectRatio ); } + else + fitAll(); } -double DependencyTree_View::getComputeProgress() -{ - return double( myComputedCost ) / double( myTotalCost ); -} - -void DependencyTree_View::changeWidgetState( bool theIsCompute ) +//================================================================================= +// function : getNewTreeModel() +// purpose : get dependency tree model from engine +//================================================================================= +void DependencyTree_View::getNewTreeModel( bool theUseSelectedObject, bool theUseOB ) { - cancelAction->setVisible( theIsCompute ); - progressAction->setVisible( theIsCompute ); + GEOM::string_array_var objectsEntry = new GEOM::string_array(); + int iter = 0; - myHierarchyDepth->setEnabled( !theIsCompute ); - myDisplayAscendants->setEnabled( !theIsCompute ); - myDisplayDescendants->setEnabled( !theIsCompute ); - updateButton->setEnabled( !theIsCompute ); -} + if( theUseSelectedObject ) { + if( theUseOB ) { + SALOME_ListIO mainObjects; + mySelectionMgr->selectedObjects( mainObjects ); + // create a list of selected object entry + objectsEntry->length( mainObjects.Extent() ); + for ( SALOME_ListIteratorOfListIO It( mainObjects ); It.More(); It.Next(), iter++ ) { + Handle( SALOME_InteractiveObject ) io = It.Value(); + if( !io->hasEntry() ) + continue; + GEOM::GEOM_Object_var geomObject = GEOM::GEOM_Object::_nil(); + geomObject = GEOMBase::ConvertIOinGEOMObject( io ); + QString entry = geomObject->GetEntry(); + objectsEntry[ iter ] = entry.toLatin1().constData(); + } + } + else { + objectsEntry->length( nbSelected() ); + for( initSelected(); moreSelected(); nextSelected(), iter++ ) + if( DependencyTree_Object* treeObject = dynamic_cast( selectedObject() ) ) + objectsEntry[ iter ] = treeObject->getEntry().c_str(); + } + myMainEntries = objectsEntry; + } -DependencyTree_ComputeDlg_QThread::DependencyTree_ComputeDlg_QThread( DependencyTree_View* theView ) -{ - myView = theView; -} + // get string which describes dependency tree structure + SALOMEDS::TMPFile_var SeqFile = + GeometryGUI::GetGeomGen()->GetDependencyTree( myStudy, myMainEntries ); + char* buf = (char*)&SeqFile[0]; -void DependencyTree_ComputeDlg_QThread::run() -{ - myView->myMutex.lock(); - // QMutexLocker lock( &myView->myMutex ); - myView->setIsCompute( true ); - myView->drawTree(); + clearView( true ); + mySelectionMgr->clearSelected(); - QApplication::postEvent( myView, new QEvent( ( QEvent::Type )DRAW_EVENT ) ); - myView->myMutex.unlock(); - //exec(); -} + // get dependency tree structure + GEOMUtils::ConvertStringToTree( buf, myTreeModel ); -void DependencyTree_ComputeDlg_QThread::sleepDraw() -{ - msleep(1); + parseTree(); } -void DependencyTree_ComputeDlg_QThread::cancel() +//================================================================================= +// function : checkMaxLevelsNumber() +// purpose : calculate max levels number +//================================================================================= +int DependencyTree_View::checkMaxLevelsNumber() { - myView->setIsCompute( false ); + if( myDisplayAscendants->isChecked() && myDisplayDescendants->isChecked() ) + return myMaxUpwardLevelsNumber > myMaxDownwardLevelsNumber ? + myMaxUpwardLevelsNumber : myMaxDownwardLevelsNumber; + else if( myDisplayAscendants ->isChecked() ) + return myMaxUpwardLevelsNumber; + else if( myDisplayDescendants->isChecked() ) + return myMaxDownwardLevelsNumber; + return 0; }