]> SALOME platform Git repositories - modules/gui.git/commitdiff
Salome HOME
bos #29467 SALOME GUI logger
authorvsr <vsr@opencascade.com>
Mon, 23 May 2022 12:59:39 +0000 (15:59 +0300)
committervsr <vsr@opencascade.com>
Fri, 27 May 2022 09:46:36 +0000 (12:46 +0300)
src/CAM/CAM_Application.cxx
src/CAM/CAM_Application.h
src/CAM/CAM_Module.cxx
src/CAM/CAM_Module.h
src/CAM/resources/CAM_msg_en.ts
src/LightApp/LightApp_Application.cxx
src/LightApp/LightApp_Application.h
src/SALOME_PYQT/SalomePyQt/SalomePyQt.cxx
src/SALOME_PYQT/SalomePyQt/SalomePyQt.h
src/SALOME_PYQT/SalomePyQt/SalomePyQt.sip

index b4b4d9aa851d7171097f39abca401a4d93c4cb24..d3bfadf1785c88b25a7da8959613a142b391760d 100644 (file)
 #include <KERNEL_version.h>
 #include <GUI_version.h>
 
+#include <QAction>
 #include <QApplication>
+#include <QDir>
+#include <QFileInfo>
+#include <QMutex>
+#include <QMutexLocker>
 #include <QRegExp>
+#include <QTextStream>
 
 #ifdef WIN32
 #include <windows.h>
@@ -935,3 +941,81 @@ bool CAM_Application::abortAllOperations()
   }
   return aborted;
 }
+
+/*!
+  \brief Log GUI event.
+  \param eventDescription GUI event description.
+*/
+void CAM_Application::logUserEvent( const QString& eventDescription )
+{
+  static QString guiLogFile; // null string means log file was not initialized yet
+  static QMutex aGUILogMutex;
+
+  if ( guiLogFile.isNull() )
+  {
+    // log file was not initialized yet, try to do that by parsing command line arguments
+    guiLogFile = ""; // empty string means initialization was done but log file was not set
+    QStringList args = QApplication::arguments();
+    for ( int i = 1; i < args.count(); i++ )
+    {
+      QRegExp rxs ( "--gui-log-file=(.+)" );
+      if ( rxs.indexIn( args[i] ) >= 0 && rxs.capturedTexts().count() > 1 )
+      {
+        QString file = rxs.capturedTexts()[1];
+        QFileInfo fi ( file );
+        if ( !fi.isDir() && fi.dir().exists() )
+       {
+         guiLogFile = fi.absoluteFilePath();
+         if ( fi.exists() ) {
+           QFile file ( guiLogFile );
+           file.remove(); // remove probably existing log file, to start with empty one
+          }
+        }
+        break;
+      }
+    }
+  }
+  if ( !guiLogFile.isEmpty() ) // non-empty string means log file was already initialized
+  {
+    QMutexLocker aLocker( &aGUILogMutex );
+    QFile file ( guiLogFile );
+    if ( file.open( QFile::Append ) ) // append to log file
+    {
+      QTextStream stream( &file );
+      stream << eventDescription << endl;
+      file.close();
+    }
+  }
+}
+
+/*!
+  \brief Log given action.
+  \param action GUI action being logged.
+  \param moduleName optional name of module, owning an action
+*/
+void CAM_Application::logAction( QAction* action, const QString& moduleName )
+{
+  QString text = action->toolTip();
+  if ( text.isEmpty() )
+    text = action->text();
+  if ( text.isEmpty() )
+    text = action->iconText();
+  if ( !text.isEmpty() )
+  {
+    QStringList message;
+    if ( !moduleName.isEmpty() )
+      message << moduleName;
+    if ( action->isCheckable() )
+    {
+      message << tr( "ACTION_TOGGLED" );
+      message << ( action->isChecked() ? tr( "ACTION_ON" ) : tr( "ACTION_OFF" ) );
+    }
+    else
+    {
+      message << tr( "ACTION_TRIGGERED" );
+    }
+    message << text;
+    logUserEvent( message.join( ": " ) );
+  }
+}
+
index c4ce86178ed024487c1d70670ba95a142eecb5cb..c984bbf2d7a1fca528ec6b2804b71eb946435322 100644 (file)
@@ -82,6 +82,9 @@ public:
 
   static ModuleShortInfoList getVersionInfo();
 
+  static void         logUserEvent( const QString& );
+  static void         logAction( QAction*, const QString& = QString() );
+
 protected:
   virtual SUIT_Study* createNewStudy();
   virtual void        updateCommandsStatus();
