1 // Copyright (C) 2007-2020 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License, or (at your option) any later version.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 // File: LightApp_Module.cxx
24 // Created: 6/20/2005 16:30:56 AM
27 #include "LightApp_Module.h"
29 #include "CAM_Application.h"
31 #include "LightApp_Application.h"
32 #include "LightApp_DataModel.h"
33 #include "LightApp_DataObject.h"
34 #include "LightApp_Study.h"
35 #include "LightApp_Preferences.h"
36 #include "LightApp_Selection.h"
37 #include "LightApp_Operation.h"
38 #include "LightApp_SwitchOp.h"
39 #include "LightApp_UpdateFlags.h"
40 #include "LightApp_ShowHideOp.h"
41 #include "LightApp_SelectionMgr.h"
43 #include <SUIT_Study.h>
44 #include <SUIT_DataObject.h>
45 #include <SUIT_DataBrowser.h>
46 #include <SUIT_Operation.h>
47 #include <SUIT_ViewManager.h>
48 #include <SUIT_ResourceMgr.h>
49 #include <SUIT_ShortcutMgr.h>
50 #include <SUIT_Desktop.h>
51 #include <SUIT_TreeModel.h>
52 #include <SUIT_Session.h>
54 #ifndef DISABLE_SALOMEOBJECT
55 #include <SALOME_ListIO.hxx>
58 #ifndef DISABLE_VTKVIEWER
59 #ifndef DISABLE_SALOMEOBJECT
60 #include <SVTK_ViewWindow.h>
61 #include <SVTK_ViewModel.h>
63 #include <VTKViewer_ViewWindow.h>
65 #include <VTKViewer_ViewModel.h>
67 #ifndef DISABLE_OCCVIEWER
68 #include <OCCViewer_ViewWindow.h>
69 #include <OCCViewer_ViewPort3d.h>
70 #ifndef DISABLE_SALOMEOBJECT
71 #include <SOCC_ViewModel.h>
73 #include <OCCViewer_ViewModel.h>
76 #ifndef DISABLE_GLVIEWER
77 #include <GLViewer_ViewFrame.h>
78 #include <GLViewer_ViewPort.h>
80 #ifndef DISABLE_PVVIEWER
81 #include <PVViewer_ViewManager.h>
82 #include <PVViewer_ViewWindow.h>
84 #ifndef DISABLE_PLOT2DVIEWER
85 #include <Plot2d_ViewWindow.h>
86 #include <Plot2d_ViewFrame.h>
87 #ifndef DISABLE_SALOMEOBJECT
88 #include <SPlot2d_ViewModel.h>
90 #include <Plot2d_ViewModel.h>
94 #include <QtxPopupMgr.h>
98 #include <QStringList>
104 LightApp_Module::LightApp_Module( const QString& name )
105 : CAM_Module( name ),
112 myIsFirstActivate( true )
117 LightApp_Module::~LightApp_Module()
123 /*!Initialize module.*/
124 void LightApp_Module::initialize( CAM_Application* app )
126 CAM_Module::initialize( app );
128 SUIT_ResourceMgr* resMgr = app ? app->resourceMgr() : 0;
130 resMgr->raiseTranslators( name() );
134 void LightApp_Module::windows( QMap<int, int>& ) const
139 void LightApp_Module::viewManagers( QStringList& ) const
143 /*!Context menu popup.*/
144 void LightApp_Module::contextMenuPopup( const QString& client, QMenu* menu, QString& /*title*/ )
146 LightApp_Selection* sel = createSelection();
147 sel->init( client, getApp()->selectionMgr() );
149 popupMgr()->setSelection( sel );
150 popupMgr()->setMenu( menu );
151 popupMgr()->updateMenu();
152 popupMgr()->setSelection( 0 );
155 /*!Update object browser.
156 * For updating model or whole object browser use update() method can be used.
158 void LightApp_Module::updateObjBrowser( bool theIsUpdateDataModel,
159 SUIT_DataObject* theDataObject )
161 if (!getApp()->objectBrowser())
163 bool upd = getApp()->objectBrowser()->autoUpdate();
164 getApp()->objectBrowser()->setAutoUpdate( false );
166 if( theIsUpdateDataModel ){
167 if( CAM_DataModel* aDataModel = dataModel() ){
168 if ( LightApp_DataModel* aModel = dynamic_cast<LightApp_DataModel*>( aDataModel ) ) {
169 //SUIT_DataObject* aParent = NULL;
170 //if(theDataObject && theDataObject != aDataModel->root())
171 // aParent = theDataObject->parent();
173 LightApp_DataObject* anObject = dynamic_cast<LightApp_DataObject*>(theDataObject);
174 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(getApp()->activeStudy());
175 aModel->update( anObject, aStudy );
180 getApp()->objectBrowser()->setAutoUpdate( upd );
181 getApp()->objectBrowser()->updateTree( 0, false );
185 void LightApp_Module::selectionChanged()
189 /*! \brief If return false, selection will be cleared at module activation
191 bool LightApp_Module::isSelectionCompatible()
193 // return true if selected objects belong to this module
194 bool isCompatible = true;
195 #ifndef DISABLE_SALOMEOBJECT
196 SALOME_ListIO selected;
197 if ( LightApp_SelectionMgr *Sel = getApp()->selectionMgr() )
198 Sel->selectedObjects( selected );
200 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( getApp()->activeStudy() );
201 LightApp_DataObject* aRoot = dynamic_cast<LightApp_DataObject*>( dataModel()->root() );
202 if ( aStudy && aRoot ) {
204 QString moduleDataType = aRoot->componentDataType();
205 // check data type of selection
206 SALOME_ListIteratorOfListIO It( selected );
207 for ( ; isCompatible && It.More(); It.Next()) {
208 Handle(SALOME_InteractiveObject) io = It.Value();
209 isCompatible = ( aStudy->componentDataType( io->getEntry() ) == moduleDataType );
216 /*!Activate module.*/
217 bool LightApp_Module::activateModule( SUIT_Study* study )
219 bool res = CAM_Module::activateModule( study );
221 if ( !isSelectionCompatible() )// PAL19290, PAL18352
222 getApp()->selectionMgr()->clearSelected();
224 if ( res && application() && application()->resourceMgr() )
225 application()->resourceMgr()->raiseTranslators( name() );
227 connect( application(), SIGNAL( viewManagerAdded( SUIT_ViewManager* ) ),
228 this, SLOT( onViewManagerAdded( SUIT_ViewManager* ) ) );
229 connect( application(), SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
230 this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ) );
232 if ( mySwitchOp == 0 )
233 mySwitchOp = new LightApp_SwitchOp( this );
235 // Enable Display and Erase actions
236 if ( action(myDisplay) )
237 action(myDisplay)->setEnabled(true);
238 if ( action(myErase) )
239 action(myErase)->setEnabled(true);
241 application()->shortcutMgr()->setSectionEnabled( moduleName() );
243 /* BUG 0020498 : The Entry column is always shown at module activation
244 The registration of column is moved into LightApp_Application
246 QString EntryCol = QObject::tr( "ENTRY_COLUMN" );
247 LightApp_DataModel* m = dynamic_cast<LightApp_DataModel*>( dataModel() );
250 SUIT_AbstractModel* treeModel = dynamic_cast<SUIT_AbstractModel*>( getApp()->objectBrowser()->model() );
251 m->registerColumn( getApp()->objectBrowser(), EntryCol, LightApp_DataObject::EntryId );
252 treeModel->setAppropriate( EntryCol, Qtx::Toggled );
258 /*!Deactivate module.*/
259 bool LightApp_Module::deactivateModule( SUIT_Study* study )
264 disconnect( application(), SIGNAL( viewManagerAdded( SUIT_ViewManager* ) ),
265 this, SLOT( onViewManagerAdded( SUIT_ViewManager* ) ) );
266 disconnect( application(), SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
267 this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ) );
269 // abort all operations
270 MapOfOperation::const_iterator anIt;
271 for( anIt = myOperations.begin(); anIt != myOperations.end(); anIt++ ) {
272 anIt.value()->abort();
275 // Disable Display and Erase action
276 if ( action(myDisplay) )
277 action(myDisplay)->setEnabled(false);
278 if ( action(myErase) )
279 action(myErase)->setEnabled(false);
281 application()->shortcutMgr()->setSectionEnabled( moduleName(), false );
283 /* BUG 0020498 : The Entry column is always shown at module activation
284 QString EntryCol = QObject::tr( "ENTRY_COLUMN" );
285 LightApp_DataModel* m = dynamic_cast<LightApp_DataModel*>( dataModel() );
288 SUIT_AbstractModel* treeModel = dynamic_cast<SUIT_AbstractModel*>( getApp()->objectBrowser()->model() );
290 treeModel->setAppropriate( EntryCol, Qtx::Shown );
291 m->unregisterColumn( getApp()->objectBrowser(), EntryCol );
294 return CAM_Module::deactivateModule( study );
297 /*! Redefined to reset internal flags valid for study instance */
298 void LightApp_Module::studyClosed( SUIT_Study* theStudy )
300 CAM_Module::studyClosed( theStudy );
302 myIsFirstActivate = true;
304 LightApp_Application* app = dynamic_cast<LightApp_Application*>(application());
306 SUIT_DataBrowser* ob = app->objectBrowser();
307 if ( ob && ob->model() )
308 disconnect( ob->model(), SIGNAL( clicked( SUIT_DataObject*, int ) ),
309 this, SLOT( onObjectClicked( SUIT_DataObject*, int ) ) );
314 void LightApp_Module::MenuItem()
319 void LightApp_Module::updateInfoPanel()
324 void LightApp_Module::createPreferences()
329 void LightApp_Module::preferencesChanged( const QString&, const QString& )
334 void LightApp_Module::message( const QString& )
338 /*!Gets application.*/
339 LightApp_Application* LightApp_Module::getApp() const
341 return (LightApp_Application*)application();
345 * \brief Update something in accordance with update flags
346 * \param theFlags - update flags
348 * Update viewer or/and object browser etc. in accordance with update flags ( see
349 * LightApp_UpdateFlags enumeration ). Derived modules can redefine this method for their
352 void LightApp_Module::update( const int theFlags )
354 if ( theFlags & UF_Model )
356 if( CAM_DataModel* aDataModel = dataModel() )
357 if( LightApp_DataModel* aModel = dynamic_cast<LightApp_DataModel*>( aDataModel ) )
358 aModel->update( 0, dynamic_cast<LightApp_Study*>( getApp()->activeStudy() ) );
361 if ( theFlags & UF_ObjBrowser )
362 getApp()->objectBrowser()->updateTree( 0 );
364 if ( theFlags & UF_Controls )
366 if ( theFlags & UF_Viewer )
368 if ( SUIT_ViewManager* viewMgr = getApp()->activeViewManager() )
369 if ( SUIT_ViewWindow* viewWnd = viewMgr->getActiveView() )
371 #ifndef DISABLE_VTKVIEWER
372 #ifndef DISABLE_SALOMEOBJECT
373 if ( viewWnd->inherits( "SVTK_ViewWindow" ) )
374 ( (SVTK_ViewWindow*)viewWnd )->Repaint();
376 if ( viewWnd->inherits( "VTKViewer_ViewWindow" ) )
377 ( (VTKViewer_ViewWindow*)viewWnd )->Repaint();
380 #ifndef DISABLE_OCCVIEWER
381 if ( viewWnd->inherits( "OCCViewer_ViewWindow" ) )
382 ( (OCCViewer_ViewWindow*)viewWnd )->getViewPort()->onUpdate();
384 #ifndef DISABLE_PLOT2DVIEWER
385 if ( viewWnd->inherits( "Plot2d_ViewWindow" ) )
386 ( (Plot2d_ViewWindow*)viewWnd )->getViewFrame()->Repaint();
388 #ifndef DISABLE_GLVIEWER
389 if ( viewWnd->inherits( "GLViewer_ViewFrame" ) )
390 ( (GLViewer_ViewFrame*)viewWnd )->getViewPort()->onUpdate();
392 #ifndef DISABLE_PVVIEWER
393 // if ( viewWnd->inherits( "PVViewer_ViewWindow" ) )
394 // ( (PVViewer_ViewWindow*)viewWnd )->getViewPort()->onUpdate();
400 * \brief Updates controls
402 * Updates (i.e. disable/enable) controls states (menus, tool bars etc.). This method is
403 * called from update( UF_Controls ). You may redefine it in concrete module.
405 void LightApp_Module::updateControls()
409 /*!Create new instance of data model and return it.*/
410 CAM_DataModel* LightApp_Module::createDataModel()
412 return new LightApp_DataModel( this );
415 /*!Create and return instance of LightApp_Selection.*/
416 LightApp_Selection* LightApp_Module::createSelection() const
418 return new LightApp_Selection();
422 void LightApp_Module::onModelOpened()
427 void LightApp_Module::onModelSaved()
432 void LightApp_Module::onModelClosed()
436 /*!Gets popup manager.(create if not exist)*/
437 QtxPopupMgr* LightApp_Module::popupMgr()
441 myPopupMgr = new QtxPopupMgr( 0, this );
444 SUIT_Desktop* d = application()->desktop();
447 *disp = createAction( -1, tr( "TOP_SHOW" ), p, tr( "MEN_SHOW" ), tr( "STB_SHOW" ),
448 0, d, false, this, SLOT( onShowHide() ), QString("General:Show object(s)") ),
449 *erase = createAction( -1, tr( "TOP_HIDE" ), p, tr( "MEN_HIDE" ), tr( "STB_HIDE" ),
450 0, d, false, this, SLOT( onShowHide() ) , QString("General:Hide object(s)") ),
451 *dispOnly = createAction( -1, tr( "TOP_DISPLAY_ONLY" ), p, tr( "MEN_DISPLAY_ONLY" ), tr( "STB_DISPLAY_ONLY" ),
452 0, d, false, this, SLOT( onShowHide() ) ),
453 *eraseAll = createAction( -1, tr( "TOP_ERASE_ALL" ), p, tr( "MEN_ERASE_ALL" ), tr( "STB_ERASE_ALL" ),
454 0, d, false, this, SLOT( onShowHide() ) );
455 myDisplay = actionId( disp );
456 myErase = actionId( erase );
457 myDisplayOnly = actionId( dispOnly );
458 myEraseAll = actionId( eraseAll );
460 myPopupMgr->insert( disp, -1, 0 );
461 myPopupMgr->insert( erase, -1, 0 );
462 myPopupMgr->insert( dispOnly, -1, 0 );
463 myPopupMgr->insert( eraseAll, -1, 0 );
464 myPopupMgr->insert( separator(), -1, 0 );
466 QString oneAndNotActive = "( count( $component ) = 1 ) and ( not( activeModule in $component ) ) and ( not($displayer={'%3'}) )";
467 QString uniform = "true in $canBeDisplayed and %1 and ( activeModule = '%2' )";
468 uniform = uniform.arg( oneAndNotActive ).arg( name() ).arg( LightApp_Application::moduleDisplayer( name() ) );
469 myPopupMgr->setRule( disp, /*QString( "( not isVisible ) and " ) + */ uniform, QtxPopupMgr::VisibleRule );
470 myPopupMgr->setRule( erase, /*QString( "( isVisible ) and " ) + */ uniform, QtxPopupMgr::VisibleRule );
471 myPopupMgr->setRule( dispOnly, uniform, QtxPopupMgr::VisibleRule );
475 #ifndef DISABLE_OCCVIEWER
476 #ifndef DISABLE_SALOMEOBJECT
477 viewers.append( SOCC_Viewer::Type() );
479 viewers.append( OCCViewer_Viewer::Type() );
482 #ifndef DISABLE_VTKVIEWER
483 #ifndef DISABLE_SALOMEOBJECT
484 viewers.append( SVTK_Viewer::Type() );
486 viewers.append( VTKViewer_Viewer::Type() );
489 #ifndef DISABLE_PLOT2DVIEWER
490 #ifndef DISABLE_SALOMEOBJECT
491 viewers.append( SPlot2d_Viewer::Type() );
493 viewers.append( Plot2d_Viewer::Type() );
497 if( !viewers.isEmpty() )
499 QString strViewers = "{ ", temp = "'%1' ";
500 QStringList::const_iterator anIt = viewers.begin(), aLast = viewers.end();
501 for( ; anIt!=aLast; anIt++ )
502 strViewers+=temp.arg( *anIt );
504 myPopupMgr->setRule( eraseAll, QString( "client in %1" ).arg( strViewers ), QtxPopupMgr::VisibleRule );
510 /*!Gets preferences.*/
511 LightApp_Preferences* LightApp_Module::preferences() const
513 LightApp_Preferences* pref = 0;
515 pref = getApp()->preferences();
519 /*!Add preference to preferences.*/
520 int LightApp_Module::addPreference( const QString& label )
522 LightApp_Preferences* pref = preferences();
526 int catId = pref->addPreference( moduleName(), -1 );
530 return pref->addPreference( label, catId );
533 /*!Add preference to preferences.*/
534 int LightApp_Module::addPreference( const QString& label, const int pId, const int type,
535 const QString& section, const QString& param )
537 LightApp_Preferences* pref = preferences();
541 return pref->addPreference( moduleName(), label, pId, type, section, param );
544 /*!Gets property of preferences.*/
545 QVariant LightApp_Module::preferenceProperty( const int id, const QString& prop ) const
548 LightApp_Preferences* pref = preferences();
550 var = pref->itemProperty( prop, id );
554 /*!Set property of preferences.*/
555 void LightApp_Module::setPreferenceProperty( const int id, const QString& prop, const QVariant& var )
557 LightApp_Preferences* pref = preferences();
559 pref->setItemProperty( prop, var, id );
563 * \brief Starts operation with given identifier
564 * \param id - identifier of operation to be started
566 * Module stores operations in map. This method starts operation by id.
567 * If operation isn't in map, then it will be created by createOperation method
568 * and will be inserted to map
570 void LightApp_Module::startOperation( const int id )
572 LightApp_Operation* op = 0;
573 if( myOperations.contains( id ) && reusableOperation( id ) )
574 op = myOperations[ id ];
577 op = createOperation( id );
580 myOperations.insert( id, op );
581 op->setModule( this );
582 connect( op, SIGNAL( stopped( SUIT_Operation* ) ), this, SLOT( onOperationStopped( SUIT_Operation* ) ) );
583 connect( op, SIGNAL( destroyed() ), this, SLOT( onOperationDestroyed() ) );
589 // be sure that operation has correct study pointer
590 op->setStudy( application() ? application()->activeStudy() : 0 );
596 * \brief Creates operation with given identifier
597 * \param id - identifier of operation to be started
598 * \return Pointer on created operation or NULL if operation is not created
600 * Creates operation with given id. You should not call this method, it will be called
601 * automatically from startOperation. You may redefine this method in concrete module to
604 LightApp_Operation* LightApp_Module::createOperation( const int id ) const
610 return new LightApp_ShowHideOp( LightApp_ShowHideOp::DISPLAY );
611 else if( id==myErase )
612 return new LightApp_ShowHideOp( LightApp_ShowHideOp::ERASE );
613 else if( id==myDisplayOnly )
614 return new LightApp_ShowHideOp( LightApp_ShowHideOp::DISPLAY_ONLY );
615 else if( id==myEraseAll )
616 return new LightApp_ShowHideOp( LightApp_ShowHideOp::ERASE_ALL );
622 * \brief Virtual protected slot called when operation stopped
623 * \param theOp - stopped operation
625 * Virtual protected slot called when operation stopped. Redefine this slot if you want to
626 * perform actions after stopping operation
628 void LightApp_Module::onOperationStopped( SUIT_Operation* /*theOp*/ )
633 * \brief Virtual protected slot called when operation destroyed
634 * \param theOp - destroyed operation
636 * Virtual protected slot called when operation destroyed. Redefine this slot if you want to
637 * perform actions after destroying operation. Base implementation removes pointer on
638 * destroyed operation from the map of operations
640 void LightApp_Module::onOperationDestroyed()
642 const QObject* s = sender();
643 if( s && s->inherits( "LightApp_Operation" ) )
645 const LightApp_Operation* op = ( LightApp_Operation* )s;
646 MapOfOperation::const_iterator anIt = myOperations.begin(),
647 aLast = myOperations.end();
648 for( ; anIt!=aLast; anIt++ )
649 if( anIt.value()==op )
651 myOperations.remove( anIt.key() );
658 Must be redefined in order to use standard displayer mechanism
659 \return displayer of module
661 LightApp_Displayer* LightApp_Module::displayer()
667 SLOT: called on activating of standard operations show/hide
669 void LightApp_Module::onShowHide()
671 if( !sender()->inherits( "QAction" ) || !popupMgr() )
674 QAction* act = ( QAction* )sender();
675 int id = actionId( act );
677 startOperation( id );
681 virtual SLOT: called on view manager adding
683 void LightApp_Module::onViewManagerAdded( SUIT_ViewManager* )
688 virtual SLOT: called on view manager removing
690 void LightApp_Module::onViewManagerRemoved( SUIT_ViewManager* )
695 \brief Returns instance of operation by its id; if there is no operation
696 corresponding to this id, null pointer is returned
697 \param id - operation id
698 \return operation instance
700 LightApp_Operation* LightApp_Module::operation( const int id ) const
702 return myOperations.contains( id ) ? myOperations[id] : 0;
706 virtual method called to manage the same operations
708 bool LightApp_Module::reusableOperation( const int /*id*/ )
715 \return true if module can copy the current selection
717 bool LightApp_Module::canCopy() const
724 \return true if module can paste previously copied data
726 bool LightApp_Module::canPaste() const
733 \brief Copies the current selection into clipboard
735 void LightApp_Module::copy()
741 \brief Pastes the current data in the clipboard
743 void LightApp_Module::paste()
749 \return true if module allows dragging the given object
751 bool LightApp_Module::isDraggable( const SUIT_DataObject* /*what*/ ) const
758 \return true if module allows dropping one or more objects (currently selected) on the object \c where
760 bool LightApp_Module::isDropAccepted( const SUIT_DataObject* /*where*/ ) const
767 Complete drag-n-drop operation by processing objects \a what being dragged, dropped to the line \a row
768 within the object \a where. The drop action being performed is specified by \a action.
770 void LightApp_Module::dropObjects( const DataObjectList& /*what*/, SUIT_DataObject* /*where*/,
771 const int /*row*/, Qt::DropAction /*action*/ )
776 \brief Return \c true if object can be renamed
778 bool LightApp_Module::renameAllowed( const QString& /*entry*/ ) const
784 Rename object by entry.
785 \param entry entry of the object
786 \param name new name of the object
787 \brief Return \c true if rename operation finished successfully, \c false otherwise.
789 bool LightApp_Module::renameObject( const QString& /*entry*/, const QString& /*name*/ )
795 Update visibility state for data objects
797 void LightApp_Module::updateModuleVisibilityState()
799 // update visibility state of objects
800 LightApp_Application* app = dynamic_cast<LightApp_Application*>(SUIT_Session::session()->activeApplication());
803 SUIT_DataBrowser* ob = app->objectBrowser();
804 if ( !ob || !ob->model() ) return;
806 if ( !myIsFirstActivate )
809 myIsFirstActivate = false;
811 // connect to click on item
812 connect( ob->model(), SIGNAL( clicked( SUIT_DataObject*, int ) ),
813 this, SLOT( onObjectClicked( SUIT_DataObject*, int ) ), Qt::UniqueConnection );
814 // connect to click on item
815 connect( ob, SIGNAL( destroyed( QObject* ) ),
816 this, SLOT( onOBDestroyed() ), Qt::UniqueConnection );
818 SUIT_DataObject* rootObj = ob->root();
819 if ( !rootObj ) return;
821 DataObjectList listObj = rootObj->children( true );
823 SUIT_ViewModel* vmod = 0;
824 if ( SUIT_ViewManager* vman = app->activeViewManager() )
825 vmod = vman->getViewModel();
826 app->updateVisibilityState( listObj, vmod );
830 * \brief Virtual public slot
832 * This method is called after the object inserted into data view to update their visibility state
833 * This is default implementation
835 void LightApp_Module::onObjectClicked( SUIT_DataObject* theObject, int theColumn )
837 if ( !isActiveModule() ) return;
839 // change visibility of object
840 if ( !theObject || theColumn != SUIT_DataObject::VisibilityId ) return;
842 LightApp_Study* study = dynamic_cast<LightApp_Study*>( SUIT_Session::session()->activeApplication()->activeStudy() );
843 if ( !study ) return;
845 LightApp_DataObject* lo = dynamic_cast<LightApp_DataObject*>( theObject );
848 // detect action index (from LightApp level)
851 if ( study->visibilityState( lo->entry() ) == Qtx::ShownState )
853 else if ( study->visibilityState( lo->entry() ) == Qtx::HiddenState )
857 startOperation( id );
860 void LightApp_Module::onOBDestroyed()
862 myIsFirstActivate = true;