From ccca8ccd1b357b07100623cd9c438cd8e38660ab Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Fri, 4 Mar 2022 16:26:18 +0200 Subject: [PATCH] QmlDesigner: Fix crumblebar recursion If a file that already exist in crumblebar is pushed into crumblebar, pop the bar until the first instance of the specified file is on the top of the bar and skip the push. Fixes: QDS-6307 Change-Id: I75f7d575db3fc6bb5b629ea1e6b61ea2905726b4 Reviewed-by: Thomas Hartmann Reviewed-by: Mahmoud Badri Reviewed-by: Samuel Ghinet --- .../components/componentcore/crumblebar.cpp | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/plugins/qmldesigner/components/componentcore/crumblebar.cpp b/src/plugins/qmldesigner/components/componentcore/crumblebar.cpp index c729fd07512..82032b3fc2e 100644 --- a/src/plugins/qmldesigner/components/componentcore/crumblebar.cpp +++ b/src/plugins/qmldesigner/components/componentcore/crumblebar.cpp @@ -83,20 +83,29 @@ void CrumbleBar::pushFile(const Utils::FilePath &fileName) if (!m_isInternalCalled) { crumblePath()->clear(); } else { - CrumbleBarInfo lastElementCrumbleBarInfo = crumblePath()->dataForLastIndex().value(); + // If the path already exists in crumblePath, pop up to first instance of that to avoid + // cyclical crumblePath + int match = -1; + for (int i = crumblePath()->length() - 1; i >= 0; --i) { + CrumbleBarInfo info = crumblePath()->dataForIndex(i).value(); + if (info.fileName == fileName) + match = i; + } - if (!lastElementCrumbleBarInfo.displayName.isEmpty() - && lastElementCrumbleBarInfo.fileName == fileName) - crumblePath()->popElement(); + if (match != -1) { + for (int i = crumblePath()->length() - 1 - match; i > 0; --i) + crumblePath()->popElement(); + } } - CrumbleBarInfo crumbleBarInfo; - crumbleBarInfo.fileName = fileName; - - crumblePath()->pushElement(fileName.fileName(), QVariant::fromValue(crumbleBarInfo)); + CrumbleBarInfo info = crumblePath()->dataForLastIndex().value(); + if (info.fileName != fileName) { + CrumbleBarInfo crumbleBarInfo; + crumbleBarInfo.fileName = fileName; + crumblePath()->pushElement(fileName.fileName(), QVariant::fromValue(crumbleBarInfo)); + } m_isInternalCalled = false; - updateVisibility(); }