From a7f03fbbf14c57a390438450941f1acb3e43efd0 Mon Sep 17 00:00:00 2001
From: Clinton Stimpson <clinton@elemtech.com>
Date: Wed, 18 May 2011 16:47:18 -0600
Subject: [PATCH] Fix lookup of menu items during playback to match recording.  Old code assumed QActions were owned by menus.

---
 pqAbstractActivateEventPlayer.cxx |   88 +++++++++++++++++++++----------------
 pqAbstractActivateEventPlayer.h   |    7 +++
 2 files changed, 57 insertions(+), 38 deletions(-)

diff --git a/pqAbstractActivateEventPlayer.cxx b/pqAbstractActivateEventPlayer.cxx
index b0f7964..abe0c4c 100644
--- a/pqAbstractActivateEventPlayer.cxx
+++ b/pqAbstractActivateEventPlayer.cxx
@@ -57,52 +57,21 @@ bool pqAbstractActivateEventPlayer::playEvent(QObject* Object,
 
   if (QMenuBar* const menu_bar  = qobject_cast<QMenuBar*>(Object))
     {
-    QMenu* sub_menu = menu_bar->findChild<QMenu*>(Arguments);
-    if (sub_menu)
+    QAction* action = findAction(menu_bar, Arguments);
+    if (action)
       {
-      QAction* action = 0;
-      foreach (QAction* cur_action, menu_bar->actions())
-        {
-        if (cur_action->menu() == sub_menu)
-          {
-          action = cur_action;
-          break;
-          }
-        }
-      if (action)
-        {
-        menu_bar->setActiveAction(action);
-        return true;
-        }
+      menu_bar->setActiveAction(action);
+      return true;
       }
+
+    qCritical() << "couldn't find action " << Arguments;
     Error = true;
     return true;
     }
 
   if(QMenu* const object = qobject_cast<QMenu*>(Object))
     {
-
-    QAction* action = NULL;
-    QList<QAction*> actions = object->actions();
-    for(int j = 0; j != actions.size() && !action; ++j)
-      {
-      if(actions[j]->objectName() == Arguments)
-        {
-        action = actions[j];
-        }
-      }
-
-    // fall back to the text of the action
-    if(!action)
-      {
-      for(int j = 0; j != actions.size() && !action; ++j)
-        {
-        if(actions[j]->text() == Arguments)
-          {
-          action = actions[j];
-          }
-        }
-      }
+    QAction* action = findAction(object, Arguments);
 
     if(!action)
       {
@@ -182,3 +151,46 @@ bool pqAbstractActivateEventPlayer::playEvent(QObject* Object,
   Error = true;
   return true;
 }
+
+QAction* pqAbstractActivateEventPlayer::findAction(QMenuBar* p, const QString& name)
+{
+  QList<QAction*> actions = p->actions();
+  QAction* action = NULL;
+  foreach(QAction* a, actions)
+    {
+    if(a->menu()->objectName() == name)
+      {
+      action = a;
+      break;
+      }
+    }
+  return action;
+}
+
+QAction* pqAbstractActivateEventPlayer::findAction(QMenu* p, const QString& name)
+{
+  QList<QAction*> actions = p->actions();
+  QAction* action = NULL;
+  foreach(QAction* a, actions)
+    {
+    if(a->objectName() == name)
+      {
+      action = a;
+      break;
+      }
+    }
+
+  if(!action)
+    {
+    foreach(QAction* a, actions)
+      {
+      if(a->text() == name)
+        {
+        action = a;
+        break;
+        }
+      }
+    }
+
+  return action;
+}
diff --git a/pqAbstractActivateEventPlayer.h b/pqAbstractActivateEventPlayer.h
index 03f51ca..7cefb91 100644
--- a/pqAbstractActivateEventPlayer.h
+++ b/pqAbstractActivateEventPlayer.h
@@ -34,6 +34,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #define _pqAbstractActivateEventPlayer_h
 
 #include "pqWidgetEventPlayer.h"
+class QAction;
+class QMenuBar;
+class QMenu;
 
 /**
 Concrete implementation of pqWidgetEventPlayer that handles playback of "activate" events for buttons and menus.
@@ -49,6 +52,10 @@ public:
   bool playEvent(QObject* Object, const QString& Command, const QString& Arguments, bool& Error);
 
 private:
+
+  QAction* findAction(QMenu* p, const QString& name);
+  QAction* findAction(QMenuBar* p, const QString& name);
+
   pqAbstractActivateEventPlayer(const pqAbstractActivateEventPlayer&);
   pqAbstractActivateEventPlayer& operator=(const pqAbstractActivateEventPlayer&);
 };
-- 
1.7.1

