1 // Copyright (C) 2014 CEA/DEN, EDF R&D, OPEN CASCADE
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 #include "DependencyTree_View.h"
21 #include "DependencyTree_Object.h"
22 #include "DependencyTree_Arrow.h"
24 #include <GEOM_InteractiveObject.hxx>
25 #include <GeometryGUI.h>
29 #include <SUIT_Session.h>
30 #include <SUIT_ResourceMgr.h>
31 #include <SalomeApp_Study.h>
32 #include <QtxActionToolMgr.h>
33 #include <LightApp_SelectionMgr.h>
34 #include <SALOME_ListIteratorOfListIO.hxx>
37 #include <QCloseEvent>
38 #include <QApplication>
39 #include <QGraphicsScene>
41 #define DRAW_EVENT ( QEvent::User + 1 )
45 DependencyTree_View::DependencyTree_View( QWidget* theParent )
46 :GraphicsView_ViewPort(theParent),
47 myMaxDownwardLevelsNumber(0),
48 myMaxUpwardLevelsNumber(0),
55 SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
58 SalomeApp_Study* study = dynamic_cast<SalomeApp_Study*>( app->activeStudy() );
59 myStudy = GeometryGUI::ClientStudyToStudy( study->studyDS());
61 mySelectionMgr = app->selectionMgr();
62 if ( !mySelectionMgr ) return;
67 DependencyTree_View::~DependencyTree_View()
71 void DependencyTree_View::init( GraphicsView_ViewFrame* theViewFrame )
73 SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
75 myNodesMovable = new QCheckBox( tr( "MOVE_NODES" ) );
76 QWidgetAction* nodesMovableAction = new QWidgetAction( theViewFrame );
77 nodesMovableAction->setDefaultWidget( myNodesMovable );
79 myDisplayAscendants = new QCheckBox( tr( "DISPLAY_ASCENDANTS" ) );
80 QWidgetAction* ShowParentsAction = new QWidgetAction( theViewFrame );
81 ShowParentsAction->setDefaultWidget( myDisplayAscendants );
83 myDisplayDescendants = new QCheckBox(tr("DISPLAY_DESCENDANTS"));
84 QWidgetAction* ShowChildrenAction = new QWidgetAction(theViewFrame);
85 ShowChildrenAction->setDefaultWidget( myDisplayDescendants );
87 QLabel* hierarchyDepthLabel = new QLabel( tr( "HIERARCHY_DEPTH" ) );
88 QWidgetAction* hierarchyDepthLabelAction = new QWidgetAction(theViewFrame);
89 hierarchyDepthLabelAction->setDefaultWidget( hierarchyDepthLabel );
91 myLevelsNumber = checkMaxLevelsNumber();
93 myHierarchyDepth = new QSpinBox();
94 myHierarchyDepth->setRange( 0, checkMaxLevelsNumber() );
95 myHierarchyDepth->setSpecialValueText( tr( "SHOW_ALL" ) );
96 myHierarchyDepth->setValue( 0 );
97 QWidgetAction* hierarchyDepthAction = new QWidgetAction( theViewFrame );
98 hierarchyDepthAction->setDefaultWidget( myHierarchyDepth );
100 updateButton = new QPushButton( tr( "UPDATE" ) );
101 QWidgetAction* updateAction = new QWidgetAction( theViewFrame );
102 updateAction->setDefaultWidget( updateButton );
104 QPushButton* cancelButton = new QPushButton( tr( "CANCEL" ) );
105 cancelButton->setCheckable( true );
106 cancelAction = new QWidgetAction( theViewFrame );
107 cancelAction->setDefaultWidget( cancelButton );
108 cancelAction->setVisible( false );
110 QProgressBar* progressBar = new QProgressBar( this );
111 progressBar->setMinimum( 0 );
112 progressBar->setMaximum( 100 );
113 progressBar->setFixedWidth( 100 );
114 progressAction = new QWidgetAction( theViewFrame );
115 progressAction->setDefaultWidget( progressBar );
116 progressAction->setVisible( false );
118 QAction* separator1 = theViewFrame->toolMgr()->separator( false );
119 QAction* separator2 = theViewFrame->toolMgr()->separator( false );
121 theViewFrame->toolMgr()->append( separator1, theViewFrame->getToolBarId() );
122 theViewFrame->toolMgr()->append( nodesMovableAction, theViewFrame->getToolBarId() );
123 theViewFrame->toolMgr()->append( hierarchyDepthLabelAction, theViewFrame->getToolBarId() );
124 theViewFrame->toolMgr()->append( hierarchyDepthAction, theViewFrame->getToolBarId() );
125 theViewFrame->toolMgr()->append( ShowParentsAction, theViewFrame->getToolBarId() );
126 theViewFrame->toolMgr()->append( ShowChildrenAction, theViewFrame->getToolBarId() );
128 theViewFrame->toolMgr()->append( separator2, theViewFrame->getToolBarId() );
129 theViewFrame->toolMgr()->append( updateAction, theViewFrame->getToolBarId() );
130 theViewFrame->toolMgr()->append( progressAction, theViewFrame->getToolBarId() );
131 theViewFrame->toolMgr()->append( cancelAction, theViewFrame->getToolBarId() );
133 connect( myNodesMovable, SIGNAL( toggled( bool ) ), this, SLOT( onMoveNodes( bool ) ) );
134 connect( myHierarchyDepth, SIGNAL( valueChanged ( int ) ), this, SLOT( onHierarchyType() ) );
135 connect( myDisplayAscendants , SIGNAL( toggled( bool ) ), this, SLOT( onHierarchyType() ) );
136 connect( myDisplayDescendants, SIGNAL( toggled( bool ) ), this, SLOT( onHierarchyType() ) );
137 connect( updateButton, SIGNAL( clicked() ), this, SLOT( updateView() ) );
138 connect( cancelButton, SIGNAL( clicked() ), this, SLOT( onCancel() ) );
140 setPrefBackgroundColor( resMgr->colorValue( "Geometry", "dependency_tree_background_color", QColor( 255, 255, 255 ) ) );
141 setNodesMovable( resMgr->booleanValue( "Geometry", "dependency_tree_move_nodes", true ) );
142 setHierarchyType( resMgr->integerValue( "Geometry", "dependency_tree_hierarchy_type", 0 ) );
145 void DependencyTree_View::updateModel()
149 SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
151 setPrefBackgroundColor( resMgr->colorValue( "Geometry", "dependency_tree_background_color", QColor( 255, 255, 255 ) ) );
152 setNodesMovable( resMgr->booleanValue( "Geometry", "dependency_tree_move_nodes", true ) );
153 setHierarchyType( resMgr->integerValue( "Geometry", "dependency_tree_hierarchy_type", 0 ) );
156 void DependencyTree_View::drawTree()
160 std::cout << "\n\n\n TOTAL COST = " << myTotalCost << std::endl;
165 // draw nodes on scene
166 std::map< std::string, int > entryLevelMap;
167 std::map< int, std::vector< std::string > > levelObjects;
169 int horDistance, verDistance;
170 GEOMUtils::TreeModel::const_reverse_iterator i;
171 for( i = myTreeModel.rbegin(); i != myTreeModel.rend(); i++ ) {
176 std::string objectEntry = i->first;
177 DependencyTree_Object* objectItem = myTreeMap[ objectEntry ];
178 horDistance = 100 + int( objectItem->boundingRect().width() );
179 verDistance = 3 * int( objectItem->boundingRect().height() );
180 if( isItemAdded( objectItem ) )
181 currentLevel = entryLevelMap[ objectEntry ];
183 addItem( objectItem );
184 objectItem->unselect();
185 entryLevelMap[ objectEntry ] = currentLevel;
186 levelObjects[ currentLevel ].push_back( objectEntry );
188 objectItem->setIsMainObject( true );
190 if( myDisplayAscendants->isChecked() )
191 drawWard( i->second.first, entryLevelMap, levelObjects, currentLevel, -1 );
192 if( myDisplayDescendants->isChecked() )
193 drawWard( i->second.second, entryLevelMap, levelObjects, currentLevel, 1 );
196 std::map< int, std::vector< std::string > >::const_iterator level;
197 for( level = levelObjects.begin(); level != levelObjects.end(); level++ ) {
198 int step = -horDistance * ( level->second.size() - 1 ) / 2;
199 std::cout<<"\n\n LEVEL = " << level->first << std::endl;
200 for( int objIter = 0; objIter < level->second.size(); objIter++ ) {
201 std::cout << level->second.at( objIter ) << ", ";
202 DependencyTree_Object* anObject = myTreeMap[ level->second.at( objIter ) ];
203 anObject->setPos( step, verDistance * level->first );
208 // draw arrows on scene
209 GEOMUtils::TreeModel::const_iterator j;
210 for( j = myTreeModel.begin(); j != myTreeModel.end(); j++ ) {
211 DependencyTree_Object* Main_object = myTreeMap[ j->first ];
212 if( j->second.first.size() > 0 ) {
213 GEOMUtils::LevelInfo Levelup = j->second.first.at(0);
214 if( myDisplayAscendants ->isChecked() ) {
215 GEOMUtils::LevelInfo::const_iterator node;
216 for (node = Levelup.begin(); node != Levelup.end(); node++ ) {
217 DependencyTree_Object* object = myTreeMap[node->first];
218 DependencyTree_Arrow* arrow = myArrows[std::pair<DependencyTree_Object*,DependencyTree_Object*>(Main_object, object)];
219 if( arrow && !isItemAdded( arrow) )
224 if( myDisplayAscendants->isChecked() )
225 drawWardArrows( j->second.first );
226 if( myDisplayDescendants->isChecked() )
227 drawWardArrows( j->second.second );
229 std::cout << "\n ComputedCost = " << myComputedCost << std::endl;
232 int DependencyTree_View::select( const QRectF& theRect, bool theIsAppend )
234 GraphicsView_ViewPort::select( theRect, theIsAppend );
236 mySelectionMgr->clearSelected();
239 SALOME_ListIO listIO;
240 int StudyId = myStudy->StudyId();
241 for( initSelected(); moreSelected(); nextSelected() )
242 if( DependencyTree_Object* treeObject = dynamic_cast<DependencyTree_Object*>( selectedObject() ) ) {
243 CORBA::String_var studyEntry = treeObject->getGeomObject()->GetStudyEntry();
244 Handle(SALOME_InteractiveObject) tmpIO =
245 new SALOME_InteractiveObject( studyEntry.in(), "GEOM", "TEMP_IO");
246 listIO.Append( tmpIO );
248 mySelectionMgr->setSelectedObjects( listIO, true );
251 void DependencyTree_View::customEvent ( QEvent * event )
253 if( event->type() == DRAW_EVENT ) {
254 //qthread->sleepDraw();
256 std::cout << "\n\n\n DRAW_EVENT!!! " << std::endl;
257 QPushButton* cancelButton = dynamic_cast<QPushButton*>( cancelAction->defaultWidget() );
258 QProgressBar* progressBar = dynamic_cast<QProgressBar*>( progressAction->defaultWidget() );
260 std::cout << "\n\n *** myIsCompute " << myIsCompute << std::endl;
261 if ( !cancelButton->isChecked() ) {
262 std::cout << "\n\n *** getComputeProgress = " << getComputeProgress() << std::endl;
263 progressBar->setValue( progressBar->maximum() * getComputeProgress() );
267 std::cout << "\n\n *** qthread->isFinished() = " << qthread->isFinished() << std::endl;
268 if( !myIsCompute || qthread->isFinished() ) {
269 changeWidgetState( false );
270 cancelButton->setChecked( false );
271 progressBar->setValue(0);
277 void DependencyTree_View::addItem( QGraphicsItem* theObject )
279 GraphicsView_ViewPort::addItem( theObject );
280 qthread->sleepDraw();
281 SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
282 QApplication::postEvent( this, new QEvent( ( QEvent::Type )DRAW_EVENT ) );
285 void DependencyTree_View::mouseMoveEvent(QMouseEvent *event)
287 QGraphicsView::mouseMoveEvent( event );
288 ArrowsInfo::const_iterator j;
289 for (j = myArrows.begin(); j != myArrows.end(); j++ ) {
290 DependencyTree_Arrow* arrow = myArrows[ j->first ];
295 void DependencyTree_View::setHierarchyType( const int theType )
300 myDisplayAscendants->setChecked( true );
301 myDisplayDescendants->setChecked( true );
304 myDisplayAscendants->setChecked( true );
305 myDisplayDescendants->setChecked( false );
308 myDisplayAscendants->setChecked( false );
309 myDisplayDescendants->setChecked( true );
314 myLevelsNumber = checkMaxLevelsNumber();
319 void DependencyTree_View::setNodesMovable( const bool theIsMovable )
321 myNodesMovable->setChecked( theIsMovable );
324 void DependencyTree_View::setPrefBackgroundColor( const QColor& theColor )
326 if( isForegroundEnabled() )
328 setForegroundColor( theColor );
332 setBackgroundColor( theColor );
335 void DependencyTree_View::setNodeColor( const QColor& theColor )
337 EntryObjectMap::const_iterator i;
338 for (i = myTreeMap.begin(); i != myTreeMap.end(); i++ ) {
339 DependencyTree_Object* object = myTreeMap[ i->first ];
340 object->setColor( theColor );
344 void DependencyTree_View::setMainNodeColor( const QColor& theColor )
346 EntryObjectMap::const_iterator i;
347 for (i = myTreeMap.begin(); i != myTreeMap.end(); i++ ) {
348 DependencyTree_Object* object = myTreeMap[ i->first ];
349 object->setMainObjectColor( theColor );
353 void DependencyTree_View::setSelectNodeColor( const QColor& theColor )
355 EntryObjectMap::const_iterator i;
356 for (i = myTreeMap.begin(); i != myTreeMap.end(); i++ ) {
357 DependencyTree_Object* object = myTreeMap[ i->first ];
358 object->setSelectColor( theColor );
362 void DependencyTree_View::setArrowColor( const QColor& theColor )
364 ArrowsInfo::const_iterator j;
365 for (j = myArrows.begin(); j != myArrows.end(); j++ ) {
366 DependencyTree_Arrow* arrow = myArrows[ j->first ];
367 arrow->setColor( theColor );
371 void DependencyTree_View::setHighlightArrowColor( const QColor& theColor )
373 ArrowsInfo::const_iterator j;
374 for (j = myArrows.begin(); j != myArrows.end(); j++ ) {
375 DependencyTree_Arrow* arrow = myArrows[ j->first ];
376 arrow->setHighlightColor( theColor );
380 void DependencyTree_View::setSelectArrowColor( const QColor& theColor )
382 ArrowsInfo::const_iterator j;
383 for (j = myArrows.begin(); j != myArrows.end(); j++ ) {
384 DependencyTree_Arrow* arrow = myArrows[ j->first ];
385 arrow->setSelectColor( theColor );
389 void DependencyTree_View::setIsCompute( bool theIsCompute )
391 myIsCompute = theIsCompute;
394 bool DependencyTree_View::getIsCompute()
399 //void DependencyTree_View::timerEvent(QTimerEvent *event)
401 // QPushButton* cancelButton = dynamic_cast<QPushButton*>( cancelAction->defaultWidget() );
402 // QProgressBar* progressBar = dynamic_cast<QProgressBar*>( progressAction->defaultWidget() );
404 // std::cout << "TIMER! " << std::endl;
405 // if ( !cancelButton->isChecked() )
406 // progressBar->setValue( progressBar->maximum() * getComputeProgress() );
408 // if( !myIsCompute || qthread->isFinished() ) {
409 // changeWidgetState( false );
410 // killTimer( myTimer );
411 // cancelButton->setChecked( false );
412 // progressBar->setValue(0);
417 void DependencyTree_View::closeEvent( QCloseEvent* event )
419 if(qthread->isRunning())
427 void DependencyTree_View::updateView()
432 // clearView( false );
434 qthread = new DependencyTree_ComputeDlg_QThread( this );
436 changeWidgetState( true );
438 //myTimer = startTimer( 100 ); // millisecs
442 void DependencyTree_View::onMoveNodes( bool theIsMoveNodes )
444 EntryObjectMap::const_iterator i;
445 for (i = myTreeMap.begin(); i != myTreeMap.end(); i++ ) {
446 DependencyTree_Object* object = myTreeMap[ i->first ];
448 object->setMovable( theIsMoveNodes );
452 void DependencyTree_View::onHierarchyType()
454 myHierarchyDepth->setRange( 0, checkMaxLevelsNumber() );
455 if( myHierarchyDepth->value() > checkMaxLevelsNumber() )
456 myHierarchyDepth->setValue( checkMaxLevelsNumber() );
458 if( myHierarchyDepth->value() == 0 )
459 myLevelsNumber = myHierarchyDepth->maximum();
461 myLevelsNumber = myHierarchyDepth->value();
466 void DependencyTree_View::onCancel()
469 //qthread->deleteLater();
472 void DependencyTree_View::addNode( const std::string& theEntry )
474 if( !myTreeMap[theEntry] )
475 myTreeMap[theEntry] = new DependencyTree_Object( theEntry );
478 void DependencyTree_View::addArrow( DependencyTree_Object *startItem, DependencyTree_Object *endItem )
482 std::cout << " " << startItem->getEntry() << " " << endItem->getEntry() << std::endl;
483 ArrowsInfo::const_iterator i;
484 for (i = myArrows.begin(); i != myArrows.end(); i++ ) {
485 DependencyTree_Arrow* arrow = i->second;
486 if( arrow->getStartItem() == startItem && arrow->getEndItem() == endItem ) {
488 std::cout<<" theSame " << std::endl;
490 else if( arrow->getStartItem() == endItem && arrow->getEndItem() == startItem ) {
491 arrow->setIsBiLink( true );
492 std::cout<<" Bilink " << std::endl;
498 DependencyTree_Arrow *arrow = new DependencyTree_Arrow(startItem, endItem);
499 myArrows[std::pair<DependencyTree_Object*,DependencyTree_Object*>( startItem, endItem )] = arrow;
500 std::cout<<" addArrow " << std::endl;
504 void DependencyTree_View::parseTree()
507 GEOMUtils::TreeModel::const_iterator i;
508 for (i = myTreeModel.begin(); i != myTreeModel.end(); i++ ) {
509 std::string objectEntry = i->first;
510 addNode( objectEntry );
511 parseTreeWard( i->second.first );
512 if( i->second.first.size() > myMaxUpwardLevelsNumber )
513 myMaxUpwardLevelsNumber = i->second.first.size();
514 parseTreeWard( i->second.second );
515 if( i->second.second.size() > myMaxDownwardLevelsNumber )
516 myMaxDownwardLevelsNumber = i->second.second.size();
519 for (i = myTreeModel.begin(); i != myTreeModel.end(); i++ ) {
520 DependencyTree_Object* Main_object = myTreeMap[i->first];
521 if( i->second.first.size() > 0 ) {
522 GEOMUtils::LevelInfo Levelup = i->second.first.at(0);
523 GEOMUtils::LevelInfo::const_iterator node;
524 for (node = Levelup.begin(); node != Levelup.end(); node++ ) {
525 DependencyTree_Object* object = myTreeMap[node->first];
526 addArrow( Main_object, object );
529 parseTreeWardArrow( i->second.first );
530 parseTreeWardArrow( i->second.second );
535 void DependencyTree_View::parseTreeWard(const GEOMUtils::LevelsList theWard)
537 int levelsNumber = theWard.size();
538 for( int level = 0; level < levelsNumber; level++ ) {
539 GEOMUtils::LevelInfo levelInfo = theWard[ level ];
540 GEOMUtils::LevelInfo::const_iterator node;
541 for (node = levelInfo.begin(); node != levelInfo.end(); node++ ) {
542 addNode( node->first );
546 void DependencyTree_View::parseTreeWardArrow(const GEOMUtils::LevelsList theWard)
548 for(int j = 0; j < theWard.size(); j++ ) {
549 GEOMUtils::LevelInfo Level = theWard.at(j);
550 GEOMUtils::LevelInfo::const_iterator node;
551 for (node = Level.begin(); node != Level.end(); node++ ) {
552 DependencyTree_Object* object = myTreeMap[node->first];
553 std::vector<std::string> Links = node->second;
554 for( int link = 0; link < Links.size(); link++ ) {
555 DependencyTree_Object* LinkObject = myTreeMap[Links[link]];
556 if( object && LinkObject )
557 addArrow( object, LinkObject );
563 void DependencyTree_View::drawWard( const GEOMUtils::LevelsList& theWard,
564 std::map< std::string, int >& theEntryLevelMap,
565 std::map< int, std::vector< std::string > >& theLevelObjects,
566 int theCurrentLevel, const int theLevelStep )
568 for( int level = 0; level < theWard.size(); level++ ) {
569 if( level >= myLevelsNumber || !myIsCompute )
572 theCurrentLevel += theLevelStep;
573 GEOMUtils::LevelInfo levelInfo = theWard.at( level );
574 GEOMUtils::LevelInfo::const_iterator node;
575 for (node = levelInfo.begin(); node != levelInfo.end(); node++ ) {
576 DependencyTree_Object* object = myTreeMap[ node->first ];
577 if( !isItemAdded( object ) ) {
580 theEntryLevelMap[ node->first ] = theCurrentLevel;
581 theLevelObjects[ theCurrentLevel ].push_back( node->first );
587 void DependencyTree_View::drawWardArrows( GEOMUtils::LevelsList theWard )
589 for(int j = 0; j < theWard.size(); j++ ) {
590 if( j >= myLevelsNumber || !myIsCompute )
593 GEOMUtils::LevelInfo Level = theWard.at(j);
594 GEOMUtils::LevelInfo::const_iterator node;
595 for (node = Level.begin(); node != Level.end(); node++ ) {
596 DependencyTree_Object* object = myTreeMap[node->first];
597 GEOMUtils::NodeLinks Links = node->second;
598 for( int link = 0; link < Links.size(); link++ ) {
599 DependencyTree_Object* LinkObject = myTreeMap[Links[link]];
600 if( isItemAdded( object ) && isItemAdded( LinkObject ) ) {
601 DependencyTree_Arrow* arrow = myArrows[std::pair<DependencyTree_Object*,DependencyTree_Object*>(object, LinkObject)];
602 if( arrow && !isItemAdded( arrow) )
610 void DependencyTree_View::getNewTreeModel()
614 SALOME_ListIO aSelList;
615 mySelectionMgr->selectedObjects( aSelList );
617 // create a list of selected object entry
618 GEOM::string_array_var objectsEntry = new GEOM::string_array();
619 objectsEntry->length( aSelList.Extent());
621 for ( SALOME_ListIteratorOfListIO It( aSelList ); It.More(); It.Next(), iter++ ) {
622 Handle( SALOME_InteractiveObject ) io = It.Value();
623 GEOM::GEOM_Object_var geomObject = GEOM::GEOM_Object::_nil();
624 geomObject = GEOMBase::ConvertIOinGEOMObject( io );
625 QString entry = geomObject->GetEntry();
626 objectsEntry[ iter ] = entry.toLatin1().constData();
629 // get string which describes dependency tree structure
630 SALOMEDS::TMPFile_var SeqFile =
631 GeometryGUI::GetGeomGen()->GetDependencyTree( myStudy, objectsEntry );
632 char* buf = (char*) &SeqFile[0];
634 std::cout << "\n\n\n\n\n TREE = " << buf << std::endl;
636 // get dependency tree structure
637 GEOMUtils::ConvertStringToTree( buf, myTreeModel );
639 mySelectionMgr->clearSelected();
645 void DependencyTree_View::clearView( bool isClearModel )
647 EntryObjectMap::const_iterator objectIter;
648 for( objectIter = myTreeMap.begin(); objectIter != myTreeMap.end(); objectIter++ ) {
649 DependencyTree_Object* object = objectIter->second;
650 if( isItemAdded( object ) && object )
651 removeItem( object );
654 ArrowsInfo::const_iterator arrowIter;
655 for( arrowIter = myArrows.begin(); arrowIter != myArrows.end(); arrowIter++ ) {
656 DependencyTree_Arrow* object = arrowIter->second;
657 if( isItemAdded( object ) && object )
658 removeItem( object );
664 myMaxDownwardLevelsNumber = 0;
665 myMaxUpwardLevelsNumber = 0;
672 int DependencyTree_View::checkMaxLevelsNumber()
674 if( myDisplayAscendants->isChecked() && myDisplayDescendants->isChecked() )
675 return myMaxUpwardLevelsNumber>myMaxDownwardLevelsNumber?myMaxUpwardLevelsNumber:myMaxDownwardLevelsNumber;
676 else if( myDisplayAscendants ->isChecked() )
677 return myMaxUpwardLevelsNumber;
678 else if( myDisplayDescendants->isChecked() )
679 return myMaxDownwardLevelsNumber;
682 void DependencyTree_View::calcTotalCost()
684 myTotalCost = myTreeModel.size();
685 GEOMUtils::TreeModel::const_iterator i;
686 for( i = myTreeModel.begin(); i != myTreeModel.end(); i++ ) {
687 if( myDisplayAscendants->isChecked() )
688 myTotalCost += 2*( myLevelsNumber < i->second.first.size() ? myLevelsNumber : i->second.first.size() );
689 if( myDisplayDescendants->isChecked() )
690 myTotalCost += 2*( myLevelsNumber < i->second.second.size() ? myLevelsNumber : i->second.second.size() );
694 double DependencyTree_View::getComputeProgress()
696 return double( myComputedCost ) / double( myTotalCost );
699 void DependencyTree_View::changeWidgetState( bool theIsCompute )
701 cancelAction->setVisible( theIsCompute );
702 progressAction->setVisible( theIsCompute );
704 myHierarchyDepth->setEnabled( !theIsCompute );
705 myDisplayAscendants->setEnabled( !theIsCompute );
706 myDisplayDescendants->setEnabled( !theIsCompute );
707 updateButton->setEnabled( !theIsCompute );
710 DependencyTree_ComputeDlg_QThread::DependencyTree_ComputeDlg_QThread( DependencyTree_View* theView )
715 void DependencyTree_ComputeDlg_QThread::run()
717 myView->setIsCompute( true );
719 myView->fitAll( true );
720 SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
721 QApplication::postEvent( myView, new QEvent( ( QEvent::Type )DRAW_EVENT ) );
724 void DependencyTree_ComputeDlg_QThread::sleepDraw()
729 void DependencyTree_ComputeDlg_QThread::cancel()
731 myView->setIsCompute( false );