index 13ae3c4aba0005aa7765483ab39b669a68ee814b..bce98f3848f5f0262ef3eb9a52fd8310fdfaa19a 100644 (file)
@@ -92,7 +92,8 @@ CAM_Module::CAM_Module( const QString& name )
   myName( name ),
   myDataModel( 0 ),
   myMenuShown( false ),
-  myToolShown( false )
+  myToolShown( false ),
+  myActionLoggingEnabled( false )
 {
 }
 
@@ -1018,6 +1019,8 @@ QAction* CAM_Module::createAction( const int id, const QString& text, const QIco
   QtxAction* a = new QtxAction( text, icon, menu, key, parent, toggle, shortcutAction );
   a->setStatusTip( tip );
 
+  connect( a, SIGNAL( triggered( bool ) ), this, SLOT( moduleActionActivated() ), Qt::UniqueConnection );
+
   if ( reciever && member )
     connect( a, SIGNAL( triggered( bool ) ), reciever, member );
 
@@ -1215,3 +1218,41 @@ bool CAM_Module::abortAllOperations()
 {
   return true;
 }
+
+/*!
+  \brief Called when an action is triggered
+*/
+void CAM_Module::moduleActionActivated()
+{
+  QAction* action = qobject_cast<QAction*>( sender() );
+  if ( action && !action->isSeparator() && isActionLoggingEnabled() )
+    logAction( action );
+}
+
+/*!
+  \brief Log given action.
+  \param action GUI action being logged.
+
+  Default implementation just forwards to CAM_Applicaion::logAction();
+*/
+void CAM_Module::logAction( QAction* action )
+{
+  CAM_Application::logAction( action, moduleName() );
+}
+
+/*!
+  \brief Return \c true if action logging is enabled.
+*/
+bool CAM_Module::isActionLoggingEnabled() const
+{
+  return myActionLoggingEnabled;
+}
+
+/*!
+  \brief Enable / disable action logging.
+  \param enabled \c true to enable logging, or \c false to disable it.
+*/
+void CAM_Module::setActionLoggingEnabled( bool enabled )
+{
+  myActionLoggingEnabled = enabled;
+}
index 406fa4f7aca959d6670025d1045fd944664be827..62cfd3125b6a26a269dbe962d8a6a51c931be22d 100644 (file)
@@ -122,6 +122,10 @@ public:
   int                    createMenu( QAction*, const int, const int = -1, const int = -1, const int = -1 );
   int                    createMenu( QAction*, const QString&, const int = -1, const int = -1, const int = -1 );
 
+  virtual void           logAction( QAction* );
+  bool                   isActionLoggingEnabled() const;
+  void                   setActionLoggingEnabled( bool );
+  
   static QAction*        separator();
 
 public slots:
@@ -135,6 +139,8 @@ public slots:
 
   virtual void           onApplicationClosed( SUIT_Application* );
 
+  virtual void           moduleActionActivated();
+
 private slots:
   void                   onInfoChanged( QString );
 
@@ -164,6 +170,7 @@ private:
   QMap<int, QAction*>    myActionMap;       //!< menu actions
   bool                   myMenuShown;       //!< menu shown flag
   bool                   myToolShown;       //!< tool shown flag
+  bool                   myActionLoggingEnabled; //!< action logging enabled 
 
   friend class CAM_Application;
 };
index 6779ef2282e2a0d0cf9043aef928bee251b68e5e..fb54357e4d9f608896819db0a746d1ad6387d767 100644 (file)
         <source>MODULE_ROOT_OBJECT_TOOLTIP</source>
         <translation>%1 module root object</translation>
     </message>
+    <message>
+        <source>ACTION_TRIGGERED</source>
+        <translation>action is triggered</translation>
+    </message>
+    <message>
+        <source>ACTION_TOGGLED</source>
+        <translation>action is toggled</translation>
+    </message>
+    <message>
+        <source>ACTION_ON</source>
+        <translation>on</translation>
+    </message>
+    <message>
+        <source>ACTION_OFF</source>
+        <translation>off</translation>
+    </message>
+    <message>
+        <source>OPERATION_APPLIED</source>
+        <translation>operation applied</translation>
+    </message>
 </context>
 </TS>
index 2a8a4dca63274cee385c5241d1beda12804581f4..e687135f6a656301e7679061818e350dba879162 100644 (file)
 #include <QMimeData>
 #include <QShortcut>
 #include <QRegExp>
-#include <QMutex>
-#include <QMutexLocker>
 
 #include <utilities.h>
 
