From a61f7db1ea51dbdce9d91be60372cfd549a2285f Mon Sep 17 00:00:00 2001 From: Samuel Ghinet Date: Tue, 8 Mar 2022 15:09:49 +0200 Subject: [PATCH] Fix: Recents don't show up for Custom presets In the New Project dialog for QDS, if the user had created a project from a User-defined (i.e. Custom) preset, this preset did not appear under the Recents tab. Task-number: QDS-4989 Change-Id: Ib1f5e772fc9a45ad727627152f292f6e1178ee8c Reviewed-by: Miikka Heikkinen Reviewed-by: Mahmoud Badri --- .../NewProjectDialog/NewProjectView.qml | 2 +- src/plugins/studiowelcome/presetmodel.cpp | 25 ++++--- src/plugins/studiowelcome/presetmodel.h | 4 +- src/plugins/studiowelcome/qdsnewdialog.cpp | 5 ++ src/plugins/studiowelcome/qdsnewdialog.h | 1 + .../qmldesigner/wizard/presetmodel-test.cpp | 73 +++++++++++++++++++ 6 files changed, 98 insertions(+), 12 deletions(-) diff --git a/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/NewProjectView.qml b/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/NewProjectView.qml index 997260747b3..aae984b069a 100644 --- a/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/NewProjectView.qml +++ b/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/NewProjectView.qml @@ -199,7 +199,7 @@ ScrollView { anchors.margins: 4 visible: isUserPreset === true && delegate.hover - && scrollView.currentTabName !== "Recents" + && scrollView.currentTabName !== BackendApi.recentsTabName() Text { anchors.fill: parent diff --git a/src/plugins/studiowelcome/presetmodel.cpp b/src/plugins/studiowelcome/presetmodel.cpp index e9d7438139d..cc06bf59f54 100644 --- a/src/plugins/studiowelcome/presetmodel.cpp +++ b/src/plugins/studiowelcome/presetmodel.cpp @@ -39,6 +39,12 @@ static const QString CustomTabName = QObject::tr("Custom"); /****************** PresetData ******************/ + +QString PresetData::recentsTabName() +{ + return RecentsTabName; +} + void PresetData::setData(const PresetsByCategory &presetsByCategory, const std::vector &userPresetsData, const std::vector &loadedRecentsData) @@ -47,11 +53,6 @@ void PresetData::setData(const PresetsByCategory &presetsByCategory, m_recents = loadedRecentsData; m_userPresets = userPresetsData; - if (!m_recents.empty()) { - m_categories.push_back(RecentsTabName); - m_presets.push_back({}); - } - for (auto &[id, category] : presetsByCategory) { m_categories.push_back(category.name); m_presets.push_back(category.items); @@ -59,17 +60,21 @@ void PresetData::setData(const PresetsByCategory &presetsByCategory, PresetItems wizardPresets = Utils::flatten(m_presets); - PresetItems recentPresets = makeRecentPresets(wizardPresets); - if (!m_recents.empty()) { - m_presets[0] = recentPresets; - } - PresetItems userPresetItems = makeUserPresets(wizardPresets); if (!userPresetItems.empty()) { m_categories.push_back(CustomTabName); m_presets.push_back(userPresetItems); } + PresetItems allWizardPresets = std::move(wizardPresets); + Utils::concat(allWizardPresets, userPresetItems); + + PresetItems recentPresets = makeRecentPresets(allWizardPresets); + if (!recentPresets.empty()) { + Utils::prepend(m_categories, RecentsTabName); + Utils::prepend(m_presets, recentPresets); + } + m_presetsByCategory = presetsByCategory; } diff --git a/src/plugins/studiowelcome/presetmodel.h b/src/plugins/studiowelcome/presetmodel.h index 5bc19755885..e4c6712b81b 100644 --- a/src/plugins/studiowelcome/presetmodel.h +++ b/src/plugins/studiowelcome/presetmodel.h @@ -115,7 +115,7 @@ inline QDebug &operator<<(QDebug &d, const PresetItem &item) d << "; size = " << item.screenSizeName; if (item.isUserPreset()) - d << (UserPresetItem &) item; + d << "; " << (UserPresetItem &) item; return d; } @@ -177,6 +177,8 @@ public: const std::vector &presets() const { return m_presets; } const Categories &categories() const { return m_categories; } + static QString recentsTabName(); + private: PresetItems makeRecentPresets(const PresetItems &wizardPresets); PresetItems makeUserPresets(const PresetItems &wizardPresets); diff --git a/src/plugins/studiowelcome/qdsnewdialog.cpp b/src/plugins/studiowelcome/qdsnewdialog.cpp index 88b7b0fa55f..527204c80e8 100644 --- a/src/plugins/studiowelcome/qdsnewdialog.cpp +++ b/src/plugins/studiowelcome/qdsnewdialog.cpp @@ -376,6 +376,11 @@ void QdsNewDialog::setWizardFactories(QList factories_, } } +QString QdsNewDialog::recentsTabName() const +{ + return PresetData::recentsTabName(); +} + QString QdsNewDialog::qmlPath() const { return Core::ICore::resourcePath("qmldesigner/newprojectdialog/NewProjectDialog.qml").toString(); diff --git a/src/plugins/studiowelcome/qdsnewdialog.h b/src/plugins/studiowelcome/qdsnewdialog.h index bb5e44343fd..670b39192d9 100644 --- a/src/plugins/studiowelcome/qdsnewdialog.h +++ b/src/plugins/studiowelcome/qdsnewdialog.h @@ -74,6 +74,7 @@ public: Q_INVOKABLE int screenSizeIndex() const; Q_INVOKABLE QString chooseProjectLocation(); + Q_INVOKABLE QString recentsTabName() const; Q_PROPERTY(QAbstractListModel *categoryModel MEMBER m_categoryModel CONSTANT); Q_PROPERTY(QAbstractListModel *presetModel MEMBER m_presetModel CONSTANT); diff --git a/tests/auto/qml/qmldesigner/wizard/presetmodel-test.cpp b/tests/auto/qml/qmldesigner/wizard/presetmodel-test.cpp index f2233eee855..3c166884583 100644 --- a/tests/auto/qml/qmldesigner/wizard/presetmodel-test.cpp +++ b/tests/auto/qml/qmldesigner/wizard/presetmodel-test.cpp @@ -326,6 +326,79 @@ TEST(QdsPresetModel, userPresetWithSameNameAsWizardPreset) ElementsAre(UserPresetIs("A.categ", "Desktop", "Desktop")))); } +TEST(QdsPresetModel, recentOfUserPresetReferringToExistingWizardPreset) +{ + // Given + PresetData data; + + // When + data.setData( + /*wizard presets*/ + { + aCategory("A.categ", "A", {"Desktop"}), + }, + { + aUserPreset("A.categ", "Desktop", "Windows 7"), + }, + /*recents*/ + { + {"A.categ", "Windows 7", "200 x 300", /*is user*/true} + }); + + // Then + ASSERT_THAT(data.categories(), ElementsAre("Recents", "A", "Custom")); + ASSERT_THAT(data.presets(), + ElementsAre(ElementsAre(UserPresetIs("A.categ", "Desktop", "Windows 7")), + ElementsAre(PresetIs("A.categ", "Desktop")), + ElementsAre(UserPresetIs("A.categ", "Desktop", "Windows 7")))); +} + +TEST(QdsPresetModel, recentOfUserPresetReferringToNonexistingWizardPreset) +{ + // Given + PresetData data; + + // When + data.setData( + /*wizard presets*/ + { + aCategory("A.categ", "A", {"Desktop"}), + }, + { + aUserPreset("A.categ", "Not-Desktop", "Windows 7"), // Non-existing Wizard Preset + }, + /*recents*/ + { + {"A.categ", "Windows 7", "200 x 300", /*is user*/true} + }); + + // Then + ASSERT_THAT(data.categories(), ElementsAre("A")); + ASSERT_THAT(data.presets(), ElementsAre(ElementsAre(PresetIs("A.categ", "Desktop")))); +} + +TEST(QdsPresetModel, recentOfNonExistentUserPreset) +{ + // Given + PresetData data; + + // When + data.setData( + /*wizard presets*/ + { + aCategory("A.categ", "A", {"Desktop"}), + }, + {/*user presets*/}, + /*recents*/ + { + {"A.categ", "Windows 7", "200 x 300", /*is user*/true} + }); + + // Then + ASSERT_THAT(data.categories(), ElementsAre("A")); + ASSERT_THAT(data.presets(), ElementsAre(ElementsAre(PresetIs("A.categ", "Desktop")))); +} + TEST(QdsPresetModel, recentsShouldNotBeSorted) { // Given