X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSUIT%2FSUIT_Application.cxx;h=06d9180ed8138cd4a388437a8f8014578d1d4de2;hb=efe3cdefadc31ad9cdaa9fd7fc368e2931cebdf1;hp=e6400595ce50f490dbd8f6dd410701f565b0a0e5;hpb=f830c97c748d8f8a6a7eccc8e3a58e19066a1181;p=modules%2Fgui.git diff --git a/src/SUIT/SUIT_Application.cxx b/src/SUIT/SUIT_Application.cxx old mode 100755 new mode 100644 index e6400595c..06d9180ed --- a/src/SUIT/SUIT_Application.cxx +++ b/src/SUIT/SUIT_Application.cxx @@ -1,56 +1,83 @@ -// Copyright (C) 2005 OPEN CASCADE, CEA/DEN, EDF R&D, PRINCIPIA R&D -// +// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // + #include "SUIT_Application.h" +#include "SUIT_Study.h" #include "SUIT_Session.h" #include "SUIT_Desktop.h" #include "SUIT_ResourceMgr.h" +#include "SUIT_ShortcutMgr.h" -#include -#include -#include -#include +#include +#include +#include +#include +#include #include #include #include + +/*! + \class StatusLabel + \brief Status bar customization label. Used to workaroubd desktop resizing bug. + \internal +*/ +class StatusLabel : public QLabel +{ +public: + StatusLabel( QWidget* parent ) : QLabel( parent ) {} + QSize minimumSizeHint () const { return QSize( 0, QLabel::minimumSizeHint().height() ); } +}; + /*! Default constructor */ SUIT_Application::SUIT_Application() - : QObject( 0 ), - myStudy( 0 ), - myDesktop( 0 ), - myStatusLabel( 0 ) +: QObject( 0 ), + myStudy( 0 ), + myDesktop( 0 ), + myStatusLabel( 0 ), + myPostRoutines( QList() ) { + if ( SUIT_Session::session() ) + SUIT_Session::session()->insertApplication( this ); } /*! Destructor */ -SUIT_Application::~SUIT_Application() +SUIT_Application::~SUIT_Application() { + SUIT_Study* s = myStudy; setActiveStudy( 0 ); - delete myStudy; + delete s; setDesktop( 0 ); + + foreach ( PostRoutine routine, myPostRoutines ) + routine(); } /*! @@ -62,8 +89,8 @@ SUIT_Desktop* SUIT_Application::desktop() } /*! - \return FALSE if application can not be closed (because of non saved data for example). - This method called by SUIT_Session whin closing of application was requested. + \return \c false if application can not be closed (because of non saved data for example). + This method called by SUIT_Session when closing of application was requested. */ bool SUIT_Application::isPossibleToClose( bool& ) { @@ -92,7 +119,7 @@ SUIT_Study* SUIT_Application::activeStudy() const */ QString SUIT_Application::applicationVersion() const { - return QString::null; + return QString(); } /*! @@ -102,6 +129,9 @@ void SUIT_Application::start() { if ( desktop() ) desktop()->show(); + + // Initialize shortcut manager + SUIT_ShortcutMgr::Init(); } /*! @@ -124,15 +154,6 @@ bool SUIT_Application::useFile( const QString& theFileName ) return status; } -/*! - Opens other study into active Study. If Study is empty - creates it. - \param theName - name of study -*/ -bool SUIT_Application::useStudy( const QString& theName ) -{ - return false; -} - /*! Creates new empty Study if active Study = 0 */ @@ -143,7 +164,7 @@ void SUIT_Application::createEmptyStudy() } /*! - \return number of Studies. + \return number of Studies. Must be redefined in Applications which support several studies for one Application instance. */ int SUIT_Application::getNbStudies() const @@ -162,10 +183,19 @@ SUIT_ResourceMgr* SUIT_Application::resourceMgr() const return SUIT_Session::session()->resourceMgr(); } +/*! + \brief Get access to shortcut manager. + \return global shortcut manager +*/ +SUIT_ShortcutMgr* SUIT_Application::shortcutMgr() const +{ + return SUIT_ShortcutMgr::getShortcutMgr(); +} + #define DEFAULT_MESSAGE_DELAY 3000 /*! - Puts the message to the status bar + Puts the message to the status bar \param msg - text of message \param msec - time in milliseconds, after that the status label will be cleared */ @@ -176,7 +206,7 @@ void SUIT_Application::putInfo( const QString& msg, const int msec ) if ( !myStatusLabel ) { - myStatusLabel = new QLabel( desktop()->statusBar() ); + myStatusLabel = new StatusLabel( desktop()->statusBar() ); desktop()->statusBar()->addWidget( myStatusLabel, 1 ); myStatusLabel->show(); } @@ -202,14 +232,15 @@ void SUIT_Application::onInfoClear() bool changed = !myStatusLabel->text().isEmpty(); myStatusLabel->clear(); if ( changed ) - emit infoChanged( QString::null ); + emit infoChanged( QString() ); } /*! - Updates status of the registerd actions + Update status of the registerd actions */ void SUIT_Application::updateCommandsStatus() -{} +{ +} /*! Initialize with application arguments @@ -218,7 +249,7 @@ void SUIT_Application::updateCommandsStatus() */ SUIT_Application* SUIT_Application::startApplication( int argc, char** argv ) const { - return startApplication( name(), argc, argv ); + return startApplication( objectName(), argc, argv ); } /*! @@ -245,10 +276,13 @@ void SUIT_Application::setDesktop( SUIT_Desktop* desk ) if ( myDesktop == desk ) return; - delete myDesktop; + // >> VSR 09/06/2009: workaround about the Qt 4.5.0 bug: SIGSEGV on desktop delete + myDesktop->deleteLater(); // delete myDesktop; + // << VSR 09/06/2009 myDesktop = desk; if ( myDesktop ) { connect( myDesktop, SIGNAL( activated() ), this, SLOT( onDesktopActivated() ) ); +// connect( myDesktop, SIGNAL( moved() ), this, SLOT( onDesktopMoved() ) ); // Force desktop activation (NPAL16628) QApplication::postEvent(myDesktop, new QEvent(QEvent::WindowActivate)); } @@ -273,26 +307,28 @@ void SUIT_Application::setActiveStudy( SUIT_Study* study ) if ( myStudy == study ) return; - if(myStudy) - disconnect(myStudy, SIGNAL( studyModified( SUIT_Study* ) ), this, SLOT( updateCommandsStatus() ) ); + if ( myStudy ) + disconnect( myStudy, SIGNAL( studyModified( SUIT_Study* ) ), + this, SLOT( updateCommandsStatus() ) ); + if ( study ) + connect( study, SIGNAL( studyModified( SUIT_Study* ) ), + this, SLOT( updateCommandsStatus() ) ); - if(study) - connect(study, SIGNAL( studyModified( SUIT_Study* ) ), this, SLOT( updateCommandsStatus() ) ); - myStudy = study; } /*! Creates new toolbar \return identificator of new toolbar in tool manager - \param name - name of new toolbar + \param title - title of new toolbar + \param name - name (identifier) of new toolbar */ -int SUIT_Application::createTool( const QString& name ) +int SUIT_Application::createTool( const QString& title, const QString& name ) { if ( !desktop() || !desktop()->toolMgr() ) return -1; - return desktop()->toolMgr()->createToolBar( name ); + return desktop()->toolMgr()->createToolBar( title, name ); } /*! @@ -474,49 +510,57 @@ int SUIT_Application::createMenu( const int id, const QString& menu, const int g /*! Show/hide menu item corresponding to action \param a - action - \param on - if it is true, the item will be shown, otherwise it will be hidden + \param on - if it is \c true, the item will be shown, otherwise it will be hidden */ void SUIT_Application::setMenuShown( QAction* a, const bool on ) { - setMenuShown( actionId( a ), on ); + if ( !a || !desktop() ) + return; + + QtxActionMenuMgr* mMgr = desktop()->menuMgr(); + if ( mMgr ) + mMgr->setShown( mMgr->actionId( a ), on ); } /*! Show/hide menu item corresponding to action \param id - identificator of action in menu manager - \param on - if it is true, the item will be shown, otherwise it will be hidden + \param on - if it is \c true, the item will be shown, otherwise it will be hidden */ void SUIT_Application::setMenuShown( const int id, const bool on ) { - if ( desktop() && desktop()->menuMgr() ) - desktop()->menuMgr()->setShown( id, on ); + setMenuShown( action( id ), on ); } /*! Show/hide tool button corresponding to action \param a - action - \param on - if it is true, the button will be shown, otherwise it will be hidden + \param on - if it is \c true, the button will be shown, otherwise it will be hidden */ void SUIT_Application::setToolShown( QAction* a, const bool on ) { - setToolShown( actionId( a ), on ); + if ( !a || !desktop() ) + return; + + QtxActionToolMgr* tMgr = desktop()->toolMgr(); + if ( tMgr ) + tMgr->setShown( tMgr->actionId( a ), on ); } /*! Show/hide menu item corresponding to action \param id - identificator of action in tool manager - \param on - if it is true, the button will be shown, otherwise it will be hidden + \param on - if it is \c true, the button will be shown, otherwise it will be hidden */ void SUIT_Application::setToolShown( const int id, const bool on ) { - if ( desktop() && desktop()->toolMgr() ) - desktop()->toolMgr()->setShown( id, on ); + setToolShown( action( id ), on ); } /*! Show/hide both menu item and tool button corresponding to action \param a - action - \param on - if it is true, the item will be shown, otherwise it will be hidden + \param on - if it is \c true, the item will be shown, otherwise it will be hidden */ void SUIT_Application::setActionShown( QAction* a, const bool on ) { @@ -527,7 +571,7 @@ void SUIT_Application::setActionShown( QAction* a, const bool on ) /*! Show/hide both menu item and tool button corresponding to action \param id - identificator in both menu manager and tool manager - \param on - if it is true, the item will be shown, otherwise it will be hidden + \param on - if it is \c true, the item will be shown, otherwise it will be hidden */ void SUIT_Application::setActionShown( const int id, const bool on ) { @@ -554,15 +598,24 @@ QAction* SUIT_Application::action( const int id ) const int SUIT_Application::actionId( const QAction* a ) const { int id = -1; - for ( QMap::ConstIterator it = myActionMap.begin(); - it != myActionMap.end() && id == -1; - ++it ) { - if ( it.data() == a ) + for ( QMap::ConstIterator it = myActionMap.begin(); it != myActionMap.end() && id == -1; ++it ) + { + if ( it.value() == a ) id = it.key(); } return id; } +QList SUIT_Application::actions() const +{ + return myActionMap.values(); +} + +QList SUIT_Application::actionIds() const +{ + return myActionMap.keys(); +} + /*! Creates action and registers it both in menu manager and tool manager \return new instance of action @@ -573,19 +626,42 @@ int SUIT_Application::actionId( const QAction* a ) const \param tip - tool tip \param key - shortcut \param parent - parent object - \param toggle - if it is TRUE the action will be a toggle action, otherwise it will be a command action + \param toggle - if it is \c true the action will be a toggle action, otherwise it will be a command action \param reciever - object that contains slot \param member - slot to be called when action is activated */ -QAction* SUIT_Application::createAction( const int id, const QString& text, const QIconSet& icon, +QAction* SUIT_Application::createAction( const int id, const QString& text, const QIcon& icon, const QString& menu, const QString& tip, const int key, - QObject* parent, const bool toggle, QObject* reciever, const char* member ) + QObject* parent, const bool toggle, QObject* reciever, + const char* member, const QString& shortcutAction ) +{ + return createAction( id, text, icon, menu, tip, QKeySequence(key), parent, toggle, reciever, member, shortcutAction ); +} + +/*! + Creates action and registers it both in menu manager and tool manager + \return new instance of action + \param id - proposed SUIT identificator + \param text - description + \param icon - icon for toolbar + \param menu - menu text + \param tip - tool tip + \param key - shortcut + \param parent - parent object + \param toggle - if it is TRUE the action will be a toggle action, otherwise it will be a command action + \param reciever - object that contains slot + \param member - slot to be called when action is activated +*/ +QAction* SUIT_Application::createAction( const int id, const QString& text, const QIcon& icon, + const QString& menu, const QString& tip, const QKeySequence& key, + QObject* parent, const bool toggle, QObject* reciever, + const char* member, const QString& shortcutAction ) { - QtxAction* a = new QtxAction( text, icon, menu, key, parent, 0, toggle ); + QtxAction* a = new QtxAction( text, icon, menu, key, parent, toggle, shortcutAction ); a->setStatusTip( tip ); if ( reciever && member ) - connect( a, SIGNAL( activated() ), reciever, member ); + connect( a, SIGNAL( triggered( bool ) ), reciever, member ); registerAction( id, a ); @@ -606,7 +682,7 @@ int SUIT_Application::registerAction( const int id, QAction* a ) static int generatedId = -1; ident = id == -1 ? --generatedId : id; - if ( action( ident ) ) + if ( action( ident ) ) qWarning( "Action registration id is already in use: %d", ident ); myActionMap.insert( ident, a ); @@ -617,6 +693,10 @@ int SUIT_Application::registerAction( const int id, QAction* a ) if ( desktop() && desktop()->toolMgr() ) desktop()->toolMgr()->registerAction( a ); + if ( desktop() && a->shortcutContext() != Qt::WidgetShortcut && + a->shortcutContext() != Qt::WidgetWithChildrenShortcut ) + desktop()->addAction( a ); + return ident; } @@ -637,11 +717,24 @@ void SUIT_Application::onDesktopActivated() emit activated( this ); } +/*! + SLOT: it is called when desktop is moved +*/ +/*void SUIT_Application::onDesktopMoved() +{ + emit moving(); +}*/ /*! SLOT: is used for Help browsing */ +void SUIT_Application::onHelpContextModule( const QString& /*theComponentName*/, + const QString& /*theFileName*/, + const QString& /*theContext*/ ) +{ +} -void SUIT_Application::onHelpContextModule (const QString& /*theComponentName*/, - const QString& /*theFileName*/) +void SUIT_Application::addPostRoutine( PostRoutine theRoutine ) { + if ( !myPostRoutines.contains( theRoutine ) ) + myPostRoutines << theRoutine; }