diff --git a/src/plugins/coreplugin/actionmanager/actioncontainer.cpp b/src/plugins/coreplugin/actionmanager/actioncontainer.cpp index 31e68bd70dbb82c17a2cd3aeeded805e6883b0cc..ea1bfd818e34487aed46f7341dcd317bf1d8c9e3 100644 --- a/src/plugins/coreplugin/actionmanager/actioncontainer.cpp +++ b/src/plugins/coreplugin/actionmanager/actioncontainer.cpp @@ -245,6 +245,7 @@ void ActionContainerPrivate::addAction(Command *command, const QString &groupId) m_groups[groupIt-m_groups.constBegin()].items.append(command); connect(command, SIGNAL(activeStateChanged()), this, SLOT(scheduleUpdate())); + connect(command, SIGNAL(destroyed()), this, SLOT(itemDestroyed())); insertAction(beforeAction, command->action()); scheduleUpdate(); } @@ -271,6 +272,17 @@ void ActionContainerPrivate::addMenu(ActionContainer *menu, const QString &group scheduleUpdate(); } +void ActionContainerPrivate::itemDestroyed() +{ + QObject *obj = sender(); + QMutableListIterator<Group> it(m_groups); + while (it.hasNext()) { + Group &group = it.next(); + if (group.items.removeAll(obj) > 0) + break; + } +} + int ActionContainerPrivate::id() const { return m_id; diff --git a/src/plugins/coreplugin/actionmanager/actioncontainer_p.h b/src/plugins/coreplugin/actionmanager/actioncontainer_p.h index 8d313dc98eebb749e3fbdd5984a34938b931e696..6aff0a8d08df2bba11e0c7861f4a31c920600e07 100644 --- a/src/plugins/coreplugin/actionmanager/actioncontainer_p.h +++ b/src/plugins/coreplugin/actionmanager/actioncontainer_p.h @@ -85,6 +85,7 @@ protected: private slots: void scheduleUpdate(); void update(); + void itemDestroyed(); private: QList<Group>::const_iterator findGroup(const QString &groupId) const; diff --git a/src/plugins/coreplugin/actionmanager/actionmanager.cpp b/src/plugins/coreplugin/actionmanager/actionmanager.cpp index e28f44abbf3c87cdacda5c97e146304d661e5bcf..0d7921ac4fd54c28bea8622ac5d6c0f89d4869a5 100644 --- a/src/plugins/coreplugin/actionmanager/actionmanager.cpp +++ b/src/plugins/coreplugin/actionmanager/actionmanager.cpp @@ -247,8 +247,9 @@ ActionManagerPrivate::ActionManagerPrivate(MainWindow *mainWnd) ActionManagerPrivate::~ActionManagerPrivate() { - qDeleteAll(m_idCmdMap.values()); + // first delete containers to avoid them reacting to command deletion qDeleteAll(m_idContainerMap.values()); + qDeleteAll(m_idCmdMap.values()); } ActionManagerPrivate *ActionManagerPrivate::instance() @@ -382,6 +383,7 @@ void ActionManagerPrivate::unregisterAction(QAction *action, const Id &id) a->removeOverrideAction(action); if (a->isEmpty()) { // clean up + // ActionContainers listen to the commands' destroyed signals m_mainWnd->removeAction(a->action()); delete a->action(); m_idCmdMap.remove(uid);