X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FObjBrowser%2FOB_Browser.cxx;h=a660a57d762860607f6a1f12c68544be83fdc7ef;hb=95c32a3d017f9611ca3519ad1da9c9c23b4e183d;hp=cfac7369726439136ef2b0173f1906b4f130a6bb;hpb=ec43b17a200bb62311dadf4593f8acd08c7c0084;p=modules%2Fgui.git diff --git a/src/ObjBrowser/OB_Browser.cxx b/src/ObjBrowser/OB_Browser.cxx index cfac73697..a660a57d7 100755 --- a/src/ObjBrowser/OB_Browser.cxx +++ b/src/ObjBrowser/OB_Browser.cxx @@ -44,7 +44,7 @@ void OB_Browser::ToolTip::maybeTip( const QPoint& pos ) if ( !parentWidget() || !myBrowser || !myBrowser->isShowToolTips() ) return; - QListView* lv = myBrowser->getListView(); + QListView* lv = myBrowser->listView(); QListViewItem* item = lv->itemAt( pos ); SUIT_DataObject* obj = myBrowser->dataObject( item ); @@ -76,12 +76,13 @@ myAutoUpdate( false ), myAutoDelObjs( false ), myRootDecorated( true ) { - myView = new OB_ListView( this ); - myView->addColumn( "Data" ); + myView = new OB_ListView( QtxListView::HeaderAuto, this ); + myView->setAppropriate( myView->addColumn( "Data" ), false ); myView->setSorting( -1 ); myView->setRootIsDecorated( true ); myView->setSelectionMode( QListView::Extended ); myView->installEventFilter( this ); + myView->viewport()->installEventFilter( this ); QVBoxLayout* main = new QVBoxLayout( this ); main->addWidget( myView ); @@ -178,6 +179,7 @@ void OB_Browser::setRootObject( SUIT_DataObject* theRoot ) if ( theRoot ) curObj = storeState( selObjs, openObjs, selKeys, openKeys, curKey ); + removeConnections( myRoot ); if ( myRoot != theRoot && isAutoDeleteObjects() ) delete myRoot; @@ -187,10 +189,10 @@ void OB_Browser::setRootObject( SUIT_DataObject* theRoot ) if ( myRoot ) updateView( myRoot ); - else if ( getListView() ) + else if ( listView() ) { myItems.clear(); - getListView()->clear(); + listView()->clear(); } restoreState( selObjs, openObjs, curObj, selKeys, openKeys, curKey ); @@ -204,9 +206,9 @@ void OB_Browser::setRootObject( SUIT_DataObject* theRoot ) int OB_Browser::numberOfSelected() const { int count = 0; - if ( getListView() ) + if ( listView() ) { - for ( QListViewItemIterator it( getListView() ); it.current(); ++it ) + for ( QListViewItemIterator it( listView() ); it.current(); ++it ) if ( it.current()->isSelected() ) count++; } @@ -224,16 +226,16 @@ void OB_Browser::getSelected( DataObjectList& theObjList ) const { theObjList.clear(); - if ( !getListView() ) + if ( !listView() ) return; - for ( QListViewItemIterator it( getListView() ); it.current(); ++it ) + for ( QListViewItemIterator it( listView() ); it.current(); ++it ) { if ( it.current()->isSelected() ) { SUIT_DataObject* obj = dataObject( it.current() ); if ( obj ) - theObjList.append( obj ); + theObjList.append( obj ); } } } @@ -247,7 +249,7 @@ void OB_Browser::setSelected( const SUIT_DataObject* theObject, const bool appen void OB_Browser::setSelected( const DataObjectList& theObjLst, const bool append ) { - QListView* lv = getListView(); + QListView* lv = listView(); if ( !lv ) return; @@ -307,22 +309,22 @@ void OB_Browser::setSelected( const DataObjectList& theObjLst, const bool append bool OB_Browser::isOpen( SUIT_DataObject* theObject ) const { bool res = false; - if ( getListView() ) - res = getListView()->isOpen( listViewItem( theObject ) ); + if ( listView() ) + res = listView()->isOpen( listViewItem( theObject ) ); return res; } void OB_Browser::setOpen( SUIT_DataObject* theObject, const bool theOpen ) { - if ( getListView() ) - getListView()->setOpen( listViewItem( theObject ), theOpen ); + if ( listView() ) + listView()->setOpen( listViewItem( theObject ), theOpen ); } SUIT_DataObject* OB_Browser::dataObjectAt( const QPoint& pos ) const { SUIT_DataObject* obj = 0; - QListView* lv = getListView(); + QListView* lv = listView(); if ( lv ) obj = dataObject( lv->itemAt( pos ) ); @@ -339,64 +341,154 @@ void OB_Browser::setFilter( OB_Filter* f ) myView->setFilter( f ); } -int OB_Browser::addColumn( const QString & label, int width, int index ) +int OB_Browser::addColumn( const QString& label, const int id, const int width ) { - int id = -1; - if ( !myView ) - return id; - if ( index != -1 && myColumnIds.contains( index ) ) - return id; // can not reuse index - - int trueId = index; - id = myView->addColumn( label, width ); - if ( trueId == -1 ) - trueId = id; - myColumnIds.insert( trueId, id ); - updateText(); - - return trueId; + return addColumn( QIconSet(), label, id, width ); } -int OB_Browser::addColumn( const QIconSet & iconset, const QString & label, int width, int index ) +int OB_Browser::addColumn( const QIconSet& icon, const QString& label, const int id, const int width ) { - int id = -1; - if ( !myView ) - return id; - if ( index != -1 && myColumnIds.contains( index ) ) - return id; // can not reuse index + QListView* lv = listView(); + if ( !lv ) + return -1; + + int theId = id; + if ( theId < 0 ) + { + while ( myColumnIds.contains( theId ) ) + theId++; + } - int trueId = index; - id = myView->addColumn( iconset, label, width ); - if ( trueId == -1 ) - trueId = id; - myColumnIds.insert( trueId, id ); + if ( myColumnIds.contains( theId ) ) + return -1; // can not reuse id + + int sec = -1; + if ( icon.isNull() ) + sec = lv->addColumn( label, width ); + else + sec = lv->addColumn( icon, label, width ); + + if ( sec == -1 ) + return -1; + + myColumnIds.insert( theId, sec ); updateText(); - return trueId; + return theId; } -void OB_Browser::removeColumn( int index ) +void OB_Browser::removeColumn( const int id ) { - if ( !myView || !myColumnIds.contains( index ) ) + QListView* lv = listView(); + if ( !lv || !myColumnIds.contains( id ) ) return; - int id = myColumnIds[ index ]; - myView->removeColumn( id ); + int sec = myColumnIds[id]; + lv->removeColumn( sec ); // update map of column indeces - myColumnIds.remove( index ); + myColumnIds.remove( id ); for ( QMap::iterator it = myColumnIds.begin(); it != myColumnIds.end(); ++it ) { - if ( it.key() > index ) + if ( it.key() > id ) it.data()--; } updateText(); } -void OB_Browser::updateTree( SUIT_DataObject* o ) +void OB_Browser::setNameTitle( const QString& label ) { - SUIT_DataObject* obj = o ? o : getRootObject(); - if ( !obj ) + setNameTitle( QIconSet(), label ); +} + +void OB_Browser::setNameTitle( const QIconSet& icon, const QString& label ) +{ + QListView* lv = listView(); + if ( !lv ) + return; + + if ( icon.isNull() ) + lv->setColumnText( 0, label ); + else + lv->setColumnText( 0, icon, label ); +} + +void OB_Browser::setColumnTitle( const int id, const QString& label ) +{ + setColumnTitle( id, QIconSet(), label ); +} + +void OB_Browser::setColumnTitle( const int id, const QIconSet& icon, const QString& label ) +{ + QListView* lv = listView(); + if ( !lv || !myColumnIds.contains( id ) ) + return; + + if ( icon.isNull() ) + lv->setColumnText( myColumnIds[id], label ); + else + lv->setColumnText( myColumnIds[id], icon, label ); +} + +QString OB_Browser::nameTitle() const +{ + return myView->columnText( 0 ); +} + +QString OB_Browser::columnTitle( const int id ) const +{ + QString txt; + if ( myColumnIds.contains( id ) ) + txt = myView->columnText( myColumnIds[id] ); + return txt; +} + +bool OB_Browser::isColumnVisible( const int id ) const +{ + return myColumnIds.contains( id ) && myView->isShown( myColumnIds[id] ); +} + +void OB_Browser::setColumnShown( const int id, const bool on ) +{ + if ( !myColumnIds.contains( id ) ) + return; + + myView->setShown( myColumnIds[id], on ); +} + +void OB_Browser::setWidthMode( QListView::WidthMode mode ) +{ + for ( int i = 0, n = myView->columns(); i < n; i++ ) + myView->setColumnWidthMode( i, mode ); +} + +QValueList OB_Browser::columns() const +{ + QValueList lst; + for ( QMap::ConstIterator it = myColumnIds.begin(); it != myColumnIds.end(); ++it ) + lst.append( it.key() ); + return lst; +} + +bool OB_Browser::appropriateColumn( const int id ) const +{ + bool res = false; + if ( myColumnIds.contains( id ) ) + res = myView->appropriate( myColumnIds[id] ); + return res; +} + +void OB_Browser::setAppropriateColumn( const int id, const bool on ) +{ + if ( !myColumnIds.contains( id ) ) + return; + + myView->setAppropriate( myColumnIds[id], on ); +} + +void OB_Browser::updateTree( SUIT_DataObject* obj ) +{ + if ( !obj && !(obj = getRootObject()) ) return; DataObjectKey curKey; @@ -420,7 +512,7 @@ void OB_Browser::updateTree( SUIT_DataObject* o ) void OB_Browser::replaceTree( SUIT_DataObject* src, SUIT_DataObject* trg ) { - if ( !src || !trg || src->root() != getRootObject() ) + if ( !src || !trg || src == trg || src->root() != getRootObject() ) return; DataObjectKey curKey; @@ -436,7 +528,8 @@ void OB_Browser::replaceTree( SUIT_DataObject* src, SUIT_DataObject* trg ) src->setParent( 0 ); - if ( src != trg && isAutoDeleteObjects() ) + removeConnections( src ); + if ( isAutoDeleteObjects() ) delete src; if ( parent && pos != -1 ) @@ -457,7 +550,7 @@ void OB_Browser::replaceTree( SUIT_DataObject* src, SUIT_DataObject* trg ) void OB_Browser::updateView( const SUIT_DataObject* theStartObj ) { - QListView* lv = getListView(); + QListView* lv = listView(); if ( !lv ) return; @@ -509,11 +602,11 @@ void OB_Browser::updateView( const SUIT_DataObject* theStartObj ) createTree( it.current(), 0, 0 ); } else - createTree( theStartObj, parent, after ); + createTree( theStartObj, parent, after ? after : parent ); } QListViewItem* OB_Browser::createTree( const SUIT_DataObject* obj, - QListViewItem* parent, QListViewItem* after ) + QListViewItem* parent, QListViewItem* after ) { if ( !obj ) return 0; @@ -525,13 +618,16 @@ QListViewItem* OB_Browser::createTree( const SUIT_DataObject* obj, for ( DataObjectListIterator it ( lst ); it.current(); ++it ) createTree( it.current(), item ); + if ( item ) + item->setOpen( obj->isOpen() ); + return item; } QListViewItem* OB_Browser::createItem( const SUIT_DataObject* o, QListViewItem* parent, QListViewItem* after ) { - QListView* lv = getListView(); + QListView* lv = listView(); if ( !lv || !o ) return 0; @@ -585,17 +681,19 @@ QListViewItem* OB_Browser::createItem( const SUIT_DataObject* o, myItems.insert( obj, item ); + updateText( item ); + return item; } void OB_Browser::adjustWidth() { - if ( !getListView() ) + if ( !listView() ) return; - getListView()->setColumnWidth( 0, 0 ); - if ( getListView()->firstChild() ) - adjustWidth( getListView()->firstChild() ); + listView()->setColumnWidth( 0, 0 ); + if ( listView()->firstChild() ) + adjustWidth( listView()->firstChild() ); } void OB_Browser::adjustWidth( QListViewItem* item ) @@ -631,7 +729,7 @@ QListViewItem* OB_Browser::listViewItem( const SUIT_DataObject* obj ) const return item; } -QListView* OB_Browser::getListView() const +QListView* OB_Browser::listView() const { return myView; } @@ -642,6 +740,7 @@ void OB_Browser::removeReferences( QListViewItem* item ) return; SUIT_DataObject* obj = dataObject( item ); + obj->disconnect( this, SLOT( onDestroyed( SUIT_DataObject* ) ) ); myItems.remove( obj ); QListViewItem* i = item->firstChild(); @@ -666,11 +765,25 @@ void OB_Browser::createConnections( SUIT_DataObject* obj ) it.current()->connect( this, SLOT( onDestroyed( SUIT_DataObject* ) ) ); } +void OB_Browser::removeConnections( SUIT_DataObject* obj ) +{ + if ( !obj ) + return; + + DataObjectList childList; + obj->children( childList, true ); + + childList.prepend( obj ); + + for ( DataObjectListIterator it( childList ); it.current(); ++it ) + it.current()->disconnect( this, SLOT( onDestroyed( SUIT_DataObject* ) ) ); +} + SUIT_DataObject* OB_Browser::storeState( DataObjectMap& selObjs, DataObjectMap& openObjs, DataObjectKeyMap& selKeys, DataObjectKeyMap& openKeys, DataObjectKey& curKey ) const { - QListView* lv = getListView(); + QListView* lv = listView(); if ( !lv ) return 0; @@ -699,7 +812,7 @@ void OB_Browser::restoreState( const DataObjectMap& selObjs, const DataObjectMap const SUIT_DataObject* curObj, const DataObjectKeyMap& selKeys, const DataObjectKeyMap& openKeys, const DataObjectKey& curKey ) { - QListView* lv = getListView(); + QListView* lv = listView(); if ( !lv ) return; @@ -772,9 +885,9 @@ void OB_Browser::onExpand() expand( listViewItem( itr.current() ) ); } -void OB_Browser::onRefresh() +void OB_Browser::onColumnVisible( int id ) { - updateTree(); + setColumnShown( id, !isColumnVisible( id ) ); } void OB_Browser::onDestroyed( SUIT_DataObject* obj ) @@ -802,38 +915,81 @@ void OB_Browser::onDropped( QPtrList items, QListViewItem* item, void OB_Browser::updateText() { - if ( !myView ) + if ( myColumnIds.isEmpty() ) return; - - if ( myColumnIds.size() ) + + QListView* lv = listView(); + if ( !lv ) + return; + + for ( QListViewItemIterator it( lv ); it.current(); ++it ) { - QListViewItemIterator it( myView ); - for ( ; it.current() != 0; ++it ) - { - QListViewItem* item = it.current(); - SUIT_DataObject* obj = dataObject( item ); - if ( !item || !obj ) - continue; - QMap::iterator it = myColumnIds.begin(); - for( ; it != myColumnIds.end(); ++it ) - item->setText( it.data(), obj->text( it.key() ) ); - } + SUIT_DataObject* obj = dataObject( it.current() ); + if ( !obj ) + continue; + + for( QMap::iterator itr = myColumnIds.begin(); itr != myColumnIds.end(); ++itr ) + it.current()->setText( itr.data(), obj->text( itr.key() ) ); } - updateView(); } -bool OB_Browser::eventFilter(QObject* watched, QEvent* e) +void OB_Browser::updateText( QListViewItem* item ) +{ + SUIT_DataObject* obj = dataObject( item ); + if ( !obj ) + return; + + for( QMap::iterator it = myColumnIds.begin(); it != myColumnIds.end(); ++it ) + item->setText( it.data(), obj->text( it.key() ) ); +} + +bool OB_Browser::eventFilter( QObject* o, QEvent* e ) { - if ( watched == myView && e->type() == QEvent::ContextMenu ) + if ( o == myView && e->type() == QEvent::ContextMenu ) { - contextMenuRequest( (QContextMenuEvent*)e ); + QContextMenuEvent* ce = (QContextMenuEvent*)e; + if ( ce->reason() != QContextMenuEvent::Mouse ) + contextMenuRequest( ce ); return true; } - return QFrame::eventFilter(watched, e); + if ( o == myView->viewport() && e->type() == QEvent::MouseButtonRelease ) + { + QMouseEvent* me = (QMouseEvent*)e; + if ( me->button() == RightButton ) + { + QContextMenuEvent ce( QContextMenuEvent::Mouse, me->pos(), me->globalPos(), me->state() ); + contextMenuRequest( &ce ); + return true; + } + } + + return QFrame::eventFilter( o, e ); } void OB_Browser::contextMenuPopup( QPopupMenu* menu ) { +/* QValueList cols; + for ( QMap::ConstIterator it = myColumnIds.begin(); it != myColumnIds.end(); ++it ) + { + if ( appropriateColumn( it.key() ) ) + cols.append( it.key() ); + } + + uint num = menu->count(); + menu->setCheckable( true ); + for ( QValueList::const_iterator iter = cols.begin(); iter != cols.end(); ++iter ) + { + QString name = columnTitle( *iter ); + if ( name.isEmpty() ) + continue; + + int id = menu->insertItem( name, this, SLOT( onColumnVisible( int ) ) ); + menu->setItemChecked( id, isColumnVisible( *iter ) ); + menu->setItemParameter( id, *iter ); + } + if ( menu->count() != num ) + menu->insertSeparator();*/ + DataObjectList selected; getSelected( selected ); @@ -846,7 +1002,6 @@ void OB_Browser::contextMenuPopup( QPopupMenu* menu ) menu->insertItem( tr( "MEN_EXPAND_ALL" ), this, SLOT( onExpand() ) ); menu->insertSeparator(); } - menu->insertItem( tr( "MEN_REFRESH" ), this, SLOT( onRefresh() ) ); } void OB_Browser::expand( QListViewItem* item ) @@ -889,6 +1044,7 @@ void OB_Browser::removeObject( SUIT_DataObject* obj, const bool autoUpd ) QListViewItem* item = listViewItem( obj ); + obj->disconnect( this, SLOT( onDestroyed( SUIT_DataObject* ) ) ); myItems.remove( obj ); if ( obj == myRoot ) @@ -909,7 +1065,7 @@ void OB_Browser::removeObject( SUIT_DataObject* obj, const bool autoUpd ) void OB_Browser::autoOpenBranches() { int level = autoOpenLevel(); - QListView* lv = getListView(); + QListView* lv = listView(); if ( !lv || level < 1 ) return; @@ -926,10 +1082,10 @@ void OB_Browser::openBranch( QListViewItem* item, const int level ) if ( !item || level < 1 || !item->childCount() ) return; - item->setOpen( true ); while ( item ) { - openBranch( item, level - 1 ); + item->setOpen( true ); + openBranch( item->firstChild(), level - 1 ); item = item->nextSibling(); } }