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 qthread = new DependencyTree_ComputeDlg_QThread( this );
75 SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
77 myNodesMovable = new QCheckBox( tr( "MOVE_NODES" ) );
78 QWidgetAction* nodesMovableAction = new QWidgetAction( theViewFrame );
79 nodesMovableAction->setDefaultWidget( myNodesMovable );
81 myDisplayAscendants = new QCheckBox( tr( "DISPLAY_ASCENDANTS" ) );
82 QWidgetAction* ShowParentsAction = new QWidgetAction( theViewFrame );
83 ShowParentsAction->setDefaultWidget( myDisplayAscendants );
85 myDisplayDescendants = new QCheckBox(tr("DISPLAY_DESCENDANTS"));
86 QWidgetAction* ShowChildrenAction = new QWidgetAction(theViewFrame);
87 ShowChildrenAction->setDefaultWidget( myDisplayDescendants );
89 QLabel* hierarchyDepthLabel = new QLabel( tr( "HIERARCHY_DEPTH" ) );
90 QWidgetAction* hierarchyDepthLabelAction = new QWidgetAction(theViewFrame);
91 hierarchyDepthLabelAction->setDefaultWidget( hierarchyDepthLabel );
93 myLevelsNumber = checkMaxLevelsNumber();
95 myHierarchyDepth = new QSpinBox();
96 myHierarchyDepth->setRange( 0, checkMaxLevelsNumber() );
97 myHierarchyDepth->setSpecialValueText( tr( "SHOW_ALL" ) );
98 myHierarchyDepth->setValue( 0 );
99 QWidgetAction* hierarchyDepthAction = new QWidgetAction( theViewFrame );
100 hierarchyDepthAction->setDefaultWidget( myHierarchyDepth );
102 updateButton = new QPushButton( tr( "UPDATE" ) );
103 QWidgetAction* updateAction = new QWidgetAction( theViewFrame );
104 updateAction->setDefaultWidget( updateButton );
106 QPushButton* cancelButton = new QPushButton( tr( "CANCEL" ) );
107 cancelButton->setCheckable( true );
108 cancelAction = new QWidgetAction( theViewFrame );
109 cancelAction->setDefaultWidget( cancelButton );
110 cancelAction->setVisible( false );
112 QProgressBar* progressBar = new QProgressBar( this );
113 progressBar->setMinimum( 0 );
114 progressBar->setMaximum( 100 );
115 progressBar->setFixedWidth( 100 );
116 progressAction = new QWidgetAction( theViewFrame );
117 progressAction->setDefaultWidget( progressBar );
118 progressAction->setVisible( false );
120 QAction* separator1 = theViewFrame->toolMgr()->separator( false );
121 QAction* separator2 = theViewFrame->toolMgr()->separator( false );
123 theViewFrame->toolMgr()->append( separator1, theViewFrame->getToolBarId() );
124 theViewFrame->toolMgr()->append( nodesMovableAction, theViewFrame->getToolBarId() );
125 theViewFrame->toolMgr()->append( hierarchyDepthLabelAction, theViewFrame->getToolBarId() );
126 theViewFrame->toolMgr()->append( hierarchyDepthAction, theViewFrame->getToolBarId() );
127 theViewFrame->toolMgr()->append( ShowParentsAction, theViewFrame->getToolBarId() );
128 theViewFrame->toolMgr()->append( ShowChildrenAction, theViewFrame->getToolBarId() );
130 theViewFrame->toolMgr()->append( separator2, theViewFrame->getToolBarId() );
131 theViewFrame->toolMgr()->append( updateAction, theViewFrame->getToolBarId() );
132 theViewFrame->toolMgr()->append( progressAction, theViewFrame->getToolBarId() );
133 theViewFrame->toolMgr()->append( cancelAction, theViewFrame->getToolBarId() );
135 connect( myNodesMovable, SIGNAL( toggled( bool ) ), this, SLOT( onMoveNodes( bool ) ) );
136 connect( myHierarchyDepth, SIGNAL( valueChanged ( int ) ), this, SLOT( onHierarchyType() ) );
137 connect( myDisplayAscendants , SIGNAL( toggled( bool ) ), this, SLOT( onHierarchyType() ) );
138 connect( myDisplayDescendants, SIGNAL( toggled( bool ) ), this, SLOT( onHierarchyType() ) );
139 connect( updateButton, SIGNAL( clicked() ), this, SLOT( onUpdateModel( false ) ) );
140 connect( cancelButton, SIGNAL( clicked() ), this, SLOT( onCancel() ) );
142 setPrefBackgroundColor( resMgr->colorValue( "Geometry", "dependency_tree_background_color", QColor( 255, 255, 255 ) ) );
143 setNodesMovable( resMgr->booleanValue( "Geometry", "dependency_tree_move_nodes", true ) );
144 setHierarchyType( resMgr->integerValue( "Geometry", "dependency_tree_hierarchy_type", 0 ) );
147 void DependencyTree_View::updateModel( bool getSelectedObjects )
149 getNewTreeModel( getSelectedObjects );
151 SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
153 setPrefBackgroundColor( resMgr->colorValue( "Geometry", "dependency_tree_background_color", QColor( 255, 255, 255 ) ) );
154 setNodesMovable( resMgr->booleanValue( "Geometry", "dependency_tree_move_nodes", true ) );
155 setHierarchyType( resMgr->integerValue( "Geometry", "dependency_tree_hierarchy_type", 0 ) );
158 void DependencyTree_View::drawTree()
162 std::cout << "\n\n\n TOTAL COST = " << myTotalCost << std::endl;
170 // draw nodes on scene
171 std::map< std::string, int > entryLevelMap;
172 std::map< int, std::vector< std::string > > levelObjects;
174 int horDistance, verDistance;
175 GEOMUtils::TreeModel::const_reverse_iterator i;
176 for( i = myTreeModel.rbegin(); i != myTreeModel.rend(); i++ ) {
181 std::string objectEntry = i->first;
182 DependencyTree_Object* objectItem = myTreeMap[ objectEntry ];
183 horDistance = 100 + int( objectItem->boundingRect().width() );
184 verDistance = 3 * int( objectItem->boundingRect().height() );
185 if( isItemAdded( objectItem ) )
186 currentLevel = entryLevelMap[ objectEntry ];
188 addNewItem( objectItem );
189 objectItem->unselect();
190 entryLevelMap[ objectEntry ] = currentLevel;
191 levelObjects[ currentLevel ].push_back( objectEntry );
193 objectItem->setIsMainObject( true );
195 if( myDisplayAscendants->isChecked() )
196 drawWard( i->second.first, entryLevelMap, levelObjects, currentLevel, -1 );
197 if( myDisplayDescendants->isChecked() )
198 drawWard( i->second.second, entryLevelMap, levelObjects, currentLevel, 1 );
201 std::map< int, std::vector< std::string > >::const_iterator level;
202 for( level = levelObjects.begin(); level != levelObjects.end(); level++ ) {
203 int step = -horDistance * ( level->second.size() - 1 ) / 2;
204 std::cout<<"\n\n LEVEL = " << level->first << std::endl;
205 for( int objIter = 0; objIter < level->second.size(); objIter++ ) {
206 std::cout << level->second.at( objIter ) << ", ";
207 DependencyTree_Object* anObject = myTreeMap[ level->second.at( objIter ) ];
208 anObject->setPos( step, verDistance * level->first );
213 // draw arrows on scene
214 GEOMUtils::TreeModel::const_iterator j;
215 for( j = myTreeModel.begin(); j != myTreeModel.end(); j++ ) {
216 DependencyTree_Object* Main_object = myTreeMap[ j->first ];
217 if( j->second.first.size() > 0 ) {
218 GEOMUtils::LevelInfo Levelup = j->second.first.at(0);
219 if( myDisplayAscendants ->isChecked() ) {
220 GEOMUtils::LevelInfo::const_iterator node;
221 for (node = Levelup.begin(); node != Levelup.end(); node++ ) {
222 DependencyTree_Object* object = myTreeMap[node->first];
223 DependencyTree_Arrow* arrow = myArrows[std::pair<DependencyTree_Object*,DependencyTree_Object*>(Main_object, object)];
224 if( arrow && !isItemAdded( arrow) )
229 if( myDisplayAscendants->isChecked() )
230 drawWardArrows( j->second.first );
231 if( myDisplayDescendants->isChecked() )
232 drawWardArrows( j->second.second );
234 std::cout << "\n ComputedCost = " << myComputedCost << std::endl;
238 int DependencyTree_View::select( const QRectF& theRect, bool theIsAppend )
240 GraphicsView_ViewPort::select( theRect, theIsAppend );
242 mySelectionMgr->clearSelected();
245 SALOME_ListIO listIO;
246 int StudyId = myStudy->StudyId();
247 for( initSelected(); moreSelected(); nextSelected() )
248 if( DependencyTree_Object* treeObject = dynamic_cast<DependencyTree_Object*>( selectedObject() ) ) {
249 CORBA::String_var studyEntry = treeObject->getGeomObject()->GetStudyEntry();
250 Handle(SALOME_InteractiveObject) tmpIO =
251 new SALOME_InteractiveObject( studyEntry.in(), "GEOM", "TEMP_IO");
252 listIO.Append( tmpIO );
254 mySelectionMgr->setSelectedObjects( listIO, true );
257 void DependencyTree_View::customEvent( QEvent * event )
259 if( event->type() == DRAW_EVENT ) {
261 QPushButton* cancelButton = dynamic_cast<QPushButton*>( cancelAction->defaultWidget() );
262 QProgressBar* progressBar = dynamic_cast<QProgressBar*>( progressAction->defaultWidget() );
264 if ( !cancelButton->isChecked() )
265 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);
273 QApplication::removePostedEvents( this, ( QEvent::Type )DRAW_EVENT );
279 void DependencyTree_View::addNewItem( QGraphicsItem* theObject )
281 qthread->sleepDraw();
283 addItem( theObject );
284 SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
285 QApplication::postEvent( this, new QEvent( ( QEvent::Type )DRAW_EVENT ) );
288 void DependencyTree_View::mouseMoveEvent(QMouseEvent *event)
290 QGraphicsView::mouseMoveEvent( event );
291 ArrowsInfo::const_iterator j;
292 for (j = myArrows.begin(); j != myArrows.end(); j++ ) {
293 DependencyTree_Arrow* arrow = myArrows[ j->first ];
298 void DependencyTree_View::setHierarchyType( const int theType )
303 myDisplayAscendants->setChecked( true );
304 myDisplayDescendants->setChecked( true );
307 myDisplayAscendants->setChecked( true );
308 myDisplayDescendants->setChecked( false );
311 myDisplayAscendants->setChecked( false );
312 myDisplayDescendants->setChecked( true );
317 myLevelsNumber = checkMaxLevelsNumber();
322 void DependencyTree_View::setNodesMovable( const bool theIsMovable )
324 myNodesMovable->setChecked( theIsMovable );
327 void DependencyTree_View::setPrefBackgroundColor( const QColor& theColor )
329 if( isForegroundEnabled() )
331 setForegroundColor( theColor );
335 setBackgroundColor( theColor );
338 void DependencyTree_View::setNodeColor( const QColor& theColor )
340 EntryObjectMap::const_iterator i;
341 for (i = myTreeMap.begin(); i != myTreeMap.end(); i++ ) {
342 DependencyTree_Object* object = myTreeMap[ i->first ];
343 object->setColor( theColor );
347 void DependencyTree_View::setMainNodeColor( const QColor& theColor )
349 EntryObjectMap::const_iterator i;
350 for (i = myTreeMap.begin(); i != myTreeMap.end(); i++ ) {
351 DependencyTree_Object* object = myTreeMap[ i->first ];
352 object->setMainObjectColor( theColor );
356 void DependencyTree_View::setSelectNodeColor( const QColor& theColor )
358 EntryObjectMap::const_iterator i;
359 for (i = myTreeMap.begin(); i != myTreeMap.end(); i++ ) {
360 DependencyTree_Object* object = myTreeMap[ i->first ];
361 object->setSelectColor( theColor );
365 void DependencyTree_View::setArrowColor( const QColor& theColor )
367 ArrowsInfo::const_iterator j;
368 for (j = myArrows.begin(); j != myArrows.end(); j++ ) {
369 DependencyTree_Arrow* arrow = myArrows[ j->first ];
370 arrow->setColor( theColor );
374 void DependencyTree_View::setHighlightArrowColor( const QColor& theColor )
376 ArrowsInfo::const_iterator j;
377 for (j = myArrows.begin(); j != myArrows.end(); j++ ) {
378 DependencyTree_Arrow* arrow = myArrows[ j->first ];
379 arrow->setHighlightColor( theColor );
383 void DependencyTree_View::setSelectArrowColor( const QColor& theColor )
385 ArrowsInfo::const_iterator j;
386 for (j = myArrows.begin(); j != myArrows.end(); j++ ) {
387 DependencyTree_Arrow* arrow = myArrows[ j->first ];
388 arrow->setSelectColor( theColor );
392 void DependencyTree_View::setIsCompute( bool theIsCompute )
394 myIsCompute = theIsCompute;
397 bool DependencyTree_View::getIsCompute()
402 //void DependencyTree_View::timerEvent(QTimerEvent *event)
404 // QPushButton* cancelButton = dynamic_cast<QPushButton*>( cancelAction->defaultWidget() );
405 // QProgressBar* progressBar = dynamic_cast<QProgressBar*>( progressAction->defaultWidget() );
407 // std::cout << "TIMER! " << std::endl;
408 // if ( !cancelButton->isChecked() )
409 // progressBar->setValue( progressBar->maximum() * getComputeProgress() );
411 // if( !myIsCompute || qthread->isFinished() ) {
412 // changeWidgetState( false );
413 // killTimer( myTimer );
414 // cancelButton->setChecked( false );
415 // progressBar->setValue(0);
420 void DependencyTree_View::closeEvent( QCloseEvent* event )
422 if(qthread->isRunning())
430 void DependencyTree_View::onUpdateModel( bool getSelectedObjects )
432 updateModel( getSelectedObjects );
435 void DependencyTree_View::updateView()
440 changeWidgetState( true );
449 void DependencyTree_View::onMoveNodes( bool theIsMoveNodes )
451 EntryObjectMap::const_iterator i;
452 for (i = myTreeMap.begin(); i != myTreeMap.end(); i++ ) {
453 DependencyTree_Object* object = myTreeMap[ i->first ];
455 object->setMovable( theIsMoveNodes );
459 void DependencyTree_View::onHierarchyType()
461 myHierarchyDepth->setRange( 0, checkMaxLevelsNumber() );
462 if( myHierarchyDepth->value() > checkMaxLevelsNumber() )
463 myHierarchyDepth->setValue( checkMaxLevelsNumber() );
465 if( myHierarchyDepth->value() == 0 )
466 myLevelsNumber = myHierarchyDepth->maximum();
468 myLevelsNumber = myHierarchyDepth->value();
473 void DependencyTree_View::onCancel()
476 //qthread->deleteLater();
479 void DependencyTree_View::addNode( const std::string& theEntry )
481 if( !myTreeMap[theEntry] )
482 myTreeMap[theEntry] = new DependencyTree_Object( theEntry );
485 void DependencyTree_View::addArrow( DependencyTree_Object *startItem, DependencyTree_Object *endItem )
489 std::cout << " " << startItem->getEntry() << " " << endItem->getEntry() << std::endl;
490 ArrowsInfo::const_iterator i;
491 for (i = myArrows.begin(); i != myArrows.end(); i++ ) {
492 DependencyTree_Arrow* arrow = i->second;
493 if( arrow->getStartItem() == startItem && arrow->getEndItem() == endItem ) {
495 std::cout<<" theSame " << std::endl;
497 else if( arrow->getStartItem() == endItem && arrow->getEndItem() == startItem ) {
498 arrow->setIsBiLink( true );
499 std::cout<<" Bilink " << std::endl;
505 DependencyTree_Arrow *arrow = new DependencyTree_Arrow(startItem, endItem);
506 myArrows[std::pair<DependencyTree_Object*,DependencyTree_Object*>( startItem, endItem )] = arrow;
507 std::cout<<" addArrow " << std::endl;
511 void DependencyTree_View::parseTree()
514 GEOMUtils::TreeModel::const_iterator i;
515 for (i = myTreeModel.begin(); i != myTreeModel.end(); i++ ) {
516 std::string objectEntry = i->first;
517 addNode( objectEntry );
518 parseTreeWard( i->second.first );
519 if( i->second.first.size() > myMaxUpwardLevelsNumber )
520 myMaxUpwardLevelsNumber = i->second.first.size();
521 parseTreeWard( i->second.second );
522 if( i->second.second.size() > myMaxDownwardLevelsNumber )
523 myMaxDownwardLevelsNumber = i->second.second.size();
526 for (i = myTreeModel.begin(); i != myTreeModel.end(); i++ ) {
527 DependencyTree_Object* Main_object = myTreeMap[i->first];
528 if( i->second.first.size() > 0 ) {
529 GEOMUtils::LevelInfo Levelup = i->second.first.at(0);
530 GEOMUtils::LevelInfo::const_iterator node;
531 for (node = Levelup.begin(); node != Levelup.end(); node++ ) {
532 DependencyTree_Object* object = myTreeMap[node->first];
533 addArrow( Main_object, object );
536 parseTreeWardArrow( i->second.first );
537 parseTreeWardArrow( i->second.second );
542 void DependencyTree_View::parseTreeWard(const GEOMUtils::LevelsList theWard)
544 int levelsNumber = theWard.size();
545 for( int level = 0; level < levelsNumber; level++ ) {
546 GEOMUtils::LevelInfo levelInfo = theWard[ level ];
547 GEOMUtils::LevelInfo::const_iterator node;
548 for (node = levelInfo.begin(); node != levelInfo.end(); node++ ) {
549 addNode( node->first );
553 void DependencyTree_View::parseTreeWardArrow(const GEOMUtils::LevelsList theWard)
555 for(int j = 0; j < theWard.size(); j++ ) {
556 GEOMUtils::LevelInfo Level = theWard.at(j);
557 GEOMUtils::LevelInfo::const_iterator node;
558 for (node = Level.begin(); node != Level.end(); node++ ) {
559 DependencyTree_Object* object = myTreeMap[node->first];
560 std::vector<std::string> Links = node->second;
561 for( int link = 0; link < Links.size(); link++ ) {
562 DependencyTree_Object* LinkObject = myTreeMap[Links[link]];
563 if( object && LinkObject )
564 addArrow( object, LinkObject );
570 void DependencyTree_View::drawWard( const GEOMUtils::LevelsList& theWard,
571 std::map< std::string, int >& theEntryLevelMap,
572 std::map< int, std::vector< std::string > >& theLevelObjects,
573 int theCurrentLevel, const int theLevelStep )
575 for( int level = 0; level < theWard.size(); level++ ) {
576 if( level >= myLevelsNumber || !myIsCompute )
579 theCurrentLevel += theLevelStep;
580 GEOMUtils::LevelInfo levelInfo = theWard.at( level );
581 GEOMUtils::LevelInfo::const_iterator node;
582 for (node = levelInfo.begin(); node != levelInfo.end(); node++ ) {
583 DependencyTree_Object* object = myTreeMap[ node->first ];
584 if( !isItemAdded( object ) ) {
585 addNewItem( object );
587 theEntryLevelMap[ node->first ] = theCurrentLevel;
588 theLevelObjects[ theCurrentLevel ].push_back( node->first );
594 void DependencyTree_View::drawWardArrows( GEOMUtils::LevelsList theWard )
596 for(int j = 0; j < theWard.size(); j++ ) {
597 if( j >= myLevelsNumber || !myIsCompute )
600 GEOMUtils::LevelInfo Level = theWard.at(j);
601 GEOMUtils::LevelInfo::const_iterator node;
602 for (node = Level.begin(); node != Level.end(); node++ ) {
603 DependencyTree_Object* object = myTreeMap[node->first];
604 GEOMUtils::NodeLinks Links = node->second;
605 for( int link = 0; link < Links.size(); link++ ) {
606 DependencyTree_Object* LinkObject = myTreeMap[Links[link]];
607 if( isItemAdded( object ) && isItemAdded( LinkObject ) ) {
608 DependencyTree_Arrow* arrow = myArrows[std::pair<DependencyTree_Object*,DependencyTree_Object*>(object, LinkObject)];
609 if( arrow && !isItemAdded( arrow) )
617 void DependencyTree_View::getNewTreeModel( bool getSelectedObjects )
621 if( getSelectedObjects )
622 mySelectionMgr->selectedObjects( myMainObjects );
624 // create a list of selected object entry
625 GEOM::string_array_var objectsEntry = new GEOM::string_array();
626 objectsEntry->length( myMainObjects.Extent());
628 for ( SALOME_ListIteratorOfListIO It( myMainObjects ); It.More(); It.Next(), iter++ ) {
629 Handle( SALOME_InteractiveObject ) io = It.Value();
630 GEOM::GEOM_Object_var geomObject = GEOM::GEOM_Object::_nil();
631 geomObject = GEOMBase::ConvertIOinGEOMObject( io );
632 QString entry = geomObject->GetEntry();
633 objectsEntry[ iter ] = entry.toLatin1().constData();
636 // get string which describes dependency tree structure
637 SALOMEDS::TMPFile_var SeqFile =
638 GeometryGUI::GetGeomGen()->GetDependencyTree( myStudy, objectsEntry );
639 char* buf = (char*) &SeqFile[0];
641 std::cout << "\n\n\n\n\n TREE = " << buf << std::endl;
643 // get dependency tree structure
644 GEOMUtils::ConvertStringToTree( buf, myTreeModel );
646 mySelectionMgr->clearSelected();
652 void DependencyTree_View::clearView( bool isClearModel )
654 EntryObjectMap::const_iterator objectIter;
655 for( objectIter = myTreeMap.begin(); objectIter != myTreeMap.end(); objectIter++ ) {
656 DependencyTree_Object* object = objectIter->second;
658 if( isItemAdded( object ) )
659 removeItem( object );
662 ArrowsInfo::const_iterator arrowIter;
663 for( arrowIter = myArrows.begin(); arrowIter != myArrows.end(); arrowIter++ ) {
664 DependencyTree_Arrow* object = arrowIter->second;
666 if( isItemAdded( object ) )
667 removeItem( object );
673 myMaxDownwardLevelsNumber = 0;
674 myMaxUpwardLevelsNumber = 0;
681 int DependencyTree_View::checkMaxLevelsNumber()
683 if( myDisplayAscendants->isChecked() && myDisplayDescendants->isChecked() )
684 return myMaxUpwardLevelsNumber>myMaxDownwardLevelsNumber?myMaxUpwardLevelsNumber:myMaxDownwardLevelsNumber;
685 else if( myDisplayAscendants ->isChecked() )
686 return myMaxUpwardLevelsNumber;
687 else if( myDisplayDescendants->isChecked() )
688 return myMaxDownwardLevelsNumber;
691 void DependencyTree_View::calcTotalCost()
693 myTotalCost = myTreeModel.size();
694 GEOMUtils::TreeModel::const_iterator i;
695 for( i = myTreeModel.begin(); i != myTreeModel.end(); i++ ) {
696 if( myDisplayAscendants->isChecked() )
697 myTotalCost += 2*( myLevelsNumber < i->second.first.size() ? myLevelsNumber : i->second.first.size() );
698 if( myDisplayDescendants->isChecked() )
699 myTotalCost += 2*( myLevelsNumber < i->second.second.size() ? myLevelsNumber : i->second.second.size() );
703 double DependencyTree_View::getComputeProgress()
705 return double( myComputedCost ) / double( myTotalCost );
708 void DependencyTree_View::changeWidgetState( bool theIsCompute )
710 cancelAction->setVisible( theIsCompute );
711 progressAction->setVisible( theIsCompute );
713 myHierarchyDepth->setEnabled( !theIsCompute );
714 myDisplayAscendants->setEnabled( !theIsCompute );
715 myDisplayDescendants->setEnabled( !theIsCompute );
716 updateButton->setEnabled( !theIsCompute );
719 DependencyTree_ComputeDlg_QThread::DependencyTree_ComputeDlg_QThread( DependencyTree_View* theView )
724 void DependencyTree_ComputeDlg_QThread::run()
726 myView->myMutex.lock();
727 // QMutexLocker lock( &myView->myMutex );
728 myView->setIsCompute( true );
731 QApplication::postEvent( myView, new QEvent( ( QEvent::Type )DRAW_EVENT ) );
732 myView->myMutex.unlock();
736 void DependencyTree_ComputeDlg_QThread::sleepDraw()
741 void DependencyTree_ComputeDlg_QThread::cancel()
743 myView->setIsCompute( false );