From 315830b12591d44366f952e440338e856595f848 Mon Sep 17 00:00:00 2001 From: nds Date: Wed, 29 Jan 2014 08:30:55 +0000 Subject: [PATCH] refs #339 - Regression: Drag and select operation is not available after first action refs #351 - regression - impossible to move Zone to another Region --- src/HYDROGUI/HYDROGUI_DataBrowser.cxx | 155 +++++++++++++++++++++++++- 1 file changed, 154 insertions(+), 1 deletion(-) diff --git a/src/HYDROGUI/HYDROGUI_DataBrowser.cxx b/src/HYDROGUI/HYDROGUI_DataBrowser.cxx index 2c16b0c6..d5460b64 100644 --- a/src/HYDROGUI/HYDROGUI_DataBrowser.cxx +++ b/src/HYDROGUI/HYDROGUI_DataBrowser.cxx @@ -37,6 +37,159 @@ #define VISIBILITY_COLUMN_WIDTH 25 + +#include +#include + +#include + +class SUIT_DataBrowser; +class LightApp_DataObject; + + +#include "LightApp_DataOwner.h" +#include "LightApp_DataObject.h" +#include "LightApp_Application.h" +#include +#include +#include +#include +#include + + +// The selector is redefined in order to correct the selection in the browser. +// The main modification is to call fillEntries without the selector modified +// time compare. The modified time is result of the clock() method. +// On Linux, the method clock() returns the same values with some delay. So, it is possible, +// that time has the same value, but the browser has already other objects. +// So, the obsole entries can be in the saved entries by the filled method. +// May be it will be improved in the latest version of GUI_SRC. +// This redefinition is done for tag V7_3_0 of GUI_SRC. +class HYDROGUI_OBSelector : public LightApp_OBSelector +{ +public: + HYDROGUI_OBSelector( SUIT_DataBrowser*, SUIT_SelectionMgr* ); + virtual ~HYDROGUI_OBSelector(); + +protected: + virtual void getSelection( SUIT_DataOwnerPtrList& ) const; + virtual void setSelection( const SUIT_DataOwnerPtrList& ); + +private: + void fillEntries( QMap& ); + +private: + SUIT_DataOwnerPtrList mySelectedList; + QMap myEntries; +}; + +HYDROGUI_OBSelector::HYDROGUI_OBSelector( SUIT_DataBrowser* ob, SUIT_SelectionMgr* mgr ) +: LightApp_OBSelector( ob, mgr ) +{ +} + +/*! + \brief Destructor. +*/ +HYDROGUI_OBSelector::~HYDROGUI_OBSelector() +{ +} + +/*! + \brief Get list of currently selected objects. + \param theList list to be filled with the selected objects owners + \ This method is necessary to fill the cach containter mySelectedList + \ It is the same as in LightApp_OBSelector +*/ +void HYDROGUI_OBSelector::getSelection( SUIT_DataOwnerPtrList& theList ) const +{ + SUIT_DataBrowser* aBrowser = browser(); + + if ( mySelectedList.count() == 0 ) { + SUIT_Session* session = SUIT_Session::session(); + SUIT_Application* sapp = session ? session->activeApplication() : 0; + LightApp_Application* app = dynamic_cast( sapp ); + if( !app || !aBrowser ) + return; + + DataObjectList objlist; + aBrowser->getSelected( objlist ); + HYDROGUI_OBSelector* that = (HYDROGUI_OBSelector*)this; + QListIterator it( objlist ); + while ( it.hasNext() ) { + LightApp_DataObject* obj = dynamic_cast( it.next() ); + if ( obj && app->checkDataObject( obj) ) { +#ifndef DISABLE_SALOMEOBJECT + Handle(SALOME_InteractiveObject) aSObj = new SALOME_InteractiveObject + ( obj->entry().toLatin1().constData(), + obj->componentDataType().toLatin1().constData(), + obj->name().toLatin1().constData() ); + LightApp_DataOwner* owner = new LightApp_DataOwner( aSObj ); +#else + LightApp_DataOwner* owner = new LightApp_DataOwner( obj->entry() ); +#endif + that->mySelectedList.append( SUIT_DataOwnerPtr( owner ) ); + } + } + } + theList = mySelectedList; +} + +/*! + \brief Set selection. + \param theList list of the object owners to be set selected + \ It is the same as in LightApp_OBSelector. The difference is in the row with + \ the modification time check. +*/ +void HYDROGUI_OBSelector::setSelection( const SUIT_DataOwnerPtrList& theList ) +{ + SUIT_DataBrowser* aBrowser = browser(); + if ( !aBrowser ) + return; + + // this is the difference to LightApp_OBSelector. For this, this class is redefined + //if( myEntries.count() == 0 || myModifiedTime < aBrowser->getModifiedTime() ) + { + fillEntries( myEntries ); + } + + DataObjectList objList; + for ( SUIT_DataOwnerPtrList::const_iterator it = theList.begin(); + it != theList.end(); ++it ) { + const LightApp_DataOwner* owner = dynamic_cast( (*it).operator->() ); + + if ( owner && myEntries.contains( owner->entry() ) ) + objList.append( myEntries[owner->entry()] ); + } + + aBrowser->setSelected( objList ); + mySelectedList.clear(); +} + +/*! + \brief Fill map of the data objects currently shown in the Object Browser. + \param entries map to be filled + \ It is the same as in LightApp_OBSelector +*/ +void HYDROGUI_OBSelector::fillEntries( QMap& entries ) +{ + entries.clear(); + + SUIT_DataBrowser* aBrowser = browser(); + if ( !aBrowser ) + return; + + for ( SUIT_DataObjectIterator it( aBrowser->root(), + SUIT_DataObjectIterator::DepthLeft ); it.current(); ++it ) { + LightApp_DataObject* obj = dynamic_cast( it.current() ); + if ( obj ) + entries.insert( obj->entry(), obj ); + } + + setModified(); +} + + HYDROGUI_DataBrowser::HYDROGUI_DataBrowser( HYDROGUI_Module* theModule, SUIT_DataObject* theRoot, QWidget* theParent ) : SUIT_DataBrowser( theRoot, theParent ), myModule( theModule ) { @@ -117,7 +270,7 @@ HYDROGUI_DataBrowser::HYDROGUI_DataBrowser( HYDROGUI_Module* theModule, SUIT_Dat */ // Create OBSelector - new LightApp_OBSelector( this, theModule->getApp()->selectionMgr() ); + new HYDROGUI_OBSelector( this, theModule->getApp()->selectionMgr() ); treeView()->header()->setResizeMode(SUIT_DataObject::VisibilityId, QHeaderView::Fixed); treeView()->header()->moveSection(SUIT_DataObject::NameId,SUIT_DataObject::VisibilityId); -- 2.39.2