From e5d1bc9ccea68ecf92f8de5c1ff7efc2f5548dbe Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Wed, 10 Oct 2018 13:21:53 +0200 Subject: [PATCH] ActionContainer: Fix inconsistency in book keeping It doesn't make sense to specify both a group ID and a menu to add another menu before. This most certainly leads to inconsistency in the internal book keeping in m_groups vs the actual menu insertion point. Change-Id: Ic30508f390885ddeb72eb94f26efb75456b469ec Reviewed-by: hjk --- .../actionmanager/actioncontainer.cpp | 19 ++++++++++++------- .../actionmanager/actioncontainer.h | 2 +- .../actionmanager/actioncontainer_p.h | 2 +- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/plugins/coreplugin/actionmanager/actioncontainer.cpp b/src/plugins/coreplugin/actionmanager/actioncontainer.cpp index b602dc54cd9..637e76ab03b 100644 --- a/src/plugins/coreplugin/actionmanager/actioncontainer.cpp +++ b/src/plugins/coreplugin/actionmanager/actioncontainer.cpp @@ -263,20 +263,25 @@ void ActionContainerPrivate::addMenu(ActionContainer *menu, Id groupId) scheduleUpdate(); } -void ActionContainerPrivate::addMenu(ActionContainer *before, ActionContainer *menu, Id groupId) +void ActionContainerPrivate::addMenu(ActionContainer *before, ActionContainer *menu) { auto containerPrivate = static_cast(menu); if (!containerPrivate->canBeAddedToMenu()) return; - auto container = static_cast(containerPrivate); - const Id actualGroupId = groupId.isValid() ? groupId : Id(Constants::G_DEFAULT_TWO); - QList::const_iterator groupIt = findGroup(actualGroupId); - QTC_ASSERT(groupIt != m_groups.constEnd(), return); - QAction *beforeAction = before->menu()->menuAction(); - m_groups[groupIt-m_groups.constBegin()].items.append(menu); + QMutableListIterator it(m_groups); + while (it.hasNext()) { + Group &group = it.next(); + const int insertionPoint = group.items.indexOf(before); + if (insertionPoint >= 0) { + group.items.insert(insertionPoint, menu); + break; + } + } connect(menu, &QObject::destroyed, this, &ActionContainerPrivate::itemDestroyed); + auto container = static_cast(containerPrivate); + QAction *beforeAction = before->menu()->menuAction(); insertMenu(beforeAction, container->menu()); scheduleUpdate(); } diff --git a/src/plugins/coreplugin/actionmanager/actioncontainer.h b/src/plugins/coreplugin/actionmanager/actioncontainer.h index a20962430bd..531d01ccdbb 100644 --- a/src/plugins/coreplugin/actionmanager/actioncontainer.h +++ b/src/plugins/coreplugin/actionmanager/actioncontainer.h @@ -64,7 +64,7 @@ public: virtual void insertGroup(Id before, Id group) = 0; virtual void addAction(Command *action, Id group = Id()) = 0; virtual void addMenu(ActionContainer *menu, Id group = Id()) = 0; - virtual void addMenu(ActionContainer *before, ActionContainer *menu, Id group = Id()) = 0; + virtual void addMenu(ActionContainer *before, ActionContainer *menu) = 0; Command *addSeparator(Id group = Id()); virtual Command *addSeparator(const Context &context, Id group = Id(), QAction **outSeparator = nullptr) = 0; diff --git a/src/plugins/coreplugin/actionmanager/actioncontainer_p.h b/src/plugins/coreplugin/actionmanager/actioncontainer_p.h index ffa24eecddc..c78310b7b2a 100644 --- a/src/plugins/coreplugin/actionmanager/actioncontainer_p.h +++ b/src/plugins/coreplugin/actionmanager/actioncontainer_p.h @@ -56,7 +56,7 @@ public: void insertGroup(Id before, Id groupId) override; void addAction(Command *action, Id group = Id()) override; void addMenu(ActionContainer *menu, Id group = Id()) override; - void addMenu(ActionContainer *before, ActionContainer *menu, Id group = Id()) override; + void addMenu(ActionContainer *before, ActionContainer *menu) override; Command *addSeparator(const Context &context, Id group = Id(), QAction **outSeparator = nullptr) override; void clear() override;