#include <QtxFontEdit.h>
#include <QtxToolBar.h>
#include <QtxTreeView.h>
+#include <QtxInfoPanel.h>
#include <QtxMRUAction.h>
#include <QtxDockAction.h>
#include <QtxDockWidget.h>
#ifndef DISABLE_QTXWEBBROWSER
QProcess::startDetached( "HelpBrowser",
QStringList() << QString( "--remove=%1" ).arg( QApplication::instance()->applicationPid() ) );
-#endif
+#endif
CAM_Application::closeApplication();
}
saveDockWindowsState();
+ if ( infoPanel() )
+ infoPanel()->clear();
+
bool status = CAM_Application::activateModule( modName );
updateModuleActions();
updateViewManagers();
if ( activeStudy() && activeStudy()->root() && objectBrowser() ) {
- if ( objectBrowser()->root() != activeStudy()->root() )
+ if ( objectBrowser()->root() != activeStudy()->root() )
objectBrowser()->setRoot( activeStudy()->root() );
updateObjectBrowser( true );
}
// Help menu
int helpMenu = createMenu( tr( "MEN_DESK_HELP" ), -1, -1, 1000 );
-
+
int id = LightApp_Application::UserID + FIRST_HELP_ID;
// a) Link to web site
QString url = resMgr->stringValue("GUI", "site_url");
if ( !url.isEmpty() ) {
QString title = tr ( "SALOME_SITE" );
- QAction* as = createAction( id, title,
+ QAction* as = createAction( WebSiteId, title,
resMgr->loadPixmap( "LightApp", tr( "ICON_WWW" ), false ),
title, title,
0, desk, false, this, SLOT( onHelpContentsModule() ) );
as->setData( url );
createMenu( as, helpMenu, -1, 0 );
- id++;
}
// b) Link to Forum
url = resMgr->stringValue("GUI", "forum_url");
if ( !url.isEmpty() ) {
QString title = tr ( "SALOME_FORUM" );
- QAction* af = createAction( helpMenu, title,
+ QAction* af = createAction( ForumId, title,
resMgr->loadPixmap( "LightApp", tr( "ICON_WWW" ), false ),
title, title,
0, desk, false, this, SLOT( onHelpContentsModule() ) );
af->setData( url );
createMenu( af, helpMenu, -1, 0 );
- id++;
}
// c) Link to YouTube channel
if ( !url.isEmpty() ) {
createMenu( separator(), helpMenu, -1, 0 );
QString title = tr ( "SALOME_VIDEO_TUTORIALS" );
- QAction* av = createAction( helpMenu, title,
+ QAction* av = createAction( VideosId, title,
resMgr->loadPixmap( "LightApp", tr( "ICON_LIFE_RIGN" ), false ),
- title, title,
+ title, tr( "PRP_SALOME_VIDEO_TUTORIALS" ),
0, desk, false, this, SLOT( onHelpContentsModule() ) );
av->setData( url );
createMenu( av, helpMenu, -1, 0 );
- id++;
}
- // d) Help for modules
+ // d) Link to Tutorials
+
+ url = resMgr->stringValue("GUI", "tutorials_url");
+ if ( !url.isEmpty() ) {
+ QString title = tr ( "SALOME_TUTORIALS" );
+ QAction* as = createAction( TutorialsId, title,
+ resMgr->loadPixmap( "LightApp", tr( "ICON_WWW" ), false ),
+ title, tr( "PRP_SALOME_TUTORIALS" ),
+ 0, desk, false, this, SLOT( onHelpContentsModule() ) );
+ as->setData( url );
+ createMenu( as, helpMenu, -1, 0 );
+ }
+
+ // e) Help for modules
// - First create top-level menus to preserve correct order
QString userGuide = "User's Guide";
IMapConstIterator<QString, QString > fileIt;
for ( fileIt = helpData.begin(); fileIt != helpData.end(); fileIt++ ) {
QString helpItemPath = fileIt.key();
- // remove all '//' occurances
+ // remove all '//' occurances
while ( helpItemPath.contains( "//" ) )
helpItemPath.replace( "//", "" );
// obtain submenus hierarchy if given
if ( total.count() == 1 && smenus.count() > 0 )
helpItemPath = smenus.takeLast();
}
- QPixmap helpIcon = fileIt.value().startsWith( "http", Qt::CaseInsensitive ) ?
+ QPixmap helpIcon = fileIt.value().startsWith( "http", Qt::CaseInsensitive ) ?
resMgr->loadPixmap( "STD", tr( "ICON_WWW" ), false ) : resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false );
QAction* a = createAction( id, helpItemPath, helpIcon, helpItemPath, helpItemPath,
0, desk, false, this, SLOT( onHelpContentsModule() ) );
QString valueStr = resMgr->stringValue( "add_help", paramName );
if ( !valueStr.isEmpty() ) {
QStringList valueItems = valueStr.split( ";;", QString::SkipEmptyParts );
- foreach( QString item, valueItems ) {
+ foreach( QString item, valueItems ) {
if ( item.startsWith( "http", Qt::CaseInsensitive ) || QFile::exists( item ) ) {
- QPixmap helpIcon = item.startsWith( "http", Qt::CaseInsensitive ) ?
+ QPixmap helpIcon = item.startsWith( "http", Qt::CaseInsensitive ) ?
resMgr->loadPixmap( "STD", tr( "ICON_WWW" ), false ) : resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false );
QAction* a = createAction( id++, paramName, helpIcon, paramName, paramName,
0, desk, false, this, SLOT( onHelpContentsModule() ) );
//asl: fix for 0020515
saveDockWindowsState();
-
+
CAM_Application::onNewDoc();
}
// We should take mru action first because this application instance can be deleted later.
QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
-
+
bool res = CAM_Application::onOpenDoc( aName );
if ( mru )
{
if ( !myBrowser.isEmpty() && !myUrl.isEmpty() )
{
+ QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
#ifdef WIN32
QString cmdLine = QString( "\"%1\" %2 \"%3\"" ).arg( myBrowser, myParameters, myUrl );
#else
QString cmdLine = QString( "%1 %2 \"%3\"" ).arg( myBrowser, myParameters, myUrl );
+ // remove LD_LIBRARY_PATH from the environement before starting launcher to avoid bad interactions.
+ // (especially in the case of universal binaries)
+ env.remove("LD_LIBRARY_PATH");
#endif
QProcess* proc = new QProcess();
+ proc->setProcessEnvironment(env);
proc->start( cmdLine );
if ( !proc->waitForStarted() )
{
#if DISABLE_QTXWEBBROWSER
bool useExternalBrowser = true;
-#else
+#else
bool useExternalBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
#endif
QString browser = resMgr->stringValue( "ExternalBrowser", "application" );
#endif
QString parameters = resMgr->stringValue("ExternalBrowser", "parameters");
-
+
if ( !browser.isEmpty() )
{
RunBrowser::execute( this, browser, parameters, path );
myWin.insert( id, wid );
QtxDockWidget* dock = new QtxDockWidget( true, desktop() );
+ if ( id == WT_InfoPanel ) {
+ // Info panel's position is strongly limited to the right area;
+ // It is not movable and not floatable.
+ dock->setAllowedAreas( Qt::RightDockWidgetArea );
+ dock->setFeatures( QDockWidget::DockWidgetClosable );
+ connect( dock, SIGNAL( aboutToShow()), this, SLOT( onInfoPanelShown() ) );
+ }
+ else {
+ dock->setFeatures( QDockWidget::AllDockWidgetFeatures );
+ }
connect( dock, SIGNAL( destroyed( QObject* ) ), this, SLOT( onWCDestroyed( QObject* ) ) );
- dock->setFeatures( QDockWidget::AllDockWidgetFeatures );
dock->setObjectName( wid->objectName().isEmpty() ? QString( "window_%1" ).arg( id ) :
QString( "%1Dock" ).arg( wid->objectName() ) );
dock->setWidget( wid );
return qobject_cast<SUIT_DataBrowser*>( dockWindow( WT_ObjectBrowser ) );
}
+QtxInfoPanel* LightApp_Application::infoPanel()
+{
+ return qobject_cast<QtxInfoPanel *>( dockWindow( WT_InfoPanel ));
+}
+
/*!
\return Log Window
*/
when you request the python console, this function could return
null. Then the optional parameter force (default to false) can be
set to force the creation of the python console if it is not done
- already.
+ already.
\param force - if true, the pythonConsole is created if it does not exist yet
\return Python Console
*/
}
getWindow( WT_ObjectBrowser );
+ getWindow( WT_InfoPanel );
loadDockWindowsState();
}
getWindow( WT_ObjectBrowser );
+ getWindow( WT_InfoPanel );
loadDockWindowsState();
wid = ob;
ob->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
}
+ else if ( flag == WT_InfoPanel)
+ {
+ QtxInfoPanel* ipanel = new QtxInfoPanel( desktop() );
+ ipanel->setObjectName( "infoPanel" );
+ ipanel->setWindowTitle( tr( "INFO_PANEL" ) );
+ wid = ipanel;
+ }
#ifndef DISABLE_PYCONSOLE
else if ( flag == WT_PyConsole )
{
#endif
if ( activeStudy() ) {
aMap.insert( WT_ObjectBrowser, Qt::LeftDockWidgetArea );
+ aMap.insert( WT_InfoPanel, Qt::RightDockWidgetArea );
// aMap.insert( WT_LogWindow, Qt::DockBottom );
}
}
pref->addPreference( tr( "PREF_SHOW_SPLASH" ), lookGroup, LightApp_Preferences::Bool, "launch", "splash" );
// .... -> opaque resize
pref->addPreference( tr( "PREF_OPAQUE_RESIZE" ), lookGroup, LightApp_Preferences::Bool, "desktop", "opaque_resize" );
- // .... -> drop-down buttons
+ // .... -> drop-down buttons
pref->addPreference( tr( "PREF_DROP_DOWN_BUTTONS" ), lookGroup, LightApp_Preferences::Bool, "viewers", "drop_down_buttons" );
// .... -> Notification timeout
int delay = pref->addPreference( tr( "PREF_NOTIFY_TIMEOUT" ), lookGroup, LightApp_Preferences::IntSpin, "notification", "timeout" );
}
loadDockWindowsState();
+
+ if ( !activeModule() && infoPanel() )
+ {
+ infoPanel()->clear();
+ infoPanel()->setTitle( tr( "INFO_WELCOME_TO_SALOME" ) );
+
+ int grp = infoPanel()->addGroup( tr( "INFO_GETTING_STARTED" ) );
+ infoPanel()->addAction( action( FileNewId ), grp );
+ infoPanel()->addLabel( action( FileNewId )->statusTip(), grp );
+ infoPanel()->addAction( action( FileOpenId ), grp );
+ infoPanel()->addLabel( action( FileOpenId )->statusTip(), grp );
+ infoPanel()->addAction( action( TutorialsId ), grp );
+ infoPanel()->addLabel( action( TutorialsId )->statusTip(), grp );
+ infoPanel()->addAction( action( VideosId ), grp );
+ infoPanel()->addLabel( action( VideosId )->statusTip(), grp );
+
+ LightApp_ModuleAction* ma = qobject_cast<LightApp_ModuleAction*>(action(ModulesListId));
+ if ( ma && ma->count() > 0 )
+ {
+ grp = infoPanel()->addGroup( tr( "INFO_AVAILABLE_MODULES" ) );
+ foreach ( QString mname, ma->modules() )
+ {
+ infoPanel()->addAction( ma->moduleAction( mname ), grp );
+ if ( !moduleDescription( mname ).isEmpty() )
+ infoPanel()->addLabel( moduleDescription( mname ), grp );
+ }
+ }
+ }
}
/*!
}
}
+void LightApp_Application::onInfoPanelShown()
+{
+ if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
+ ((LightApp_Module*)activeModule())->updateInfoPanel();
+}
+
/*!
Internal method.
Returns all top level toolbars.
Update visibility state of given objects
*/
void LightApp_Application::updateVisibilityState( DataObjectList& theList,
- SUIT_ViewModel* theViewModel )
+ SUIT_ViewModel* theViewModel )
{
if ( !theViewModel || theList.isEmpty() ) return;
if ( !obj || aStudy->isComponent( obj->entry() ) )
continue;
- LightApp_Module* anObjModule = dynamic_cast<LightApp_Module*>(obj->module());
- if ( anObjModule ) {
- LightApp_Displayer* aDisplayer = anObjModule->displayer();
- if ( aDisplayer ) {
- Qtx::VisibilityState anObjState = Qtx::UnpresentableState;
- if ( aDisplayer->canBeDisplayed( obj->entry(), theViewModel->getType() ) ) {
- if ( aView && aDisplayer->IsDisplayed( obj->entry(), aView ) )
- anObjState = Qtx::ShownState;
- else
- anObjState = Qtx::HiddenState;
+ QString mname = aStudy->componentDataType(obj->entry());
+ LightApp_Displayer* aDisplayer = LightApp_Displayer::FindDisplayer(mname, false);
+ if ( aDisplayer ) {
+ Qtx::VisibilityState anObjState = Qtx::UnpresentableState;
+ if ( aDisplayer->canBeDisplayed( obj->entry(), theViewModel->getType() ) ) {
+ if ( aView && aDisplayer->IsDisplayed( obj->entry(), aView ) )
+ anObjState = Qtx::ShownState;
+ else
+ anObjState = Qtx::HiddenState;
+ }
+ aStudy->setVisibilityState( obj->entry(), anObjState );
+ }
+ }
+}
+
+/*!
+ Update presentations of all displayed objects of theComponent in specified viewers
+*/
+void LightApp_Application::updatePresentations( const QString& theComponent,
+ const QStringList& theViewManagerTypes )
+{
+ LightApp_Displayer* aDisplayer = LightApp_Displayer::FindDisplayer(theComponent, false);
+ if ( aDisplayer ) {
+ LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
+ DataObjectList aComps;
+ bool isFound = false;
+ aStudy->root()->children( aComps );
+ DataObjectList::const_iterator aCompsIt = aComps.begin();
+ for ( ; aCompsIt != aComps.end() && !isFound; aCompsIt++ ) {
+ LightApp_DataObject* aComp = dynamic_cast<LightApp_DataObject*>( *aCompsIt );
+ if ( aComp && aComp->componentDataType() == theComponent) {
+ isFound = true;
+ DataObjectList anObjs;
+ aComp->children(anObjs, true);
+
+ QList<SUIT_ViewManager*> aViewMgrs;
+ QStringList::const_iterator itVMTypes = theViewManagerTypes.begin();
+ for ( ; itVMTypes != theViewManagerTypes.end(); ++itVMTypes )
+ viewManagers( *itVMTypes, aViewMgrs );
+
+ DataObjectList::const_iterator itObjs = anObjs.begin();
+ for ( ; itObjs != anObjs.end(); itObjs++ ) {
+ LightApp_DataObject* anObj = dynamic_cast<LightApp_DataObject*>( *itObjs );
+ QString anEntry = anObj->entry();
+
+ QListIterator<SUIT_ViewManager*> itViewMgrs( aViewMgrs );
+ while ( itViewMgrs.hasNext()) {
+ SUIT_ViewModel* aVM = itViewMgrs.next()->getViewModel();
+ if ( aVM ) {
+ SALOME_View* aView = dynamic_cast<SALOME_View*>(aVM);
+ if ( aView ) {
+ bool isDisp = aDisplayer->IsDisplayed( anEntry, aView );
+ aDisplayer->Erase( anEntry, true, false, aView );
+ if ( isDisp ) {
+ aDisplayer->Display( anEntry, false, aView );
+ }
+ }
+ }
+ }
}
- aStudy->setVisibilityState( obj->entry(), anObjState );
}
}
}