@@ -5425,45 +5423,6 @@ bool LightApp_Application::checkExistingDoc( bool closeExistingDoc )
   return result;
 }
 
-/*!
-  Log GUI action
-*/
-void LightApp_Application::logUserEvent(const QString& eventDescription)
-{
-  static QString _gui_log_file_ = "Not initialized";
-  static QMutex aGUILogMutex;
-  if (_gui_log_file_ == "Not initialized") {
-    _gui_log_file_ = "";
-    QStringList args = QApplication::arguments();
-    for (int i = 1; i < args.count(); i++) {
-      QRegExp rxs ("--gui-log-file=(.+)");
-      if (rxs.indexIn( args[i] ) >= 0 && rxs.capturedTexts().count() > 1) {
-        QString file = rxs.capturedTexts()[1];
-        QFileInfo fi ( file );
-        if (!fi.isDir()) {
-          if (fi.dir().exists()) {
-            _gui_log_file_ = fi.absoluteFilePath();
-            if (fi.exists()) {
-              QFile file (_gui_log_file_);
-              file.remove();
-            }
-          }
-        }
-        break;
-      }
-    }
-  }
-  if (_gui_log_file_ != "") {
-    QMutexLocker aLocker (&aGUILogMutex);
-    QFile file (_gui_log_file_);
-    if (file.open(QFile::Append)) {
-      QTextStream stream( &file );
-      stream << eventDescription << endl;
-      file.close();
-    }
-  }
-}
-
 #ifndef DISABLE_PYCONSOLE
 
 PyConsole_Interp* LightApp_Application::getPyInterp()
index 2ad55b938bfe9beaca6be9fc3087d69705b10bef..29af725c2415d93013ef16b87120713dc8b5780c 100644 (file)
@@ -189,8 +189,6 @@ public:
 
   virtual bool                        checkExistingDoc( bool = true );
 
-  static void                         logUserEvent(const QString& eventDescription);
-
 #ifndef DISABLE_PYCONSOLE
   PyConsole_Interp*                   getPyInterp();
 #endif
index d7382482fffc7d1fe11d38e037c3198949f77e55..795b8593d0050e0ebd70c8e3a3061996e276697e 100644 (file)
@@ -5067,3 +5067,43 @@ void SalomePyQt::stopPyLog()
   };
   ProcessVoidEvent( new TEvent() );
 }
+
+/*!
+  \brief Log GUI event.
+  \param eventDescription GUI event description.
+*/
+void SalomePyQt::logUserEvent( const QString& eventDescription )
+{
+  class TEvent: public SALOME_Event
+  {
+    QString myEventDescription;
+  public:
+    TEvent( const QString& theDescription ) : myEventDescription( theDescription ) {}
+    virtual void Execute() 
+    {
+      LightApp_Application::logUserEvent( myEventDescription );
+    }
+  };
+  ProcessVoidEvent( new TEvent( eventDescription ) );
+}
+
+/*!
+  \brief Log given action.
+  \param action GUI action being logged.
+  \param moduleName optional name of module, owning an action
+*/
+void SalomePyQt::logAction( QAction* action, const QString& moduleName )
+{
+  class TEvent: public SALOME_Event
+  {
+    QAction* myAction;
+    QString myModuleName;
+  public:
+    TEvent( QAction* theAction, const QString& theModuleName ) : myAction( theAction ), myModuleName( theModuleName ) {}
+    virtual void Execute() 
+    {
+      LightApp_Application::logAction( myAction, myModuleName );
+    }
+  };
+  ProcessVoidEvent( new TEvent( action, moduleName ) );
+}
index e405442f66e393798716d7f401bd99a0cee08770..7643b2d07f4efa15d30d40132c205a1a4e313b38 100644 (file)
@@ -377,6 +377,8 @@ public:
   static void              startPyLog(const QString&);
   static void              stopPyLog();
 
+  static void              logUserEvent( const QString& );
+  static void              logAction( QAction*, const QString& = QString() );
 };
 
 #endif // SALOME_PYQT_H
index a283576ee66eec2a65dffb11a824056e94d31f1a..67c0b5e1c6b310577b66b82cb6bde23fa09565ec 100644 (file)
@@ -495,4 +495,7 @@ public:
 
   static void              startPyLog(const QString&) /ReleaseGIL/ ;
   static void              stopPyLog() /ReleaseGIL/ ;
+
+  static void              logUserEvent( const QString& ) /ReleaseGIL/ ;
+  static void              logAction( QAction*, const QString& = QString() ) /ReleaseGIL/ ;
 };