Salome HOME
SalomePyQt methods activateModule(), activateView() do not work if focus is in other...
authorvsr <vsr@opencascade.com>
Thu, 30 Jun 2022 14:32:16 +0000 (17:32 +0300)
committervsr <vsr@opencascade.com>
Thu, 30 Jun 2022 14:32:16 +0000 (17:32 +0300)
src/CAM/CAM_Application.cxx
src/LightApp/LightApp_Application.cxx
src/SALOME_PYQT/SalomePyQt/SalomePyQt.cxx

index aa92a3a9745d968826034dae0ec7dc0d170b19b6..afd1faf37c681d16b4ccf52e97b1798a4cb07f32 100644 (file)
@@ -415,13 +415,17 @@ bool CAM_Application::activateModule( const QString& modName )
   // See issues 0021307, 0021373
   BusyLocker lock( myBlocked );
 
+  QString name = modName;
+  if ( !name.isEmpty() && !moduleTitle( modName ).isEmpty() )
+    name = moduleTitle( modName );
+
   bool res = false;
-  if ( !modName.isEmpty() )
+  if ( !name.isEmpty() )
   {
     setProperty("activateModule", true);
-    CAM_Module* mod = module( modName );
+    CAM_Module* mod = module( name );
     if ( !mod )
-      mod = loadModule( modName );
+      mod = loadModule( name );
     addModule( mod );
 
     if ( mod )
index 9f042366bc8ed3c4545ac488251650448b5da7f8..e64fef2c722b3ecc0af5ba931ed5b50cfc0b11e7 100644 (file)
@@ -542,17 +542,21 @@ bool LightApp_Application::activateModule( const QString& modName )
   if ( prevMod )
     actName = prevMod->moduleName();
 
-  if ( actName == modName )
+  QString name = modName;
+  if ( !name.isEmpty() && !moduleTitle( modName ).isEmpty() )
+    name = moduleTitle( modName );
+
+  if ( actName == name )
     return true;
 
-  putInfo( tr( "ACTIVATING_MODULE" ).arg( modName ) );
+  putInfo( tr( "ACTIVATING_MODULE" ).arg( name ) );
 
   saveDockWindowsState();
 
   if ( infoPanel() )
     infoPanel()->clear();
 
-  bool status = CAM_Application::activateModule( modName );
+  bool status = CAM_Application::activateModule( name );
 
   updateModuleActions();
 
index 0cf073967e555024cea8d877b8efb3c3a048d71f..eea2424635e3c813d78e27a9c751af14ac9b8d1c 100644 (file)
@@ -225,6 +225,25 @@ namespace
     \internal
   */
   const char* DEFAULT_SECTION = "SalomePyQt";
+
+  struct Activator
+  {
+    QWidget* myActiveWindow;
+    QWidget* myFocusedWidget;
+    Activator()
+    {
+      myActiveWindow = QApplication::activeWindow();
+      myFocusedWidget = QApplication::focusWidget();
+      QApplication::setActiveWindow( getApplication()->desktop() );
+    }
+    ~Activator()
+    {
+      if ( myActiveWindow )
+       QApplication::setActiveWindow( myActiveWindow );
+      if ( myFocusedWidget )
+       myFocusedWidget->setFocus();
+    }
+  };
 }
 
 /*!
@@ -934,6 +953,7 @@ public:
   virtual void Execute() 
   {
     if ( LightApp_Application* anApp = getApplication() ) {
+      Activator activator;
       myResult = anApp->activateModule( myModuleName );
     }
   }
@@ -3616,6 +3636,7 @@ public:
     SUIT_ViewWindow* wnd = getWnd( myWndId );
     MESSAGE("window id:" << myWndId << " SUIT_ViewWindow*: " << wnd);
     if ( wnd ) {
+      Activator activator;
       wnd->setFocus();
       myResult = true;
     }